From 9c235509a6c6822d74cc38b575231b29a6ff2e1b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 5 Sep 2015 11:43:30 +0900 Subject: [PATCH] Read guest view's info from WebContentsPreferences --- atom/browser/api/atom_api_web_view_manager.cc | 41 ++--------- atom/browser/atom_browser_client.cc | 68 +++---------------- atom/browser/atom_browser_context.cc | 2 +- atom/browser/lib/guest-view-manager.coffee | 14 ++-- atom/browser/web_contents_preferences.cc | 19 +++++- atom/browser/web_contents_preferences.h | 3 + atom/browser/web_view_manager.cc | 5 +- atom/browser/web_view_manager.h | 37 +--------- 8 files changed, 45 insertions(+), 144 deletions(-) diff --git a/atom/browser/api/atom_api_web_view_manager.cc b/atom/browser/api/atom_api_web_view_manager.cc index 221d0d7118b4..83287ac8b2f1 100644 --- a/atom/browser/api/atom_api_web_view_manager.cc +++ b/atom/browser/api/atom_api_web_view_manager.cc @@ -3,14 +3,12 @@ // found in the LICENSE file. #include "atom/browser/api/atom_api_web_contents.h" -#include "atom/browser/web_view_constants.h" +#include "atom/browser/web_contents_preferences.h" #include "atom/browser/web_view_manager.h" -#include "atom/common/native_mate_converters/gurl_converter.h" +#include "atom/common/native_mate_converters/value_converter.h" +#include "atom/common/node_includes.h" #include "content/public/browser/browser_context.h" #include "native_mate/dictionary.h" -#include "net/base/filename_util.h" - -#include "atom/common/node_includes.h" namespace mate { @@ -26,31 +24,6 @@ struct Converter { } }; -template<> -struct Converter { - static bool FromV8(v8::Isolate* isolate, v8::Local val, - atom::WebViewManager::WebViewInfo* out) { - Dictionary options; - if (!ConvertFromV8(isolate, val, &options)) - return false; - - GURL preload_url; - if (!options.Get(atom::web_view::kPreloadUrl, &preload_url)) - return false; - - if (!preload_url.is_empty() && - !net::FileURLToFilePath(preload_url, &(out->preload_script))) - return false; - - return options.Get(atom::web_view::kNodeIntegration, - &(out->node_integration)) && - options.Get(atom::web_view::kPlugins, &(out->plugins)) && - options.Get(atom::web_view::kPartitionId, &(out->partition_id)) && - options.Get(atom::web_view::kDisableWebSecurity, - &(out->disable_web_security)); - } -}; - } // namespace mate namespace { @@ -69,17 +42,13 @@ void AddGuest(int guest_instance_id, int element_instance_id, content::WebContents* embedder, content::WebContents* guest_web_contents, - atom::WebViewManager::WebViewInfo info) { + const base::DictionaryValue& options) { auto manager = GetWebViewManager(embedder); if (manager) manager->AddGuest(guest_instance_id, element_instance_id, embedder, guest_web_contents); - info.guest_instance_id = guest_instance_id; - info.embedder = embedder; - auto data = new atom::WebViewManager::WebViewInfoUserData(info); - guest_web_contents->SetUserData( - atom::web_view::kWebViewInfoKeyName, data); + atom::WebContentsPreferences::From(guest_web_contents)->Merge(options); } void RemoveGuest(content::WebContents* embedder, int guest_instance_id) { diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index fa9c8fb4abe2..e45caceab01e 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -16,8 +16,6 @@ #include "atom/browser/browser.h" #include "atom/browser/native_window.h" #include "atom/browser/web_contents_preferences.h" -#include "atom/browser/web_view_manager.h" -#include "atom/browser/web_view_constants.h" #include "atom/browser/window_list.h" #include "atom/common/options_switches.h" #include "base/command_line.h" @@ -56,37 +54,6 @@ bool g_suppress_renderer_process_restart = false; // Custom schemes to be registered to standard. std::string g_custom_schemes = ""; -// Find out the owner of the child process according to |process_id|. -enum ProcessOwner { - OWNER_NATIVE_WINDOW, - OWNER_GUEST_WEB_CONTENTS, - OWNER_NONE, // it might be devtools though. -}; - -ProcessOwner GetProcessOwner(int process_id, - NativeWindow** window, - WebViewManager::WebViewInfo* info) { - content::WebContents* web_contents = content::WebContents::FromRenderViewHost( - content::RenderViewHost::FromID(process_id, kDefaultRoutingID)); - if (!web_contents) - return OWNER_NONE; - - // First search for NativeWindow. - *window = NativeWindow::FromWebContents(web_contents); - if (*window) - return OWNER_NATIVE_WINDOW; - - // Then search for guest WebContents. - auto data = static_cast( - web_contents->GetUserData(web_view::kWebViewInfoKeyName)); - if (data) { - *info = data->web_view_info(); - return OWNER_GUEST_WEB_CONTENTS; - } - - return OWNER_NONE; -} - scoped_refptr ImportCertFromFile( const base::FilePath& path) { if (path.empty()) @@ -162,16 +129,7 @@ void AtomBrowserClient::OverrideWebkitPrefs( // Custom preferences of guest page. auto web_contents = content::WebContents::FromRenderViewHost(host); - auto info = static_cast( - web_contents->GetUserData(web_view::kWebViewInfoKeyName)); - if (info) { - prefs->web_security_enabled = !info->web_view_info().disable_web_security; - return; - } - - NativeWindow* window = NativeWindow::FromWebContents(web_contents); - if (window) - WebContentsPreferences::OverrideWebkitPrefs(web_contents, prefs); + WebContentsPreferences::OverrideWebkitPrefs(web_contents, prefs); } std::string AtomBrowserClient::GetApplicationLocale() { @@ -227,24 +185,14 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches( if (ContainsKey(pending_processes_, process_id)) process_id = pending_processes_[process_id]; - NativeWindow* window; - WebViewManager::WebViewInfo info; - ProcessOwner owner = GetProcessOwner(process_id, &window, &info); + // Get the WebContents of the render process. + content::WebContents* web_contents = content::WebContents::FromRenderViewHost( + content::RenderViewHost::FromID(process_id, kDefaultRoutingID)); + if (!web_contents) + return; - if (owner == OWNER_NATIVE_WINDOW) { - WebContentsPreferences::AppendExtraCommandLineSwitches( - window->web_contents(), command_line); - } else if (owner == OWNER_GUEST_WEB_CONTENTS) { - command_line->AppendSwitchASCII( - switches::kGuestInstanceID, base::IntToString(info.guest_instance_id)); - command_line->AppendSwitchASCII( - switches::kNodeIntegration, info.node_integration ? "true" : "false"); - if (info.plugins) - command_line->AppendSwitch(switches::kEnablePlugins); - if (!info.preload_script.empty()) - command_line->AppendSwitchPath( - switches::kPreloadScript, info.preload_script); - } + WebContentsPreferences::AppendExtraCommandLineSwitches( + web_contents, command_line); } void AtomBrowserClient::DidCreatePpapiPlugin( diff --git a/atom/browser/atom_browser_context.cc b/atom/browser/atom_browser_context.cc index 583a6324a8f5..43573b1c7076 100644 --- a/atom/browser/atom_browser_context.cc +++ b/atom/browser/atom_browser_context.cc @@ -150,7 +150,7 @@ AtomBrowserContext::GetDownloadManagerDelegate() { content::BrowserPluginGuestManager* AtomBrowserContext::GetGuestManager() { if (!guest_manager_) - guest_manager_.reset(new WebViewManager(this)); + guest_manager_.reset(new WebViewManager); return guest_manager_.get(); } diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index 581274699085..961da8ad1920 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -132,12 +132,14 @@ attachGuest = (embedder, elementInstanceId, guestInstanceId, params) -> return unless guestInstances[oldGuestInstanceId]? destroyGuest embedder, oldGuestInstanceId - webViewManager.addGuest guestInstanceId, elementInstanceId, embedder, guest, - nodeIntegration: params.nodeintegration - plugins: params.plugins - disableWebSecurity: params.disablewebsecurity - preloadUrl: params.preload ? '' - partitionId: getPartitionId(params.partition) + webPreferences = + 'guest-instance-id': guestInstanceId + 'node-integration': params.nodeintegration ? false + 'plugins': params.plugins + 'web-security': !params.disablewebsecurity + webPreferences['preload-url'] = params.preload if params.preload + webPreferences['partition'] = getPartitionId(params.partition) if params.partition + webViewManager.addGuest guestInstanceId, elementInstanceId, embedder, guest, webPreferences guest.attachParams = params embedderElementsMap[key] = guestInstanceId diff --git a/atom/browser/web_contents_preferences.cc b/atom/browser/web_contents_preferences.cc index 269433e4d6b3..ab7a700cc284 100644 --- a/atom/browser/web_contents_preferences.cc +++ b/atom/browser/web_contents_preferences.cc @@ -44,6 +44,10 @@ WebContentsPreferences::WebContentsPreferences( WebContentsPreferences::~WebContentsPreferences() { } +void WebContentsPreferences::Merge(const base::DictionaryValue& extend) { + web_preferences_.MergeDictionary(&extend); +} + // static WebContentsPreferences* WebContentsPreferences::From( content::WebContents* web_contents) { @@ -55,7 +59,9 @@ WebContentsPreferences* WebContentsPreferences::From( void WebContentsPreferences::AppendExtraCommandLineSwitches( content::WebContents* web_contents, base::CommandLine* command_line) { WebContentsPreferences* self = From(web_contents); - CHECK(self); + if (!self) + return; + base::DictionaryValue& web_preferences = self->web_preferences_; bool b; @@ -110,12 +116,21 @@ void WebContentsPreferences::AppendExtraCommandLineSwitches( zoom_factor != 1.0) command_line->AppendSwitchASCII(switches::kZoomFactor, base::DoubleToString(zoom_factor)); + + // --guest-instance-id, which is used to identify guest WebContents. + int guest_instance_id; + if (web_preferences.GetInteger(switches::kGuestInstanceID, + &guest_instance_id)) + command_line->AppendSwitchASCII(switches::kGuestInstanceID, + base::IntToString(guest_instance_id)); } +// static void WebContentsPreferences::OverrideWebkitPrefs( content::WebContents* web_contents, content::WebPreferences* prefs) { WebContentsPreferences* self = From(web_contents); - CHECK(self); + if (!self) + return; bool b; if (self->web_preferences_.GetBoolean("javascript", &b)) diff --git a/atom/browser/web_contents_preferences.h b/atom/browser/web_contents_preferences.h index a2a63415047d..1053dd9c1087 100644 --- a/atom/browser/web_contents_preferences.h +++ b/atom/browser/web_contents_preferences.h @@ -37,6 +37,9 @@ class WebContentsPreferences base::DictionaryValue&& web_preferences); ~WebContentsPreferences() override; + // $.extend(|web_preferences_|, |new_web_preferences|). + void Merge(const base::DictionaryValue& new_web_preferences); + private: friend class content::WebContentsUserData; diff --git a/atom/browser/web_view_manager.cc b/atom/browser/web_view_manager.cc index 9d0b9337599f..d404c1a43680 100644 --- a/atom/browser/web_view_manager.cc +++ b/atom/browser/web_view_manager.cc @@ -5,13 +5,12 @@ #include "atom/browser/web_view_manager.h" #include "atom/browser/atom_browser_context.h" -#include "atom/browser/atom_browser_main_parts.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" namespace atom { -WebViewManager::WebViewManager(content::BrowserContext* context) { +WebViewManager::WebViewManager() { } WebViewManager::~WebViewManager() { @@ -21,7 +20,6 @@ void WebViewManager::AddGuest(int guest_instance_id, int element_instance_id, content::WebContents* embedder, content::WebContents* web_contents) { - base::AutoLock auto_lock(lock_); web_contents_embedder_map_[guest_instance_id] = { web_contents, embedder }; // Map the element in embedder to guest. @@ -31,7 +29,6 @@ void WebViewManager::AddGuest(int guest_instance_id, } void WebViewManager::RemoveGuest(int guest_instance_id) { - base::AutoLock auto_lock(lock_); if (!ContainsKey(web_contents_embedder_map_, guest_instance_id)) return; diff --git a/atom/browser/web_view_manager.h b/atom/browser/web_view_manager.h index 20c044849720..ff9a8ecba2ab 100644 --- a/atom/browser/web_view_manager.h +++ b/atom/browser/web_view_manager.h @@ -7,45 +7,14 @@ #include -#include "base/files/file_path.h" -#include "base/supports_user_data.h" -#include "base/synchronization/lock.h" #include "content/public/browser/browser_plugin_guest_manager.h" -#include "content/public/browser/site_instance.h" - -namespace content { -class BrowserContext; -class RenderProcessHost; -} namespace atom { class WebViewManager : public content::BrowserPluginGuestManager { public: - struct WebViewInfo { - int guest_instance_id; - content::WebContents* embedder; - bool node_integration; - bool plugins; - bool disable_web_security; - base::FilePath preload_script; - GURL partition_id; - }; - - class WebViewInfoUserData : public base::SupportsUserData::Data { - public: - explicit WebViewInfoUserData(WebViewInfo info) - : web_view_info_(info) {} - ~WebViewInfoUserData() override {} - - WebViewInfo& web_view_info() { return web_view_info_; } - - private: - WebViewInfo web_view_info_; - }; - - explicit WebViewManager(content::BrowserContext* context); - virtual ~WebViewManager(); + WebViewManager(); + ~WebViewManager() override; void AddGuest(int guest_instance_id, int element_instance_id, @@ -90,8 +59,6 @@ class WebViewManager : public content::BrowserPluginGuestManager { // (embedder_process_id, element_instance_id) => guest_instance_id std::map element_instance_id_to_guest_map_; - base::Lock lock_; - DISALLOW_COPY_AND_ASSIGN(WebViewManager); };