Chromium Code Reviews| 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/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
| 8 #include "chrome/browser/extensions/extension_process_manager.h" | 8 #include "chrome/browser/extensions/extension_process_manager.h" |
| 9 #include "chrome/browser/extensions/extension_system.h" | 9 #include "chrome/browser/extensions/extension_system.h" |
| 10 #include "chrome/browser/extensions/shell_window_geometry_cache.h" | 10 #include "chrome/browser/extensions/shell_window_geometry_cache.h" |
| 11 #include "chrome/browser/extensions/shell_window_registry.h" | 11 #include "chrome/browser/extensions/shell_window_registry.h" |
| 12 #include "chrome/browser/extensions/tab_helper.h" | 12 #include "chrome/browser/extensions/tab_helper.h" |
| 13 #include "chrome/browser/file_select_helper.h" | 13 #include "chrome/browser/file_select_helper.h" |
| 14 #include "chrome/browser/infobars/infobar_tab_helper.h" | |
| 15 #include "chrome/browser/intents/web_intents_util.h" | 14 #include "chrome/browser/intents/web_intents_util.h" |
| 16 #include "chrome/browser/lifetime/application_lifetime.h" | 15 #include "chrome/browser/lifetime/application_lifetime.h" |
| 17 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
| 18 #include "chrome/browser/sessions/session_id.h" | 17 #include "chrome/browser/sessions/session_id.h" |
| 19 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
| 20 #include "chrome/browser/ui/browser_finder.h" | 19 #include "chrome/browser/ui/browser_finder.h" |
| 21 #include "chrome/browser/ui/browser_tabstrip.h" | 20 #include "chrome/browser/ui/browser_tabstrip.h" |
| 22 #include "chrome/browser/ui/browser_window.h" | 21 #include "chrome/browser/ui/browser_window.h" |
| 22 #include "chrome/browser/ui/constrained_window_tab_helper.h" | |
| 23 #include "chrome/browser/ui/extensions/native_shell_window.h" | 23 #include "chrome/browser/ui/extensions/native_shell_window.h" |
| 24 #include "chrome/browser/ui/intents/web_intent_picker_controller.h" | 24 #include "chrome/browser/ui/intents/web_intent_picker_controller.h" |
| 25 #include "chrome/browser/ui/tab_contents/tab_contents.h" | 25 #include "chrome/browser/ui/tab_contents/tab_contents.h" |
| 26 #include "chrome/browser/view_type_utils.h" | 26 #include "chrome/browser/view_type_utils.h" |
| 27 #include "chrome/common/chrome_notification_types.h" | 27 #include "chrome/common/chrome_notification_types.h" |
| 28 #include "chrome/common/extensions/extension.h" | 28 #include "chrome/common/extensions/extension.h" |
| 29 #include "chrome/common/extensions/extension_messages.h" | 29 #include "chrome/common/extensions/extension_messages.h" |
| 30 #include "content/public/browser/browser_thread.h" | 30 #include "content/public/browser/browser_thread.h" |
| 31 #include "content/public/browser/invalidate_type.h" | 31 #include "content/public/browser/invalidate_type.h" |
| 32 #include "content/public/browser/navigation_entry.h" | 32 #include "content/public/browser/navigation_entry.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 const extensions::Extension* extension) | 91 const extensions::Extension* extension) |
| 92 : profile_(profile), | 92 : profile_(profile), |
| 93 extension_(extension), | 93 extension_(extension), |
| 94 web_contents_(NULL), | 94 web_contents_(NULL), |
| 95 ALLOW_THIS_IN_INITIALIZER_LIST( | 95 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 96 extension_function_dispatcher_(profile, this)) { | 96 extension_function_dispatcher_(profile, this)) { |
| 97 } | 97 } |
| 98 | 98 |
| 99 void ShellWindow::Init(const GURL& url, | 99 void ShellWindow::Init(const GURL& url, |
| 100 const ShellWindow::CreateParams& params) { | 100 const ShellWindow::CreateParams& params) { |
| 101 web_contents_ = WebContents::Create( | 101 web_contents_.reset(WebContents::Create( |
| 102 profile(), SiteInstance::CreateForURL(profile(), url), MSG_ROUTING_NONE, | 102 profile(), SiteInstance::CreateForURL(profile(), url), MSG_ROUTING_NONE, |
| 103 NULL); | 103 NULL)); |
| 104 contents_.reset(TabContents::Factory::CreateTabContents(web_contents_)); | 104 ConstrainedWindowTabHelper::CreateForWebContents(web_contents_.get()); |
| 105 content::WebContentsObserver::Observe(web_contents_); | 105 WebIntentPickerController::CreateForWebContents(web_contents_.get()); |
| 106 | |
| 107 content::WebContentsObserver::Observe(web_contents_.get()); | |
| 106 web_contents_->SetDelegate(this); | 108 web_contents_->SetDelegate(this); |
| 107 chrome::SetViewType(web_contents_, chrome::VIEW_TYPE_APP_SHELL); | 109 chrome::SetViewType(web_contents_.get(), chrome::VIEW_TYPE_APP_SHELL); |
| 108 web_contents_->GetMutableRendererPrefs()-> | 110 web_contents_->GetMutableRendererPrefs()-> |
| 109 browser_handles_all_top_level_requests = true; | 111 browser_handles_all_top_level_requests = true; |
| 110 web_contents_->GetRenderViewHost()->SyncRendererPrefs(); | 112 web_contents_->GetRenderViewHost()->SyncRendererPrefs(); |
| 111 | 113 |
| 112 native_window_.reset(NativeShellWindow::Create(this, params)); | 114 native_window_.reset(NativeShellWindow::Create(this, params)); |
| 113 | 115 |
| 114 if (!params.window_key.empty()) { | 116 if (!params.window_key.empty()) { |
| 115 window_key_ = params.window_key; | 117 window_key_ = params.window_key; |
| 116 | 118 |
| 117 if (params.restore_position || params.restore_size) { | 119 if (params.restore_position || params.restore_size) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 registrar_.RemoveAll(); | 165 registrar_.RemoveAll(); |
| 164 | 166 |
| 165 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, | 167 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 166 content::Source<Profile>(profile_)); | 168 content::Source<Profile>(profile_)); |
| 167 // Close when the browser is exiting. | 169 // Close when the browser is exiting. |
| 168 // TODO(mihaip): we probably don't want this in the long run (when platform | 170 // TODO(mihaip): we probably don't want this in the long run (when platform |
| 169 // apps are no longer tied to the browser process). | 171 // apps are no longer tied to the browser process). |
| 170 registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, | 172 registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, |
| 171 content::NotificationService::AllSources()); | 173 content::NotificationService::AllSources()); |
| 172 | 174 |
| 173 // Automatically dismiss all infobars. | |
| 174 InfoBarTabHelper* infobar_helper = | |
| 175 InfoBarTabHelper::FromWebContents(web_contents_); | |
| 176 infobar_helper->set_infobars_enabled(false); | |
|
benwells
2012/10/19 01:51:24
Will this re-enable infobars? Or does not having a
Avi (use Gerrit)
2012/10/19 01:59:01
Look at it this way.
A TabContents just is a WebC
| |
| 177 | |
| 178 // Prevent the browser process from shutting down while this window is open. | 175 // Prevent the browser process from shutting down while this window is open. |
| 179 browser::StartKeepAlive(); | 176 browser::StartKeepAlive(); |
| 180 | 177 |
| 181 UpdateExtensionAppIcon(); | 178 UpdateExtensionAppIcon(); |
| 182 } | 179 } |
| 183 | 180 |
| 184 ShellWindow::~ShellWindow() { | 181 ShellWindow::~ShellWindow() { |
| 185 // Unregister now to prevent getting NOTIFICATION_APP_TERMINATING if we're the | 182 // Unregister now to prevent getting NOTIFICATION_APP_TERMINATING if we're the |
| 186 // last window open. | 183 // last window open. |
| 187 registrar_.RemoveAll(); | 184 registrar_.RemoveAll(); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 362 return true; | 359 return true; |
| 363 } | 360 } |
| 364 | 361 |
| 365 void ShellWindow::WebIntentDispatch( | 362 void ShellWindow::WebIntentDispatch( |
| 366 content::WebContents* web_contents, | 363 content::WebContents* web_contents, |
| 367 content::WebIntentsDispatcher* intents_dispatcher) { | 364 content::WebIntentsDispatcher* intents_dispatcher) { |
| 368 if (!web_intents::IsWebIntentsEnabledForProfile(profile_)) | 365 if (!web_intents::IsWebIntentsEnabledForProfile(profile_)) |
| 369 return; | 366 return; |
| 370 | 367 |
| 371 WebIntentPickerController* web_intent_picker_controller = | 368 WebIntentPickerController* web_intent_picker_controller = |
| 372 WebIntentPickerController::FromWebContents(contents_->web_contents()); | 369 WebIntentPickerController::FromWebContents(web_contents_.get()); |
| 373 web_intent_picker_controller->SetIntentsDispatcher(intents_dispatcher); | 370 web_intent_picker_controller->SetIntentsDispatcher(intents_dispatcher); |
| 374 web_intent_picker_controller->ShowDialog( | 371 web_intent_picker_controller->ShowDialog( |
| 375 intents_dispatcher->GetIntent().action, | 372 intents_dispatcher->GetIntent().action, |
| 376 intents_dispatcher->GetIntent().type); | 373 intents_dispatcher->GetIntent().type); |
| 377 } | 374 } |
| 378 | 375 |
| 379 void ShellWindow::RunFileChooser(WebContents* tab, | 376 void ShellWindow::RunFileChooser(WebContents* tab, |
| 380 const content::FileChooserParams& params) { | 377 const content::FileChooserParams& params) { |
| 381 FileSelectHelper::RunFileChooser(tab, params); | 378 FileSelectHelper::RunFileChooser(tab, params); |
| 382 } | 379 } |
| 383 | 380 |
| 384 bool ShellWindow::IsPopupOrPanel(const WebContents* source) const { | 381 bool ShellWindow::IsPopupOrPanel(const WebContents* source) const { |
| 385 DCHECK(source == web_contents_); | 382 DCHECK(source == web_contents_.get()); |
| 386 return true; | 383 return true; |
| 387 } | 384 } |
| 388 | 385 |
| 389 void ShellWindow::MoveContents(WebContents* source, const gfx::Rect& pos) { | 386 void ShellWindow::MoveContents(WebContents* source, const gfx::Rect& pos) { |
| 390 DCHECK(source == web_contents_); | 387 DCHECK(source == web_contents_.get()); |
| 391 native_window_->SetBounds(pos); | 388 native_window_->SetBounds(pos); |
| 392 } | 389 } |
| 393 | 390 |
| 394 void ShellWindow::NavigationStateChanged( | 391 void ShellWindow::NavigationStateChanged( |
| 395 const content::WebContents* source, unsigned changed_flags) { | 392 const content::WebContents* source, unsigned changed_flags) { |
| 396 DCHECK(source == web_contents_); | 393 DCHECK(source == web_contents_.get()); |
| 397 if (changed_flags & content::INVALIDATE_TYPE_TITLE) | 394 if (changed_flags & content::INVALIDATE_TYPE_TITLE) |
| 398 native_window_->UpdateWindowTitle(); | 395 native_window_->UpdateWindowTitle(); |
| 399 else if (changed_flags & content::INVALIDATE_TYPE_TAB) | 396 else if (changed_flags & content::INVALIDATE_TYPE_TAB) |
| 400 native_window_->UpdateWindowIcon(); | 397 native_window_->UpdateWindowIcon(); |
| 401 } | 398 } |
| 402 | 399 |
| 403 void ShellWindow::ToggleFullscreenModeForTab(content::WebContents* source, | 400 void ShellWindow::ToggleFullscreenModeForTab(content::WebContents* source, |
| 404 bool enter_fullscreen) { | 401 bool enter_fullscreen) { |
| 405 DCHECK(source == web_contents_); | 402 DCHECK(source == web_contents_.get()); |
| 406 native_window_->SetFullscreen(enter_fullscreen); | 403 native_window_->SetFullscreen(enter_fullscreen); |
| 407 } | 404 } |
| 408 | 405 |
| 409 bool ShellWindow::IsFullscreenForTabOrPending( | 406 bool ShellWindow::IsFullscreenForTabOrPending( |
| 410 const content::WebContents* source) const { | 407 const content::WebContents* source) const { |
| 411 DCHECK(source == web_contents_); | 408 DCHECK(source == web_contents_.get()); |
| 412 return native_window_->IsFullscreenOrPending(); | 409 return native_window_->IsFullscreenOrPending(); |
| 413 } | 410 } |
| 414 | 411 |
| 415 void ShellWindow::Observe(int type, | 412 void ShellWindow::Observe(int type, |
| 416 const content::NotificationSource& source, | 413 const content::NotificationSource& source, |
| 417 const content::NotificationDetails& details) { | 414 const content::NotificationDetails& details) { |
| 418 switch (type) { | 415 switch (type) { |
| 419 case content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED: { | 416 case content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED: { |
| 420 // TODO(jeremya): once http://crbug.com/123007 is fixed, we'll no longer | 417 // TODO(jeremya): once http://crbug.com/123007 is fixed, we'll no longer |
| 421 // need to suspend resource requests here (the call in the constructor | 418 // need to suspend resource requests here (the call in the constructor |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 488 const extensions::DraggableRegion& region = *iter; | 485 const extensions::DraggableRegion& region = *iter; |
| 489 sk_region->op( | 486 sk_region->op( |
| 490 region.bounds.x(), | 487 region.bounds.x(), |
| 491 region.bounds.y(), | 488 region.bounds.y(), |
| 492 region.bounds.right(), | 489 region.bounds.right(), |
| 493 region.bounds.bottom(), | 490 region.bounds.bottom(), |
| 494 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); | 491 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); |
| 495 } | 492 } |
| 496 return sk_region; | 493 return sk_region; |
| 497 } | 494 } |
| OLD | NEW |