Implement mounting

This commit is contained in:
Les De Ridder 2017-05-20 04:23:38 +02:00
commit bade69ec79
No known key found for this signature in database
GPG Key ID: 5EC132DFA85DB372
5 changed files with 276 additions and 0 deletions

52
background.js Normal file
View File

@ -0,0 +1,52 @@
'use strict';
function onMountRequested(onSuccess, onError) {
console.log("mount requested");
getMountInfo(function(mountInfo) { mount(mountInfo, onSuccess, onError); });
}
function getMountInfo(callback) {
let windowCallback = function(appWindow) {
let listener = function(message) {
if(message.senderId == appWindow.id) {
callback(message.mountInfo);
} else {
console.log(message);
console.log(appWindow);
console.log(message.senderId);
console.log(appWindow.id);
}
chrome.runtime.onMessage.removeListener(listener);
};
chrome.runtime.onMessage.addListener(listener);
};
let windowOptions = { outerBounds : { width: 800, height: 600 }, resizable : false, id: Date.now().toString() };
chrome.app.window.create("mount-info.html", windowOptions, windowCallback);
}
function mount(mountInfo, onSuccess, onError) {
console.log("mount()");
let request = new XMLHttpRequest();
request.open("GET", mountInfo.url, true);
request.onreadystatechange = function() {
if(request.readyState != XMLHttpRequest.DONE) return;
try {
JSON.parse(request.responseText);
let options = { fileSystemId: mountInfo.url, displayName: mountInfo.name, writable: false };
chrome.fileSystemProvider.mount(options);
console.log("mount succeeded");
onSuccess();
} catch(exception) {
console.log(exception);
console.log("mount failed");
onError();
}
};
request.send();
}
chrome.fileSystemProvider.onMountRequested.addListener(onMountRequested);

24
manifest.json Normal file
View File

@ -0,0 +1,24 @@
{
"name": "Nginx JSON autoindex File System Provider",
"version": "0.0.1",
"manifest_version": 2,
"description":
"Mount an nginx JSON autoindex URL as a file system",
"permissions": [
"fileSystemProvider",
"http://*/",
"https://*/"
],
"file_system_provider_capabilities": {
"source": "network",
"multiple_mounts": true
},
"app" : {
"background": {
"scripts": [
"background.js",
"mount-info.js"
]
}
}
}

27
mount-info.html Normal file
View File

@ -0,0 +1,27 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Nginx JSON autoindex Mount Info</title>
<link rel="stylesheet" href="sakura.css" type="text/css">
</head>
<body>
<h1>Mount options</h1>
<form id="mount-info-form">
<label for="mount-name">Mount name:</label>
<input id="mount-name" type="text" required />
<br />
<label for="mount-url">Root URL:</label>
<input id="mount-url" type="url" required />
<br />
<button type="submit">Mount</button>
</form>
<script src="mount-info.js"></script>
</body>
</html>

11
mount-info.js Normal file
View File

@ -0,0 +1,11 @@
"use strict";
(function() {
window.onload = function() {
document.getElementById("mount-info-form").onsubmit = function() {
let mountInfo = { name: document.getElementById("mount-name").value, url: document.getElementById("mount-url").value };
chrome.runtime.sendMessage({ mountInfo: mountInfo, senderId: chrome.app.window.current().id});
window.close();
}
}
})();

162
sakura.css Normal file
View File

@ -0,0 +1,162 @@
/* Sakura.css v1.0.0
* ================
* Minimal css theme.
* Project: https://github.com/oxalorg/sakura
*/
/* Body */
html {
font-size: 62.5%;
font-family: serif; }
body {
font-size: 1.8rem;
line-height: 1.618;
max-width: 38em;
margin: auto;
color: #4a4a4a;
background-color: #f9f9f9;
padding: 13px; }
@media (max-width: 684px) {
body {
font-size: 1.53rem; } }
@media (max-width: 382px) {
body {
font-size: 1.35rem; } }
h1, h2, h3, h4, h5, h6 {
line-height: 1.1;
font-family: Verdana, Geneva, sans-serif;
font-weight: 700;
overflow-wrap: break-word;
word-wrap: break-word;
-ms-word-break: break-all;
word-break: break-word;
-ms-hyphens: auto;
-moz-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto; }
h1 {
font-size: 2.35em; }
h2 {
font-size: 2.00em; }
h3 {
font-size: 1.75em; }
h4 {
font-size: 1.5em; }
h5 {
font-size: 1.25em; }
h6 {
font-size: 1em; }
small, sub, sup {
font-size: 75%; }
hr {
border-color: #2c8898; }
a {
text-decoration: none;
color: #2c8898; }
a:hover {
color: #982c61;
border-bottom: 2px solid #4a4a4a; }
ul {
padding-left: 1.4em; }
li {
margin-bottom: 0.4em; }
blockquote {
font-style: italic;
margin-left: 1.5em;
padding-left: 1em;
border-left: 3px solid #2c8898; }
img {
max-width: 100%; }
/* Pre and Code */
pre {
background-color: #f1f1f1;
display: block;
padding: 1em;
overflow-x: auto; }
code {
font-size: 0.9em;
padding: 0 0.5em;
background-color: #f1f1f1;
white-space: pre-wrap; }
pre > code {
padding: 0;
background-color: transparent;
white-space: pre; }
/* Tables */
table {
text-align: justify;
width: 100%;
border-collapse: collapse; }
td, th {
padding: 0.5em;
border-bottom: 1px solid #f1f1f1; }
/* Buttons, forms and input */
input, textarea {
border: 1px solid #4a4a4a; }
input:focus, textarea:focus {
border: 1px solid #2c8898; }
textarea {
width: 100%; }
.button, button, input[type="submit"], input[type="reset"], input[type="button"] {
display: inline-block;
padding: 5px 10px;
text-align: center;
text-decoration: none;
white-space: nowrap;
background-color: #2c8898;
color: #f9f9f9;
border-radius: 1px;
border: 1px solid #2c8898;
cursor: pointer;
box-sizing: border-box; }
.button[disabled], button[disabled], input[type="submit"][disabled], input[type="reset"][disabled], input[type="button"][disabled] {
cursor: default;
opacity: .5; }
.button:focus, .button:hover, button:focus, button:hover, input[type="submit"]:focus, input[type="submit"]:hover, input[type="reset"]:focus, input[type="reset"]:hover, input[type="button"]:focus, input[type="button"]:hover {
background-color: #982c61;
border-color: #982c61;
color: #f9f9f9;
outline: 0; }
textarea, select, input[type] {
color: #4a4a4a;
padding: 6px 10px;
/* The 6px vertically centers text on FF, ignored by Webkit */
margin-bottom: 10px;
background-color: #f1f1f1;
border: 1px solid #f1f1f1;
border-radius: 4px;
box-shadow: none;
box-sizing: border-box; }
textarea:focus, select:focus, input[type]:focus {
border: 1px solid #2c8898;
outline: 0; }
label, legend, fieldset {
display: block;
margin-bottom: .5rem;
font-weight: 600; }