From ad0c86db7a64173840b89cae5750e5d590965124 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Wed, 24 Aug 2016 05:46:54 +0530 Subject: [PATCH 1/4] register custom schemes to access files through filesystem api --- atom/browser/atom_browser_client.cc | 18 +++++++++++++++++- atom/browser/atom_browser_client.h | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index 323acdd9b370..87f18316a664 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -23,8 +23,9 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/stl_util.h" -#include "base/strings/string_util.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" #include "chrome/browser/printing/printing_message_filter.h" #include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" #include "chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.h" @@ -279,6 +280,21 @@ bool AtomBrowserClient::CanCreateWindow( return false; } +void AtomBrowserClient::GetAdditionalAllowedSchemesForFileSystem( + std::vector* additional_schemes) { + // Parse --standard-schemes=scheme1,scheme2 + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + std::string custom_schemes = command_line->GetSwitchValueASCII( + switches::kStandardSchemes); + if (!custom_schemes.empty()) { + std::vector schemes_list = base::SplitString( + custom_schemes, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); + additional_schemes->insert(additional_schemes->end(), + schemes_list.begin(), + schemes_list.end()); + } +} + brightray::BrowserMainParts* AtomBrowserClient::OverrideCreateBrowserMainParts( const content::MainFunctionParams&) { v8::V8::Initialize(); // Init V8 before creating main parts. diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index a61706534aa8..e5ccb7961c32 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -94,6 +94,8 @@ class AtomBrowserClient : public brightray::BrowserClient, int opener_render_view_id, int opener_render_frame_id, bool* no_javascript_access) override; + void GetAdditionalAllowedSchemesForFileSystem( + std::vector* schemes) override; // brightray::BrowserClient: brightray::BrowserMainParts* OverrideCreateBrowserMainParts( From ae297760affd631aa4f011b597f933eae4ad109b Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Wed, 24 Aug 2016 06:53:14 +0530 Subject: [PATCH 2/4] add spec and docs --- docs/api/protocol.md | 7 ++++--- spec/api-protocol-spec.js | 15 ++++++++++++++- spec/fixtures/pages/filesystem.html | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 spec/fixtures/pages/filesystem.html diff --git a/docs/api/protocol.md b/docs/api/protocol.md index 97e37d3c4ba2..7000b4f2a874 100644 --- a/docs/api/protocol.md +++ b/docs/api/protocol.md @@ -47,9 +47,10 @@ non-standard schemes can not recognize relative URLs: ``` - -So if you want to register a custom protocol to replace the `http` protocol, you -have to register it as standard scheme: +Registering a scheme as standard, will allow access of files through +the FileSystem API. Otherwise the renderer will throw a security error for the +scheme. So in general if you want to register a custom protocol to replace the +`http` protocol, you have to register it as standard scheme: ```javascript const {app, protocol} = require('electron') diff --git a/spec/api-protocol-spec.js b/spec/api-protocol-spec.js index b27663590aa5..5caec616201d 100644 --- a/spec/api-protocol-spec.js +++ b/spec/api-protocol-spec.js @@ -4,7 +4,7 @@ const path = require('path') const qs = require('querystring') const {closeWindow} = require('./window-helpers') const remote = require('electron').remote -const {BrowserWindow, protocol, webContents} = remote +const {BrowserWindow, ipcMain, protocol, webContents} = remote describe('protocol module', function () { var protocolName = 'sp' @@ -965,5 +965,18 @@ describe('protocol module', function () { w.loadURL(origin) }) }) + + it('can access files through FileSystem API', function (done) { + let filePath = path.join(__dirname, 'fixtures', 'pages', 'filesystem.html') + const handler = function (request, callback) { + callback({path: filePath}) + } + protocol.registerFileProtocol(standardScheme, handler, function (error) { + if (error) return done(error) + w.loadURL(origin) + }) + ipcMain.once('file-system-error', (event, err) => done(err)) + ipcMain.once('file-system-write-end', () => done()) + }) }) }) diff --git a/spec/fixtures/pages/filesystem.html b/spec/fixtures/pages/filesystem.html new file mode 100644 index 000000000000..f8555c56340f --- /dev/null +++ b/spec/fixtures/pages/filesystem.html @@ -0,0 +1,24 @@ + From 62cb8428fbd4ba70e5449aa19cbdaf0dba79fb78 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Wed, 24 Aug 2016 20:22:35 +0530 Subject: [PATCH 3/4] use schemes from global instead of commandline --- atom/browser/atom_browser_client.cc | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index 87f18316a664..80951e7d6e82 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -9,6 +9,7 @@ #endif #include "atom/browser/api/atom_api_app.h" +#include "atom/browser/api/atom_api_protocol.h" #include "atom/browser/atom_access_token_store.h" #include "atom/browser/atom_browser_context.h" #include "atom/browser/atom_browser_main_parts.h" @@ -24,7 +25,6 @@ #include "base/files/file_util.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" -#include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "chrome/browser/printing/printing_message_filter.h" #include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" @@ -282,17 +282,11 @@ bool AtomBrowserClient::CanCreateWindow( void AtomBrowserClient::GetAdditionalAllowedSchemesForFileSystem( std::vector* additional_schemes) { - // Parse --standard-schemes=scheme1,scheme2 - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - std::string custom_schemes = command_line->GetSwitchValueASCII( - switches::kStandardSchemes); - if (!custom_schemes.empty()) { - std::vector schemes_list = base::SplitString( - custom_schemes, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); + auto schemes_list = api::GetStandardSchemes(); + if (!schemes_list.empty()) additional_schemes->insert(additional_schemes->end(), schemes_list.begin(), schemes_list.end()); - } } brightray::BrowserMainParts* AtomBrowserClient::OverrideCreateBrowserMainParts( From 4ce2c221c9697a147253a28eae1d99ab03760c83 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 24 Aug 2016 09:03:44 -0700 Subject: [PATCH 4/4] Minor doc edits and link to MDN page --- docs/api/protocol.md | 10 ++++++---- spec/api-protocol-spec.js | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/api/protocol.md b/docs/api/protocol.md index 7000b4f2a874..853cb6aba032 100644 --- a/docs/api/protocol.md +++ b/docs/api/protocol.md @@ -47,10 +47,11 @@ non-standard schemes can not recognize relative URLs: ``` -Registering a scheme as standard, will allow access of files through -the FileSystem API. Otherwise the renderer will throw a security error for the -scheme. So in general if you want to register a custom protocol to replace the -`http` protocol, you have to register it as standard scheme: + +Registering a scheme as standard will allow access to files through the +[FileSystem API][file-system-api]. Otherwise the renderer will throw a security +error for the scheme. So in general if you want to register a custom protocol to +replace the `http` protocol, you have to register it as a standard scheme: ```javascript const {app, protocol} = require('electron') @@ -229,3 +230,4 @@ which sends a new HTTP request as a response. Remove the interceptor installed for `scheme` and restore its original handler. [net-error]: https://code.google.com/p/chromium/codesearch#chromium/src/net/base/net_error_list.h +[file-system-api]: https://developer.mozilla.org/en-US/docs/Web/API/LocalFileSystem diff --git a/spec/api-protocol-spec.js b/spec/api-protocol-spec.js index 5caec616201d..d831734a2bf8 100644 --- a/spec/api-protocol-spec.js +++ b/spec/api-protocol-spec.js @@ -966,7 +966,7 @@ describe('protocol module', function () { }) }) - it('can access files through FileSystem API', function (done) { + it('can access files through the FileSystem API', function (done) { let filePath = path.join(__dirname, 'fixtures', 'pages', 'filesystem.html') const handler = function (request, callback) { callback({path: filePath})