| 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/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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 view_->Init(); | 170 view_->Init(); |
| 171 #elif defined(TOOLKIT_GTK) | 171 #elif defined(TOOLKIT_GTK) |
| 172 view_.reset(new ExtensionViewGtk(this, browser)); | 172 view_.reset(new ExtensionViewGtk(this, browser)); |
| 173 view_->Init(); | 173 view_->Init(); |
| 174 #else | 174 #else |
| 175 // TODO(port) | 175 // TODO(port) |
| 176 NOTREACHED(); | 176 NOTREACHED(); |
| 177 #endif | 177 #endif |
| 178 } | 178 } |
| 179 | 179 |
| 180 void ExtensionHost::CreateViewWithoutBrowser() { | |
| 181 CreateView(NULL); | |
| 182 } | |
| 183 | |
| 184 WebContents* ExtensionHost::GetAssociatedWebContents() const { | 180 WebContents* ExtensionHost::GetAssociatedWebContents() const { |
| 185 return associated_web_contents_; | 181 return associated_web_contents_; |
| 186 } | 182 } |
| 187 | 183 |
| 188 void ExtensionHost::SetAssociatedWebContents( | 184 void ExtensionHost::SetAssociatedWebContents( |
| 189 content::WebContents* web_contents) { | 185 content::WebContents* web_contents) { |
| 190 associated_web_contents_ = web_contents; | 186 associated_web_contents_ = web_contents; |
| 191 if (web_contents) { | 187 if (web_contents) { |
| 192 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 188 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| 193 content::Source<WebContents>(associated_web_contents_)); | 189 content::Source<WebContents>(associated_web_contents_)); |
| 194 } | 190 } |
| 195 } | 191 } |
| 196 | 192 |
| 197 | |
| 198 content::RenderProcessHost* ExtensionHost::render_process_host() const { | 193 content::RenderProcessHost* ExtensionHost::render_process_host() const { |
| 199 return render_view_host()->GetProcess(); | 194 return render_view_host()->GetProcess(); |
| 200 } | 195 } |
| 201 | 196 |
| 202 RenderViewHost* ExtensionHost::render_view_host() const { | 197 RenderViewHost* ExtensionHost::render_view_host() const { |
| 203 // TODO(mpcomplete): This can be NULL. How do we handle that? | 198 // TODO(mpcomplete): This can be NULL. How do we handle that? |
| 204 return render_view_host_; | 199 return render_view_host_; |
| 205 } | 200 } |
| 206 | 201 |
| 207 bool ExtensionHost::IsRenderViewLive() const { | 202 bool ExtensionHost::IsRenderViewLive() const { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 } | 281 } |
| 287 break; | 282 break; |
| 288 default: | 283 default: |
| 289 NOTREACHED() << "Unexpected notification sent."; | 284 NOTREACHED() << "Unexpected notification sent."; |
| 290 break; | 285 break; |
| 291 } | 286 } |
| 292 } | 287 } |
| 293 | 288 |
| 294 void ExtensionHost::ResizeDueToAutoResize(WebContents* source, | 289 void ExtensionHost::ResizeDueToAutoResize(WebContents* source, |
| 295 const gfx::Size& new_size) { | 290 const gfx::Size& new_size) { |
| 296 if (view_.get()) | 291 if (view()) |
| 297 view_->ResizeDueToAutoResize(new_size); | 292 view()->ResizeDueToAutoResize(new_size); |
| 298 } | 293 } |
| 299 | 294 |
| 300 void ExtensionHost::RenderViewGone(base::TerminationStatus status) { | 295 void ExtensionHost::RenderViewGone(base::TerminationStatus status) { |
| 301 // During browser shutdown, we may use sudden termination on an extension | 296 // During browser shutdown, we may use sudden termination on an extension |
| 302 // process, so it is expected to lose our connection to the render view. | 297 // process, so it is expected to lose our connection to the render view. |
| 303 // Do nothing. | 298 // Do nothing. |
| 304 if (browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) | 299 if (browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) |
| 305 return; | 300 return; |
| 306 | 301 |
| 307 // In certain cases, multiple ExtensionHost objects may have pointed to | 302 // In certain cases, multiple ExtensionHost objects may have pointed to |
| (...skipping 23 matching lines...) Expand all Loading... |
| 331 | 326 |
| 332 render_view_host()->InsertCSS(string16(), css.as_string()); | 327 render_view_host()->InsertCSS(string16(), css.as_string()); |
| 333 } | 328 } |
| 334 | 329 |
| 335 void ExtensionHost::DidStopLoading() { | 330 void ExtensionHost::DidStopLoading() { |
| 336 bool notify = !did_stop_loading_; | 331 bool notify = !did_stop_loading_; |
| 337 did_stop_loading_ = true; | 332 did_stop_loading_ = true; |
| 338 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || | 333 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || |
| 339 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || | 334 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || |
| 340 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || | 335 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || |
| 341 extension_host_type_ == chrome::VIEW_TYPE_APP_SHELL || | |
| 342 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 336 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |
| 343 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) | 337 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) |
| 344 if (view_.get()) | 338 if (view()) |
| 345 view_->DidStopLoading(); | 339 view()->DidStopLoading(); |
| 346 #endif | 340 #endif |
| 347 } | 341 } |
| 348 if (notify) { | 342 if (notify) { |
| 349 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { | 343 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
| 350 UMA_HISTOGRAM_TIMES("Extensions.BackgroundPageLoadTime", | 344 UMA_HISTOGRAM_TIMES("Extensions.BackgroundPageLoadTime", |
| 351 since_created_.Elapsed()); | 345 since_created_.Elapsed()); |
| 352 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG) { | 346 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG) { |
| 353 UMA_HISTOGRAM_TIMES("Extensions.DialogLoadTime", | 347 UMA_HISTOGRAM_TIMES("Extensions.DialogLoadTime", |
| 354 since_created_.Elapsed()); | 348 since_created_.Elapsed()); |
| 355 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP) { | 349 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP) { |
| 356 UMA_HISTOGRAM_TIMES("Extensions.PopupLoadTime", | 350 UMA_HISTOGRAM_TIMES("Extensions.PopupLoadTime", |
| 357 since_created_.Elapsed()); | 351 since_created_.Elapsed()); |
| 358 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) { | 352 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) { |
| 359 UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime", | 353 UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime", |
| 360 since_created_.Elapsed()); | 354 since_created_.Elapsed()); |
| 361 } else if (extension_host_type_ == chrome::VIEW_TYPE_APP_SHELL) { | |
| 362 UMA_HISTOGRAM_TIMES("Extensions.ShellLoadTime", since_created_.Elapsed()); | |
| 363 } else if (extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 355 } else if (extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |
| 364 UMA_HISTOGRAM_TIMES("Extensions.PanelLoadTime", since_created_.Elapsed()); | 356 UMA_HISTOGRAM_TIMES("Extensions.PanelLoadTime", since_created_.Elapsed()); |
| 365 } | 357 } |
| 366 | 358 |
| 367 // Send the notification last, because it might result in this being | 359 // Send the notification last, because it might result in this being |
| 368 // deleted. | 360 // deleted. |
| 369 content::NotificationService::current()->Notify( | 361 content::NotificationService::current()->Notify( |
| 370 chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, | 362 chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, |
| 371 content::Source<Profile>(profile_), | 363 content::Source<Profile>(profile_), |
| 372 content::Details<ExtensionHost>(this)); | 364 content::Details<ExtensionHost>(this)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 399 content::Source<Profile>(profile_), | 391 content::Source<Profile>(profile_), |
| 400 content::Details<ExtensionHost>(this)); | 392 content::Details<ExtensionHost>(this)); |
| 401 } | 393 } |
| 402 | 394 |
| 403 void ExtensionHost::CloseContents(WebContents* contents) { | 395 void ExtensionHost::CloseContents(WebContents* contents) { |
| 404 // TODO(mpcomplete): is this check really necessary? | 396 // TODO(mpcomplete): is this check really necessary? |
| 405 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || | 397 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || |
| 406 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || | 398 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || |
| 407 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE || | 399 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE || |
| 408 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || | 400 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || |
| 409 extension_host_type_ == chrome::VIEW_TYPE_APP_SHELL || | |
| 410 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 401 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |
| 411 Close(); | 402 Close(); |
| 412 } | 403 } |
| 413 } | 404 } |
| 414 | 405 |
| 415 bool ExtensionHost::ShouldSuppressDialogs() { | |
| 416 return extension_->is_platform_app(); | |
| 417 } | |
| 418 | |
| 419 void ExtensionHost::WillRunJavaScriptDialog() { | 406 void ExtensionHost::WillRunJavaScriptDialog() { |
| 420 ExtensionProcessManager* pm = | 407 ExtensionProcessManager* pm = |
| 421 ExtensionSystem::Get(profile_)->process_manager(); | 408 ExtensionSystem::Get(profile_)->process_manager(); |
| 422 if (pm) | 409 if (pm) |
| 423 pm->IncrementLazyKeepaliveCount(extension()); | 410 pm->IncrementLazyKeepaliveCount(extension()); |
| 424 } | 411 } |
| 425 | 412 |
| 426 void ExtensionHost::DidCloseJavaScriptDialog() { | 413 void ExtensionHost::DidCloseJavaScriptDialog() { |
| 427 ExtensionProcessManager* pm = | 414 ExtensionProcessManager* pm = |
| 428 ExtensionSystem::Get(profile_)->process_manager(); | 415 ExtensionSystem::Get(profile_)->process_manager(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 return handled; | 469 return handled; |
| 483 } | 470 } |
| 484 | 471 |
| 485 void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) { | 472 void ExtensionHost::OnRequest(const ExtensionHostMsg_Request_Params& params) { |
| 486 extension_function_dispatcher_.Dispatch(params, render_view_host()); | 473 extension_function_dispatcher_.Dispatch(params, render_view_host()); |
| 487 } | 474 } |
| 488 | 475 |
| 489 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { | 476 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { |
| 490 render_view_host_ = render_view_host; | 477 render_view_host_ = render_view_host; |
| 491 | 478 |
| 492 if (view_.get()) | 479 if (view()) |
| 493 view_->RenderViewCreated(); | 480 view()->RenderViewCreated(); |
| 494 | 481 |
| 495 // If the host is bound to a browser, then extract its window id. | 482 // If the host is bound to a browser, then extract its window id. |
| 496 // Extensions hosted in ExternalTabContainer objects may not have | 483 // Extensions hosted in ExternalTabContainer objects may not have |
| 497 // an associated browser. | 484 // an associated browser. |
| 498 const Browser* browser = GetBrowser(); | 485 const Browser* browser = GetBrowser(); |
| 499 if (browser) { | 486 if (browser) { |
| 500 render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( | 487 render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( |
| 501 render_view_host->GetRoutingID(), | 488 render_view_host->GetRoutingID(), |
| 502 ExtensionTabUtil::GetWindowId(browser))); | 489 ExtensionTabUtil::GetWindowId(browser))); |
| 503 } | 490 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 params.user_gesture = user_gesture; | 559 params.user_gesture = user_gesture; |
| 573 browser::Navigate(¶ms); | 560 browser::Navigate(¶ms); |
| 574 } | 561 } |
| 575 | 562 |
| 576 void ExtensionHost::RenderViewReady() { | 563 void ExtensionHost::RenderViewReady() { |
| 577 content::NotificationService::current()->Notify( | 564 content::NotificationService::current()->Notify( |
| 578 chrome::NOTIFICATION_EXTENSION_HOST_CREATED, | 565 chrome::NOTIFICATION_EXTENSION_HOST_CREATED, |
| 579 content::Source<Profile>(profile_), | 566 content::Source<Profile>(profile_), |
| 580 content::Details<ExtensionHost>(this)); | 567 content::Details<ExtensionHost>(this)); |
| 581 } | 568 } |
| OLD | NEW |