diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index cfc8304d0611..e06d2b2419b3 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -85,7 +85,7 @@ v8::Persistent template_; // Get the window that has the |guest| embedded. NativeWindow* GetWindowFromGuest(const content::WebContents* guest) { WebViewManager::WebViewInfo info; - if (WebViewManager::GetInfoForProcess(guest->GetRenderProcessHost(), &info)) + if (WebViewManager::GetInfoForWebContents(guest, &info)) return NativeWindow::FromWebContents(info.embedder); else return nullptr; diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index f987cec5ac5e..50a851bb5248 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -31,33 +31,38 @@ namespace atom { namespace { +// The default routing id of WebContents, since in Electron a WebContents +// always owns its own RenderProcessHost, this ID is same for every WebContents. +int kDefaultRoutingID = 2; + // Next navigation should not restart renderer process. bool g_suppress_renderer_process_restart = false; +// Returns the WebContents from process. +inline content::WebContents* GetWebContentsFromProcess(int process_id) { + return content::WebContents::FromRenderViewHost( + content::RenderViewHost::FromID(process_id, kDefaultRoutingID)); +} + // Find out the owner of the child process according to child_process_id. -enum ChildProcessOwner { +enum WebContentsOwner { OWNER_NATIVE_WINDOW, OWNER_GUEST_WEB_CONTENTS, OWNER_NONE, // it might be devtools though. }; -ChildProcessOwner GetChildProcessOwner(int process_id, - NativeWindow** window, - WebViewManager::WebViewInfo* info) { +WebContentsOwner GetWebContentsOwner(content::WebContents* web_contents, + NativeWindow** window, + WebViewManager::WebViewInfo* info) { // First search for NativeWindow. - for (auto native_window : *WindowList::GetInstance()) { - content::WebContents* web_contents = native_window->GetWebContents(); - if (web_contents && - process_id == web_contents->GetRenderProcessHost()->GetID()) { + for (auto native_window : *WindowList::GetInstance()) + if (web_contents == native_window->GetWebContents()) { *window = native_window; return OWNER_NATIVE_WINDOW; } - } // Then search for guest WebContents. - auto process = content::RenderProcessHost::FromID(process_id); - if (WebViewManager::GetInfoForProcess(process, info)) { + if (WebViewManager::GetInfoForWebContents(web_contents, info)) return OWNER_GUEST_WEB_CONTENTS; - } return OWNER_NONE; } @@ -69,8 +74,7 @@ void AtomBrowserClient::SuppressRendererProcessRestartForOnce() { g_suppress_renderer_process_restart = true; } -AtomBrowserClient::AtomBrowserClient() - : dying_render_process_(nullptr) { +AtomBrowserClient::AtomBrowserClient() { } AtomBrowserClient::~AtomBrowserClient() { @@ -148,9 +152,6 @@ void AtomBrowserClient::OverrideSiteInstanceForNavigation( if (url.SchemeIs(url::kJavaScriptScheme)) return; - if (current_instance->HasProcess()) - dying_render_process_ = current_instance->GetProcess(); - *new_instance = content::SiteInstance::CreateForURL(browser_context, url); } @@ -161,20 +162,16 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches( if (process_type != "renderer") return; + auto web_contents = GetWebContentsFromProcess(process_id); + if (!web_contents) + return; + NativeWindow* window; WebViewManager::WebViewInfo info; - ChildProcessOwner owner = GetChildProcessOwner(process_id, &window, &info); - - // If the render process is a newly started one, which means the owner still - // uses the old going-to-be-swapped render process, then we try to find the - // owner from the swapped render process. - if (owner == OWNER_NONE) { - process_id = dying_render_process_->GetID(); - owner = GetChildProcessOwner(process_id, &window, &info); - } + WebContentsOwner owner = GetWebContentsOwner(web_contents, &window, &info); if (owner == OWNER_NATIVE_WINDOW) { - window->AppendExtraCommandLineSwitches(command_line, process_id); + window->AppendExtraCommandLineSwitches(command_line); } else if (owner == OWNER_GUEST_WEB_CONTENTS) { command_line->AppendSwitchASCII( switches::kGuestInstanceID, base::IntToString(info.guest_instance_id)); @@ -186,8 +183,6 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches( command_line->AppendSwitchPath( switches::kPreloadScript, info.preload_script); } - - dying_render_process_ = nullptr; } void AtomBrowserClient::DidCreatePpapiPlugin( diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index a505daaea5cc..6aebc3128a48 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -46,9 +46,6 @@ class AtomBrowserClient : public brightray::BrowserClient { brightray::BrowserMainParts* OverrideCreateBrowserMainParts( const content::MainFunctionParams&) override; - // The render process which would be swapped out soon. - content::RenderProcessHost* dying_render_process_; - DISALLOW_COPY_AND_ASSIGN(AtomBrowserClient); }; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 7fb0de344472..01916781ee6d 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -422,7 +422,7 @@ content::WebContents* NativeWindow::GetDevToolsWebContents() const { } void NativeWindow::AppendExtraCommandLineSwitches( - base::CommandLine* command_line, int child_process_id) { + base::CommandLine* command_line) { // Append --node-integration to renderer process. command_line->AppendSwitchASCII(switches::kNodeIntegration, node_integration_ ? "true" : "false"); diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index ce829c71b533..8f9d8e95a34e 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -192,8 +192,7 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, content::WebContents* GetDevToolsWebContents() const; // Called when renderer process is going to be started. - void AppendExtraCommandLineSwitches(base::CommandLine* command_line, - int child_process_id); + void AppendExtraCommandLineSwitches(base::CommandLine* command_line); void OverrideWebkitPrefs(content::WebPreferences* prefs); // Set fullscreen mode triggered by html api. diff --git a/atom/browser/web_view_manager.cc b/atom/browser/web_view_manager.cc index 0ce31ffe0c8c..7dba6c06dd38 100644 --- a/atom/browser/web_view_manager.cc +++ b/atom/browser/web_view_manager.cc @@ -12,10 +12,9 @@ namespace atom { namespace { -WebViewManager* GetManagerFromProcess(content::RenderProcessHost* process) { - if (!process) - return nullptr; - auto context = process->GetBrowserContext(); +WebViewManager* GetManagerFromWebContents( + const content::WebContents* web_contents) { + auto context = web_contents->GetBrowserContext(); if (!context) return nullptr; return static_cast(context->GetGuestManager()); @@ -24,24 +23,9 @@ WebViewManager* GetManagerFromProcess(content::RenderProcessHost* process) { } // namespace // static -bool WebViewManager::GetInfoForProcess(content::RenderProcessHost* process, - WebViewInfo* info) { - auto manager = GetManagerFromProcess(process); - if (!manager) - return false; - base::AutoLock auto_lock(manager->lock_); - for (auto iter : manager->webview_info_map_) - if (iter.first->GetRenderProcessHost() == process) { - *info = iter.second; - return true; - } - return false; -} - -// static -bool WebViewManager::GetInfoForWebContents(content::WebContents* web_contents, - WebViewInfo* info) { - auto manager = GetManagerFromProcess(web_contents->GetRenderProcessHost()); +bool WebViewManager::GetInfoForWebContents( + const content::WebContents* web_contents, WebViewInfo* info) { + auto manager = GetManagerFromWebContents(web_contents); if (!manager) return false; base::AutoLock auto_lock(manager->lock_); diff --git a/atom/browser/web_view_manager.h b/atom/browser/web_view_manager.h index 24a33fb6221d..b1bea92702cc 100644 --- a/atom/browser/web_view_manager.h +++ b/atom/browser/web_view_manager.h @@ -29,13 +29,9 @@ class WebViewManager : public content::BrowserPluginGuestManager { base::FilePath preload_script; }; - // Finds the WebViewManager attached with |process| and returns the + // Finds the WebViewManager attached with |web_contents| and returns the // WebViewInfo of it. - static bool GetInfoForProcess(content::RenderProcessHost* process, - WebViewInfo* info); - - // Same with GetInfoForProcess but search for |web_contents| instead. - static bool GetInfoForWebContents(content::WebContents* web_contents, + static bool GetInfoForWebContents(const content::WebContents* web_contents, WebViewInfo* info); explicit WebViewManager(content::BrowserContext* context); @@ -85,7 +81,7 @@ class WebViewManager : public content::BrowserPluginGuestManager { // (embedder_process_id, element_instance_id) => guest_instance_id std::map element_instance_id_to_guest_map_; - typedef std::map WebViewInfoMap; + typedef std::map WebViewInfoMap; // web_contents => (guest_instance_id, embedder, ...) WebViewInfoMap webview_info_map_;