| 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 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 view_->Init(); | 171 view_->Init(); |
| 172 #elif defined(TOOLKIT_GTK) | 172 #elif defined(TOOLKIT_GTK) |
| 173 view_.reset(new ExtensionViewGtk(this, browser)); | 173 view_.reset(new ExtensionViewGtk(this, browser)); |
| 174 view_->Init(); | 174 view_->Init(); |
| 175 #else | 175 #else |
| 176 // TODO(port) | 176 // TODO(port) |
| 177 NOTREACHED(); | 177 NOTREACHED(); |
| 178 #endif | 178 #endif |
| 179 } | 179 } |
| 180 | 180 |
| 181 void ExtensionHost::CreateViewWithoutBrowser() { | |
| 182 CreateView(NULL); | |
| 183 } | |
| 184 | |
| 185 WebContents* ExtensionHost::GetAssociatedWebContents() const { | 181 WebContents* ExtensionHost::GetAssociatedWebContents() const { |
| 186 return associated_web_contents_; | 182 return associated_web_contents_; |
| 187 } | 183 } |
| 188 | 184 |
| 189 void ExtensionHost::SetAssociatedWebContents( | 185 void ExtensionHost::SetAssociatedWebContents( |
| 190 content::WebContents* web_contents) { | 186 content::WebContents* web_contents) { |
| 191 associated_web_contents_ = web_contents; | 187 associated_web_contents_ = web_contents; |
| 192 if (web_contents) { | 188 if (web_contents) { |
| 193 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 189 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| 194 content::Source<WebContents>(associated_web_contents_)); | 190 content::Source<WebContents>(associated_web_contents_)); |
| 195 } | 191 } |
| 196 } | 192 } |
| 197 | 193 |
| 198 | |
| 199 content::RenderProcessHost* ExtensionHost::render_process_host() const { | 194 content::RenderProcessHost* ExtensionHost::render_process_host() const { |
| 200 return render_view_host()->GetProcess(); | 195 return render_view_host()->GetProcess(); |
| 201 } | 196 } |
| 202 | 197 |
| 203 RenderViewHost* ExtensionHost::render_view_host() const { | 198 RenderViewHost* ExtensionHost::render_view_host() const { |
| 204 // TODO(mpcomplete): This can be NULL. How do we handle that? | 199 // TODO(mpcomplete): This can be NULL. How do we handle that? |
| 205 return render_view_host_; | 200 return render_view_host_; |
| 206 } | 201 } |
| 207 | 202 |
| 208 bool ExtensionHost::IsRenderViewLive() const { | 203 bool ExtensionHost::IsRenderViewLive() const { |
| 209 return render_view_host()->IsRenderViewLive(); | 204 return render_view_host()->IsRenderViewLive(); |
| 210 } | 205 } |
| 211 | 206 |
| 212 void ExtensionHost::CreateRenderViewSoon() { | 207 void ExtensionHost::CreateRenderViewSoon() { |
| 213 if ((render_process_host() && render_process_host()->HasConnection()) || | 208 if ((render_process_host() && render_process_host()->HasConnection())) { |
| 214 extension_host_type_ == chrome::VIEW_TYPE_APP_SHELL) { | |
| 215 // If the process is already started, go ahead and initialize the RenderView | 209 // If the process is already started, go ahead and initialize the RenderView |
| 216 // synchronously. The process creation is the real meaty part that we want | 210 // synchronously. The process creation is the real meaty part that we want |
| 217 // to defer. | 211 // to defer. |
| 218 // We also skip the ratelimiting in the shell window case. This is a hack | |
| 219 // (see crbug.com/124350 for details). | |
| 220 CreateRenderViewNow(); | 212 CreateRenderViewNow(); |
| 221 } else { | 213 } else { |
| 222 ProcessCreationQueue::GetInstance()->CreateSoon(this); | 214 ProcessCreationQueue::GetInstance()->CreateSoon(this); |
| 223 } | 215 } |
| 224 } | 216 } |
| 225 | 217 |
| 226 void ExtensionHost::CreateRenderViewNow() { | 218 void ExtensionHost::CreateRenderViewNow() { |
| 227 LoadInitialURL(); | 219 LoadInitialURL(); |
| 228 if (is_background_page()) { | 220 if (is_background_page()) { |
| 229 DCHECK(IsRenderViewLive()); | 221 DCHECK(IsRenderViewLive()); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 } | 282 } |
| 291 break; | 283 break; |
| 292 default: | 284 default: |
| 293 NOTREACHED() << "Unexpected notification sent."; | 285 NOTREACHED() << "Unexpected notification sent."; |
| 294 break; | 286 break; |
| 295 } | 287 } |
| 296 } | 288 } |
| 297 | 289 |
| 298 void ExtensionHost::ResizeDueToAutoResize(WebContents* source, | 290 void ExtensionHost::ResizeDueToAutoResize(WebContents* source, |
| 299 const gfx::Size& new_size) { | 291 const gfx::Size& new_size) { |
| 300 if (view_.get()) | 292 if (view()) |
| 301 view_->ResizeDueToAutoResize(new_size); | 293 view()->ResizeDueToAutoResize(new_size); |
| 302 } | 294 } |
| 303 | 295 |
| 304 void ExtensionHost::RenderViewGone(base::TerminationStatus status) { | 296 void ExtensionHost::RenderViewGone(base::TerminationStatus status) { |
| 305 // During browser shutdown, we may use sudden termination on an extension | 297 // During browser shutdown, we may use sudden termination on an extension |
| 306 // process, so it is expected to lose our connection to the render view. | 298 // process, so it is expected to lose our connection to the render view. |
| 307 // Do nothing. | 299 // Do nothing. |
| 308 if (browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) | 300 if (browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) |
| 309 return; | 301 return; |
| 310 | 302 |
| 311 // In certain cases, multiple ExtensionHost objects may have pointed to | 303 // In certain cases, multiple ExtensionHost objects may have pointed to |
| (...skipping 23 matching lines...) Expand all Loading... |
| 335 | 327 |
| 336 render_view_host()->InsertCSS(string16(), css.as_string()); | 328 render_view_host()->InsertCSS(string16(), css.as_string()); |
| 337 } | 329 } |
| 338 | 330 |
| 339 void ExtensionHost::DidStopLoading() { | 331 void ExtensionHost::DidStopLoading() { |
| 340 bool notify = !did_stop_loading_; | 332 bool notify = !did_stop_loading_; |
| 341 did_stop_loading_ = true; | 333 did_stop_loading_ = true; |
| 342 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || | 334 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || |
| 343 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || | 335 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || |
| 344 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || | 336 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || |
| 345 extension_host_type_ == chrome::VIEW_TYPE_APP_SHELL || | |
| 346 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 337 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |
| 347 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) | 338 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) |
| 348 if (view_.get()) | 339 if (view()) |
| 349 view_->DidStopLoading(); | 340 view()->DidStopLoading(); |
| 350 #endif | 341 #endif |
| 351 } | 342 } |
| 352 if (notify) { | 343 if (notify) { |
| 353 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { | 344 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
| 354 UMA_HISTOGRAM_TIMES("Extensions.BackgroundPageLoadTime", | 345 UMA_HISTOGRAM_TIMES("Extensions.BackgroundPageLoadTime", |
| 355 since_created_.Elapsed()); | 346 since_created_.Elapsed()); |
| 356 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG) { | 347 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG) { |
| 357 UMA_HISTOGRAM_TIMES("Extensions.DialogLoadTime", | 348 UMA_HISTOGRAM_TIMES("Extensions.DialogLoadTime", |
| 358 since_created_.Elapsed()); | 349 since_created_.Elapsed()); |
| 359 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP) { | 350 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP) { |
| 360 UMA_HISTOGRAM_TIMES("Extensions.PopupLoadTime", | 351 UMA_HISTOGRAM_TIMES("Extensions.PopupLoadTime", |
| 361 since_created_.Elapsed()); | 352 since_created_.Elapsed()); |
| 362 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) { | 353 } else if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR) { |
| 363 UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime", | 354 UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime", |
| 364 since_created_.Elapsed()); | 355 since_created_.Elapsed()); |
| 365 } else if (extension_host_type_ == chrome::VIEW_TYPE_APP_SHELL) { | |
| 366 UMA_HISTOGRAM_TIMES("Extensions.ShellLoadTime", since_created_.Elapsed()); | |
| 367 } else if (extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 356 } else if (extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |
| 368 UMA_HISTOGRAM_TIMES("Extensions.PanelLoadTime", since_created_.Elapsed()); | 357 UMA_HISTOGRAM_TIMES("Extensions.PanelLoadTime", since_created_.Elapsed()); |
| 369 } | 358 } |
| 370 | 359 |
| 371 // Send the notification last, because it might result in this being | 360 // Send the notification last, because it might result in this being |
| 372 // deleted. | 361 // deleted. |
| 373 content::NotificationService::current()->Notify( | 362 content::NotificationService::current()->Notify( |
| 374 chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, | 363 chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, |
| 375 content::Source<Profile>(profile_), | 364 content::Source<Profile>(profile_), |
| 376 content::Details<ExtensionHost>(this)); | 365 content::Details<ExtensionHost>(this)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 396 } | 385 } |
| 397 } | 386 } |
| 398 } | 387 } |
| 399 | 388 |
| 400 void ExtensionHost::CloseContents(WebContents* contents) { | 389 void ExtensionHost::CloseContents(WebContents* contents) { |
| 401 // TODO(mpcomplete): is this check really necessary? | 390 // TODO(mpcomplete): is this check really necessary? |
| 402 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || | 391 if (extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_POPUP || |
| 403 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || | 392 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_DIALOG || |
| 404 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE || | 393 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE || |
| 405 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || | 394 extension_host_type_ == chrome::VIEW_TYPE_EXTENSION_INFOBAR || |
| 406 extension_host_type_ == chrome::VIEW_TYPE_APP_SHELL || | |
| 407 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { | 395 extension_host_type_ == chrome::VIEW_TYPE_PANEL) { |
| 408 Close(); | 396 Close(); |
| 409 } | 397 } |
| 410 } | 398 } |
| 411 | 399 |
| 412 bool ExtensionHost::ShouldSuppressDialogs() { | |
| 413 return extension_->is_platform_app(); | |
| 414 } | |
| 415 | |
| 416 void ExtensionHost::WillRunJavaScriptDialog() { | 400 void ExtensionHost::WillRunJavaScriptDialog() { |
| 417 ExtensionProcessManager* pm = | 401 ExtensionProcessManager* pm = |
| 418 ExtensionSystem::Get(profile_)->process_manager(); | 402 ExtensionSystem::Get(profile_)->process_manager(); |
| 419 if (pm) | 403 if (pm) |
| 420 pm->IncrementLazyKeepaliveCount(extension()); | 404 pm->IncrementLazyKeepaliveCount(extension()); |
| 421 } | 405 } |
| 422 | 406 |
| 423 void ExtensionHost::DidCloseJavaScriptDialog() { | 407 void ExtensionHost::DidCloseJavaScriptDialog() { |
| 424 ExtensionProcessManager* pm = | 408 ExtensionProcessManager* pm = |
| 425 ExtensionSystem::Get(profile_)->process_manager(); | 409 ExtensionSystem::Get(profile_)->process_manager(); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 ExtensionProcessManager* pm = | 489 ExtensionProcessManager* pm = |
| 506 ExtensionSystem::Get(profile_)->process_manager(); | 490 ExtensionSystem::Get(profile_)->process_manager(); |
| 507 if (pm) | 491 if (pm) |
| 508 pm->DecrementLazyKeepaliveCount(extension()); | 492 pm->DecrementLazyKeepaliveCount(extension()); |
| 509 } | 493 } |
| 510 | 494 |
| 511 | 495 |
| 512 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { | 496 void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { |
| 513 render_view_host_ = render_view_host; | 497 render_view_host_ = render_view_host; |
| 514 | 498 |
| 515 if (view_.get()) | 499 if (view()) |
| 516 view_->RenderViewCreated(); | 500 view()->RenderViewCreated(); |
| 517 | 501 |
| 518 // If the host is bound to a browser, then extract its window id. | 502 // If the host is bound to a browser, then extract its window id. |
| 519 // Extensions hosted in ExternalTabContainer objects may not have | 503 // Extensions hosted in ExternalTabContainer objects may not have |
| 520 // an associated browser. | 504 // an associated browser. |
| 521 const Browser* browser = GetBrowser(); | 505 const Browser* browser = GetBrowser(); |
| 522 if (browser) { | 506 if (browser) { |
| 523 render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( | 507 render_view_host->Send(new ExtensionMsg_UpdateBrowserWindowId( |
| 524 render_view_host->GetRoutingID(), | 508 render_view_host->GetRoutingID(), |
| 525 ExtensionTabUtil::GetWindowId(browser))); | 509 ExtensionTabUtil::GetWindowId(browser))); |
| 526 } | 510 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 params.user_gesture = user_gesture; | 579 params.user_gesture = user_gesture; |
| 596 browser::Navigate(¶ms); | 580 browser::Navigate(¶ms); |
| 597 } | 581 } |
| 598 | 582 |
| 599 void ExtensionHost::RenderViewReady() { | 583 void ExtensionHost::RenderViewReady() { |
| 600 content::NotificationService::current()->Notify( | 584 content::NotificationService::current()->Notify( |
| 601 chrome::NOTIFICATION_EXTENSION_HOST_CREATED, | 585 chrome::NOTIFICATION_EXTENSION_HOST_CREATED, |
| 602 content::Source<Profile>(profile_), | 586 content::Source<Profile>(profile_), |
| 603 content::Details<ExtensionHost>(this)); | 587 content::Details<ExtensionHost>(this)); |
| 604 } | 588 } |
| OLD | NEW |