Load the "preload" script in <webview>

This commit is contained in:
Cheng Zhao 2014-11-06 15:13:37 +08:00
parent 8d8bfcd120
commit 217b1afe87
8 changed files with 24 additions and 3 deletions

View file

@ -156,6 +156,10 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches(
info.node_integration ? "true" : "false"); info.node_integration ? "true" : "false");
if (info.plugins) if (info.plugins)
command_line->AppendSwitch(switches::kEnablePlugins); command_line->AppendSwitch(switches::kEnablePlugins);
if (!info.preload_script.empty())
command_line->AppendSwitchPath(
switches::kPreloadScript,
info.preload_script);
} }
} }

View file

@ -33,7 +33,8 @@ createGuest = (embedder, params) ->
guestInstanceId: id guestInstanceId: id
storagePartitionId: params.storagePartitionId storagePartitionId: params.storagePartitionId
guestInstances[id] = {guest, embedder} guestInstances[id] = {guest, embedder}
webViewManager.addGuest id, embedder, guest, params.nodeIntegration, params.plugins preload = params.preload ? ''
webViewManager.addGuest id, embedder, guest, params.nodeIntegration, params.plugins, preload
# Destroy guest when the embedder is gone. # Destroy guest when the embedder is gone.
embedder.once 'render-view-deleted', -> embedder.once 'render-view-deleted', ->

View file

@ -7,12 +7,14 @@
#include "atom/browser/api/atom_api_web_contents.h" #include "atom/browser/api/atom_api_web_contents.h"
#include "atom/browser/atom_browser_context.h" #include "atom/browser/atom_browser_context.h"
#include "atom/browser/web_view/web_view_renderer_state.h" #include "atom/browser/web_view/web_view_renderer_state.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "native_mate/dictionary.h" #include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h" #include "native_mate/object_template_builder.h"
#include "net/base/filename_util.h"
#include "atom/common/node_includes.h" #include "atom/common/node_includes.h"
@ -44,12 +46,14 @@ void WebViewManager::AddGuest(int guest_instance_id,
content::WebContents* embedder, content::WebContents* embedder,
content::WebContents* web_contents, content::WebContents* web_contents,
bool node_integration, bool node_integration,
bool plugins) { bool plugins,
const GURL& preload_url) {
web_contents_map_[guest_instance_id] = { web_contents, embedder }; web_contents_map_[guest_instance_id] = { web_contents, embedder };
WebViewRendererState::WebViewInfo web_view_info = { WebViewRendererState::WebViewInfo web_view_info = {
guest_instance_id, node_integration, plugins guest_instance_id, node_integration, plugins
}; };
net::FileURLToFilePath(preload_url, &web_view_info.preload_script);
content::BrowserThread::PostTask( content::BrowserThread::PostTask(
content::BrowserThread::IO, content::BrowserThread::IO,
FROM_HERE, FROM_HERE,

View file

@ -24,7 +24,8 @@ class WebViewManager : public content::BrowserPluginGuestManager {
content::WebContents* embedder, content::WebContents* embedder,
content::WebContents* web_contents, content::WebContents* web_contents,
bool node_integration, bool node_integration,
bool plugins); bool plugins,
const GURL& preload_url);
void RemoveGuest(int guest_instance_id); void RemoveGuest(int guest_instance_id);
protected: protected:

View file

@ -9,6 +9,7 @@
#include <string> #include <string>
#include <utility> #include <utility>
#include "base/files/file_path.h"
#include "base/memory/singleton.h" #include "base/memory/singleton.h"
namespace atom { namespace atom {
@ -23,6 +24,7 @@ class WebViewRendererState {
int guest_instance_id; int guest_instance_id;
bool node_integration; bool node_integration;
bool plugins; bool plugins;
base::FilePath preload_script;
}; };
static WebViewRendererState* GetInstance(); static WebViewRendererState* GetInstance();

View file

@ -66,6 +66,9 @@ const char kEnablePlugins[] = "enable-plugins";
// Instancd ID of guest WebContents. // Instancd ID of guest WebContents.
const char kGuestInstanceID[] = "guest-instance-id"; const char kGuestInstanceID[] = "guest-instance-id";
// Script that will be loaded by guest WebContents before other scripts.
const char kPreloadScript[] = "preload-script";
// Web runtime features. // Web runtime features.
const char kExperimentalFeatures[] = "experimental-features"; const char kExperimentalFeatures[] = "experimental-features";
const char kExperimentalCanvasFeatures[] = "experimental-canvas-features"; const char kExperimentalCanvasFeatures[] = "experimental-canvas-features";

View file

@ -38,6 +38,7 @@ extern const char kDarkTheme[];
extern const char kDirectWrite[]; extern const char kDirectWrite[];
extern const char kEnablePlugins[]; extern const char kEnablePlugins[];
extern const char kGuestInstanceID[]; extern const char kGuestInstanceID[];
extern const char kPreloadScript[];
extern const char kExperimentalFeatures[]; extern const char kExperimentalFeatures[];
extern const char kExperimentalCanvasFeatures[]; extern const char kExperimentalCanvasFeatures[];

View file

@ -31,6 +31,8 @@ for arg in process.argv
require('web-frame').setName 'ATOM_SHELL_GUEST_WEB_VIEW' require('web-frame').setName 'ATOM_SHELL_GUEST_WEB_VIEW'
else if arg.indexOf('--node-integration=') == 0 else if arg.indexOf('--node-integration=') == 0
nodeIntegration = arg.substr arg.indexOf('=') + 1 nodeIntegration = arg.substr arg.indexOf('=') + 1
else if arg.indexOf('--preload-script=') == 0
preloadScript = arg.substr arg.indexOf('=') + 1
if location.protocol is 'chrome-devtools:' if location.protocol is 'chrome-devtools:'
# Override some inspector APIs. # Override some inspector APIs.
@ -86,3 +88,6 @@ else
delete global.process delete global.process
delete global.setImmediate delete global.setImmediate
delete global.clearImmediate delete global.clearImmediate
# Load the script specfied by the "preload" attribute.
require preloadScript if preloadScript