26 |
27 |
--------------------------------------------------------------------------------
/reviews/2012-05-15.txt:
--------------------------------------------------------------------------------
1 | Your add-on, Local Filesystem Links 0.9, has been reviewed by an editor and did not meet the criteria for being hosted in our gallery.
2 |
3 | Reviewer:
4 | Kris Maglione
5 |
6 | Comments:
7 | Your version was rejected because of the following problems:
8 |
9 | 1) We can't match your included version of jQuery and jQuery UI to the checksum of any known version. Please include only releases of libraries obtained from official sources in their original, unmodified files. Please note that third party CDNs are not considered official sources for this purpose. In the case of jQuery UI, it's best to include individual files from the development bundle rather than a single, amalgamated script.
10 |
11 | Please also remove the duplicate copies of jQuery and jquery.datatables that you include.
12 |
13 | This version didn't pass full review because of the following issues:
14 |
15 | 1) Your add-on prints quite a lot of debugging information in the Error Console, which is generally not allowed in production add-ons.
16 |
17 | It would also be a good idea to use nsILocalFile.reveal() or .launch() rather than launching explorer.exe directly.
18 |
19 | Please fix them and submit again. Thank you.
--------------------------------------------------------------------------------
/src/extension/utils/os-util.js:
--------------------------------------------------------------------------------
1 | /*
2 | * License: www.mozilla.org/MPL/
3 | * Created by https://github.com/feinstaub/firefox_addon_local_filesystem_links
4 | */
5 | 'use strict';
6 |
7 | // var {Cc, Ci} = chrome; //require('chrome');
8 |
9 | var getOsStringTag = function() {
10 | // https://developer.mozilla.org/en/nsIXULRuntime
11 | // var xulRuntime = Cc['@mozilla.org/xre/app-info;1'].
12 | // getService(Ci.nsIXULRuntime);
13 |
14 | // see https://developer.mozilla.org/en/OS_TARGET
15 | return browser.runtime.getPlatformInfo(function(info) {
16 | // Display host OS in the console
17 | // console.log(info.os);
18 | return info.os;
19 | }); // xulRuntime.OS;
20 | };
21 |
22 | var retrieveIsWindowsOs = function() {
23 | var osStringTag = getOsStringTag();
24 |
25 | return osStringTag === 'win';
26 | };
27 | const constIsWindowsOs = retrieveIsWindowsOs();
28 |
29 | var isWindowsOs = function() {
30 | // console.log('isWindowsOs', constIsWindowsOs);
31 | return constIsWindowsOs;
32 | };
33 |
34 | exports.isWindowsOs = isWindowsOs;
35 |
36 | exports.getFileManagerDisplayName = function() {
37 | if (isWindowsOs()) {
38 | return 'Windows Explorer';
39 | } else {
40 | return 'default file manager';
41 | }
42 | };
43 |
--------------------------------------------------------------------------------
/test/test-link-util.js:
--------------------------------------------------------------------------------
1 | /*
2 | * License: www.mozilla.org/MPL/
3 | */
4 | "use strict";
5 |
6 | const linkUtil = require( "../lib/utils/link-util" );
7 |
8 | exports.test_stripQuotes = function( test ) {
9 | test.assertEqual( linkUtil.stripQuotes( "aaa" ), "aaa" );
10 | test.assertEqual( linkUtil.stripQuotes( "\"aaa\"" ), "aaa" );
11 |
12 | // Test.assertEqual(localProcess.stripQuotes("\"aaa"), "aaa"); // throws error
13 | };
14 |
15 | exports.test_fixFileLinkStringForWindowsOs = function( test ) {
16 | test.assertEqual( linkUtil.fixFileLinkStringForWindowsOs( "file://W:/" ), "W:\\" );
17 | test.assertEqual( linkUtil.fixFileLinkStringForWindowsOs( "file:///W:/" ), "W:\\" );
18 | test.assertEqual( linkUtil.fixFileLinkStringForWindowsOs( "file:///W:/a/bb/ccc" ), "W:\\a\\bb\\ccc" );
19 | };
20 |
21 | exports.test_looksLikeLocalFileLink = function( test ) {
22 | test.assertEqual( linkUtil.looksLikeLocalFileLink( "file:///W:/" ), true );
23 | test.assertEqual( linkUtil.looksLikeLocalFileLink( "file:///W:/asdfasdf asdfasdf" ), true );
24 | test.assertEqual( linkUtil.looksLikeLocalFileLink( "http://www.google.com" ), false );
25 |
26 | // test.assertEqual(linkUtil.looksLikeLocalFileLink("file:///AB:/"), false); // TODO
27 | // test.assertEqual(linkUtil.looksLikeLocalFileLink("file:///abc/def"), false); // TODO
28 | };
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | firefox_addon_local_filesystem_links
4 |
5 |
6 |
7 |
8 |
9 | org.eclipse.wst.jsdt.core.javascriptValidator
10 |
11 |
12 |
13 |
14 |
15 | org.eclipse.wst.jsdt.core.jsNature
16 |
17 |
18 |
19 | 1339019242040
20 |
21 | 6
22 |
23 | org.eclipse.ui.ide.multiFilter
24 | 1.0-name-matches-false-false-*~
25 |
26 |
27 |
28 | 1339019242041
29 |
30 | 10
31 |
32 | org.eclipse.ui.ide.multiFilter
33 | 1.0-name-matches-false-false-_p1
34 |
35 |
36 |
37 | 1339019242042
38 |
39 | 10
40 |
41 | org.eclipse.ui.ide.multiFilter
42 | 1.0-name-matches-false-false-$p1
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: "npm"
9 | directory: "/" # Location of package manifests
10 | # Raise pull requests for version updates
11 | # to pip against the `develop` branch
12 | target-branch: "develop"
13 | schedule:
14 | interval: "weekly"
15 | labels:
16 | - "npm dependencies (extension)"
17 | - package-ecosystem: "npm"
18 | directory: "/native-host" # Location of package manifests
19 | # Raise pull requests for version updates
20 | # to pip against the `develop` branch
21 | target-branch: "develop"
22 | schedule:
23 | interval: "weekly"
24 | labels:
25 | - "npm dependencies (native app)"
26 | - package-ecosystem: "pip"
27 | directory: "/native-host" # Location of package manifests
28 | # Raise pull requests for version updates
29 | # to pip against the `develop` branch
30 | target-branch: "develop"
31 | schedule:
32 | interval: "weekly"
33 | labels:
34 | - "pip dependencies (native app)"
35 |
--------------------------------------------------------------------------------
/test/webserver/issue84/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Issue 84 - European accents
6 |
7 |
8 |
In version 0.99.46 - European accents can't be opened!
9 |
decodeURIComponent is important for direct link click to make these characters work
10 | - side effect env. var not working with it (work-around needed for env. var)
41 |
42 |
43 |
--------------------------------------------------------------------------------
/reviews/2011-12-30.txt:
--------------------------------------------------------------------------------
1 | REVIEW
2 | ------
3 | Mozilla Add-ons: Local Filesystem Links 0.64 Preliminary Reviewed
4 | [...]
5 | Reviewer:
6 | Kris Maglione
7 |
8 | Comments:
9 | Your preliminary review request has been approved. Due to caching and mirroring on our site, it can take a few hours before your add-on appears public, so please be patient.
10 |
11 | However, I have the following issues which should be addressed before your next update:
12 |
13 | 1) You alter the markup of documents by textually modifying their innerHTML. This causes the entire document to be re-parsed, which aside from the inefficiency has critical drawbacks, including invalidating any JavaScript reference to replaced DOM nodes, clearing any JavaScript properties and event listeners on replaced DOM nodes, re-executing any script tags in the changed markup, and causing said scripts to fail if they rely on document.write. Please create and alter DOM nodes with DOM methods such as createElement and replaceChild, and the textContent rather than innerHTML property.
14 |
15 | 2) Generating script fragments such as event listeners and content scripts from unsanitized string data is error prone and poses a major risk of security vulnerabilities. For more information, please see https://developer.mozilla.org/en/XUL_School/DOM_Building_and_HTML_Insertion#listeners
16 |
17 | Thank you.
18 | [...]
19 |
20 | ---------------------------------------------------------------------
21 |
22 | ACTIONS
23 | -------
24 | Commented out some code and made comments.
25 |
26 |
27 | OPEN ISSUES
28 | -----------
29 | Make sure all mentioned issues in the review were addressed.
30 |
--------------------------------------------------------------------------------
/native-host/build/unix/install_host_compiled.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Copyright 2013 The Chromium Authors. All rights reserved.
3 | # Use of this source code is governed by a BSD-style license that can be
4 | # found in the LICENSE file.
5 |
6 | # see https://github.com/passff/passff/blob/master/src/host/install_host_app.sh
7 | # for installer for multiple browsers --> for now just firefox
8 |
9 | set -e
10 |
11 | DIR="$( cd "$( dirname "$0" )" && pwd )"
12 | if [ "$(uname -s)" = "Darwin" ]; then
13 | if [ "$(whoami)" = "root" ]; then
14 | TARGET_DIR="/Library/Application Support/Mozilla/NativeMessagingHosts"
15 | else
16 | TARGET_DIR="$HOME/Library/Application Support/Mozilla/NativeMessagingHosts"
17 | fi
18 | else
19 | if [ "$(whoami)" = "root" ]; then
20 | TARGET_DIR="/usr/lib/mozilla/native-messaging-hosts"
21 | else
22 | TARGET_DIR="$HOME/.mozilla/native-messaging-hosts"
23 | fi
24 | fi
25 |
26 | HOST_NAME="webextension_local_filesystem_links"
27 |
28 | # Create directory to store native messaging host.
29 | mkdir -p "$TARGET_DIR"
30 |
31 | # Copy native messaging host manifest
32 | cp "$DIR/$HOST_NAME.json" "$TARGET_DIR"
33 |
34 | # Copy lib & executable
35 | cp -r "$DIR/local-link-messaging-host" "$TARGET_DIR"
36 |
37 | # Copy uninstall script
38 | cp "$DIR/uninstall_host_compiled.sh" "$TARGET_DIR"
39 |
40 | # Update host path in the manifest.
41 | HOST_PATH=$TARGET_DIR/local-link-messaging-host/local-link-messaging-host
42 | ESCAPED_HOST_PATH=${HOST_PATH////\\/}
43 | sed -i -e "s/HOST_PATH/$ESCAPED_HOST_PATH/" "$TARGET_DIR/$HOST_NAME.json"
44 |
45 | # Set permissions for the manifest so that all users can read it.
46 | chmod o+r "$TARGET_DIR/$HOST_NAME.json"
47 |
48 | echo "Native messaging host $HOST_NAME has been installed."
49 |
--------------------------------------------------------------------------------
/README.build-from-source.md:
--------------------------------------------------------------------------------
1 | Build from source: webextension_local_filesystem_links
2 | ======================================================
3 |
4 | 1. Extract source code archive
5 |
6 | 2. Install dependencies:
7 |
8 | $ npm install
9 | ...
10 | added 1208 packages in 25.165s
11 |
12 | 3. Generate the production version of the extension in dist folder.
13 | Creates extension from src folder, converts host script to executable and create installer with InnoSetup
14 | (working under windows)
15 |
16 | $ npm run build
17 | ...
18 | DONE Compiled successfully in 4841ms
19 |
20 | 4. Generate the bundle in web-ext-artifacts folder / create the final package
21 |
22 | $ npm run bundle
23 | ...
24 | Your web extension is ready: /home/gregor/dev/src/firefox_addon/sourcecode-archive/web-ext-artifacts/local_filesystem_links-0.99.60.zip
25 |
26 | 5. Manually upload of the zip file here: https://addons.mozilla.org/en-US/developers/addon/local-filesystem-links/versions
27 | - Upload Version -> Select a file...
28 | - Troubleshooting:
29 | - red message: "Version 0.99.58 was uploaded before and deleted". No hint what to do next.
30 | - solution: upload new version 0.99.59 (npm run build, npm run bundle, upload the file)
31 | - Follow the instructions and provide source code
32 | - $ ./make-sourcecode-archive.sh
33 |
34 | Older stuff
35 | -----------
36 | * One-time: Install [web-ext](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Getting_started_with_web-ext) with `npm install web-ext`.
37 | * Find API key hiere: See Tools > Manage API Keys (https://addons.mozilla.org/en-US/developers/addon/api/key/)
38 |
39 | $ ./node_modules/web-ext/bin/web-ext sign --api-key=userkey --api-secret=... -s dist
40 |
--------------------------------------------------------------------------------
/test/webserver/test-server.nodejs.js:
--------------------------------------------------------------------------------
1 | //
2 | // code by http://thecodinghumanist.com/blog/archives/2011/5/6/serving-static-files-from-node-js
3 | //
4 | // see also http://stackoverflow.com/questions/4720343/loading-basic-html-in-nodejs
5 | // http://stackoverflow.com/questions/6084360/node-js-as-a-simple-web-server
6 | //
7 | // TODO: use readFileSync?
8 | //
9 |
10 | var http = require('http');
11 | var fs = require('fs');
12 | var path = require('path');
13 |
14 | http.createServer(function (request, response) {
15 |
16 | console.log('request starting...');
17 |
18 | var filePath = '.' + request.url;
19 | if (filePath == './')
20 | filePath = './index.htm';
21 |
22 | var extname = path.extname(filePath);
23 | var contentType = 'text/html';
24 | switch (extname) {
25 | case '.js':
26 | contentType = 'text/javascript';
27 | break;
28 | case '.css':
29 | contentType = 'text/css';
30 | break;
31 | }
32 |
33 | fs.exists(filePath, function(exists) {
34 |
35 | if (exists) {
36 | fs.readFile(filePath, function(error, content) {
37 | if (error) {
38 | response.writeHead(500);
39 | response.end();
40 | }
41 | else {
42 | response.writeHead(200, { 'Content-Type': contentType });
43 | response.end(content, 'utf-8');
44 | }
45 | });
46 | }
47 | else {
48 | response.writeHead(404);
49 | response.end();
50 | }
51 | });
52 |
53 | }).listen(8125);
54 |
55 | console.log('Server running at http://127.0.0.1:8125/');
--------------------------------------------------------------------------------
/native-host/build/windows/readme.md:
--------------------------------------------------------------------------------
1 | This folder contains information needed for the windows installer.
2 |
3 | ## Files
4 | - InnoSetupScript.iss: Used by [Inno Setup](http://www.jrsoftware.org/) to create the installer.
5 | - vcredist_x86.exe: Needed for PyInstaller to work (unchecked by default because it needs admin rights to install)
6 | Bundled in the setup.exe (can be enabled during installation)
7 | Question: Is it already installed at most users pcs or not? Or is it automatically bundled into pyinstaller bundle?
8 | - Windows SDK for signTool - download [here](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk)
9 | (not everything needed but still around 300 MB, most important part is SDK Signing tools)
10 |
11 | ## Useful resources
12 | - Configure py2exe destination [SO question](https://stackoverflow.com/questions/5811960/is-there-a-way-to-specify-the-build-directory-for-py2exe)
13 |
14 | - Configure Registry addition in InnoSetup [SO question](https://stackoverflow.com/questions/13537841/how-to-write-install-path-to-registry-after-install-is-complete-with-inno-setup)
15 |
16 | # Possible improvements to the installer
17 | - Check if vcredist is installed (if not install it) --> probably not that easy as I'd like to start with-out admin rights
18 | Resource for a VC++ check can be found [here](https://stackoverflow.com/questions/11137424/how-to-make-vcredist-x86-reinstall-only-if-not-yet-installed)
19 |
20 |
21 | ## SignTool (not working yet)
22 | Signing is needed to avoid security warning from Windows Defender.
23 |
24 | [step by step guide to sign inno setup installer](https://revolution.screenstepslive.com/s/revolution/m/10695/l/563371-signing-installers-you-create-with-inno-setup)
25 |
26 | Path to signtool at my installation C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86\signtool.exe
27 |
--------------------------------------------------------------------------------
/native-host/build/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Detects which OS and if it is Linux then it will detect which Linux
3 | # Distribution.
4 |
5 | OS=`uname -s`
6 |
7 | # VERSION_INFO probably different for Linux
8 | VERSION_INFO="# UTF-8
9 | #
10 | # For more details about fixed file info 'ffi' see:
11 | # http://msdn.microsoft.com/en-us/library/ms646997.aspx
12 | VSVersionInfo(
13 | ffi=FixedFileInfo("
14 |
15 | if [[ "$OS" =~ ^MSYS.* ]]; then
16 | BIN_DIR="bin/win32";
17 | elif [[ "$OS" =~ ^Linux.* ]]; then
18 | BIN_DIR="./bin/linux";
19 | elif [[ "$OS" =~ ^Darwin.* ]]; then
20 | BIN_DIR="./bin/mac"
21 | else
22 | BIN_DIR="./bin/$OS"
23 | fi
24 |
25 | # rmdir -rf BIN_DIR # already removed by npm
26 | echo $BIN_DIR # debugging output
27 |
28 | # Version key/value should be on his own line
29 | PACKAGE_VERSION=$(cat package.json \
30 | | grep version \
31 | | head -1 \
32 | | awk -F: '{ print $2 }' \
33 | | sed 's/[",]//g')
34 |
35 | echo $PACKAGE_VERSION # return 0.1.0 - debugging output
36 |
37 | # create version file
38 | # filevers=(2, 0, 4, 0),
39 | # prodvers=(2, 0, 4, 0),
40 | #IN="bla@some.com;john@home.com" # e.g. 3.2.1 --> [0] = 3, [1] = 2, [2] = 1
41 | versionArr=${PACKAGE_VERSION//./ } #
42 |
43 | {
44 | printf "$VERSION_INFO\n"
45 | printf " filevers=(%s, %s, %s, 0),\n" ${versionArr[0]} ${versionArr[1]} ${versionArr[2]}
46 | printf " prodvers=(%s, %s, %s, 0),\n" ${versionArr[0]} ${versionArr[1]} ${versionArr[2]}
47 | echo "))"
48 | } >version.rc
49 |
50 | # create folder (-p if it doesn't exist)
51 | mkdir -p $BIN_DIR
52 |
53 | # onefile not working (not correctly bundled)
54 | # --> onedir better (faster start - no extracting to temp. location of python required)
55 | pyinstaller ./src/local-link-messaging-host.py \
56 | --onedir \
57 | --distpath=$BIN_DIR \
58 | --icon ./src/addon_icon_48.ico \
59 | --workpath=dist \
60 | --version-file=version.rc
61 | # --log-level=DEBUG
62 |
63 | # remove temporary directory
64 | rm -rf dist
65 |
--------------------------------------------------------------------------------
/doc/AboutThisAddon.htm:
--------------------------------------------------------------------------------
1 | Summary
2 | This Firefox extension scans pages for file:/// links and makes it possible to open them with the system's file browser (e. g. Windows Explorer).
3 |
4 | Target Audience
5 | The extensions was created to assist people using local or enterprise intranet sites (e. g. Wikis)
6 | where pages exist that link to files that are located on the local drive or on network shares.
7 |
8 | Details
9 | Currently there are two methods of opening local file system links.
10 |
11 | 1) Automatic file link recognition
12 | An automatic file link recognition scans for hyperlinks with a file:/// prefix.
13 | For each of these hyperlinks a folder icon will be inserted on the right side of the hyperlink.
14 | If you click the icon the local file link is opened with the system's file browser (e. g. Windows Explorer).
15 | In case of a link to a directory, the file browser opens the directory.
16 | In case of a link to a file, the file will be selected (NOT executed) in the file browser.
17 |
18 | 2) Page context menu entry
19 | The extension adds an entry 'Open with Windows Explorer' to the page context menu that works on selected text.
20 | It works as follows:
21 |
22 |
Select a text portion that contains the path to a local file or folder (e. g. C:\Windows).
23 |
Right click on the selection and choose 'Open with Windows Explorer' from the context menu.
24 |
See the two cases above.
25 |
26 |
27 | Supported file links
28 |
29 |
Local disk file links like C:\Windows (file:///C:/Windows)
30 |
Network share links (UNC paths) like \\server\folder\file.png (file://///server/folder/file.png)
31 |
Blanks in the path
32 |
33 |
34 | Known Issues
35 | Partial incompatibility with Extension Test 2.7.7
36 | The options page of Local Filesystem Links does not work if the add-on Extension Test 2.7.7 is also installed. Reported 2012-06-16 on Firefox 13.
37 |
--------------------------------------------------------------------------------
/test/webserver/server.js:
--------------------------------------------------------------------------------
1 | //
2 | // code by http://thecodinghumanist.com/blog/archives/2011/5/6/serving-static-files-from-node-js
3 | //
4 | // see also http://stackoverflow.com/questions/4720343/loading-basic-html-in-nodejs
5 | // http://stackoverflow.com/questions/6084360/node-js-as-a-simple-web-server
6 | //
7 | // TODO: use readFileSync?
8 | //
9 |
10 | import http from 'http';
11 | import fs from 'fs';
12 | import path from 'path';
13 | import open from 'open';
14 |
15 | var server = http
16 | .createServer(function(request, response) {
17 | console.log('request starting...');
18 |
19 | var filePath = '.' + request.url;
20 | if (filePath == './') filePath = './index.htm';
21 |
22 | var extname = path.extname(filePath);
23 | var contentType = 'text/html';
24 | switch (extname) {
25 | case '.js':
26 | contentType = 'text/javascript';
27 | break;
28 | case '.css':
29 | contentType = 'text/css';
30 | break;
31 | }
32 |
33 | fs.exists(filePath, function(exists) {
34 | if (exists) {
35 | fs.readFile(filePath, function(error, content) {
36 | if (error) {
37 | response.writeHead(500);
38 | response.end();
39 | } else {
40 | response.writeHead(200, {
41 | 'Content-Type': contentType
42 | });
43 | response.end(content, 'utf-8');
44 | }
45 | });
46 | } else {
47 | response.writeHead(404);
48 | response.end();
49 | }
50 | });
51 | })
52 | .listen(3000, 'localhost', function() {
53 | var adrObj = server.address(),
54 | address = [adrObj.address, adrObj.port];
55 |
56 | console.log('Server running at ' + address.join(':'));
57 | open('http://' + address.join(':'));
58 | });
59 |
--------------------------------------------------------------------------------
/reviews/2012-05-29.txt:
--------------------------------------------------------------------------------
1 | Your add-on, Local Filesystem Links 0.95, has been reviewed by an editor and did not meet the criteria for full review. However, your add-on has been granted preliminary review and is now available for download in our gallery at https://addons.mozilla.org/addon/local-filesystem-links/
2 |
3 |
4 |
5 | Reviewer:
6 | Kris Maglione
7 |
8 | Comments:
9 | This version didn't pass full review because of the following issues:
10 |
11 | 1) I get the following errors in the Error Console at startup:
12 |
13 | Error: jQuery is not defined
14 | Source file: resource://jid1-jazc7z53jemo5q-at-jetpack/alien-local-filesystem-links/data/js/jquery-ui-1.8.16.custom.min.js
15 | Line: 18
16 | ----------
17 | Error: jQuery is not defined
18 | Source file: resource://jid1-jazc7z53jemo5q-at-jetpack/alien-local-filesystem-links/data/jsdt/jquery.dataTables.js
19 | Line: 7440
20 | ----------
21 | Error: unterminated string literal
22 | Source file: resource://jid1-jazc7z53jemo5q-at-jetpack/alien-local-filesystem-links/data/main-wid/main-panel.htm
23 | Line: 57, Column: 96
24 | Source code:
25 | return '
26 |
27 | It would incidentally be a good idea to ensure that your HTML files are well formed XHTML and change the extensions to .xhtml
28 |
29 | See also https://developer.mozilla.org/en/XUL_School/DOM_Building_and_HTML_Insertion
30 |
31 | You should also remove or disable the unused code in your showPathInWindowsExplorer function.
32 |
33 | You need to correct them to get full approval. Thanks.
34 |
35 | Your add-on will now appear in search results and categories with some limitations. You may re-request full review by addressing the editor's comments and uploading a new version. To learn more about the review process, please visit https://addons.mozilla.org/developers/docs/policies/reviews#selection
36 |
37 | If you have any questions or comments on this review, please reply to this email or join #amo-editors on irc.mozilla.org
38 | --
39 | Mozilla Add-ons
40 | https://addons.mozilla.org
41 |
--------------------------------------------------------------------------------
/privacy.md:
--------------------------------------------------------------------------------
1 | # Privacy Policy for the Local Filesystem Link Extension
2 |
3 | This privacy policy details the data practices of the Local Filesystem Link extension.
4 |
5 | ## 1. Data Collection and Usage
6 |
7 | The Local Filesystem Link extension does not collect, use, or share any personal data from its users. It operates entirely locally on your browser, without communicating with external servers or services. The extension does not gather or store any personally identifiable information or any other type of data from its users.
8 |
9 | ## 2. Permissions
10 |
11 | To facilitate its core functionalities, the extension requires permissions to alter the browser's behavior, enabling it to open local files such as `c:/textfile.txt` or any UNC path from user-whitelisted URLs. Despite necessitating these permissions, the extension doesn’t engage in the collection or transmission of personal data.
12 |
13 | ## 3. User Control
14 |
15 | Users maintain the authority to dictate the URLs where the extension remains active, by leveraging a white-listing feature. This function operates locally and does not involve the transfer or sharing of data with external entities.
16 |
17 | ## 4. Disclosure to Websites
18 |
19 | The extension adds a click handler and an icon next to eligible links, a feature that can be toggled in the extension’s options. Due to this, websites can technically detect the presence of the extension. This addition enhances user interaction without collecting or conveying any personal information to the websites.
20 |
21 | ## 5. Data Security
22 |
23 | Since the extension does not engage in the collection or storage of personal data, it does not incorporate data security measures pertaining to the protection of personal data.
24 |
25 | ## 6. Changes to the Privacy Policy
26 |
27 | We hold the rights to update this privacy policy periodically. Despite the non-involvement in data collection, we may refine this policy to maintain alignment with regulatory requisites and ensure transparency with our users.
28 |
29 | ## Contact Us
30 |
31 | For any queries or clarifications regarding this privacy policy, please reach us at [Github/webextension_local_filesystem_links](https://github.com/feinstaub/webextension_local_filesystem_links).
32 |
33 | By utilizing the Local Filesystem Link extension, you consent to the practices delineated in this privacy policy.
34 |
--------------------------------------------------------------------------------
/test/test-launch-local-process.js:
--------------------------------------------------------------------------------
1 | /*
2 | * License: www.mozilla.org/MPL/
3 | */
4 | "use strict";
5 |
6 | // SEE https://addons.mozilla.org/en-US/developers/docs/sdk/1.1/packages/api-utils/docs/unit-test.html
7 |
8 | const { Ci, Cc } = require( "chrome" );
9 | const localProcess = require( "../lib/launch-local-process" );
10 | const isWindowsOs = require('../lib/utils/os-util').isWindowsOs;
11 |
12 | var existingFile, notExisting, folderWithSpaceExisting, folderWithSpaceQuotedExisting;
13 |
14 | if (isWindowsOs()) {
15 | existingFile = "C:\\Windows\\explorer.exe";
16 | notExisting = "C:\\muh.exe";
17 | folderWithSpaceExisting = "C:\\Windows\\Downloaded Program Files";
18 | folderWithSpaceQuotedExisting = "\"C:\\Windows\\Downloaded Program Files\"";
19 | }
20 | else {
21 | // console.log('unix system');
22 | existingFile = "/etc/issue";
23 | notExisting = "/muh/notfound";
24 | // todo --> create path at /tmp/ folder
25 | folderWithSpaceExisting = "/tmp/path with spaces";
26 | folderWithSpaceQuotedExisting = "\"/tmp/path with spaces\"";
27 |
28 | // check if folder is existing --> create it if it's missing
29 | var file = Cc['@mozilla.org/file/local;1'].
30 | createInstance(Ci.nsILocalFile);
31 | file.initWithPath(folderWithSpaceExisting);
32 | if (file && !file.exists()) {
33 | file.create(1, 384); // oct 0600 --> only current user can read/write
34 | }
35 | }
36 |
37 | /*exports.test_getEnvVar = function( test ) {
38 | let v1 = localProcess.getEnvironmentVariable( "WINDIR" );
39 | test.assertEqual( v1.toUpperCase(), "C:\\WINDOWS" );
40 |
41 | test.assertRaises( function() {
42 | localProcess.getEnvironmentVariable( "__MUH__" );
43 | },
44 | "getEnvironmentVariable: variable does not exist: __MUH__" );
45 | };*/
46 |
47 | exports.test_pathExists = function( test ) {
48 | var localFile = Cc[ "@mozilla.org/file/local;1" ]
49 | .createInstance( Ci.nsILocalFile );
50 |
51 | localFile.initWithPath(existingFile);
52 | test.assertEqual( localProcess.pathExists( localFile ), true );
53 |
54 | localFile.initWithPath(notExisting);
55 | test.assertEqual( localProcess.pathExists( localFile ), false );
56 | };
57 |
58 | exports.test_getNsIFileFromPath = function( test ) {
59 | let nsFile = localProcess.getNsIFileFromPath( existingFile );
60 | test.assertEqual( nsFile.exists(), true );
61 |
62 | nsFile = localProcess.getNsIFileFromPath( notExisting );
63 | test.assertEqual( nsFile.exists(), false );
64 |
65 | // Folder with space
66 | nsFile = localProcess.getNsIFileFromPath( folderWithSpaceExisting );
67 | test.assertEqual( nsFile.exists(), true );
68 |
69 | // With ""
70 | nsFile = localProcess.getNsIFileFromPath( folderWithSpaceQuotedExisting );
71 | test.assertEqual( nsFile.exists(), true );
72 | };
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Local Filesystem Links",
3 | "name": "alien-local-filesystem-links",
4 | "version": "0.101.0",
5 | "description": "Scans pages for file:/// links and makes it possible to open them with the system's file browser.",
6 | "main": "index.js",
7 | "author": "austrALIENsun",
8 | "scripts": {
9 | "start": "npm run dev",
10 | "start:web-ext": "wait-on dist/ && web-ext run -s dist/",
11 | "start:web-ext_profile": "wait-on dist/ && web-ext run -s dist/ -p \"firefox_addon\" --keep-profile-changes",
12 | "web-ext": "web-ext run -s dist/",
13 | "bundle": "web-ext build -s dist/ --overwrite-dest",
14 | "sign": "sh ./sign-bundle.sh",
15 | "clean": "rimraf dist",
16 | "dev": "npm-run-all clean --parallel watch start:web-ext",
17 | "watch": "webpack-cli --watch",
18 | "prebuild": "npm run clean",
19 | "build": "cross-env NODE_ENV=production webpack-cli --progress",
20 | "lint": "eslint ./src/**/*.js",
21 | "lint:web-ext": "web-ext lint",
22 | "pretty": "prettier ./src/**/*.js --write"
23 | },
24 | "husky": {
25 | "hooks": {
26 | "pre-commit": "pretty-quick --staged"
27 | }
28 | },
29 | "lint-staged": {
30 | "*.js": [
31 | "npm run lint",
32 | "git add"
33 | ]
34 | },
35 | "engines": {
36 | "firefox": ">=38.0a1",
37 | "fennec": ">=38.0a1"
38 | },
39 | "license": "MPL 1.1/GPL 3.0",
40 | "id": "jid1-JAzC7z53jemo5Q@jetpack",
41 | "permissions": {
42 | "multiprocess": true
43 | },
44 | "dependencies": {
45 | "lodash.debounce": "^4.0.8",
46 | "match-pattern": "0.0.2",
47 | "vue": "^2.5.16",
48 | "webextension-polyfill": "^0.2.1"
49 | },
50 | "devDependencies": {
51 | "@babel/core": "^7.21.8",
52 | "@babel/preset-env": "^7.21.5",
53 | "ajv": "^8.6.0",
54 | "babel-eslint": "^9.0.0",
55 | "babel-loader": "^8.0.0-beta.6",
56 | "babel-preset-env": "^1.7.0",
57 | "copy-webpack-plugin": "^11.0.0",
58 | "cross-env": "^5.1.5",
59 | "css-loader": "^3.1.0",
60 | "eslint": "^8.41.0",
61 | "eslint-config-prettier": "^6.0.0",
62 | "eslint-plugin-prettier": "^3.1.0",
63 | "file-loader": "^1.1.11",
64 | "friendly-errors-webpack-plugin": "^1.7.0",
65 | "html-webpack-plugin": "^5.5.1",
66 | "husky": "^3.0.2",
67 | "node-process": "^1.0.1",
68 | "npm-run-all": "^4.1.5",
69 | "prettier": "^1.16.4",
70 | "pretty-quick": "^1.11.1",
71 | "request": "^2.88.2",
72 | "rimraf": "^2.6.2",
73 | "style-loader": "^0.21.0",
74 | "vue-template-compiler": "^2.5.16",
75 | "vue-template-loader": "^1.1.0",
76 | "wait-on": "^7.0.1",
77 | "web-ext": "^7.6.2",
78 | "webpack": "^5.84.1",
79 | "webpack-cli": "^5.1.1",
80 | "write-file-webpack-plugin": "^4.3.2"
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/test/webserver/issue22/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Issue 22 - Windows / Linux path variables
6 |
7 |
8 |
Test if we can open links with environment path variables e.g. %HOMEPATH%
9 |
Why are three slashes required file:///%HOMEDRIVE%? With only two it will be relpace to file:///
10 |
Probably FF will remove %HOMEDRIVE% because it is not a valid uri.
11 |
Info to env. var
12 |
Windows list all env. variables with SET command.
13 |
Linux list all env. variables with printenv command.
14 | Windows setting: SET name=c:\
15 | Linux setting:
16 | add the following lines to the end of your ~/.bashrc file and re-login into your account (test.txt file in /tmp/test/test.txt):
17 | export TMPDIR=/tmp
18 | export TEST=test
19 |
20 |
Encoding issue: % in uri is a problem - interference with decodeUriComponent that is required for accents in urls.
21 | with-out decodeUriComponent the links are working as commented below.
22 | Temporary work-around manually encoding in links with env. vars required %25 for % for windows and %24 for $ in Linux
23 |
111 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | local-filesystem-links
2 | ======================
3 |
4 | Overview
5 | --------
6 | This is the alien-local-filesystem-links extension for Mozilla Firefox.
7 |
8 | It contains:
9 |
10 | * extension source code (src/)
11 | * native app source code (native-host/)
12 | * tests (test/)
13 | * documentation (doc/)
14 |
15 |
16 | Features
17 | --------
18 | - Adds a click event to every link that is including `file://` or `smb://` in `href` tag. (smb not working yet)
19 | - Shows a link icon close to the link. Icon can be disabled in preferences.
20 | - Dynamic loaded content supported because link events are delegated with `$(document).on(...)`
21 | - Supports links with double and tripple slashes (e.g. file:// or file:///)
22 | - (Not available: Right click context menu that opens a text selection that contains a file link + option to reveal the directory of a directly linked file.)
23 | - Whitelist option to enable local links only at a specific url e.g. `*.trello.com`
24 | - Statusbar icon for displaying if links are active for current tab & for easier access to addon settings
25 | - Option to change the default text link behaviour (open or reveal)
26 | - Localization (current languages German, English, Russian)
27 |
28 |
29 | Screenshots
30 | --------
31 | 
32 | 
33 |
34 |
35 | License
36 | -------
37 | * GPLv3 or later
38 | * www.mozilla.org/MPL/ v2 or later
39 |
40 |
41 | Start developing
42 | ----------------
43 | See README.dev.md
44 |
45 |
46 | Donations
47 | ---------
48 | If you like the extension and you want to support the development - please consider to donate. Any donations are greatly appreciated.
49 |
50 | * AWolf81 - current main developer:
51 | * [Paypal.me to AWolf81](https://www.paypal.me/awlf81) (coding contributions)
52 | * What are we doing with the donations?
53 | * Buy a code signing certificate (needed for Windows) cost around 100 USD
54 | * Incentive / motivation - this helps to stay motivated.
55 |
56 | * Feinstaub - original author and addon management:
57 | * No direct donations possible yet (waiting for something private and decentrally organized like [GNU Taler](https://taler.net/en))
58 | * [Some people do not use Paypal](https://github.com/feinstaub/webextension_local_filesystem_links/issues/98#issuecomment-357984115), maybe because of https://de.wikipedia.org/wiki/PayPal#Kritik
59 | * Any donation that supports a Free Software community helps to maintain a technical and social environment where the development of software like this addon are possible. If you have no idea which community you would like to support, I recommend these organisations:
60 | * **KDE**: https://www.kde.org/community/donations/others.php
61 | * Vision: ["A world in which everyone has control over their digital life and enjoys freedom and privacy."](https://dot.kde.org/2016/04/05/kde-presents-its-vision-future)
62 | * [supports Bitpay](https://bitpay.com/990273/donate)
63 | * **Free Software Foundation**: https://www.fsf.org/about/ways-to-donate
64 | * **Software Freedom Conservancy**: https://sfconservancy.org/donate
65 | * ["helps promote, improve, develop, and defend Free, Libre, and Open Source Software (FLOSS) projects"](https://sfconservancy.org/about/)
66 | * **Mozilla**: https://donate.mozilla.org/de/
67 | * For Germany, there are related organisations which help Free Software indirectly by supporting the underlying values:
68 | * **DigitalCourage**: https://digitalcourage.de/ueber-uns
69 | * "Digitalcourage arbeitet für eine lebenswerte Welt im digitalen Zeitalter."
70 | * "setzt sich seit 1987 für Grundrechte und Datenschutz ein"
71 | * **Forum InformatikerInnen für Frieden und gesellschaftliche Verantwortung e.V.**: https://www.fiff.de
72 | * "FIfF wurde 1984 [...] aus einer historischen Situation heraus gegründet, als es galt, das Schweigen einer Zunft zu brechen, die so maßgeblich an der Entwicklung automatisierter und informatisierter Kriegsführung beteiligt war."
73 |
--------------------------------------------------------------------------------
/native-host/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "native-messaging-host",
3 | "version": "0.2.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "balanced-match": {
8 | "version": "1.0.0",
9 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
10 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
11 | "dev": true
12 | },
13 | "brace-expansion": {
14 | "version": "1.1.8",
15 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
16 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
17 | "dev": true,
18 | "requires": {
19 | "balanced-match": "1.0.0",
20 | "concat-map": "0.0.1"
21 | }
22 | },
23 | "concat-map": {
24 | "version": "0.0.1",
25 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
26 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
27 | "dev": true
28 | },
29 | "fs.realpath": {
30 | "version": "1.0.0",
31 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
32 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
33 | "dev": true
34 | },
35 | "glob": {
36 | "version": "7.1.2",
37 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
38 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
39 | "dev": true,
40 | "requires": {
41 | "fs.realpath": "1.0.0",
42 | "inflight": "1.0.6",
43 | "inherits": "2.0.3",
44 | "minimatch": "3.0.4",
45 | "once": "1.4.0",
46 | "path-is-absolute": "1.0.1"
47 | }
48 | },
49 | "inflight": {
50 | "version": "1.0.6",
51 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
52 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
53 | "dev": true,
54 | "requires": {
55 | "once": "1.4.0",
56 | "wrappy": "1.0.2"
57 | }
58 | },
59 | "inherits": {
60 | "version": "2.0.3",
61 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
62 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
63 | "dev": true
64 | },
65 | "innosetup-compiler": {
66 | "version": "5.5.9",
67 | "resolved": "https://registry.npmjs.org/innosetup-compiler/-/innosetup-compiler-5.5.9.tgz",
68 | "integrity": "sha1-//VhobtJzl07Ez7ot4i1qGj17iE=",
69 | "dev": true
70 | },
71 | "minimatch": {
72 | "version": "3.0.4",
73 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
74 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
75 | "dev": true,
76 | "requires": {
77 | "brace-expansion": "1.1.8"
78 | }
79 | },
80 | "once": {
81 | "version": "1.4.0",
82 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
83 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
84 | "dev": true,
85 | "requires": {
86 | "wrappy": "1.0.2"
87 | }
88 | },
89 | "path-is-absolute": {
90 | "version": "1.0.1",
91 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
92 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
93 | "dev": true
94 | },
95 | "rimraf": {
96 | "version": "2.6.2",
97 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
98 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
99 | "dev": true,
100 | "requires": {
101 | "glob": "7.1.2"
102 | }
103 | },
104 | "wrappy": {
105 | "version": "1.0.2",
106 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
107 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
108 | "dev": true
109 | }
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/test/webserver/index.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | firefox_addon_local_filesystem_links Test Pages
6 |
7 |
8 |
firefox_addon_local_filesystem_links Test pages
9 |
Here you can find pages where you can verify features.
10 |
11 |
12 | NOTE: These test pages should be served by a webserver and
13 | not just double-clicked and opened locally. Otherwise the link
14 | recognition fails and Firefox opens the file links (which it does
15 | not if the page is served by a webserver; thats what the add-on is
16 | for).
17 |
39 | Check and modify whitelist settings by clicking at the addon icon in addon bar and select "Change settings...".
40 | By default all pages are allowed but it's recommended to limit the pages where the addon can add the local link behaviour.
41 |
42 |
43 | Test the addon at your pages or at this Jsfiddle.
44 |
45 |
46 |
47 |
Donations
48 |
If you like the extension and you want to support the development - please consider to donate. Any donations are greatly appreciated.
Why do I get a warning that my computer was protected by Windows? Show answer
53 |
54 |
55 | This warning shouldn't happend anymore because the installer is signed now. If you're getting this warning please report it so we can check the certificate.
56 | You can install the app if you're clicking on show more information and afterwards click on the new button "run anyway".
57 | Below you see that message in Windows 10:
58 |
59 |
60 |
61 | If you're concerned about security then you can do the following to be sure that everything is as usual:
62 |
71 | In previous versions of Firefox (before FF 57) it was possible to access the
72 | local filesystem with the browser API. That's not supported anymore and it
73 | is similar to other browsers (e.g. Chrome has also this restriction).
74 |
75 |
76 | To make this extension possible we need a way to interact with the file system again.
77 | This is possible with a native application that communicates with the browser with an API. It's called native messaging.
78 | The application will use the system file explorer (e.g. on Windows - it's Windows Explorer)
79 | to open the application in your linked application.
80 |
81 |
82 |
Whitelist needs to be according to new schema e.g. *://*.jsfiddle.net/*
83 |
The new format is <scheme>://<host><path> (wildcard char * is possible)
84 | A single * will be replaced with <all_urls> by the extension.
85 | Please have a look at the following docs. for more details about match patterns
86 |
87 |
How can I whitelist a server with a port e.g. servername:8080?
88 |
Just add it with-out the port and it will be correctly handled. e.g. http://servername/*
89 |
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/src/extension/_locales/en/messages.json:
--------------------------------------------------------------------------------
1 | {
2 | "whitelist_title": {
3 | "message": "Enable file link addon for whitelisted URLs",
4 | "description": "Settings title for whitelist"
5 | },
6 | "whitelist_description": {
7 | "message": "Any URLs that are added to the whitelist will enable local file links if you're browsing to that address. * will enable all. Empty will disable all. Multiple URLs are space separated. Wildcards are allowed e.g. *://*.trello.com/*",
8 | "description": "Settings description for whitelist"
9 | },
10 | "enableExecutables_title": {
11 | "message": "Enable links to local executable files",
12 | "description": "Settings title for enable of executable files"
13 | },
14 | "enableExecutables_description": {
15 | "message": "If enabled any progam file can be launched by the addon. (Attention! A malicious site could use this for denial-of-service attack!)",
16 | "description": "Settings description for executable files"
17 | },
18 | "enableLinkIcons_title": {
19 | "message": "Enable link icons",
20 | "description": "Settings title for enable link icons"
21 | },
22 | "enableLinkIcons_description": {
23 | "message": "If checked there will be a link added to every local link",
24 | "description": "Settings description for link icons"
25 | },
26 | "revealOpenOption_title": {
27 | "message": "Default link text click behaviour",
28 | "description": "Settings title for default link click behaviour"
29 | },
30 | "revealOpenOption_description": {
31 | "message": "Changes the default click behaviour of file-links. Default = direct file link open.",
32 | "description": "Settings description for default click behaviour"
33 | },
34 | "revealOpenOption_options_Open": {
35 | "message": "Open link directly",
36 | "description": "Setting open link directly"
37 | },
38 | "revealOpenOption_options_Reveal": {
39 | "message": "Reveal link (open containing folder)",
40 | "description": "Setting reveal link"
41 | },
42 | "revealOpenOption_options_Direct": {
43 | "message": "Open link directly in browser",
44 | "description": "Setting direct open"
45 | },
46 | "retries_on_failure_title": {
47 | "message": "Retries on failure",
48 | "description": "Settings title for retries on failure"
49 | },
50 | "retries_on_failure_description": {
51 | "message": "The number of retries to open a file before an error will be displayed (e.g. file not found will be indicated after all retries failed)",
52 | "description": "Settings description for retries on failure"
53 | },
54 | "ERROR_EXECTUBALES_NOT_ENABLED": {
55 | "message": "You're trying to open an executable file. Please check addon settings to enable executable files and try again.",
56 | "description": "Error message EXE not enabled"
57 | },
58 | "ERROR_BAD_LINK": {
59 | "message": "Couldn't open file $URL$",
60 | "description": "Error message bad link",
61 | "placeholders": {
62 | "url": {
63 | "content": "$1",
64 | "example": "file://"
65 | }
66 | }
67 | },
68 | "INFO_CONFIG_CHANGED_SMB": {
69 | "message": "Configuration changed! SMB links now enabled",
70 | "description": "Info message SMB configured (not used yet)"
71 | },
72 | "LABEL_CONTEXT_MENU_OPEN_LINK": {
73 | "message": "Open link",
74 | "description": "Label text open link"
75 | },
76 | "LABEL_CONTEXT_MENU_OPEN_CONTAINING": {
77 | "message": "Open containing folder",
78 | "description": "Label text open containing folder"
79 | },
80 | "LABEL_CONTEXT_MENU_OPEN_DIRECT": {
81 | "message": "Open in browser",
82 | "description": "Label text open in browser"
83 | },
84 |
85 | "LABEL_CONTEXT_SUB_SELECTION_TITLE": {
86 | "message": "Link addon selection",
87 | "description": "Label text selection in context menu"
88 | },
89 |
90 | "LABEL_CONTEXT_SUB_LINK_TITLE": {
91 | "message": "Link addon",
92 | "description": "Label text context menu item"
93 | },
94 |
95 | "LABEL_ADDONBAR_ICON_HOVER": {
96 | "message": "Local link addon (current tab: $ACTIVE$)",
97 | "description": "Status icon hover text",
98 | "placeholders": {
99 | "active": {
100 | "content": "$1",
101 | "example": "active"
102 | }
103 | }
104 | },
105 |
106 | "LABEL_ADDONBAR_HOVER_STATE_active": {
107 | "message": "active",
108 | "description": "Status text active hover"
109 | },
110 | "LABEL_ADDONBAR_HOVER_STATE_inactive": {
111 | "message": "inactive",
112 | "description": "Status text inactive hover"
113 | },
114 |
115 | "TOOLTIP_OPEN_FOLDER": {
116 | "message": "Open folder",
117 | "description": "Tooltip text open folder"
118 | },
119 | "TOOLTIP_OPEN_LINK": {
120 | "message": "Open link",
121 | "description": "Tooltip text open link"
122 | },
123 | "TOOLTIP_OPEN_IN_BROWSER": {
124 | "message": "Open link in browser",
125 | "description": "Tooltip text open in browser"
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/test/webserver/issue1/issue.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | local_filesystem_links / Test Page / dynamic
6 |
7 |
71 |
72 |
73 | The source of this html page was copied from
74 | here.
75 |