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/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 // OS_WIN | 10 #endif // OS_WIN |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 88 #include "chrome/browser/sync/sync_ui_util.h" | 88 #include "chrome/browser/sync/sync_ui_util.h" |
| 89 #include "chrome/browser/tab_contents/background_contents.h" | 89 #include "chrome/browser/tab_contents/background_contents.h" |
| 90 #include "chrome/browser/tab_contents/retargeting_details.h" | 90 #include "chrome/browser/tab_contents/retargeting_details.h" |
| 91 #include "chrome/browser/tab_contents/simple_alert_infobar_delegate.h" | 91 #include "chrome/browser/tab_contents/simple_alert_infobar_delegate.h" |
| 92 #include "chrome/browser/tab_contents/tab_util.h" | 92 #include "chrome/browser/tab_contents/tab_util.h" |
| 93 #include "chrome/browser/themes/theme_service.h" | 93 #include "chrome/browser/themes/theme_service.h" |
| 94 #include "chrome/browser/themes/theme_service_factory.h" | 94 #include "chrome/browser/themes/theme_service_factory.h" |
| 95 #include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_creator.h" | 95 #include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_creator.h" |
| 96 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" | 96 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" |
| 97 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" | 97 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" |
| 98 #include "chrome/browser/ui/browser_command_controller.h" | |
| 98 #include "chrome/browser/ui/browser_commands.h" | 99 #include "chrome/browser/ui/browser_commands.h" |
| 99 #include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h" | 100 #include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h" |
| 100 #include "chrome/browser/ui/browser_dialogs.h" | 101 #include "chrome/browser/ui/browser_dialogs.h" |
| 101 #include "chrome/browser/ui/browser_finder.h" | 102 #include "chrome/browser/ui/browser_finder.h" |
| 102 #include "chrome/browser/ui/browser_list.h" | 103 #include "chrome/browser/ui/browser_list.h" |
| 103 #include "chrome/browser/ui/browser_navigator.h" | 104 #include "chrome/browser/ui/browser_navigator.h" |
| 104 #include "chrome/browser/ui/browser_tab_restore_service_delegate.h" | 105 #include "chrome/browser/ui/browser_tab_restore_service_delegate.h" |
| 105 #include "chrome/browser/ui/browser_toolbar_model_delegate.h" | 106 #include "chrome/browser/ui/browser_toolbar_model_delegate.h" |
| 106 #include "chrome/browser/ui/browser_ui_prefs.h" | 107 #include "chrome/browser/ui/browser_ui_prefs.h" |
| 107 #include "chrome/browser/ui/browser_window.h" | 108 #include "chrome/browser/ui/browser_window.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 230 "https://www.google.com/support/chrome/bin/request.py?contact_type=" | 231 "https://www.google.com/support/chrome/bin/request.py?contact_type=" |
| 231 "broken_website&format=inproduct&p.page_title=$1&p.page_url=$2"; | 232 "broken_website&format=inproduct&p.page_title=$1&p.page_url=$2"; |
| 232 | 233 |
| 233 // The URL for the privacy dashboard. | 234 // The URL for the privacy dashboard. |
| 234 const char kPrivacyDashboardUrl[] = "https://www.google.com/dashboard"; | 235 const char kPrivacyDashboardUrl[] = "https://www.google.com/dashboard"; |
| 235 | 236 |
| 236 // How long we wait before updating the browser chrome while loading a page. | 237 // How long we wait before updating the browser chrome while loading a page. |
| 237 const int kUIUpdateCoalescingTimeMS = 200; | 238 const int kUIUpdateCoalescingTimeMS = 200; |
| 238 | 239 |
| 239 // Returns |true| if entry has an internal chrome:// URL, |false| otherwise. | 240 // Returns |true| if entry has an internal chrome:// URL, |false| otherwise. |
| 240 bool HasInternalURL(const NavigationEntry* entry) { | 241 bool HasInternalURL(const NavigationEntry* entry) { |
|
sky
2012/06/27 03:09:28
Can this be remove from browser.cc now?
| |
| 241 if (!entry) | 242 if (!entry) |
| 242 return false; | 243 return false; |
| 243 | 244 |
| 244 // Check the |virtual_url()| first. This catches regular chrome:// URLs | 245 // Check the |virtual_url()| first. This catches regular chrome:// URLs |
| 245 // including URLs that were rewritten (such as chrome://bookmarks). | 246 // including URLs that were rewritten (such as chrome://bookmarks). |
| 246 if (entry->GetVirtualURL().SchemeIs(chrome::kChromeUIScheme)) | 247 if (entry->GetVirtualURL().SchemeIs(chrome::kChromeUIScheme)) |
| 247 return true; | 248 return true; |
| 248 | 249 |
| 249 // If the |virtual_url()| isn't a chrome:// URL, check if it's actually | 250 // If the |virtual_url()| isn't a chrome:// URL, check if it's actually |
| 250 // view-source: of a chrome:// URL. | 251 // view-source: of a chrome:// URL. |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 309 | 310 |
| 310 /////////////////////////////////////////////////////////////////////////////// | 311 /////////////////////////////////////////////////////////////////////////////// |
| 311 // Browser, Constructors, Creation, Showing: | 312 // Browser, Constructors, Creation, Showing: |
| 312 | 313 |
| 313 Browser::Browser(Type type, Profile* profile) | 314 Browser::Browser(Type type, Profile* profile) |
| 314 : type_(type), | 315 : type_(type), |
| 315 profile_(profile), | 316 profile_(profile), |
| 316 window_(NULL), | 317 window_(NULL), |
| 317 ALLOW_THIS_IN_INITIALIZER_LIST( | 318 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 318 tab_strip_model_(new TabStripModel(this, profile))), | 319 tab_strip_model_(new TabStripModel(this, profile))), |
| 319 command_updater_(this), | |
| 320 app_type_(APP_TYPE_HOST), | 320 app_type_(APP_TYPE_HOST), |
| 321 chrome_updater_factory_(this), | 321 chrome_updater_factory_(this), |
| 322 is_attempting_to_close_browser_(false), | 322 is_attempting_to_close_browser_(false), |
| 323 cancel_download_confirmation_state_(NOT_PROMPTED), | 323 cancel_download_confirmation_state_(NOT_PROMPTED), |
| 324 initial_show_state_(ui::SHOW_STATE_DEFAULT), | 324 initial_show_state_(ui::SHOW_STATE_DEFAULT), |
| 325 is_session_restore_(false), | 325 is_session_restore_(false), |
| 326 weak_factory_(this), | 326 weak_factory_(this), |
| 327 block_command_execution_(false), | |
| 328 last_blocked_command_id_(-1), | |
| 329 last_blocked_command_disposition_(CURRENT_TAB), | |
| 330 pending_web_app_action_(NONE), | 327 pending_web_app_action_(NONE), |
| 331 ALLOW_THIS_IN_INITIALIZER_LIST( | 328 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 332 content_setting_bubble_model_delegate_( | 329 content_setting_bubble_model_delegate_( |
| 333 new BrowserContentSettingBubbleModelDelegate(this))), | 330 new BrowserContentSettingBubbleModelDelegate(this))), |
| 334 ALLOW_THIS_IN_INITIALIZER_LIST( | 331 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 335 toolbar_model_delegate_( | 332 toolbar_model_delegate_( |
| 336 new BrowserToolbarModelDelegate(this))), | 333 new BrowserToolbarModelDelegate(this))), |
| 337 ALLOW_THIS_IN_INITIALIZER_LIST( | 334 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 338 tab_restore_service_delegate_( | 335 tab_restore_service_delegate_( |
| 339 new BrowserTabRestoreServiceDelegate(this))), | 336 new BrowserTabRestoreServiceDelegate(this))), |
| 340 ALLOW_THIS_IN_INITIALIZER_LIST( | 337 ALLOW_THIS_IN_INITIALIZER_LIST( |
| 341 synced_window_delegate_( | 338 synced_window_delegate_( |
| 342 new BrowserSyncedWindowDelegate(this))), | 339 new BrowserSyncedWindowDelegate(this))), |
| 343 bookmark_bar_state_(BookmarkBar::HIDDEN), | 340 bookmark_bar_state_(BookmarkBar::HIDDEN), |
| 341 ALLOW_THIS_IN_INITIALIZER_LIST( | |
| 342 command_controller_(new chrome::BrowserCommandController(this))), | |
| 344 window_has_shown_(false) { | 343 window_has_shown_(false) { |
| 345 tab_strip_model_->AddObserver(this); | 344 tab_strip_model_->AddObserver(this); |
| 346 | 345 |
| 347 toolbar_model_.reset(new ToolbarModel(toolbar_model_delegate_.get())); | 346 toolbar_model_.reset(new ToolbarModel(toolbar_model_delegate_.get())); |
| 348 search_model_.reset(new chrome::search::SearchModel(NULL)); | 347 search_model_.reset(new chrome::search::SearchModel(NULL)); |
| 349 search_delegate_.reset( | 348 search_delegate_.reset( |
| 350 new chrome::search::SearchDelegate(search_model_.get())); | 349 new chrome::search::SearchDelegate(search_model_.get())); |
| 351 | 350 |
| 352 registrar_.Add(this, content::NOTIFICATION_SSL_VISIBLE_STATE_CHANGED, | 351 registrar_.Add(this, content::NOTIFICATION_SSL_VISIBLE_STATE_CHANGED, |
| 353 content::NotificationService::AllSources()); | 352 content::NotificationService::AllSources()); |
| 354 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, | 353 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, |
| 355 content::Source<Profile>(profile_->GetOriginalProfile())); | 354 content::Source<Profile>(profile_->GetOriginalProfile())); |
| 356 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, | 355 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 357 content::Source<Profile>(profile_->GetOriginalProfile())); | 356 content::Source<Profile>(profile_->GetOriginalProfile())); |
| 358 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, | 357 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
| 359 content::Source<Profile>(profile_->GetOriginalProfile())); | 358 content::Source<Profile>(profile_->GetOriginalProfile())); |
| 360 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, | 359 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, |
| 361 content::NotificationService::AllSources()); | 360 content::NotificationService::AllSources()); |
| 362 #if defined(ENABLE_THEMES) | 361 #if defined(ENABLE_THEMES) |
| 363 registrar_.Add( | 362 registrar_.Add( |
| 364 this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | 363 this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
| 365 content::Source<ThemeService>( | 364 content::Source<ThemeService>( |
| 366 ThemeServiceFactory::GetForProfile(profile_))); | 365 ThemeServiceFactory::GetForProfile(profile_))); |
| 367 #endif | 366 #endif |
| 368 registrar_.Add(this, chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, | 367 registrar_.Add(this, chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, |
| 369 content::NotificationService::AllSources()); | 368 content::NotificationService::AllSources()); |
| 370 | 369 |
| 371 PrefService* local_state = g_browser_process->local_state(); | |
| 372 if (local_state) { | |
| 373 local_pref_registrar_.Init(local_state); | |
| 374 local_pref_registrar_.Add(prefs::kPrintingEnabled, this); | |
| 375 local_pref_registrar_.Add(prefs::kAllowFileSelectionDialogs, this); | |
| 376 local_pref_registrar_.Add(prefs::kInManagedMode, this); | |
| 377 } | |
| 378 | |
| 379 profile_pref_registrar_.Init(profile_->GetPrefs()); | 370 profile_pref_registrar_.Init(profile_->GetPrefs()); |
| 380 profile_pref_registrar_.Add(prefs::kDevToolsDisabled, this); | 371 profile_pref_registrar_.Add(prefs::kDevToolsDisabled, this); |
| 381 profile_pref_registrar_.Add(prefs::kEditBookmarksEnabled, this); | |
| 382 profile_pref_registrar_.Add(prefs::kShowBookmarkBar, this); | 372 profile_pref_registrar_.Add(prefs::kShowBookmarkBar, this); |
| 383 profile_pref_registrar_.Add(prefs::kHomePage, this); | 373 profile_pref_registrar_.Add(prefs::kHomePage, this); |
| 384 profile_pref_registrar_.Add(prefs::kInstantEnabled, this); | 374 profile_pref_registrar_.Add(prefs::kInstantEnabled, this); |
| 385 profile_pref_registrar_.Add(prefs::kIncognitoModeAvailability, this); | |
| 386 | 375 |
| 387 InitCommandState(); | |
| 388 BrowserList::AddBrowser(this); | 376 BrowserList::AddBrowser(this); |
| 389 | 377 |
| 390 // NOTE: These prefs all need to be explicitly destroyed in the destructor | 378 // NOTE: These prefs all need to be explicitly destroyed in the destructor |
| 391 // or you'll get a nasty surprise when you run the incognito tests. | 379 // or you'll get a nasty surprise when you run the incognito tests. |
| 392 encoding_auto_detect_.Init(prefs::kWebKitUsesUniversalDetector, | 380 encoding_auto_detect_.Init(prefs::kWebKitUsesUniversalDetector, |
| 393 profile_->GetPrefs(), NULL); | 381 profile_->GetPrefs(), NULL); |
| 394 | 382 |
| 395 tab_restore_service_ = TabRestoreServiceFactory::GetForProfile(profile); | |
| 396 if (tab_restore_service_) { | |
| 397 tab_restore_service_->AddObserver(this); | |
| 398 TabRestoreServiceChanged(tab_restore_service_); | |
| 399 } | |
| 400 | |
| 401 ProfileSyncService* service = | |
| 402 ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_); | |
| 403 if (service) | |
| 404 service->AddObserver(this); | |
| 405 | |
| 406 CreateInstantIfNecessary(); | 383 CreateInstantIfNecessary(); |
| 407 | 384 |
| 408 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_INIT); | 385 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_INIT); |
| 409 | 386 |
| 410 FilePath profile_path = profile->GetPath(); | 387 FilePath profile_path = profile->GetPath(); |
| 411 ProfileMetrics::LogProfileLaunch(profile_path); | 388 ProfileMetrics::LogProfileLaunch(profile_path); |
| 412 } | 389 } |
| 413 | 390 |
| 414 Browser::~Browser() { | 391 Browser::~Browser() { |
| 415 ProfileSyncService* service = | |
| 416 ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_); | |
| 417 if (service) | |
| 418 service->RemoveObserver(this); | |
| 419 | |
| 420 // The tab strip should not have any tabs at this point. | 392 // The tab strip should not have any tabs at this point. |
| 421 if (!browser_shutdown::ShuttingDownWithoutClosingBrowsers()) | 393 if (!browser_shutdown::ShuttingDownWithoutClosingBrowsers()) |
| 422 DCHECK(tab_strip_model_->empty()); | 394 DCHECK(tab_strip_model_->empty()); |
| 423 tab_strip_model_->RemoveObserver(this); | 395 tab_strip_model_->RemoveObserver(this); |
| 424 | 396 |
| 425 BrowserList::RemoveBrowser(this); | 397 BrowserList::RemoveBrowser(this); |
| 426 | 398 |
| 427 SessionService* session_service = | 399 SessionService* session_service = |
| 428 SessionServiceFactory::GetForProfile(profile_); | 400 SessionServiceFactory::GetForProfile(profile_); |
| 429 if (session_service) | 401 if (session_service) |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 443 // thread tries to use the IO thread (or another thread) that is no longer | 415 // thread tries to use the IO thread (or another thread) that is no longer |
| 444 // valid. | 416 // valid. |
| 445 // This isn't a valid assumption for Mac OS, as it stays running after | 417 // This isn't a valid assumption for Mac OS, as it stays running after |
| 446 // the last browser has closed. The Mac equivalent is in its app | 418 // the last browser has closed. The Mac equivalent is in its app |
| 447 // controller. | 419 // controller. |
| 448 TabRestoreServiceFactory::ResetForProfile(profile_); | 420 TabRestoreServiceFactory::ResetForProfile(profile_); |
| 449 } | 421 } |
| 450 #endif | 422 #endif |
| 451 | 423 |
| 452 profile_pref_registrar_.RemoveAll(); | 424 profile_pref_registrar_.RemoveAll(); |
| 453 local_pref_registrar_.RemoveAll(); | |
| 454 | 425 |
| 455 encoding_auto_detect_.Destroy(); | 426 encoding_auto_detect_.Destroy(); |
| 456 | 427 |
| 457 if (profile_->IsOffTheRecord() && | 428 if (profile_->IsOffTheRecord() && |
| 458 !BrowserList::IsOffTheRecordSessionActiveForProfile(profile_)) { | 429 !BrowserList::IsOffTheRecordSessionActiveForProfile(profile_)) { |
| 459 // An incognito profile is no longer needed, this indirectly frees | 430 // An incognito profile is no longer needed, this indirectly frees |
| 460 // its cache and cookies once it gets destroyed at the appropriate time. | 431 // its cache and cookies once it gets destroyed at the appropriate time. |
| 461 ProfileDestroyer::DestroyProfileWhenAppropriate(profile_); | 432 ProfileDestroyer::DestroyProfileWhenAppropriate(profile_); |
| 462 } | 433 } |
| 463 | 434 |
| 464 // There may be pending file dialogs, we need to tell them that we've gone | 435 // There may be pending file dialogs, we need to tell them that we've gone |
| 465 // away so they don't try and call back to us. | 436 // away so they don't try and call back to us. |
| 466 if (select_file_dialog_.get()) | 437 if (select_file_dialog_.get()) |
| 467 select_file_dialog_->ListenerDestroyed(); | 438 select_file_dialog_->ListenerDestroyed(); |
| 468 | |
| 469 TabRestoreServiceDestroyed(tab_restore_service_); | |
| 470 } | 439 } |
| 471 | 440 |
| 472 // static | 441 // static |
| 473 Browser* Browser::Create(Profile* profile) { | 442 Browser* Browser::Create(Profile* profile) { |
| 474 Browser* browser = new Browser(TYPE_TABBED, profile); | 443 Browser* browser = new Browser(TYPE_TABBED, profile); |
| 475 browser->InitBrowserWindow(); | 444 browser->InitBrowserWindow(); |
| 476 return browser; | 445 return browser; |
| 477 } | 446 } |
| 478 | 447 |
| 479 // static | 448 // static |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 931 profile_, navigations, &entries); | 900 profile_, navigations, &entries); |
| 932 replacement->GetController().Restore( | 901 replacement->GetController().Restore( |
| 933 selected_navigation, from_last_session, &entries); | 902 selected_navigation, from_last_session, &entries); |
| 934 DCHECK_EQ(0u, entries.size()); | 903 DCHECK_EQ(0u, entries.size()); |
| 935 | 904 |
| 936 tab_strip_model_->ReplaceNavigationControllerAt(active_index(), tab_contents); | 905 tab_strip_model_->ReplaceNavigationControllerAt(active_index(), tab_contents); |
| 937 } | 906 } |
| 938 | 907 |
| 939 void Browser::WindowFullscreenStateChanged() { | 908 void Browser::WindowFullscreenStateChanged() { |
| 940 fullscreen_controller_->WindowFullscreenStateChanged(); | 909 fullscreen_controller_->WindowFullscreenStateChanged(); |
| 941 FullScreenMode fullscreen_mode = FULLSCREEN_DISABLED; | 910 command_controller_->FullscreenStateChanged(); |
| 942 if (window_->IsFullscreen()) { | |
| 943 #if defined(OS_WIN) | |
| 944 fullscreen_mode = window_->IsInMetroSnapMode() ? FULLSCREEN_METRO_SNAP : | |
| 945 FULLSCREEN_NORMAL; | |
| 946 #else | |
| 947 fullscreen_mode = FULLSCREEN_NORMAL; | |
| 948 #endif | |
| 949 } | |
| 950 UpdateCommandsForFullscreenMode(fullscreen_mode); | |
| 951 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN); | 911 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN); |
| 952 } | 912 } |
| 953 | 913 |
| 954 /////////////////////////////////////////////////////////////////////////////// | 914 /////////////////////////////////////////////////////////////////////////////// |
| 955 // Browser, Assorted browser commands: | 915 // Browser, Assorted browser commands: |
| 956 | 916 |
| 957 void Browser::ToggleFullscreenMode() { | 917 void Browser::ToggleFullscreenMode() { |
| 958 fullscreen_controller_->ToggleFullscreenMode(); | 918 fullscreen_controller_->ToggleFullscreenMode(); |
| 959 } | 919 } |
| 960 | 920 |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1182 if (!tab_contents || !tab_contents->find_tab_helper()) | 1142 if (!tab_contents || !tab_contents->find_tab_helper()) |
| 1183 return; | 1143 return; |
| 1184 | 1144 |
| 1185 tab_contents->find_tab_helper()->HandleFindReply(request_id, | 1145 tab_contents->find_tab_helper()->HandleFindReply(request_id, |
| 1186 number_of_matches, | 1146 number_of_matches, |
| 1187 selection_rect, | 1147 selection_rect, |
| 1188 active_match_ordinal, | 1148 active_match_ordinal, |
| 1189 final_update); | 1149 final_update); |
| 1190 } | 1150 } |
| 1191 | 1151 |
| 1192 void Browser::ExecuteCommand(int id) { | |
| 1193 ExecuteCommandWithDisposition(id, CURRENT_TAB); | |
| 1194 } | |
| 1195 | |
| 1196 void Browser::ExecuteCommand(int id, int event_flags) { | |
| 1197 ExecuteCommandWithDisposition( | |
| 1198 id, browser::DispositionFromEventFlags(event_flags)); | |
| 1199 } | |
| 1200 | |
| 1201 bool Browser::ExecuteCommandIfEnabled(int id) { | |
| 1202 if (command_updater_.SupportsCommand(id) && | |
| 1203 command_updater_.IsCommandEnabled(id)) { | |
| 1204 ExecuteCommand(id); | |
| 1205 return true; | |
| 1206 } | |
| 1207 return false; | |
| 1208 } | |
| 1209 | |
| 1210 bool Browser::IsReservedCommandOrKey(int command_id, | |
| 1211 const NativeWebKeyboardEvent& event) { | |
| 1212 // In Apps mode, no keys are reserved. | |
| 1213 if (is_app()) | |
| 1214 return false; | |
| 1215 | |
| 1216 #if defined(OS_CHROMEOS) | |
| 1217 // Chrome OS's top row of keys produces F1-10. Make sure that web pages | |
| 1218 // aren't able to block Chrome from performing the standard actions for F1-F4. | |
| 1219 // We should not handle F5-10 here since they are processed by Ash. See also: | |
| 1220 // crbug.com/127333#c8 | |
| 1221 ui::KeyboardCode key_code = | |
| 1222 static_cast<ui::KeyboardCode>(event.windowsKeyCode); | |
| 1223 if ((key_code == ui::VKEY_F1 || | |
| 1224 key_code == ui::VKEY_F2 || | |
| 1225 key_code == ui::VKEY_F3 || | |
| 1226 key_code == ui::VKEY_F4) && | |
| 1227 // Make sure it's a browser shortcut (i.e. not an Ash one like Alt+F4). | |
| 1228 command_id != -1) { | |
| 1229 return true; | |
| 1230 } | |
| 1231 #endif | |
| 1232 | |
| 1233 if (window_->IsFullscreen() && command_id == IDC_FULLSCREEN) | |
| 1234 return true; | |
| 1235 return command_id == IDC_CLOSE_TAB || | |
| 1236 command_id == IDC_CLOSE_WINDOW || | |
| 1237 command_id == IDC_NEW_INCOGNITO_WINDOW || | |
| 1238 command_id == IDC_NEW_TAB || | |
| 1239 command_id == IDC_NEW_WINDOW || | |
| 1240 command_id == IDC_RESTORE_TAB || | |
| 1241 command_id == IDC_SELECT_NEXT_TAB || | |
| 1242 command_id == IDC_SELECT_PREVIOUS_TAB || | |
| 1243 command_id == IDC_TABPOSE || | |
| 1244 command_id == IDC_EXIT || | |
| 1245 command_id == IDC_SEARCH; | |
| 1246 } | |
| 1247 | |
| 1248 void Browser::SetBlockCommandExecution(bool block) { | |
| 1249 block_command_execution_ = block; | |
| 1250 if (block) { | |
| 1251 last_blocked_command_id_ = -1; | |
| 1252 last_blocked_command_disposition_ = CURRENT_TAB; | |
| 1253 } | |
| 1254 } | |
| 1255 | |
| 1256 int Browser::GetLastBlockedCommand(WindowOpenDisposition* disposition) { | |
| 1257 if (disposition) | |
| 1258 *disposition = last_blocked_command_disposition_; | |
| 1259 return last_blocked_command_id_; | |
| 1260 } | |
| 1261 | |
| 1262 void Browser::UpdateUIForNavigationInTab(TabContents* contents, | 1152 void Browser::UpdateUIForNavigationInTab(TabContents* contents, |
| 1263 content::PageTransition transition, | 1153 content::PageTransition transition, |
| 1264 bool user_initiated) { | 1154 bool user_initiated) { |
| 1265 tab_strip_model_->TabNavigating(contents, transition); | 1155 tab_strip_model_->TabNavigating(contents, transition); |
| 1266 | 1156 |
| 1267 bool contents_is_selected = contents == GetActiveTabContents(); | 1157 bool contents_is_selected = contents == GetActiveTabContents(); |
| 1268 if (user_initiated && contents_is_selected && window()->GetLocationBar()) { | 1158 if (user_initiated && contents_is_selected && window()->GetLocationBar()) { |
| 1269 // Forcibly reset the location bar if the url is going to change in the | 1159 // Forcibly reset the location bar if the url is going to change in the |
| 1270 // current tab, since otherwise it won't discard any ongoing user edits, | 1160 // current tab, since otherwise it won't discard any ongoing user edits, |
| 1271 // since it doesn't realize this is a user-initiated action. | 1161 // since it doesn't realize this is a user-initiated action. |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1287 contents->web_contents()->Focus(); | 1177 contents->web_contents()->Focus(); |
| 1288 } | 1178 } |
| 1289 | 1179 |
| 1290 /////////////////////////////////////////////////////////////////////////////// | 1180 /////////////////////////////////////////////////////////////////////////////// |
| 1291 // Browser, PageNavigator implementation: | 1181 // Browser, PageNavigator implementation: |
| 1292 | 1182 |
| 1293 WebContents* Browser::OpenURL(const OpenURLParams& params) { | 1183 WebContents* Browser::OpenURL(const OpenURLParams& params) { |
| 1294 return OpenURLFromTab(NULL, params); | 1184 return OpenURLFromTab(NULL, params); |
| 1295 } | 1185 } |
| 1296 | 1186 |
| 1297 /////////////////////////////////////////////////////////////////////////////// | |
| 1298 // Browser, CommandUpdater::CommandUpdaterDelegate implementation: | |
| 1299 | |
| 1300 void Browser::ExecuteCommandWithDisposition( | |
| 1301 int id, WindowOpenDisposition disposition) { | |
| 1302 // No commands are enabled if there is not yet any selected tab. | |
| 1303 // TODO(pkasting): It seems like we should not need this, because either | |
| 1304 // most/all commands should not have been enabled yet anyway or the ones that | |
| 1305 // are enabled should be global, or safe themselves against having no selected | |
| 1306 // tab. However, Ben says he tried removing this before and got lots of | |
| 1307 // crashes, e.g. from Windows sending WM_COMMANDs at random times during | |
| 1308 // window construction. This probably could use closer examination someday. | |
| 1309 if (!GetActiveTabContents()) | |
| 1310 return; | |
| 1311 | |
| 1312 DCHECK(command_updater_.IsCommandEnabled(id)) << "Invalid/disabled command " | |
| 1313 << id; | |
| 1314 | |
| 1315 // If command execution is blocked then just record the command and return. | |
| 1316 if (block_command_execution_) { | |
| 1317 // We actually only allow no more than one blocked command, otherwise some | |
| 1318 // commands maybe lost. | |
| 1319 DCHECK_EQ(last_blocked_command_id_, -1); | |
| 1320 last_blocked_command_id_ = id; | |
| 1321 last_blocked_command_disposition_ = disposition; | |
| 1322 return; | |
| 1323 } | |
| 1324 | |
| 1325 // The order of commands in this switch statement must match the function | |
| 1326 // declaration order in browser.h! | |
| 1327 switch (id) { | |
| 1328 // Navigation commands | |
| 1329 case IDC_BACK: chrome::GoBack(this, disposition);break; | |
| 1330 case IDC_FORWARD: | |
| 1331 chrome::GoForward(this, disposition); | |
| 1332 break; | |
| 1333 case IDC_RELOAD: chrome::Reload(this, disposition);break; | |
| 1334 case IDC_RELOAD_IGNORING_CACHE: | |
| 1335 chrome::ReloadIgnoringCache(this, disposition); | |
| 1336 break; | |
| 1337 case IDC_HOME: chrome::Home(this, disposition); break; | |
| 1338 case IDC_OPEN_CURRENT_URL: chrome::OpenCurrentURL(this); break; | |
| 1339 case IDC_STOP: chrome::Stop(this); break; | |
| 1340 | |
| 1341 // Window management commands | |
| 1342 case IDC_NEW_WINDOW: chrome::NewWindow(this); break; | |
| 1343 case IDC_NEW_INCOGNITO_WINDOW: chrome::NewIncognitoWindow(this); break; | |
| 1344 case IDC_CLOSE_WINDOW: chrome::CloseWindow(this); break; | |
| 1345 case IDC_NEW_TAB: chrome::NewTab(this); break; | |
| 1346 case IDC_CLOSE_TAB: chrome::CloseTab(this); break; | |
| 1347 case IDC_SELECT_NEXT_TAB: chrome::SelectNextTab(this); break; | |
| 1348 case IDC_SELECT_PREVIOUS_TAB: chrome::SelectPreviousTab(this); break; | |
| 1349 case IDC_TABPOSE: chrome::OpenTabpose(this); break; | |
| 1350 case IDC_MOVE_TAB_NEXT: chrome::MoveTabNext(this); break; | |
| 1351 case IDC_MOVE_TAB_PREVIOUS: chrome::MoveTabPrevious(this); break; | |
| 1352 case IDC_SELECT_TAB_0: | |
| 1353 case IDC_SELECT_TAB_1: | |
| 1354 case IDC_SELECT_TAB_2: | |
| 1355 case IDC_SELECT_TAB_3: | |
| 1356 case IDC_SELECT_TAB_4: | |
| 1357 case IDC_SELECT_TAB_5: | |
| 1358 case IDC_SELECT_TAB_6: | |
| 1359 case IDC_SELECT_TAB_7: | |
| 1360 chrome::SelectNumberedTab(this, id - IDC_SELECT_TAB_0); | |
| 1361 break; | |
| 1362 case IDC_SELECT_LAST_TAB: chrome::SelectLastTab(this); break; | |
| 1363 case IDC_DUPLICATE_TAB: chrome::DuplicateTab(this); break; | |
| 1364 case IDC_RESTORE_TAB: RestoreTab(); break; | |
| 1365 case IDC_COPY_URL: | |
| 1366 chrome::WriteCurrentURLToClipboard(this); | |
| 1367 break; | |
| 1368 case IDC_SHOW_AS_TAB: | |
| 1369 chrome::ConvertPopupToTabbedBrowser(this); | |
| 1370 break; | |
| 1371 case IDC_FULLSCREEN: ToggleFullscreenMode(); break; | |
| 1372 #if defined(OS_WIN) | |
| 1373 case IDC_METRO_SNAP_ENABLE: SetMetroSnapMode(true); break; | |
| 1374 case IDC_METRO_SNAP_DISABLE: SetMetroSnapMode(false); break; | |
| 1375 #endif | |
| 1376 #if defined(OS_MACOSX) | |
| 1377 case IDC_PRESENTATION_MODE: TogglePresentationMode(); break; | |
| 1378 #endif | |
| 1379 case IDC_EXIT: chrome::Exit(); break; | |
| 1380 | |
| 1381 // Page-related commands | |
| 1382 case IDC_SAVE_PAGE: chrome::SavePage(this); break; | |
| 1383 case IDC_BOOKMARK_PAGE: chrome::BookmarkCurrentPage(this);break; | |
| 1384 case IDC_PIN_TO_START_SCREEN: | |
| 1385 chrome::PinCurrentPageToStartScreen(this); | |
| 1386 break; | |
| 1387 case IDC_BOOKMARK_ALL_TABS: BookmarkAllTabs(); break; | |
| 1388 case IDC_VIEW_SOURCE: chrome::ViewSelectedSource(this); break; | |
| 1389 case IDC_EMAIL_PAGE_LOCATION: chrome::EmailPageLocation(this); break; | |
| 1390 case IDC_PRINT: chrome::Print(this); break; | |
| 1391 case IDC_ADVANCED_PRINT: chrome::AdvancedPrint(this); break; | |
| 1392 case IDC_CHROME_TO_MOBILE_PAGE: | |
| 1393 chrome::ShowChromeToMobileBubble(this); | |
| 1394 break; | |
| 1395 case IDC_ENCODING_AUTO_DETECT: ToggleEncodingAutoDetect(); break; | |
| 1396 case IDC_ENCODING_UTF8: | |
| 1397 case IDC_ENCODING_UTF16LE: | |
| 1398 case IDC_ENCODING_ISO88591: | |
| 1399 case IDC_ENCODING_WINDOWS1252: | |
| 1400 case IDC_ENCODING_GBK: | |
| 1401 case IDC_ENCODING_GB18030: | |
| 1402 case IDC_ENCODING_BIG5HKSCS: | |
| 1403 case IDC_ENCODING_BIG5: | |
| 1404 case IDC_ENCODING_KOREAN: | |
| 1405 case IDC_ENCODING_SHIFTJIS: | |
| 1406 case IDC_ENCODING_ISO2022JP: | |
| 1407 case IDC_ENCODING_EUCJP: | |
| 1408 case IDC_ENCODING_THAI: | |
| 1409 case IDC_ENCODING_ISO885915: | |
| 1410 case IDC_ENCODING_MACINTOSH: | |
| 1411 case IDC_ENCODING_ISO88592: | |
| 1412 case IDC_ENCODING_WINDOWS1250: | |
| 1413 case IDC_ENCODING_ISO88595: | |
| 1414 case IDC_ENCODING_WINDOWS1251: | |
| 1415 case IDC_ENCODING_KOI8R: | |
| 1416 case IDC_ENCODING_KOI8U: | |
| 1417 case IDC_ENCODING_ISO88597: | |
| 1418 case IDC_ENCODING_WINDOWS1253: | |
| 1419 case IDC_ENCODING_ISO88594: | |
| 1420 case IDC_ENCODING_ISO885913: | |
| 1421 case IDC_ENCODING_WINDOWS1257: | |
| 1422 case IDC_ENCODING_ISO88593: | |
| 1423 case IDC_ENCODING_ISO885910: | |
| 1424 case IDC_ENCODING_ISO885914: | |
| 1425 case IDC_ENCODING_ISO885916: | |
| 1426 case IDC_ENCODING_WINDOWS1254: | |
| 1427 case IDC_ENCODING_ISO88596: | |
| 1428 case IDC_ENCODING_WINDOWS1256: | |
| 1429 case IDC_ENCODING_ISO88598: | |
| 1430 case IDC_ENCODING_ISO88598I: | |
| 1431 case IDC_ENCODING_WINDOWS1255: | |
| 1432 case IDC_ENCODING_WINDOWS1258: OverrideEncoding(id); break; | |
| 1433 | |
| 1434 // Clipboard commands | |
| 1435 case IDC_CUT: chrome::Cut(this); break; | |
| 1436 case IDC_COPY: chrome::Copy(this); break; | |
| 1437 case IDC_PASTE: chrome::Paste(this); break; | |
| 1438 | |
| 1439 // Find-in-page | |
| 1440 case IDC_FIND: chrome::Find(this); break; | |
| 1441 case IDC_FIND_NEXT: chrome::FindNext(this); break; | |
| 1442 case IDC_FIND_PREVIOUS: chrome::FindPrevious(this); break; | |
| 1443 | |
| 1444 // Zoom | |
| 1445 case IDC_ZOOM_PLUS: | |
| 1446 chrome::Zoom(this, content::PAGE_ZOOM_IN); | |
| 1447 break; | |
| 1448 case IDC_ZOOM_NORMAL: | |
| 1449 chrome::Zoom(this, content::PAGE_ZOOM_RESET); | |
| 1450 break; | |
| 1451 case IDC_ZOOM_MINUS: | |
| 1452 chrome::Zoom(this, content::PAGE_ZOOM_OUT); | |
| 1453 break; | |
| 1454 | |
| 1455 // Focus various bits of UI | |
| 1456 case IDC_FOCUS_TOOLBAR: chrome::FocusToolbar(this); break; | |
| 1457 case IDC_FOCUS_LOCATION: chrome::FocusLocationBar(this); break; | |
| 1458 case IDC_FOCUS_SEARCH: chrome::FocusSearch(this); break; | |
| 1459 case IDC_FOCUS_MENU_BAR: chrome::FocusAppMenu(this); break; | |
| 1460 case IDC_FOCUS_BOOKMARKS: | |
| 1461 chrome::FocusBookmarksToolbar(this); | |
| 1462 break; | |
| 1463 case IDC_FOCUS_NEXT_PANE: chrome::FocusNextPane(this); break; | |
| 1464 case IDC_FOCUS_PREVIOUS_PANE: chrome::FocusPreviousPane(this); break; | |
| 1465 | |
| 1466 // Show various bits of UI | |
| 1467 case IDC_OPEN_FILE: OpenFile(); break; | |
| 1468 case IDC_CREATE_SHORTCUTS: OpenCreateShortcutsDialog(); break; | |
| 1469 case IDC_DEV_TOOLS: | |
| 1470 chrome::ToggleDevToolsWindow(this, DEVTOOLS_TOGGLE_ACTION_NONE); | |
| 1471 break; | |
| 1472 case IDC_DEV_TOOLS_CONSOLE: | |
| 1473 chrome::ToggleDevToolsWindow(this, DEVTOOLS_TOGGLE_ACTION_SHOW_CONSOLE); | |
| 1474 break; | |
| 1475 case IDC_DEV_TOOLS_INSPECT: | |
| 1476 chrome::ToggleDevToolsWindow(this, DEVTOOLS_TOGGLE_ACTION_INSPECT); | |
| 1477 break; | |
| 1478 case IDC_TASK_MANAGER: | |
| 1479 chrome::OpenTaskManager(this, false); | |
| 1480 break; | |
| 1481 case IDC_VIEW_BACKGROUND_PAGES: | |
| 1482 chrome::OpenTaskManager(this, true); | |
| 1483 break; | |
| 1484 case IDC_FEEDBACK: | |
| 1485 chrome::OpenFeedbackDialog(this); | |
| 1486 break; | |
| 1487 | |
| 1488 case IDC_SHOW_BOOKMARK_BAR: chrome::ToggleBookmarkBar(this); break; | |
| 1489 case IDC_PROFILING_ENABLED: Profiling::Toggle(); break; | |
| 1490 | |
| 1491 case IDC_SHOW_BOOKMARK_MANAGER: chrome::ShowBookmarkManager(this);break; | |
| 1492 case IDC_SHOW_APP_MENU: chrome::ShowAppMenu(this); break; | |
| 1493 case IDC_SHOW_AVATAR_MENU: chrome::ShowAvatarMenu(this); break; | |
| 1494 case IDC_SHOW_HISTORY: chrome::ShowHistory(this); break; | |
| 1495 case IDC_SHOW_DOWNLOADS: chrome::ShowDownloads(this); break; | |
| 1496 case IDC_MANAGE_EXTENSIONS: chrome::ShowExtensions(this); break; | |
| 1497 case IDC_OPTIONS: chrome::ShowSettings(this); break; | |
| 1498 case IDC_EDIT_SEARCH_ENGINES: | |
| 1499 chrome::ShowSearchEngineSettings(this); | |
| 1500 break; | |
| 1501 case IDC_VIEW_PASSWORDS: chrome::ShowPasswordManager(this);break; | |
| 1502 case IDC_CLEAR_BROWSING_DATA: | |
| 1503 chrome::ShowClearBrowsingDataDialog(this); | |
| 1504 break; | |
| 1505 case IDC_IMPORT_SETTINGS: chrome::ShowImportDialog(this); break; | |
| 1506 case IDC_ABOUT: chrome::ShowAboutChrome(this); break; | |
| 1507 case IDC_UPGRADE_DIALOG: | |
| 1508 chrome::OpenUpdateChromeDialog(this); | |
| 1509 break; | |
| 1510 case IDC_VIEW_INCOMPATIBILITIES: | |
| 1511 chrome::ShowConflicts(this); | |
| 1512 break; | |
| 1513 case IDC_HELP_PAGE_VIA_KEYBOARD: | |
| 1514 chrome::ShowHelp(this, chrome::HELP_SOURCE_KEYBOARD); | |
| 1515 break; | |
| 1516 case IDC_HELP_PAGE_VIA_MENU: | |
| 1517 chrome::ShowHelp(this, chrome::HELP_SOURCE_MENU); | |
| 1518 break; | |
| 1519 case IDC_SHOW_SYNC_SETUP: | |
| 1520 chrome::ShowSyncSetup(this, SyncPromoUI::SOURCE_MENU); | |
| 1521 break; | |
| 1522 case IDC_TOGGLE_SPEECH_INPUT: chrome::ToggleSpeechInput(this); break; | |
| 1523 | |
| 1524 default: | |
| 1525 LOG(WARNING) << "Received Unimplemented Command: " << id; | |
| 1526 break; | |
| 1527 } | |
| 1528 } | |
| 1529 | |
| 1530 //////////////////////////////////////////////////////////////////////////////// | |
| 1531 // Browser, TabRestoreServiceObserver: | |
| 1532 | |
| 1533 void Browser::TabRestoreServiceChanged(TabRestoreService* service) { | |
| 1534 command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, | |
| 1535 !service->entries().empty()); | |
| 1536 } | |
| 1537 | |
| 1538 void Browser::TabRestoreServiceDestroyed(TabRestoreService* service) { | |
| 1539 if (!tab_restore_service_) | |
| 1540 return; | |
| 1541 | |
| 1542 DCHECK_EQ(tab_restore_service_, service); | |
| 1543 tab_restore_service_->RemoveObserver(this); | |
| 1544 tab_restore_service_ = NULL; | |
| 1545 } | |
| 1546 | |
| 1547 // Centralized method for creating a TabContents, configuring and | 1187 // Centralized method for creating a TabContents, configuring and |
| 1548 // installing all its supporting objects and observers. | 1188 // installing all its supporting objects and observers. |
| 1549 TabContents* Browser::TabContentsFactory( | 1189 TabContents* Browser::TabContentsFactory( |
| 1550 Profile* profile, | 1190 Profile* profile, |
| 1551 SiteInstance* site_instance, | 1191 SiteInstance* site_instance, |
| 1552 int routing_id, | 1192 int routing_id, |
| 1553 const WebContents* base_web_contents, | 1193 const WebContents* base_web_contents, |
| 1554 content::SessionStorageNamespace* session_storage_namespace) { | 1194 content::SessionStorageNamespace* session_storage_namespace) { |
| 1555 WebContents* new_contents = WebContents::Create( | 1195 WebContents* new_contents = WebContents::Create( |
| 1556 profile, site_instance, routing_id, base_web_contents, | 1196 profile, site_instance, routing_id, base_web_contents, |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1708 service->CreateHistoricalTab(contents->web_contents(), | 1348 service->CreateHistoricalTab(contents->web_contents(), |
| 1709 tab_strip_model_->GetIndexOfTabContents(contents)); | 1349 tab_strip_model_->GetIndexOfTabContents(contents)); |
| 1710 } | 1350 } |
| 1711 } | 1351 } |
| 1712 | 1352 |
| 1713 bool Browser::RunUnloadListenerBeforeClosing(TabContents* contents) { | 1353 bool Browser::RunUnloadListenerBeforeClosing(TabContents* contents) { |
| 1714 return Browser::RunUnloadEventsHelper(contents->web_contents()); | 1354 return Browser::RunUnloadEventsHelper(contents->web_contents()); |
| 1715 } | 1355 } |
| 1716 | 1356 |
| 1717 bool Browser::CanBookmarkAllTabs() const { | 1357 bool Browser::CanBookmarkAllTabs() const { |
| 1718 BookmarkModel* model = profile()->GetBookmarkModel(); | 1358 return chrome::CanBookmarkAllTabs(this); |
| 1719 return (model && model->IsLoaded()) && | |
| 1720 tab_count() > 1 && | |
| 1721 profile()->GetPrefs()->GetBoolean(prefs::kEditBookmarksEnabled); | |
| 1722 } | 1359 } |
| 1723 | 1360 |
| 1724 void Browser::BookmarkAllTabs() { | 1361 void Browser::BookmarkAllTabs() { |
| 1725 BookmarkEditor::ShowBookmarkAllTabsDialog(this); | 1362 chrome::BookmarkAllTabs(this); |
| 1726 } | 1363 } |
| 1727 | 1364 |
| 1728 bool Browser::CanRestoreTab() { | 1365 bool Browser::CanRestoreTab() { |
| 1729 return command_updater_.IsCommandEnabled(IDC_RESTORE_TAB); | 1366 return chrome::CanRestoreTab(this); |
| 1730 } | 1367 } |
| 1731 | 1368 |
| 1732 void Browser::RestoreTab() { | 1369 void Browser::RestoreTab() { |
| 1733 content::RecordAction(UserMetricsAction("RestoreTab")); | 1370 chrome::RestoreTab(this); |
| 1734 TabRestoreService* service = | |
| 1735 TabRestoreServiceFactory::GetForProfile(profile_); | |
| 1736 if (!service) | |
| 1737 return; | |
| 1738 | |
| 1739 service->RestoreMostRecentEntry(tab_restore_service_delegate()); | |
| 1740 } | 1371 } |
| 1741 | 1372 |
| 1742 /////////////////////////////////////////////////////////////////////////////// | 1373 /////////////////////////////////////////////////////////////////////////////// |
| 1743 // Browser, TabStripModelObserver implementation: | 1374 // Browser, TabStripModelObserver implementation: |
| 1744 | 1375 |
| 1745 void Browser::TabInsertedAt(TabContents* contents, | 1376 void Browser::TabInsertedAt(TabContents* contents, |
| 1746 int index, | 1377 int index, |
| 1747 bool foreground) { | 1378 bool foreground) { |
| 1748 SetAsDelegate(contents, this); | 1379 SetAsDelegate(contents, this); |
| 1749 contents->restore_tab_helper()->SetWindowID(session_id()); | 1380 contents->restore_tab_helper()->SetWindowID(session_id()); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1829 if (chrome_updater_factory_.HasWeakPtrs() && old_contents) | 1460 if (chrome_updater_factory_.HasWeakPtrs() && old_contents) |
| 1830 ProcessPendingUIUpdates(); | 1461 ProcessPendingUIUpdates(); |
| 1831 | 1462 |
| 1832 // Propagate the profile to the location bar. | 1463 // Propagate the profile to the location bar. |
| 1833 UpdateToolbar(true); | 1464 UpdateToolbar(true); |
| 1834 | 1465 |
| 1835 // Propagate tab state to toolbar, tab-strip, etc. | 1466 // Propagate tab state to toolbar, tab-strip, etc. |
| 1836 UpdateSearchState(new_contents); | 1467 UpdateSearchState(new_contents); |
| 1837 | 1468 |
| 1838 // Update reload/stop state. | 1469 // Update reload/stop state. |
| 1839 UpdateReloadStopState(new_contents->web_contents()->IsLoading(), true); | 1470 command_controller_->LoadingStateChanged( |
| 1471 new_contents->web_contents()->IsLoading(), true); | |
| 1840 | 1472 |
| 1841 // Update commands to reflect current state. | 1473 // Update commands to reflect current state. |
| 1842 UpdateCommandsForTabState(); | 1474 command_controller_->TabStateChanged(); |
| 1843 | 1475 |
| 1844 // Reset the status bubble. | 1476 // Reset the status bubble. |
| 1845 StatusBubble* status_bubble = GetStatusBubble(); | 1477 StatusBubble* status_bubble = GetStatusBubble(); |
| 1846 if (status_bubble) { | 1478 if (status_bubble) { |
| 1847 status_bubble->Hide(); | 1479 status_bubble->Hide(); |
| 1848 | 1480 |
| 1849 // Show the loading state (if any). | 1481 // Show the loading state (if any). |
| 1850 status_bubble->SetStatus( | 1482 status_bubble->SetStatus( |
| 1851 GetActiveTabContents()->core_tab_helper()->GetStatusText()); | 1483 GetActiveTabContents()->core_tab_helper()->GetStatusText()); |
| 1852 } | 1484 } |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2040 // Only update the UI when something visible has changed. | 1672 // Only update the UI when something visible has changed. |
| 2041 if (changed_flags) | 1673 if (changed_flags) |
| 2042 ScheduleUIUpdate(source, changed_flags); | 1674 ScheduleUIUpdate(source, changed_flags); |
| 2043 | 1675 |
| 2044 // We can synchronously update commands since they will only change once per | 1676 // We can synchronously update commands since they will only change once per |
| 2045 // navigation, so we don't have to worry about flickering. We do, however, | 1677 // navigation, so we don't have to worry about flickering. We do, however, |
| 2046 // need to update the command state early on load to always present usable | 1678 // need to update the command state early on load to always present usable |
| 2047 // actions in the face of slow-to-commit pages. | 1679 // actions in the face of slow-to-commit pages. |
| 2048 if (changed_flags & (content::INVALIDATE_TYPE_URL | | 1680 if (changed_flags & (content::INVALIDATE_TYPE_URL | |
| 2049 content::INVALIDATE_TYPE_LOAD)) | 1681 content::INVALIDATE_TYPE_LOAD)) |
| 2050 UpdateCommandsForTabState(); | 1682 command_controller_->TabStateChanged(); |
| 2051 } | 1683 } |
| 2052 | 1684 |
| 2053 void Browser::AddNewContents(WebContents* source, | 1685 void Browser::AddNewContents(WebContents* source, |
| 2054 WebContents* new_contents, | 1686 WebContents* new_contents, |
| 2055 WindowOpenDisposition disposition, | 1687 WindowOpenDisposition disposition, |
| 2056 const gfx::Rect& initial_pos, | 1688 const gfx::Rect& initial_pos, |
| 2057 bool user_gesture) { | 1689 bool user_gesture) { |
| 2058 // No code for this yet. | 1690 // No code for this yet. |
| 2059 DCHECK(disposition != SAVE_TO_DISK); | 1691 DCHECK(disposition != SAVE_TO_DISK); |
| 2060 // Can't create a new contents for the current tab - invalid case. | 1692 // Can't create a new contents for the current tab - invalid case. |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2115 window_->Deactivate(); | 1747 window_->Deactivate(); |
| 2116 } | 1748 } |
| 2117 | 1749 |
| 2118 void Browser::LoadingStateChanged(WebContents* source) { | 1750 void Browser::LoadingStateChanged(WebContents* source) { |
| 2119 window_->UpdateLoadingAnimations(tab_strip_model_->TabsAreLoading()); | 1751 window_->UpdateLoadingAnimations(tab_strip_model_->TabsAreLoading()); |
| 2120 window_->UpdateTitleBar(); | 1752 window_->UpdateTitleBar(); |
| 2121 | 1753 |
| 2122 WebContents* selected_contents = GetActiveWebContents(); | 1754 WebContents* selected_contents = GetActiveWebContents(); |
| 2123 if (source == selected_contents) { | 1755 if (source == selected_contents) { |
| 2124 bool is_loading = source->IsLoading(); | 1756 bool is_loading = source->IsLoading(); |
| 2125 UpdateReloadStopState(is_loading, false); | 1757 command_controller_->LoadingStateChanged(is_loading, false); |
| 2126 if (GetStatusBubble()) { | 1758 if (GetStatusBubble()) { |
| 2127 GetStatusBubble()->SetStatus( | 1759 GetStatusBubble()->SetStatus( |
| 2128 GetActiveTabContents()->core_tab_helper()->GetStatusText()); | 1760 GetActiveTabContents()->core_tab_helper()->GetStatusText()); |
| 2129 } | 1761 } |
| 2130 | 1762 |
| 2131 if (!is_loading && pending_web_app_action_ == UPDATE_SHORTCUT) { | 1763 if (!is_loading && pending_web_app_action_ == UPDATE_SHORTCUT) { |
| 2132 // Schedule a shortcut update when web application info is available if | 1764 // Schedule a shortcut update when web application info is available if |
| 2133 // last committed entry is not NULL. Last committed entry could be NULL | 1765 // last committed entry is not NULL. Last committed entry could be NULL |
| 2134 // when an interstitial page is injected (e.g. bad https certificate, | 1766 // when an interstitial page is injected (e.g. bad https certificate, |
| 2135 // malware site etc). When this happens, we abort the shortcut update. | 1767 // malware site etc). When this happens, we abort the shortcut update. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2199 return; | 1831 return; |
| 2200 | 1832 |
| 2201 if (source == GetActiveWebContents()) { | 1833 if (source == GetActiveWebContents()) { |
| 2202 GetStatusBubble()->MouseMoved(location, !motion); | 1834 GetStatusBubble()->MouseMoved(location, !motion); |
| 2203 if (!motion) | 1835 if (!motion) |
| 2204 GetStatusBubble()->SetURL(GURL(), std::string()); | 1836 GetStatusBubble()->SetURL(GURL(), std::string()); |
| 2205 } | 1837 } |
| 2206 } | 1838 } |
| 2207 | 1839 |
| 2208 void Browser::ContentsZoomChange(bool zoom_in) { | 1840 void Browser::ContentsZoomChange(bool zoom_in) { |
| 2209 ExecuteCommand(zoom_in ? IDC_ZOOM_PLUS : IDC_ZOOM_MINUS); | 1841 chrome::ExecuteCommand(this, zoom_in ? IDC_ZOOM_PLUS : IDC_ZOOM_MINUS); |
| 2210 } | 1842 } |
| 2211 | 1843 |
| 2212 void Browser::WebContentsFocused(WebContents* contents) { | 1844 void Browser::WebContentsFocused(WebContents* contents) { |
| 2213 window_->WebContentsFocused(contents); | 1845 window_->WebContentsFocused(contents); |
| 2214 } | 1846 } |
| 2215 | 1847 |
| 2216 bool Browser::TakeFocus(bool reverse) { | 1848 bool Browser::TakeFocus(bool reverse) { |
| 2217 content::NotificationService::current()->Notify( | 1849 content::NotificationService::current()->Notify( |
| 2218 chrome::NOTIFICATION_FOCUS_RETURNED_TO_BROWSER, | 1850 chrome::NOTIFICATION_FOCUS_RETURNED_TO_BROWSER, |
| 2219 content::Source<Browser>(this), | 1851 content::Source<Browser>(this), |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2397 details.target_url = target_url; | 2029 details.target_url = target_url; |
| 2398 details.target_web_contents = new_contents; | 2030 details.target_web_contents = new_contents; |
| 2399 details.not_yet_in_tabstrip = true; | 2031 details.not_yet_in_tabstrip = true; |
| 2400 content::NotificationService::current()->Notify( | 2032 content::NotificationService::current()->Notify( |
| 2401 chrome::NOTIFICATION_RETARGETING, | 2033 chrome::NOTIFICATION_RETARGETING, |
| 2402 content::Source<Profile>(profile_), | 2034 content::Source<Profile>(profile_), |
| 2403 content::Details<RetargetingDetails>(&details)); | 2035 content::Details<RetargetingDetails>(&details)); |
| 2404 } | 2036 } |
| 2405 | 2037 |
| 2406 void Browser::ContentRestrictionsChanged(WebContents* source) { | 2038 void Browser::ContentRestrictionsChanged(WebContents* source) { |
| 2407 UpdateCommandsForContentRestrictionState(); | 2039 command_controller_->ContentRestrictionsChanged(); |
| 2408 } | 2040 } |
| 2409 | 2041 |
| 2410 void Browser::RendererUnresponsive(WebContents* source) { | 2042 void Browser::RendererUnresponsive(WebContents* source) { |
| 2411 // Ignore hangs if print preview is open. | 2043 // Ignore hangs if print preview is open. |
| 2412 TabContents* tab_contents = TabContents::FromWebContents(source); | 2044 TabContents* tab_contents = TabContents::FromWebContents(source); |
| 2413 if (tab_contents) { | 2045 if (tab_contents) { |
| 2414 printing::PrintPreviewTabController* controller = | 2046 printing::PrintPreviewTabController* controller = |
| 2415 printing::PrintPreviewTabController::GetInstance(); | 2047 printing::PrintPreviewTabController::GetInstance(); |
| 2416 if (controller) { | 2048 if (controller) { |
| 2417 TabContents* preview_tab = | 2049 TabContents* preview_tab = |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2601 // Browser, CoreTabHelperDelegate implementation: | 2233 // Browser, CoreTabHelperDelegate implementation: |
| 2602 | 2234 |
| 2603 void Browser::SwapTabContents(TabContents* old_tab_contents, | 2235 void Browser::SwapTabContents(TabContents* old_tab_contents, |
| 2604 TabContents* new_tab_contents) { | 2236 TabContents* new_tab_contents) { |
| 2605 int index = tab_strip_model_->GetIndexOfTabContents(old_tab_contents); | 2237 int index = tab_strip_model_->GetIndexOfTabContents(old_tab_contents); |
| 2606 DCHECK_NE(TabStripModel::kNoTab, index); | 2238 DCHECK_NE(TabStripModel::kNoTab, index); |
| 2607 tab_strip_model_->ReplaceTabContentsAt(index, new_tab_contents); | 2239 tab_strip_model_->ReplaceTabContentsAt(index, new_tab_contents); |
| 2608 } | 2240 } |
| 2609 | 2241 |
| 2610 bool Browser::CanReloadContents(TabContents* source) const { | 2242 bool Browser::CanReloadContents(TabContents* source) const { |
| 2611 return !is_devtools(); | 2243 return chrome::CanReload(this); |
| 2612 } | 2244 } |
| 2613 | 2245 |
| 2614 bool Browser::CanSaveContents(TabContents* source) const { | 2246 bool Browser::CanSaveContents(TabContents* source) const { |
| 2615 return !is_devtools(); | 2247 return chrome::CanSavePage(this); |
| 2616 } | 2248 } |
| 2617 | 2249 |
| 2618 /////////////////////////////////////////////////////////////////////////////// | 2250 /////////////////////////////////////////////////////////////////////////////// |
| 2619 // Browser, SearchEngineTabHelperDelegate implementation: | 2251 // Browser, SearchEngineTabHelperDelegate implementation: |
| 2620 | 2252 |
| 2621 void Browser::ConfirmAddSearchProvider(TemplateURL* template_url, | 2253 void Browser::ConfirmAddSearchProvider(TemplateURL* template_url, |
| 2622 Profile* profile) { | 2254 Profile* profile) { |
| 2623 window()->ConfirmAddSearchProvider(template_url, profile); | 2255 window()->ConfirmAddSearchProvider(template_url, profile); |
| 2624 } | 2256 } |
| 2625 | 2257 |
| 2626 /////////////////////////////////////////////////////////////////////////////// | 2258 /////////////////////////////////////////////////////////////////////////////// |
| 2627 // Browser, ConstrainedWindowTabHelperDelegate implementation: | 2259 // Browser, ConstrainedWindowTabHelperDelegate implementation: |
| 2628 | 2260 |
| 2629 void Browser::SetTabContentBlocked(TabContents* tab_contents, bool blocked) { | 2261 void Browser::SetTabContentBlocked(TabContents* tab_contents, bool blocked) { |
| 2630 int index = tab_strip_model_->GetIndexOfTabContents(tab_contents); | 2262 int index = tab_strip_model_->GetIndexOfTabContents(tab_contents); |
| 2631 if (index == TabStripModel::kNoTab) { | 2263 if (index == TabStripModel::kNoTab) { |
| 2632 NOTREACHED(); | 2264 NOTREACHED(); |
| 2633 return; | 2265 return; |
| 2634 } | 2266 } |
| 2635 tab_strip_model_->SetTabBlocked(index, blocked); | 2267 tab_strip_model_->SetTabBlocked(index, blocked); |
| 2636 UpdatePrintingState(tab_contents->web_contents()->GetContentRestrictions()); | 2268 command_controller_->PrintingStateChanged(); |
| 2637 if (!blocked && GetActiveTabContents() == tab_contents) | 2269 if (!blocked && GetActiveTabContents() == tab_contents) |
| 2638 tab_contents->web_contents()->Focus(); | 2270 tab_contents->web_contents()->Focus(); |
| 2639 } | 2271 } |
| 2640 | 2272 |
| 2641 /////////////////////////////////////////////////////////////////////////////// | 2273 /////////////////////////////////////////////////////////////////////////////// |
| 2642 // Browser, BlockedContentTabHelperDelegate implementation: | 2274 // Browser, BlockedContentTabHelperDelegate implementation: |
| 2643 | 2275 |
| 2644 TabContents* Browser::GetConstrainingTabContents(TabContents* source) { | 2276 TabContents* Browser::GetConstrainingTabContents(TabContents* source) { |
| 2645 return source; | 2277 return source; |
| 2646 } | 2278 } |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2814 | 2446 |
| 2815 #if defined(ENABLE_THEMES) | 2447 #if defined(ENABLE_THEMES) |
| 2816 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: | 2448 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: |
| 2817 window()->UserChangedTheme(); | 2449 window()->UserChangedTheme(); |
| 2818 break; | 2450 break; |
| 2819 #endif | 2451 #endif |
| 2820 | 2452 |
| 2821 case chrome::NOTIFICATION_PREF_CHANGED: { | 2453 case chrome::NOTIFICATION_PREF_CHANGED: { |
| 2822 const std::string& pref_name = | 2454 const std::string& pref_name = |
| 2823 *content::Details<std::string>(details).ptr(); | 2455 *content::Details<std::string>(details).ptr(); |
| 2824 if (pref_name == prefs::kPrintingEnabled) { | 2456 if (pref_name == prefs::kInstantEnabled) { |
| 2825 UpdatePrintingState(GetContentRestrictionsForSelectedTab()); | |
| 2826 } else if (pref_name == prefs::kInstantEnabled) { | |
| 2827 if (browser_shutdown::ShuttingDownWithoutClosingBrowsers() || | 2457 if (browser_shutdown::ShuttingDownWithoutClosingBrowsers() || |
| 2828 !InstantController::IsEnabled(profile())) { | 2458 !InstantController::IsEnabled(profile())) { |
| 2829 if (instant()) { | 2459 if (instant()) { |
| 2830 instant()->DestroyPreviewContents(); | 2460 instant()->DestroyPreviewContents(); |
| 2831 instant_.reset(); | 2461 instant_.reset(); |
| 2832 instant_unload_handler_.reset(); | 2462 instant_unload_handler_.reset(); |
| 2833 } | 2463 } |
| 2834 } else { | 2464 } else { |
| 2835 CreateInstantIfNecessary(); | 2465 CreateInstantIfNecessary(); |
| 2836 } | 2466 } |
| 2837 } else if (pref_name == prefs::kIncognitoModeAvailability) { | |
| 2838 UpdateCommandsForIncognitoAvailability(); | |
| 2839 } else if (pref_name == prefs::kDevToolsDisabled) { | 2467 } else if (pref_name == prefs::kDevToolsDisabled) { |
| 2840 UpdateCommandsForDevTools(); | |
| 2841 if (profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled)) | 2468 if (profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled)) |
| 2842 content::DevToolsManager::GetInstance()->CloseAllClientHosts(); | 2469 content::DevToolsManager::GetInstance()->CloseAllClientHosts(); |
| 2843 } else if (pref_name == prefs::kEditBookmarksEnabled) { | |
| 2844 UpdateCommandsForBookmarkEditing(); | |
| 2845 } else if (pref_name == prefs::kShowBookmarkBar) { | 2470 } else if (pref_name == prefs::kShowBookmarkBar) { |
| 2846 UpdateCommandsForBookmarkBar(); | |
| 2847 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE); | 2471 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE); |
| 2848 } else if (pref_name == prefs::kHomePage) { | 2472 } else if (pref_name == prefs::kHomePage) { |
| 2849 PrefService* pref_service = content::Source<PrefService>(source).ptr(); | 2473 PrefService* pref_service = content::Source<PrefService>(source).ptr(); |
| 2850 MarkHomePageAsChanged(pref_service); | 2474 MarkHomePageAsChanged(pref_service); |
| 2851 } else if (pref_name == prefs::kAllowFileSelectionDialogs) { | |
| 2852 UpdateSaveAsState(GetContentRestrictionsForSelectedTab()); | |
| 2853 UpdateOpenFileState(); | |
| 2854 } else if (pref_name == prefs::kInManagedMode) { | |
| 2855 UpdateCommandsForMultipleProfiles(); | |
| 2856 } else { | 2475 } else { |
| 2857 NOTREACHED(); | 2476 NOTREACHED(); |
| 2858 } | 2477 } |
| 2859 break; | 2478 break; |
| 2860 } | 2479 } |
| 2861 | 2480 |
| 2862 case chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED: { | |
|
sky
2012/06/27 03:09:28
This looks like it was removed from both. Don't we
| |
| 2863 WebContents* web_contents = content::Source<WebContents>(source).ptr(); | |
| 2864 if (web_contents == GetActiveWebContents()) { | |
| 2865 LocationBar* location_bar = window()->GetLocationBar(); | |
| 2866 if (location_bar) | |
| 2867 location_bar->UpdateContentSettingsIcons(); | |
| 2868 } | |
| 2869 break; | |
| 2870 } | |
| 2871 | |
| 2872 case content::NOTIFICATION_INTERSTITIAL_ATTACHED: | 2481 case content::NOTIFICATION_INTERSTITIAL_ATTACHED: |
| 2873 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); | 2482 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); |
| 2874 UpdateCommandsForTabState(); | |
| 2875 break; | 2483 break; |
| 2876 | 2484 |
| 2877 case content::NOTIFICATION_INTERSTITIAL_DETACHED: | 2485 case content::NOTIFICATION_INTERSTITIAL_DETACHED: |
| 2878 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); | 2486 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); |
| 2879 UpdateCommandsForTabState(); | |
| 2880 break; | 2487 break; |
| 2881 | 2488 |
| 2882 default: | 2489 default: |
| 2883 NOTREACHED() << "Got a notification we didn't register for."; | 2490 NOTREACHED() << "Got a notification we didn't register for."; |
| 2884 } | 2491 } |
| 2885 } | 2492 } |
| 2886 | 2493 |
| 2887 /////////////////////////////////////////////////////////////////////////////// | 2494 /////////////////////////////////////////////////////////////////////////////// |
| 2888 // Browser, ProfileSyncServiceObserver implementation: | |
| 2889 | |
| 2890 void Browser::OnStateChanged() { | |
| 2891 DCHECK(ProfileSyncServiceFactory::GetInstance()->HasProfileSyncService( | |
| 2892 profile_)); | |
| 2893 // For unit tests, we don't have a window. | |
| 2894 if (!window_) | |
| 2895 return; | |
| 2896 const bool show_main_ui = IsShowingMainUI(window_->IsFullscreen()); | |
| 2897 command_updater_.UpdateCommandEnabled(IDC_SHOW_SYNC_SETUP, | |
| 2898 show_main_ui && profile_->GetOriginalProfile()->IsSyncAccessible()); | |
| 2899 } | |
| 2900 | |
| 2901 /////////////////////////////////////////////////////////////////////////////// | |
| 2902 // Browser, InstantDelegate implementation: | 2495 // Browser, InstantDelegate implementation: |
| 2903 | 2496 |
| 2904 void Browser::ShowInstant(TabContents* preview_contents) { | 2497 void Browser::ShowInstant(TabContents* preview_contents) { |
| 2905 window_->ShowInstant(preview_contents); | 2498 window_->ShowInstant(preview_contents); |
| 2906 | 2499 |
| 2907 // TODO(beng): investigate if we can avoid this and instead rely on the | 2500 // TODO(beng): investigate if we can avoid this and instead rely on the |
| 2908 // visibility of the WebContentsView | 2501 // visibility of the WebContentsView |
| 2909 GetActiveWebContents()->WasHidden(); | 2502 GetActiveWebContents()->WasHidden(); |
| 2910 preview_contents->web_contents()->WasRestored(); | 2503 preview_contents->web_contents()->WasRestored(); |
| 2911 } | 2504 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2950 window_->WebContentsFocused(instant_->GetPreviewContents()->web_contents()); | 2543 window_->WebContentsFocused(instant_->GetPreviewContents()->web_contents()); |
| 2951 } | 2544 } |
| 2952 | 2545 |
| 2953 TabContents* Browser::GetInstantHostTabContents() const { | 2546 TabContents* Browser::GetInstantHostTabContents() const { |
| 2954 return GetActiveTabContents(); | 2547 return GetActiveTabContents(); |
| 2955 } | 2548 } |
| 2956 | 2549 |
| 2957 /////////////////////////////////////////////////////////////////////////////// | 2550 /////////////////////////////////////////////////////////////////////////////// |
| 2958 // Browser, Command and state updating (private): | 2551 // Browser, Command and state updating (private): |
| 2959 | 2552 |
| 2960 bool Browser::IsShowingMainUI(bool is_fullscreen) { | |
| 2961 #if !defined(OS_MACOSX) | |
| 2962 return is_type_tabbed() && !is_fullscreen; | |
| 2963 #else | |
| 2964 return is_type_tabbed(); | |
| 2965 #endif | |
| 2966 } | |
| 2967 | |
| 2968 void Browser::InitCommandState() { | |
| 2969 // All browser commands whose state isn't set automagically some other way | |
| 2970 // (like Back & Forward with initial page load) must have their state | |
| 2971 // initialized here, otherwise they will be forever disabled. | |
| 2972 | |
| 2973 // Navigation commands | |
| 2974 command_updater_.UpdateCommandEnabled(IDC_RELOAD, true); | |
| 2975 command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true); | |
| 2976 | |
| 2977 // Window management commands | |
| 2978 command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true); | |
| 2979 command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true); | |
| 2980 command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true); | |
| 2981 command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true); | |
| 2982 command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, false); | |
| 2983 command_updater_.UpdateCommandEnabled(IDC_EXIT, true); | |
| 2984 command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true); | |
| 2985 | |
| 2986 // Page-related commands | |
| 2987 command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION, true); | |
| 2988 command_updater_.UpdateCommandEnabled(IDC_ENCODING_AUTO_DETECT, true); | |
| 2989 command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF8, true); | |
| 2990 command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF16LE, true); | |
| 2991 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88591, true); | |
| 2992 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1252, true); | |
| 2993 command_updater_.UpdateCommandEnabled(IDC_ENCODING_GBK, true); | |
| 2994 command_updater_.UpdateCommandEnabled(IDC_ENCODING_GB18030, true); | |
| 2995 command_updater_.UpdateCommandEnabled(IDC_ENCODING_BIG5HKSCS, true); | |
| 2996 command_updater_.UpdateCommandEnabled(IDC_ENCODING_BIG5, true); | |
| 2997 command_updater_.UpdateCommandEnabled(IDC_ENCODING_THAI, true); | |
| 2998 command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOREAN, true); | |
| 2999 command_updater_.UpdateCommandEnabled(IDC_ENCODING_SHIFTJIS, true); | |
| 3000 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO2022JP, true); | |
| 3001 command_updater_.UpdateCommandEnabled(IDC_ENCODING_EUCJP, true); | |
| 3002 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885915, true); | |
| 3003 command_updater_.UpdateCommandEnabled(IDC_ENCODING_MACINTOSH, true); | |
| 3004 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88592, true); | |
| 3005 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1250, true); | |
| 3006 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88595, true); | |
| 3007 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1251, true); | |
| 3008 command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOI8R, true); | |
| 3009 command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOI8U, true); | |
| 3010 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88597, true); | |
| 3011 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1253, true); | |
| 3012 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88594, true); | |
| 3013 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885913, true); | |
| 3014 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1257, true); | |
| 3015 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88593, true); | |
| 3016 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885910, true); | |
| 3017 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885914, true); | |
| 3018 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885916, true); | |
| 3019 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1254, true); | |
| 3020 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88596, true); | |
| 3021 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1256, true); | |
| 3022 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88598, true); | |
| 3023 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88598I, true); | |
| 3024 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1255, true); | |
| 3025 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1258, true); | |
| 3026 | |
| 3027 // Zoom | |
| 3028 command_updater_.UpdateCommandEnabled(IDC_ZOOM_MENU, true); | |
| 3029 command_updater_.UpdateCommandEnabled(IDC_ZOOM_PLUS, true); | |
| 3030 command_updater_.UpdateCommandEnabled(IDC_ZOOM_NORMAL, true); | |
| 3031 command_updater_.UpdateCommandEnabled(IDC_ZOOM_MINUS, true); | |
| 3032 | |
| 3033 // Show various bits of UI | |
| 3034 UpdateOpenFileState(); | |
| 3035 command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, false); | |
| 3036 UpdateCommandsForDevTools(); | |
| 3037 command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER, | |
| 3038 chrome::CanOpenTaskManager()); | |
| 3039 command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY, true); | |
| 3040 command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true); | |
| 3041 command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_KEYBOARD, true); | |
| 3042 command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_MENU, true); | |
| 3043 command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU, true); | |
| 3044 | |
| 3045 command_updater_.UpdateCommandEnabled( | |
| 3046 IDC_SHOW_SYNC_SETUP, profile_->GetOriginalProfile()->IsSyncAccessible()); | |
| 3047 | |
| 3048 // Initialize other commands based on the window type. | |
| 3049 bool normal_window = is_type_tabbed(); | |
| 3050 | |
| 3051 // Navigation commands | |
| 3052 command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window); | |
| 3053 | |
| 3054 // Window management commands | |
| 3055 // TODO(rohitrao): Disable fullscreen on non-Lion? | |
| 3056 command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN, | |
| 3057 !(is_type_panel() && is_app())); | |
| 3058 command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window); | |
| 3059 command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB, | |
| 3060 normal_window); | |
| 3061 command_updater_.UpdateCommandEnabled(IDC_MOVE_TAB_NEXT, normal_window); | |
| 3062 command_updater_.UpdateCommandEnabled(IDC_MOVE_TAB_PREVIOUS, normal_window); | |
| 3063 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_0, normal_window); | |
| 3064 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_1, normal_window); | |
| 3065 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_2, normal_window); | |
| 3066 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_3, normal_window); | |
| 3067 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_4, normal_window); | |
| 3068 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_5, normal_window); | |
| 3069 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_6, normal_window); | |
| 3070 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_7, normal_window); | |
| 3071 command_updater_.UpdateCommandEnabled(IDC_SELECT_LAST_TAB, normal_window); | |
| 3072 #if defined(OS_WIN) | |
| 3073 const bool metro_mode = base::win::IsMetroProcess(); | |
| 3074 command_updater_.UpdateCommandEnabled(IDC_METRO_SNAP_ENABLE, metro_mode); | |
| 3075 command_updater_.UpdateCommandEnabled(IDC_METRO_SNAP_DISABLE, metro_mode); | |
| 3076 #endif | |
| 3077 #if defined(OS_MACOSX) | |
| 3078 command_updater_.UpdateCommandEnabled(IDC_TABPOSE, normal_window); | |
| 3079 command_updater_.UpdateCommandEnabled(IDC_PRESENTATION_MODE, | |
| 3080 !(is_type_panel() && is_app())); | |
| 3081 #endif | |
| 3082 | |
| 3083 // Clipboard commands | |
| 3084 command_updater_.UpdateCommandEnabled(IDC_COPY_URL, !is_devtools()); | |
| 3085 | |
| 3086 // Find-in-page | |
| 3087 command_updater_.UpdateCommandEnabled(IDC_FIND, !is_devtools()); | |
| 3088 command_updater_.UpdateCommandEnabled(IDC_FIND_NEXT, !is_devtools()); | |
| 3089 command_updater_.UpdateCommandEnabled(IDC_FIND_PREVIOUS, !is_devtools()); | |
| 3090 | |
| 3091 // Show various bits of UI | |
| 3092 command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window); | |
| 3093 | |
| 3094 // The upgrade entry and the view incompatibility entry should always be | |
| 3095 // enabled. Whether they are visible is a separate matter determined on menu | |
| 3096 // show. | |
| 3097 command_updater_.UpdateCommandEnabled(IDC_UPGRADE_DIALOG, true); | |
| 3098 command_updater_.UpdateCommandEnabled(IDC_VIEW_INCOMPATIBILITIES, true); | |
| 3099 | |
| 3100 // View Background Pages entry is always enabled, but is hidden if there are | |
| 3101 // no background pages. | |
| 3102 command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES, true); | |
| 3103 | |
| 3104 // Toggle speech input | |
| 3105 command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true); | |
| 3106 | |
| 3107 // Initialize other commands whose state changes based on fullscreen mode. | |
| 3108 UpdateCommandsForFullscreenMode(FULLSCREEN_DISABLED); | |
| 3109 | |
| 3110 UpdateCommandsForContentRestrictionState(); | |
| 3111 | |
| 3112 UpdateCommandsForBookmarkEditing(); | |
| 3113 | |
| 3114 UpdateCommandsForIncognitoAvailability(); | |
| 3115 } | |
| 3116 | |
| 3117 void Browser::UpdateCommandsForIncognitoAvailability() { | |
| 3118 IncognitoModePrefs::Availability incognito_availability = | |
| 3119 IncognitoModePrefs::GetAvailability(profile_->GetPrefs()); | |
| 3120 command_updater_.UpdateCommandEnabled( | |
| 3121 IDC_NEW_WINDOW, | |
| 3122 incognito_availability != IncognitoModePrefs::FORCED); | |
| 3123 command_updater_.UpdateCommandEnabled( | |
| 3124 IDC_NEW_INCOGNITO_WINDOW, | |
| 3125 incognito_availability != IncognitoModePrefs::DISABLED); | |
| 3126 | |
| 3127 // Bookmark manager and settings page/subpages are forced to open in normal | |
| 3128 // mode. For this reason we disable these commands when incognito is forced. | |
| 3129 const bool command_enabled = | |
| 3130 incognito_availability != IncognitoModePrefs::FORCED; | |
| 3131 command_updater_.UpdateCommandEnabled( | |
| 3132 IDC_SHOW_BOOKMARK_MANAGER, | |
| 3133 browser_defaults::bookmarks_enabled && command_enabled); | |
| 3134 ExtensionService* extension_service = profile()->GetExtensionService(); | |
| 3135 bool enable_extensions = | |
| 3136 extension_service && extension_service->extensions_enabled(); | |
| 3137 command_updater_.UpdateCommandEnabled(IDC_MANAGE_EXTENSIONS, | |
| 3138 enable_extensions && command_enabled); | |
| 3139 | |
| 3140 const bool show_main_ui = IsShowingMainUI(window_ && window_->IsFullscreen()); | |
| 3141 command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS, | |
| 3142 show_main_ui && command_enabled); | |
| 3143 command_updater_.UpdateCommandEnabled(IDC_OPTIONS, | |
| 3144 show_main_ui && command_enabled); | |
| 3145 } | |
| 3146 | |
| 3147 void Browser::UpdateCommandsForTabState() { | |
| 3148 TabContents* current_tab_contents = GetActiveTabContents(); | |
| 3149 if (!current_tab_contents) // May be NULL during tab restore. | |
| 3150 return; | |
| 3151 WebContents* current_web_contents = current_tab_contents->web_contents(); | |
| 3152 | |
| 3153 // Navigation commands | |
| 3154 NavigationController& nc = current_web_contents->GetController(); | |
| 3155 command_updater_.UpdateCommandEnabled(IDC_BACK, nc.CanGoBack()); | |
| 3156 command_updater_.UpdateCommandEnabled(IDC_FORWARD, nc.CanGoForward()); | |
| 3157 command_updater_.UpdateCommandEnabled( | |
| 3158 IDC_RELOAD, CanReloadContents(current_tab_contents)); | |
| 3159 command_updater_.UpdateCommandEnabled( | |
| 3160 IDC_RELOAD_IGNORING_CACHE, CanReloadContents(current_tab_contents)); | |
| 3161 | |
| 3162 // Window management commands | |
| 3163 command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, | |
| 3164 !is_app() && CanDuplicateContentsAt(active_index())); | |
| 3165 | |
| 3166 // Page-related commands | |
| 3167 window_->SetStarredState( | |
| 3168 current_tab_contents->bookmark_tab_helper()->is_starred()); | |
| 3169 window_->SetZoomIconState( | |
| 3170 current_tab_contents->zoom_controller()->zoom_icon_state()); | |
| 3171 window_->SetZoomIconTooltipPercent( | |
| 3172 current_tab_contents->zoom_controller()->zoom_percent()); | |
| 3173 command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE, | |
| 3174 current_web_contents->GetController().CanViewSource()); | |
| 3175 command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION, | |
| 3176 toolbar_model_->ShouldDisplayURL() && | |
| 3177 current_web_contents->GetURL().is_valid()); | |
| 3178 if (is_devtools()) | |
| 3179 command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false); | |
| 3180 | |
| 3181 // Changing the encoding is not possible on Chrome-internal webpages. | |
| 3182 bool is_chrome_internal = HasInternalURL(nc.GetActiveEntry()) || | |
| 3183 current_web_contents->ShowingInterstitialPage(); | |
| 3184 command_updater_.UpdateCommandEnabled(IDC_ENCODING_MENU, | |
| 3185 !is_chrome_internal && current_web_contents->IsSavable()); | |
| 3186 | |
| 3187 // Show various bits of UI | |
| 3188 // TODO(pinkerton): Disable app-mode in the model until we implement it | |
| 3189 // on the Mac. Be sure to remove both ifdefs. http://crbug.com/13148 | |
| 3190 #if !defined(OS_MACOSX) | |
| 3191 command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, | |
| 3192 web_app::IsValidUrl(current_web_contents->GetURL())); | |
| 3193 #endif | |
| 3194 | |
| 3195 UpdateCommandsForContentRestrictionState(); | |
| 3196 UpdateCommandsForBookmarkEditing(); | |
| 3197 } | |
| 3198 | |
| 3199 void Browser::UpdateCommandsForContentRestrictionState() { | |
| 3200 int restrictions = GetContentRestrictionsForSelectedTab(); | |
| 3201 | |
| 3202 command_updater_.UpdateCommandEnabled( | |
| 3203 IDC_COPY, !(restrictions & content::CONTENT_RESTRICTION_COPY)); | |
| 3204 command_updater_.UpdateCommandEnabled( | |
| 3205 IDC_CUT, !(restrictions & content::CONTENT_RESTRICTION_CUT)); | |
| 3206 command_updater_.UpdateCommandEnabled( | |
| 3207 IDC_PASTE, !(restrictions & content::CONTENT_RESTRICTION_PASTE)); | |
| 3208 UpdateSaveAsState(restrictions); | |
| 3209 UpdatePrintingState(restrictions); | |
| 3210 } | |
| 3211 | |
| 3212 void Browser::UpdateCommandsForDevTools() { | |
| 3213 bool dev_tools_enabled = | |
| 3214 !profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled); | |
| 3215 command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS, | |
| 3216 dev_tools_enabled); | |
| 3217 command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_CONSOLE, | |
| 3218 dev_tools_enabled); | |
| 3219 command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_INSPECT, | |
| 3220 dev_tools_enabled); | |
| 3221 } | |
| 3222 | |
| 3223 void Browser::UpdateCommandsForBookmarkEditing() { | |
| 3224 bool enabled = | |
| 3225 profile_->GetPrefs()->GetBoolean(prefs::kEditBookmarksEnabled) && | |
| 3226 browser_defaults::bookmarks_enabled; | |
| 3227 | |
| 3228 command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE, | |
| 3229 enabled && is_type_tabbed()); | |
| 3230 command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS, | |
| 3231 enabled && CanBookmarkAllTabs()); | |
| 3232 command_updater_.UpdateCommandEnabled(IDC_PIN_TO_START_SCREEN, | |
| 3233 true); | |
| 3234 } | |
| 3235 | |
| 3236 void Browser::UpdateCommandsForBookmarkBar() { | |
| 3237 const bool show_main_ui = IsShowingMainUI(window_ && window_->IsFullscreen()); | |
| 3238 command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR, | |
| 3239 browser_defaults::bookmarks_enabled && | |
| 3240 !profile_->GetPrefs()->IsManagedPreference(prefs::kShowBookmarkBar) && | |
| 3241 show_main_ui); | |
| 3242 } | |
| 3243 | |
| 3244 void Browser::MarkHomePageAsChanged(PrefService* pref_service) { | 2553 void Browser::MarkHomePageAsChanged(PrefService* pref_service) { |
| 3245 pref_service->SetBoolean(prefs::kHomePageChanged, true); | 2554 pref_service->SetBoolean(prefs::kHomePageChanged, true); |
| 3246 } | 2555 } |
| 3247 | 2556 |
| 3248 void Browser::UpdateCommandsForFullscreenMode(FullScreenMode fullscreen_mode) { | |
| 3249 const bool show_main_ui = | |
| 3250 IsShowingMainUI(fullscreen_mode != FULLSCREEN_DISABLED); | |
| 3251 bool main_not_fullscreen = show_main_ui && | |
| 3252 (fullscreen_mode == FULLSCREEN_DISABLED); | |
| 3253 | |
| 3254 // Navigation commands | |
| 3255 command_updater_.UpdateCommandEnabled(IDC_OPEN_CURRENT_URL, show_main_ui); | |
| 3256 | |
| 3257 // Window management commands | |
| 3258 command_updater_.UpdateCommandEnabled(IDC_SHOW_AS_TAB, | |
| 3259 type_ != TYPE_TABBED && (fullscreen_mode == FULLSCREEN_DISABLED)); | |
| 3260 | |
| 3261 // Focus various bits of UI | |
| 3262 command_updater_.UpdateCommandEnabled(IDC_FOCUS_TOOLBAR, show_main_ui); | |
| 3263 command_updater_.UpdateCommandEnabled(IDC_FOCUS_LOCATION, show_main_ui); | |
| 3264 command_updater_.UpdateCommandEnabled(IDC_FOCUS_SEARCH, show_main_ui); | |
| 3265 command_updater_.UpdateCommandEnabled( | |
| 3266 IDC_FOCUS_MENU_BAR, main_not_fullscreen); | |
| 3267 command_updater_.UpdateCommandEnabled( | |
| 3268 IDC_FOCUS_NEXT_PANE, main_not_fullscreen); | |
| 3269 command_updater_.UpdateCommandEnabled( | |
| 3270 IDC_FOCUS_PREVIOUS_PANE, main_not_fullscreen); | |
| 3271 command_updater_.UpdateCommandEnabled( | |
| 3272 IDC_FOCUS_BOOKMARKS, main_not_fullscreen); | |
| 3273 | |
| 3274 // Show various bits of UI | |
| 3275 command_updater_.UpdateCommandEnabled(IDC_DEVELOPER_MENU, show_main_ui); | |
| 3276 command_updater_.UpdateCommandEnabled(IDC_FEEDBACK, show_main_ui); | |
| 3277 command_updater_.UpdateCommandEnabled(IDC_SHOW_SYNC_SETUP, | |
| 3278 show_main_ui && profile_->GetOriginalProfile()->IsSyncAccessible()); | |
| 3279 | |
| 3280 // Settings page/subpages are forced to open in normal mode. We disable these | |
| 3281 // commands when incognito is forced. | |
| 3282 const bool options_enabled = show_main_ui && | |
| 3283 IncognitoModePrefs::GetAvailability( | |
| 3284 profile_->GetPrefs()) != IncognitoModePrefs::FORCED; | |
| 3285 command_updater_.UpdateCommandEnabled(IDC_OPTIONS, options_enabled); | |
| 3286 command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS, options_enabled); | |
| 3287 | |
| 3288 command_updater_.UpdateCommandEnabled(IDC_EDIT_SEARCH_ENGINES, show_main_ui); | |
| 3289 command_updater_.UpdateCommandEnabled(IDC_VIEW_PASSWORDS, show_main_ui); | |
| 3290 command_updater_.UpdateCommandEnabled(IDC_ABOUT, show_main_ui); | |
| 3291 command_updater_.UpdateCommandEnabled(IDC_SHOW_APP_MENU, show_main_ui); | |
| 3292 #if defined (ENABLE_PROFILING) && !defined(NO_TCMALLOC) | |
| 3293 command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui); | |
| 3294 #endif | |
| 3295 | |
| 3296 // Disable explicit fullscreen toggling when in metro snap mode. | |
| 3297 command_updater_.UpdateCommandEnabled( | |
| 3298 IDC_FULLSCREEN, | |
| 3299 fullscreen_mode != FULLSCREEN_METRO_SNAP); | |
| 3300 | |
| 3301 UpdateCommandsForBookmarkBar(); | |
| 3302 UpdateCommandsForMultipleProfiles(); | |
| 3303 } | |
| 3304 | |
| 3305 void Browser::UpdateCommandsForMultipleProfiles() { | |
| 3306 bool show_main_ui = IsShowingMainUI(window_ && window_->IsFullscreen()); | |
| 3307 command_updater_.UpdateCommandEnabled(IDC_SHOW_AVATAR_MENU, | |
| 3308 show_main_ui && | |
| 3309 !profile()->IsOffTheRecord() && | |
| 3310 ProfileManager::IsMultipleProfilesEnabled()); | |
| 3311 } | |
| 3312 | |
| 3313 void Browser::UpdatePrintingState(int content_restrictions) { | |
| 3314 bool print_enabled = true; | |
| 3315 bool advanced_print_enabled = true; | |
| 3316 if (g_browser_process->local_state()) { | |
| 3317 print_enabled = | |
| 3318 g_browser_process->local_state()->GetBoolean(prefs::kPrintingEnabled); | |
| 3319 advanced_print_enabled = print_enabled; | |
| 3320 } | |
| 3321 if (print_enabled) { | |
| 3322 // Do not print when a constrained window is showing. It's confusing. | |
| 3323 TabContents* tab_contents = GetActiveTabContents(); | |
| 3324 bool has_constrained_window = | |
| 3325 tab_contents && | |
| 3326 tab_contents->constrained_window_tab_helper()-> | |
| 3327 constrained_window_count(); | |
| 3328 if (has_constrained_window || | |
| 3329 content_restrictions & content::CONTENT_RESTRICTION_PRINT) { | |
| 3330 print_enabled = false; | |
| 3331 advanced_print_enabled = false; | |
| 3332 } | |
| 3333 | |
| 3334 // The exception is print preview, | |
| 3335 // where advanced printing is always enabled. | |
| 3336 printing::PrintPreviewTabController* controller = | |
| 3337 printing::PrintPreviewTabController::GetInstance(); | |
| 3338 if (controller && (controller->GetPrintPreviewForTab(tab_contents) || | |
| 3339 controller->is_creating_print_preview_tab())) { | |
| 3340 advanced_print_enabled = true; | |
| 3341 } | |
| 3342 } | |
| 3343 command_updater_.UpdateCommandEnabled(IDC_PRINT, print_enabled); | |
| 3344 command_updater_.UpdateCommandEnabled(IDC_ADVANCED_PRINT, | |
| 3345 advanced_print_enabled); | |
| 3346 } | |
| 3347 | |
| 3348 void Browser::UpdateSaveAsState(int content_restrictions) { | |
| 3349 bool enabled = !(content_restrictions & content::CONTENT_RESTRICTION_SAVE); | |
| 3350 enabled = enabled && CanSaveContents(GetActiveTabContents()); | |
| 3351 PrefService* state = g_browser_process->local_state(); | |
| 3352 if (state) | |
| 3353 enabled = enabled && state->GetBoolean(prefs::kAllowFileSelectionDialogs); | |
| 3354 | |
| 3355 command_updater_.UpdateCommandEnabled(IDC_SAVE_PAGE, enabled); | |
| 3356 } | |
| 3357 | |
| 3358 void Browser::UpdateOpenFileState() { | |
| 3359 bool enabled = true; | |
| 3360 PrefService* local_state = g_browser_process->local_state(); | |
| 3361 if (local_state) | |
| 3362 enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs); | |
| 3363 | |
| 3364 command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, enabled); | |
| 3365 } | |
| 3366 | |
| 3367 void Browser::UpdateReloadStopState(bool is_loading, bool force) { | |
| 3368 window_->UpdateReloadStopState(is_loading, force); | |
| 3369 command_updater_.UpdateCommandEnabled(IDC_STOP, is_loading); | |
| 3370 } | |
| 3371 | |
| 3372 /////////////////////////////////////////////////////////////////////////////// | 2557 /////////////////////////////////////////////////////////////////////////////// |
| 3373 // Browser, UI update coalescing and handling (private): | 2558 // Browser, UI update coalescing and handling (private): |
| 3374 | 2559 |
| 3375 void Browser::UpdateToolbar(bool should_restore_state) { | 2560 void Browser::UpdateToolbar(bool should_restore_state) { |
| 3376 window_->UpdateToolbar(GetActiveTabContents(), should_restore_state); | 2561 window_->UpdateToolbar(GetActiveTabContents(), should_restore_state); |
| 3377 } | 2562 } |
| 3378 | 2563 |
| 3379 void Browser::UpdateSearchState(TabContents* contents) { | 2564 void Browser::UpdateSearchState(TabContents* contents) { |
| 3380 if (chrome::search::IsInstantExtendedAPIEnabled(profile_)) | 2565 if (chrome::search::IsInstantExtendedAPIEnabled(profile_)) |
| 3381 search_delegate_->OnTabActivated(contents); | 2566 search_delegate_->OnTabActivated(contents); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3470 } | 2655 } |
| 3471 // Updating the URL happens synchronously in ScheduleUIUpdate. | 2656 // Updating the URL happens synchronously in ScheduleUIUpdate. |
| 3472 if (flags & content::INVALIDATE_TYPE_LOAD && GetStatusBubble()) { | 2657 if (flags & content::INVALIDATE_TYPE_LOAD && GetStatusBubble()) { |
| 3473 GetStatusBubble()->SetStatus( | 2658 GetStatusBubble()->SetStatus( |
| 3474 GetActiveTabContents()-> | 2659 GetActiveTabContents()-> |
| 3475 core_tab_helper()->GetStatusText()); | 2660 core_tab_helper()->GetStatusText()); |
| 3476 } | 2661 } |
| 3477 | 2662 |
| 3478 if (flags & (content::INVALIDATE_TYPE_TAB | | 2663 if (flags & (content::INVALIDATE_TYPE_TAB | |
| 3479 content::INVALIDATE_TYPE_TITLE)) { | 2664 content::INVALIDATE_TYPE_TITLE)) { |
| 3480 // TODO(pinkerton): Disable app-mode in the model until we implement it | |
| 3481 // on the Mac. Be sure to remove both ifdefs. http://crbug.com/13148 | |
| 3482 #if !defined(OS_MACOSX) | |
| 3483 command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, | |
| 3484 web_app::IsValidUrl(contents->GetURL())); | |
| 3485 #endif | |
| 3486 window_->UpdateTitleBar(); | 2665 window_->UpdateTitleBar(); |
| 3487 } | 2666 } |
| 3488 } | 2667 } |
| 3489 | 2668 |
| 3490 // Updates that don't depend upon the selected state go here. | 2669 // Updates that don't depend upon the selected state go here. |
| 3491 if (flags & | 2670 if (flags & |
| 3492 (content::INVALIDATE_TYPE_TAB | content::INVALIDATE_TYPE_TITLE)) { | 2671 (content::INVALIDATE_TYPE_TAB | content::INVALIDATE_TYPE_TITLE)) { |
| 3493 tab_strip_model_->UpdateTabContentsStateAt( | 2672 tab_strip_model_->UpdateTabContentsStateAt( |
| 3494 tab_strip_model_->GetIndexOfWebContents(contents), | 2673 tab_strip_model_->GetIndexOfWebContents(contents), |
| 3495 TabStripModelObserver::ALL); | 2674 TabStripModelObserver::ALL); |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3760 } | 2939 } |
| 3761 | 2940 |
| 3762 void Browser::CreateInstantIfNecessary() { | 2941 void Browser::CreateInstantIfNecessary() { |
| 3763 if (is_type_tabbed() && InstantController::IsEnabled(profile()) && | 2942 if (is_type_tabbed() && InstantController::IsEnabled(profile()) && |
| 3764 !profile()->IsOffTheRecord()) { | 2943 !profile()->IsOffTheRecord()) { |
| 3765 instant_.reset(new InstantController(this, InstantController::INSTANT)); | 2944 instant_.reset(new InstantController(this, InstantController::INSTANT)); |
| 3766 instant_unload_handler_.reset(new InstantUnloadHandler(this)); | 2945 instant_unload_handler_.reset(new InstantUnloadHandler(this)); |
| 3767 } | 2946 } |
| 3768 } | 2947 } |
| 3769 | 2948 |
| 3770 int Browser::GetContentRestrictionsForSelectedTab() { | |
| 3771 int content_restrictions = 0; | |
| 3772 WebContents* current_tab = GetActiveWebContents(); | |
| 3773 if (current_tab) { | |
| 3774 content_restrictions = current_tab->GetContentRestrictions(); | |
| 3775 NavigationEntry* active_entry = | |
| 3776 current_tab->GetController().GetActiveEntry(); | |
| 3777 // See comment in UpdateCommandsForTabState about why we call url(). | |
| 3778 if (!download_util::IsSavableURL( | |
| 3779 active_entry ? active_entry->GetURL() : GURL()) | |
| 3780 || current_tab->ShowingInterstitialPage()) | |
| 3781 content_restrictions |= content::CONTENT_RESTRICTION_SAVE; | |
| 3782 if (current_tab->ShowingInterstitialPage()) | |
| 3783 content_restrictions |= content::CONTENT_RESTRICTION_PRINT; | |
| 3784 } | |
| 3785 return content_restrictions; | |
| 3786 } | |
| 3787 | |
| 3788 void Browser::UpdateBookmarkBarState(BookmarkBarStateChangeReason reason) { | 2949 void Browser::UpdateBookmarkBarState(BookmarkBarStateChangeReason reason) { |
| 3789 BookmarkBar::State state; | 2950 BookmarkBar::State state; |
| 3790 // The bookmark bar is hidden in fullscreen mode, unless on the new tab page. | 2951 // The bookmark bar is hidden in fullscreen mode, unless on the new tab page. |
| 3791 if (browser_defaults::bookmarks_enabled && | 2952 if (browser_defaults::bookmarks_enabled && |
| 3792 profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar) && | 2953 profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar) && |
| 3793 (!window_ || !window_->IsFullscreen())) { | 2954 (!window_ || !window_->IsFullscreen())) { |
| 3794 state = BookmarkBar::SHOW; | 2955 state = BookmarkBar::SHOW; |
| 3795 } else { | 2956 } else { |
| 3796 TabContents* tab = GetActiveTabContents(); | 2957 TabContents* tab = GetActiveTabContents(); |
| 3797 if (tab && tab->bookmark_tab_helper()->ShouldShowBookmarkBar()) | 2958 if (tab && tab->bookmark_tab_helper()->ShouldShowBookmarkBar()) |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3899 if (contents && !allow_js_access) { | 3060 if (contents && !allow_js_access) { |
| 3900 contents->web_contents()->GetController().LoadURL( | 3061 contents->web_contents()->GetController().LoadURL( |
| 3901 target_url, | 3062 target_url, |
| 3902 content::Referrer(), | 3063 content::Referrer(), |
| 3903 content::PAGE_TRANSITION_LINK, | 3064 content::PAGE_TRANSITION_LINK, |
| 3904 std::string()); // No extra headers. | 3065 std::string()); // No extra headers. |
| 3905 } | 3066 } |
| 3906 | 3067 |
| 3907 return contents != NULL; | 3068 return contents != NULL; |
| 3908 } | 3069 } |
| OLD | NEW |