Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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/browser.h" | 5 #include "chrome/browser/ui/browser.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <windows.h> | 8 #include <windows.h> |
| 9 #include <shellapi.h> | 9 #include <shellapi.h> |
| 10 #endif // defined(OS_WIN) | 10 #endif // defined(OS_WIN) |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 174 #include "content/public/browser/render_view_host.h" | 174 #include "content/public/browser/render_view_host.h" |
| 175 #include "content/public/browser/render_widget_host_view.h" | 175 #include "content/public/browser/render_widget_host_view.h" |
| 176 #include "content/public/browser/site_instance.h" | 176 #include "content/public/browser/site_instance.h" |
| 177 #include "content/public/browser/user_metrics.h" | 177 #include "content/public/browser/user_metrics.h" |
| 178 #include "content/public/browser/web_contents.h" | 178 #include "content/public/browser/web_contents.h" |
| 179 #include "content/public/common/content_switches.h" | 179 #include "content/public/common/content_switches.h" |
| 180 #include "content/public/common/page_zoom.h" | 180 #include "content/public/common/page_zoom.h" |
| 181 #include "content/public/common/renderer_preferences.h" | 181 #include "content/public/common/renderer_preferences.h" |
| 182 #include "content/public/common/webplugininfo.h" | 182 #include "content/public/common/webplugininfo.h" |
| 183 #include "extensions/browser/extension_prefs.h" | 183 #include "extensions/browser/extension_prefs.h" |
| 184 #include "extensions/browser/extension_registry.h" | |
| 184 #include "extensions/browser/extension_system.h" | 185 #include "extensions/browser/extension_system.h" |
| 185 #include "extensions/common/constants.h" | 186 #include "extensions/common/constants.h" |
| 186 #include "extensions/common/extension.h" | 187 #include "extensions/common/extension.h" |
| 187 #include "extensions/common/manifest_handlers/background_info.h" | 188 #include "extensions/common/manifest_handlers/background_info.h" |
| 188 #include "net/base/filename_util.h" | 189 #include "net/base/filename_util.h" |
| 189 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 190 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
| 190 #include "net/cookies/cookie_monster.h" | 191 #include "net/cookies/cookie_monster.h" |
| 191 #include "net/url_request/url_request_context.h" | 192 #include "net/url_request/url_request_context.h" |
| 192 #include "third_party/WebKit/public/web/WebWindowFeatures.h" | 193 #include "third_party/WebKit/public/web/WebWindowFeatures.h" |
| 193 #include "ui/base/l10n/l10n_util.h" | 194 #include "ui/base/l10n/l10n_util.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 }; | 326 }; |
| 326 | 327 |
| 327 /////////////////////////////////////////////////////////////////////////////// | 328 /////////////////////////////////////////////////////////////////////////////// |
| 328 // Browser, Constructors, Creation, Showing: | 329 // Browser, Constructors, Creation, Showing: |
| 329 | 330 |
| 330 Browser::Browser(const CreateParams& params) | 331 Browser::Browser(const CreateParams& params) |
| 331 : type_(params.type), | 332 : type_(params.type), |
| 332 profile_(params.profile), | 333 profile_(params.profile), |
| 333 window_(NULL), | 334 window_(NULL), |
| 334 tab_strip_model_delegate_(new chrome::BrowserTabStripModelDelegate(this)), | 335 tab_strip_model_delegate_(new chrome::BrowserTabStripModelDelegate(this)), |
| 335 tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(), | 336 tab_strip_model_( |
| 336 params.profile)), | 337 new TabStripModel(tab_strip_model_delegate_.get(), params.profile)), |
| 337 app_name_(params.app_name), | 338 app_name_(params.app_name), |
| 338 is_trusted_source_(params.trusted_source), | 339 is_trusted_source_(params.trusted_source), |
| 339 cancel_download_confirmation_state_(NOT_PROMPTED), | 340 cancel_download_confirmation_state_(NOT_PROMPTED), |
| 340 override_bounds_(params.initial_bounds), | 341 override_bounds_(params.initial_bounds), |
| 341 initial_show_state_(params.initial_show_state), | 342 initial_show_state_(params.initial_show_state), |
| 342 is_session_restore_(params.is_session_restore), | 343 is_session_restore_(params.is_session_restore), |
| 343 host_desktop_type_(BrowserWindow::AdjustHostDesktopType( | 344 host_desktop_type_( |
| 344 params.host_desktop_type)), | 345 BrowserWindow::AdjustHostDesktopType(params.host_desktop_type)), |
| 345 content_setting_bubble_model_delegate_( | 346 content_setting_bubble_model_delegate_( |
| 346 new BrowserContentSettingBubbleModelDelegate(this)), | 347 new BrowserContentSettingBubbleModelDelegate(this)), |
| 347 toolbar_model_delegate_(new BrowserToolbarModelDelegate(this)), | 348 toolbar_model_delegate_(new BrowserToolbarModelDelegate(this)), |
| 348 tab_restore_service_delegate_(new BrowserTabRestoreServiceDelegate(this)), | 349 tab_restore_service_delegate_(new BrowserTabRestoreServiceDelegate(this)), |
| 349 synced_window_delegate_(new BrowserSyncedWindowDelegate(this)), | 350 synced_window_delegate_(new BrowserSyncedWindowDelegate(this)), |
| 350 bookmark_bar_state_(BookmarkBar::HIDDEN), | 351 bookmark_bar_state_(BookmarkBar::HIDDEN), |
| 351 command_controller_(new chrome::BrowserCommandController(this)), | 352 command_controller_(new chrome::BrowserCommandController(this)), |
| 352 window_has_shown_(false), | 353 window_has_shown_(false), |
| 353 chrome_updater_factory_(this), | 354 chrome_updater_factory_(this), |
| 354 weak_factory_(this), | 355 weak_factory_(this), |
| 355 translate_driver_observer_( | 356 translate_driver_observer_( |
| 356 new BrowserContentTranslateDriverObserver(this)) { | 357 new BrowserContentTranslateDriverObserver(this)), |
| 358 extension_registry_observer_(this) { | |
| 357 // If this causes a crash then a window is being opened using a profile type | 359 // If this causes a crash then a window is being opened using a profile type |
| 358 // that is disallowed by policy. The crash prevents the disabled window type | 360 // that is disallowed by policy. The crash prevents the disabled window type |
| 359 // from opening at all, but the path that triggered it should be fixed. | 361 // from opening at all, but the path that triggered it should be fixed. |
| 360 CHECK(IncognitoModePrefs::CanOpenBrowser(profile_)); | 362 CHECK(IncognitoModePrefs::CanOpenBrowser(profile_)); |
| 361 CHECK(!profile_->IsGuestSession() || profile_->IsOffTheRecord()) | 363 CHECK(!profile_->IsGuestSession() || profile_->IsOffTheRecord()) |
| 362 << "Only off the record browser may be opened in guest mode"; | 364 << "Only off the record browser may be opened in guest mode"; |
| 363 | 365 |
| 364 // TODO(jeremy): Move to initializer list once flag is removed. | 366 // TODO(jeremy): Move to initializer list once flag is removed. |
| 365 if (IsFastTabUnloadEnabled()) | 367 if (IsFastTabUnloadEnabled()) |
| 366 fast_unload_controller_.reset(new chrome::FastUnloadController(this)); | 368 fast_unload_controller_.reset(new chrome::FastUnloadController(this)); |
| 367 else | 369 else |
| 368 unload_controller_.reset(new chrome::UnloadController(this)); | 370 unload_controller_.reset(new chrome::UnloadController(this)); |
| 369 | 371 |
| 370 if (!app_name_.empty()) | 372 if (!app_name_.empty()) |
| 371 chrome::RegisterAppPrefs(app_name_, profile_); | 373 chrome::RegisterAppPrefs(app_name_, profile_); |
| 372 tab_strip_model_->AddObserver(this); | 374 tab_strip_model_->AddObserver(this); |
| 373 | 375 |
| 374 toolbar_model_.reset(new ToolbarModelImpl(toolbar_model_delegate_.get())); | 376 toolbar_model_.reset(new ToolbarModelImpl(toolbar_model_delegate_.get())); |
| 375 search_model_.reset(new SearchModel()); | 377 search_model_.reset(new SearchModel()); |
| 376 search_delegate_.reset(new SearchDelegate(search_model_.get())); | 378 search_delegate_.reset(new SearchDelegate(search_model_.get())); |
| 377 | 379 |
| 378 registrar_.Add(this, | 380 extension_registry_observer_.Add( |
| 379 extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, | 381 extensions::ExtensionRegistry::Get(profile_)); |
| 380 content::Source<Profile>(profile_->GetOriginalProfile())); | 382 |
| 381 registrar_.Add(this, | |
| 382 extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | |
| 383 content::Source<Profile>(profile_->GetOriginalProfile())); | |
| 384 registrar_.Add(this, | |
| 385 extensions::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED, | |
| 386 content::Source<Profile>(profile_->GetOriginalProfile())); | |
| 387 registrar_.Add(this, | 383 registrar_.Add(this, |
| 388 extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, | 384 extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, |
| 389 content::NotificationService::AllSources()); | 385 content::NotificationService::AllSources()); |
| 386 | |
| 390 #if defined(ENABLE_THEMES) | 387 #if defined(ENABLE_THEMES) |
| 391 registrar_.Add( | 388 registrar_.Add( |
| 392 this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | 389 this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
| 393 content::Source<ThemeService>( | 390 content::Source<ThemeService>( |
| 394 ThemeServiceFactory::GetForProfile(profile_))); | 391 ThemeServiceFactory::GetForProfile(profile_))); |
| 395 #endif | 392 #endif |
| 396 registrar_.Add(this, chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, | 393 registrar_.Add(this, chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, |
| 397 content::NotificationService::AllSources()); | 394 content::NotificationService::AllSources()); |
| 398 | 395 |
| 399 profile_pref_registrar_.Init(profile_->GetPrefs()); | 396 profile_pref_registrar_.Init(profile_->GetPrefs()); |
| (...skipping 1523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1923 drive::util::MaybeSetDriveURL(profile_, file_info.file_path, &url); | 1920 drive::util::MaybeSetDriveURL(profile_, file_info.file_path, &url); |
| 1924 #endif | 1921 #endif |
| 1925 | 1922 |
| 1926 if (url.is_empty()) | 1923 if (url.is_empty()) |
| 1927 return; | 1924 return; |
| 1928 | 1925 |
| 1929 OpenURL(OpenURLParams( | 1926 OpenURL(OpenURLParams( |
| 1930 url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); | 1927 url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); |
| 1931 } | 1928 } |
| 1932 | 1929 |
| 1930 // Notification observer for Extension implementation | |
|
Bernhard Bauer
2014/09/10 08:03:42
This comment doesn't explain anything that can't b
| |
| 1931 | |
| 1932 void Browser::OnExtensionUninstalled(content::BrowserContext* browser_context, | |
| 1933 const extensions::Extension* extension, | |
| 1934 extensions::UninstallReason reason) { | |
| 1935 if (window() && window()->GetLocationBar()) | |
| 1936 window()->GetLocationBar()->UpdatePageActions(); | |
| 1937 } | |
| 1938 | |
| 1939 void Browser::OnExtensionLoaded(content::BrowserContext* browser_context, | |
| 1940 const extensions::Extension* extension) { | |
| 1941 chrome::UpdateCommandEnabled( | |
| 1942 this, | |
| 1943 IDC_BOOKMARK_PAGE, | |
| 1944 !chrome::ShouldRemoveBookmarkThisPageUI(profile_)); | |
| 1945 chrome::UpdateCommandEnabled( | |
| 1946 this, | |
| 1947 IDC_BOOKMARK_ALL_TABS, | |
| 1948 !chrome::ShouldRemoveBookmarkOpenPagesUI(profile_)); | |
| 1949 } | |
| 1950 | |
| 1951 void Browser::OnExtensionUnloaded( | |
| 1952 content::BrowserContext* browser_context, | |
| 1953 const extensions::Extension* extension, | |
| 1954 extensions::UnloadedExtensionInfo::Reason reason) { | |
| 1955 chrome::UpdateCommandEnabled( | |
| 1956 this, | |
| 1957 IDC_BOOKMARK_PAGE, | |
| 1958 !chrome::ShouldRemoveBookmarkThisPageUI(profile_)); | |
| 1959 chrome::UpdateCommandEnabled( | |
| 1960 this, | |
| 1961 IDC_BOOKMARK_ALL_TABS, | |
| 1962 !chrome::ShouldRemoveBookmarkOpenPagesUI(profile_)); | |
| 1963 | |
| 1964 if (window()->GetLocationBar()) | |
| 1965 window()->GetLocationBar()->UpdatePageActions(); | |
| 1966 | |
| 1967 const extensions::UnloadedExtensionInfo* extension_info = | |
| 1968 content::Details<extensions::UnloadedExtensionInfo>(details).ptr(); | |
| 1969 | |
| 1970 // Close any tabs from the unloaded extension, unless it's terminated, | |
| 1971 // in which case let the sad tabs remain. | |
| 1972 if (extension_info->reason != | |
| 1973 extensions::UnloadedExtensionInfo::REASON_TERMINATE) { | |
| 1974 const Extension* extension = extension_info->extension; | |
| 1975 // Iterate backwards as we may remove items while iterating. | |
| 1976 for (int i = tab_strip_model_->count() - 1; i >= 0; --i) { | |
| 1977 WebContents* web_contents = tab_strip_model_->GetWebContentsAt(i); | |
| 1978 // Two cases are handled here: | |
| 1979 // - The scheme check is for when an extension page is loaded in a | |
| 1980 // tab, e.g. chrome-extension://id/page.html. | |
| 1981 // - The extension_app check is for apps, which can have non-extension | |
| 1982 // schemes, e.g. https://mail.google.com if you have the Gmail app | |
| 1983 // installed. | |
| 1984 if ((web_contents->GetURL().SchemeIs(extensions::kExtensionScheme) && | |
| 1985 web_contents->GetURL().host() == extension->id()) || | |
| 1986 (extensions::TabHelper::FromWebContents(web_contents) | |
| 1987 ->extension_app() == extension)) { | |
| 1988 tab_strip_model_->CloseWebContentsAt(i, TabStripModel::CLOSE_NONE); | |
| 1989 } | |
| 1990 } | |
| 1991 } | |
| 1992 } | |
| 1933 /////////////////////////////////////////////////////////////////////////////// | 1993 /////////////////////////////////////////////////////////////////////////////// |
| 1934 // Browser, content::NotificationObserver implementation: | 1994 // Browser, content::NotificationObserver implementation: |
| 1935 | 1995 |
| 1936 void Browser::Observe(int type, | 1996 void Browser::Observe(int type, |
| 1937 const content::NotificationSource& source, | 1997 const content::NotificationSource& source, |
| 1938 const content::NotificationDetails& details) { | 1998 const content::NotificationDetails& details) { |
| 1939 switch (type) { | 1999 switch (type) { |
| 1940 case extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { | |
| 1941 chrome::UpdateCommandEnabled( | |
| 1942 this, | |
| 1943 IDC_BOOKMARK_PAGE, | |
| 1944 !chrome::ShouldRemoveBookmarkThisPageUI(profile_)); | |
| 1945 chrome::UpdateCommandEnabled( | |
| 1946 this, | |
| 1947 IDC_BOOKMARK_ALL_TABS, | |
| 1948 !chrome::ShouldRemoveBookmarkOpenPagesUI(profile_)); | |
| 1949 | |
| 1950 if (window()->GetLocationBar()) | |
| 1951 window()->GetLocationBar()->UpdatePageActions(); | |
| 1952 | |
| 1953 const extensions::UnloadedExtensionInfo* extension_info = | |
| 1954 content::Details<extensions::UnloadedExtensionInfo>(details).ptr(); | |
| 1955 | |
| 1956 // Close any tabs from the unloaded extension, unless it's terminated, | |
| 1957 // in which case let the sad tabs remain. | |
| 1958 if (extension_info->reason != | |
| 1959 extensions::UnloadedExtensionInfo::REASON_TERMINATE) { | |
| 1960 const Extension* extension = extension_info->extension; | |
| 1961 // Iterate backwards as we may remove items while iterating. | |
| 1962 for (int i = tab_strip_model_->count() - 1; i >= 0; --i) { | |
| 1963 WebContents* web_contents = tab_strip_model_->GetWebContentsAt(i); | |
| 1964 // Two cases are handled here: | |
| 1965 // - The scheme check is for when an extension page is loaded in a | |
| 1966 // tab, e.g. chrome-extension://id/page.html. | |
| 1967 // - The extension_app check is for apps, which can have non-extension | |
| 1968 // schemes, e.g. https://mail.google.com if you have the Gmail app | |
| 1969 // installed. | |
| 1970 if ((web_contents->GetURL().SchemeIs(extensions::kExtensionScheme) && | |
| 1971 web_contents->GetURL().host() == extension->id()) || | |
| 1972 (extensions::TabHelper::FromWebContents( | |
| 1973 web_contents)->extension_app() == extension)) { | |
| 1974 tab_strip_model_->CloseWebContentsAt(i, TabStripModel::CLOSE_NONE); | |
| 1975 } | |
| 1976 } | |
| 1977 } | |
| 1978 break; | |
| 1979 } | |
| 1980 | |
| 1981 case extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: { | 2000 case extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: { |
| 1982 Profile* profile = content::Source<Profile>(source).ptr(); | 2001 Profile* profile = content::Source<Profile>(source).ptr(); |
| 1983 if (profile_->IsSameProfile(profile) && window()->GetLocationBar()) | 2002 if (profile_->IsSameProfile(profile) && window()->GetLocationBar()) |
| 1984 window()->GetLocationBar()->InvalidatePageActions(); | 2003 window()->GetLocationBar()->InvalidatePageActions(); |
| 1985 break; | 2004 break; |
| 1986 } | 2005 } |
| 1987 | 2006 |
| 1988 case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: | |
| 1989 chrome::UpdateCommandEnabled( | |
| 1990 this, | |
| 1991 IDC_BOOKMARK_PAGE, | |
| 1992 !chrome::ShouldRemoveBookmarkThisPageUI(profile_)); | |
| 1993 chrome::UpdateCommandEnabled( | |
| 1994 this, | |
| 1995 IDC_BOOKMARK_ALL_TABS, | |
| 1996 !chrome::ShouldRemoveBookmarkOpenPagesUI(profile_)); | |
| 1997 // fallthrough | |
| 1998 case extensions::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED: | |
| 1999 // During window creation on Windows we may end up calling into | |
| 2000 // SHAppBarMessage, which internally spawns a nested message loop. This | |
| 2001 // makes it possible for us to end up here before window creation has | |
| 2002 // completed, at which point window_ is NULL. See 94752 for details. | |
| 2003 if (window() && window()->GetLocationBar()) | |
| 2004 window()->GetLocationBar()->UpdatePageActions(); | |
| 2005 break; | |
| 2006 | |
| 2007 #if defined(ENABLE_THEMES) | 2007 #if defined(ENABLE_THEMES) |
| 2008 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: | 2008 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: |
| 2009 window()->UserChangedTheme(); | 2009 window()->UserChangedTheme(); |
| 2010 break; | 2010 break; |
| 2011 #endif | 2011 #endif |
| 2012 | 2012 |
| 2013 case chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED: { | 2013 case chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED: { |
| 2014 WebContents* web_contents = content::Source<WebContents>(source).ptr(); | 2014 WebContents* web_contents = content::Source<WebContents>(source).ptr(); |
| 2015 if (web_contents == tab_strip_model_->GetActiveWebContents()) { | 2015 if (web_contents == tab_strip_model_->GetActiveWebContents()) { |
| 2016 LocationBar* location_bar = window()->GetLocationBar(); | 2016 LocationBar* location_bar = window()->GetLocationBar(); |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2472 if (contents && !allow_js_access) { | 2472 if (contents && !allow_js_access) { |
| 2473 contents->web_contents()->GetController().LoadURL( | 2473 contents->web_contents()->GetController().LoadURL( |
| 2474 target_url, | 2474 target_url, |
| 2475 content::Referrer(), | 2475 content::Referrer(), |
| 2476 content::PAGE_TRANSITION_LINK, | 2476 content::PAGE_TRANSITION_LINK, |
| 2477 std::string()); // No extra headers. | 2477 std::string()); // No extra headers. |
| 2478 } | 2478 } |
| 2479 | 2479 |
| 2480 return contents != NULL; | 2480 return contents != NULL; |
| 2481 } | 2481 } |
| OLD | NEW |