OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/extensions/shell_window.h" | 5 #include "chrome/browser/ui/extensions/shell_window.h" |
6 | 6 |
7 #include "base/memory/singleton.h" | 7 #include "base/memory/singleton.h" |
8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
9 #include "chrome/browser/extensions/extension_process_manager.h" | 9 #include "chrome/browser/extensions/extension_process_manager.h" |
10 #include "chrome/browser/extensions/extension_system.h" | 10 #include "chrome/browser/extensions/extension_system.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 FROM_HERE, | 109 FROM_HERE, |
110 base::Bind(&platform_util::OpenExternal, params.url)); | 110 base::Bind(&platform_util::OpenExternal, params.url)); |
111 #endif | 111 #endif |
112 | 112 |
113 return NULL; | 113 return NULL; |
114 } | 114 } |
115 | 115 |
116 ShellWindow::CreateParams::CreateParams() | 116 ShellWindow::CreateParams::CreateParams() |
117 : frame(ShellWindow::CreateParams::FRAME_CHROME), | 117 : frame(ShellWindow::CreateParams::FRAME_CHROME), |
118 bounds(-1, -1, kDefaultWidth, kDefaultHeight), | 118 bounds(-1, -1, kDefaultWidth, kDefaultHeight), |
119 restore_position(true), restore_size(true) { | 119 restore_position(true), restore_size(true), |
| 120 creator_process_id(0) { |
120 } | 121 } |
121 | 122 |
122 ShellWindow::CreateParams::~CreateParams() { | 123 ShellWindow::CreateParams::~CreateParams() { |
123 } | 124 } |
124 | 125 |
125 ShellWindow* ShellWindow::Create(Profile* profile, | 126 ShellWindow* ShellWindow::Create(Profile* profile, |
126 const extensions::Extension* extension, | 127 const extensions::Extension* extension, |
127 const GURL& url, | 128 const GURL& url, |
128 const ShellWindow::CreateParams& params) { | 129 const ShellWindow::CreateParams& params) { |
129 // This object will delete itself when the window is closed. | 130 // This object will delete itself when the window is closed. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 if (params.restore_position) | 173 if (params.restore_position) |
173 bounds.set_origin(cached_bounds.origin()); | 174 bounds.set_origin(cached_bounds.origin()); |
174 if (params.restore_size) | 175 if (params.restore_size) |
175 bounds.set_size(cached_bounds.size()); | 176 bounds.set_size(cached_bounds.size()); |
176 | 177 |
177 native_window_->SetBounds(bounds); | 178 native_window_->SetBounds(bounds); |
178 } | 179 } |
179 } | 180 } |
180 } | 181 } |
181 | 182 |
182 | 183 // If the new view is in the same process as the creator, block the created |
183 // Block the created RVH from loading anything until the background page | 184 // RVH from loading anything until the background page has had a chance to do |
184 // has had a chance to do any initialization it wants. | 185 // any initialization it wants. If it's a different process, the new RVH |
185 SuspendRenderViewHost(web_contents_->GetRenderViewHost()); | 186 // shouldn't communicate with the background page anyway (e.g. sandboxed). |
| 187 if (web_contents_->GetRenderViewHost()->GetProcess()->GetID() == |
| 188 params.creator_process_id) { |
| 189 SuspendRenderViewHost(web_contents_->GetRenderViewHost()); |
| 190 } else { |
| 191 VLOG(1) << "ShellWindow created in new process (" |
| 192 << web_contents_->GetRenderViewHost()->GetProcess()->GetID() |
| 193 << ") != creator (" << params.creator_process_id |
| 194 << "). Routing disabled."; |
| 195 } |
186 | 196 |
187 // TODO(jeremya): there's a bug where navigating a web contents to an | 197 // TODO(jeremya): there's a bug where navigating a web contents to an |
188 // extension URL causes it to create a new RVH and discard the old (perfectly | 198 // extension URL causes it to create a new RVH and discard the old (perfectly |
189 // usable) one. To work around this, we watch for a RVH_CHANGED message from | 199 // usable) one. To work around this, we watch for a RVH_CHANGED message from |
190 // the web contents (which will be sent during LoadURL) and suspend resource | 200 // the web contents (which will be sent during LoadURL) and suspend resource |
191 // requests on the new RVH to ensure that we block the new RVH from loading | 201 // requests on the new RVH to ensure that we block the new RVH from loading |
192 // anything. It should be okay to remove the NOTIFICATION_RVH_CHANGED | 202 // anything. It should be okay to remove the NOTIFICATION_RVH_CHANGED |
193 // registration once http://crbug.com/123007 is fixed. | 203 // registration once http://crbug.com/123007 is fixed. |
194 registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED, | 204 registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED, |
195 content::Source<content::NavigationController>( | 205 content::Source<content::NavigationController>( |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 shell_window_geometry_cache(); | 543 shell_window_geometry_cache(); |
534 | 544 |
535 gfx::Rect bounds = native_window_->GetBounds(); | 545 gfx::Rect bounds = native_window_->GetBounds(); |
536 cache->SaveGeometry(extension()->id(), window_key_, bounds); | 546 cache->SaveGeometry(extension()->id(), window_key_, bounds); |
537 } | 547 } |
538 | 548 |
539 void ShellWindow::SetExternalUrlControllerForTesting( | 549 void ShellWindow::SetExternalUrlControllerForTesting( |
540 content::WebContentsDelegate* controller) { | 550 content::WebContentsDelegate* controller) { |
541 url_controller_for_test_ = controller; | 551 url_controller_for_test_ = controller; |
542 } | 552 } |
OLD | NEW |