| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/extensions/extension_host.h" | 5 #include "chrome/browser/extensions/extension_host.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 // ExtensionHost | 113 // ExtensionHost |
| 114 | 114 |
| 115 ExtensionHost::ExtensionHost(const Extension* extension, | 115 ExtensionHost::ExtensionHost(const Extension* extension, |
| 116 SiteInstance* site_instance, | 116 SiteInstance* site_instance, |
| 117 const GURL& url, | 117 const GURL& url, |
| 118 content::ViewType host_type) | 118 content::ViewType host_type) |
| 119 : extension_(extension), | 119 : extension_(extension), |
| 120 extension_id_(extension->id()), | 120 extension_id_(extension->id()), |
| 121 profile_(Profile::FromBrowserContext( | 121 profile_(Profile::FromBrowserContext( |
| 122 site_instance->browsing_instance()->browser_context())), | 122 site_instance->browsing_instance()->browser_context())), |
| 123 render_view_host_(NULL), |
| 123 did_stop_loading_(false), | 124 did_stop_loading_(false), |
| 124 document_element_available_(false), | 125 document_element_available_(false), |
| 125 initial_url_(url), | 126 initial_url_(url), |
| 126 ALLOW_THIS_IN_INITIALIZER_LIST( | 127 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 127 extension_function_dispatcher_(profile_, this)), | 128 extension_function_dispatcher_(profile_, this)), |
| 128 extension_host_type_(host_type), | 129 extension_host_type_(host_type), |
| 129 associated_tab_contents_(NULL) { | 130 associated_tab_contents_(NULL) { |
| 130 host_contents_.reset(new TabContents( | 131 host_contents_.reset(new TabContents( |
| 131 profile_, site_instance, MSG_ROUTING_NONE, NULL, NULL)); | 132 profile_, site_instance, MSG_ROUTING_NONE, NULL, NULL)); |
| 132 TabContentsObserver::Observe(host_contents_.get()); | 133 TabContentsObserver::Observe(host_contents_.get()); |
| 133 host_contents_->set_delegate(this); | 134 host_contents_->set_delegate(this); |
| 134 host_contents_->set_view_type(host_type); | 135 host_contents_->set_view_type(host_type); |
| 135 | 136 |
| 137 render_view_host_ = host_contents_->render_view_host(); |
| 138 |
| 136 // Listen for when an extension is unloaded from the same profile, as it may | 139 // Listen for when an extension is unloaded from the same profile, as it may |
| 137 // be the same extension that this points to. | 140 // be the same extension that this points to. |
| 138 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, | 141 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 139 content::Source<Profile>(profile_)); | 142 content::Source<Profile>(profile_)); |
| 140 } | 143 } |
| 141 | 144 |
| 142 // This "mock" constructor should only be used by unit tests. | 145 // This "mock" constructor should only be used by unit tests. |
| 143 ExtensionHost::ExtensionHost(const Extension* extension, | 146 ExtensionHost::ExtensionHost(const Extension* extension, |
| 144 content::ViewType host_type) | 147 content::ViewType host_type) |
| 145 : extension_(extension), | 148 : extension_(extension), |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 // TODO(port) | 181 // TODO(port) |
| 179 NOTREACHED(); | 182 NOTREACHED(); |
| 180 #endif | 183 #endif |
| 181 } | 184 } |
| 182 | 185 |
| 183 TabContents* ExtensionHost::GetAssociatedTabContents() const { | 186 TabContents* ExtensionHost::GetAssociatedTabContents() const { |
| 184 return associated_tab_contents_; | 187 return associated_tab_contents_; |
| 185 } | 188 } |
| 186 | 189 |
| 187 content::RenderProcessHost* ExtensionHost::render_process_host() const { | 190 content::RenderProcessHost* ExtensionHost::render_process_host() const { |
| 188 return host_contents()->GetRenderProcessHost(); | 191 return render_view_host()->process(); |
| 189 } | 192 } |
| 190 | 193 |
| 191 RenderViewHost* ExtensionHost::render_view_host() const { | 194 RenderViewHost* ExtensionHost::render_view_host() const { |
| 192 // TODO(mpcomplete): This can be NULL. How do we handle that? | 195 // TODO(mpcomplete): This can be NULL. How do we handle that? |
| 193 return host_contents()->render_view_host(); | 196 return render_view_host_; |
| 194 } | 197 } |
| 195 | 198 |
| 196 bool ExtensionHost::IsRenderViewLive() const { | 199 bool ExtensionHost::IsRenderViewLive() const { |
| 197 return render_view_host()->IsRenderViewLive(); | 200 return render_view_host()->IsRenderViewLive(); |
| 198 } | 201 } |
| 199 | 202 |
| 200 void ExtensionHost::CreateRenderViewSoon() { | 203 void ExtensionHost::CreateRenderViewSoon() { |
| 201 if (render_process_host()->HasConnection()) { | 204 if (render_process_host() && render_process_host()->HasConnection()) { |
| 202 // If the process is already started, go ahead and initialize the RenderView | 205 // If the process is already started, go ahead and initialize the RenderView |
| 203 // synchronously. The process creation is the real meaty part that we want | 206 // synchronously. The process creation is the real meaty part that we want |
| 204 // to defer. | 207 // to defer. |
| 205 CreateRenderViewNow(); | 208 CreateRenderViewNow(); |
| 206 } else { | 209 } else { |
| 207 ProcessCreationQueue::GetInstance()->CreateSoon(this); | 210 ProcessCreationQueue::GetInstance()->CreateSoon(this); |
| 208 } | 211 } |
| 209 } | 212 } |
| 210 | 213 |
| 211 void ExtensionHost::CreateRenderViewNow() { | 214 void ExtensionHost::CreateRenderViewNow() { |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 IPC_MESSAGE_UNHANDLED(handled = false) | 415 IPC_MESSAGE_UNHANDLED(handled = false) |
| 413 IPC_END_MESSAGE_MAP() | 416 IPC_END_MESSAGE_MAP() |
| 414 return handled; | 417 return handled; |
| 415 } | 418 } |
| 416 | 419 |
| 417 void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) { | 420 void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) { |
| 418 extension_function_dispatcher_.Dispatch(params, render_view_host()); | 421 extension_function_dispatcher_.Dispatch(params, render_view_host()); |
| 419 } | 422 } |
| 420 | 423 |
| 421 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { | 424 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { |
| 425 render_view_host_ = render_view_host; |
| 426 |
| 422 if (view_.get()) | 427 if (view_.get()) |
| 423 view_->RenderViewCreated(); | 428 view_->RenderViewCreated(); |
| 424 | 429 |
| 425 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || | 430 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || |
| 426 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) { | 431 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) { |
| 427 render_view_host->EnablePreferredSizeMode(); | 432 render_view_host->EnablePreferredSizeMode(); |
| 428 } | 433 } |
| 429 | 434 |
| 430 // If the host is bound to a browser, then extract its window id. | 435 // If the host is bound to a browser, then extract its window id. |
| 431 // Extensions hosted in ExternalTabContainer objects may not have | 436 // Extensions hosted in ExternalTabContainer objects may not have |
| 432 // an associated browser. | 437 // an associated browser. |
| 433 const Browser* browser = GetBrowser(); | 438 const Browser* browser = GetBrowser(); |
| 434 if (browser) { | 439 if (browser) { |
| 435 render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( | 440 render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( |
| 436 render_view_host->routing_id(), | 441 render_view_host->routing_id(), |
| 437 ExtensionTabUtil::GetWindowId(browser))); | 442 ExtensionTabUtil::GetWindowId(browser))); |
| 438 } | 443 } |
| 439 } | 444 } |
| 440 | 445 |
| 446 void ExtensionHost::RenderViewDeleted(RenderViewHost* render_view_host) { |
| 447 // If our RenderViewHost is deleted, fall back to the host_contents' current |
| 448 // RVH. There is sometimes a small gap between the pending RVH being deleted |
| 449 // and RenderViewCreated being called, so we update it here. |
| 450 if (render_view_host == render_view_host_) |
| 451 render_view_host_ = host_contents_->render_view_host(); |
| 452 } |
| 453 |
| 441 content::JavaScriptDialogCreator* ExtensionHost::GetJavaScriptDialogCreator() { | 454 content::JavaScriptDialogCreator* ExtensionHost::GetJavaScriptDialogCreator() { |
| 442 return GetJavaScriptDialogCreatorInstance(); | 455 return GetJavaScriptDialogCreatorInstance(); |
| 443 } | 456 } |
| 444 | 457 |
| 445 void ExtensionHost::AddNewContents(TabContents* source, | 458 void ExtensionHost::AddNewContents(TabContents* source, |
| 446 TabContents* new_contents, | 459 TabContents* new_contents, |
| 447 WindowOpenDisposition disposition, | 460 WindowOpenDisposition disposition, |
| 448 const gfx::Rect& initial_pos, | 461 const gfx::Rect& initial_pos, |
| 449 bool user_gesture) { | 462 bool user_gesture) { |
| 450 // TODO(mpcomplete): is all this necessary? Maybe we can just call the | 463 // TODO(mpcomplete): is all this necessary? Maybe we can just call the |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 browser->AddTabContents(contents, disposition, initial_pos, user_gesture); | 516 browser->AddTabContents(contents, disposition, initial_pos, user_gesture); |
| 504 } | 517 } |
| 505 | 518 |
| 506 | 519 |
| 507 void ExtensionHost::RenderViewReady() { | 520 void ExtensionHost::RenderViewReady() { |
| 508 content::NotificationService::current()->Notify( | 521 content::NotificationService::current()->Notify( |
| 509 chrome::NOTIFICATION_EXTENSION_HOST_CREATED, | 522 chrome::NOTIFICATION_EXTENSION_HOST_CREATED, |
| 510 content::Source<Profile>(profile_), | 523 content::Source<Profile>(profile_), |
| 511 content::Details<ExtensionHost>(this)); | 524 content::Details<ExtensionHost>(this)); |
| 512 } | 525 } |
| OLD | NEW |