OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <shellapi.h> | 8 #include <shellapi.h> |
9 #include <windows.h> | 9 #include <windows.h> |
10 #endif // OS_WIN | 10 #endif // OS_WIN |
(...skipping 22 matching lines...) Expand all Loading... |
33 #include "chrome/browser/character_encoding.h" | 33 #include "chrome/browser/character_encoding.h" |
34 #include "chrome/browser/debugger/devtools_manager.h" | 34 #include "chrome/browser/debugger/devtools_manager.h" |
35 #include "chrome/browser/debugger/devtools_toggle_action.h" | 35 #include "chrome/browser/debugger/devtools_toggle_action.h" |
36 #include "chrome/browser/debugger/devtools_window.h" | 36 #include "chrome/browser/debugger/devtools_window.h" |
37 #include "chrome/browser/download/download_item.h" | 37 #include "chrome/browser/download/download_item.h" |
38 #include "chrome/browser/download/download_item_model.h" | 38 #include "chrome/browser/download/download_item_model.h" |
39 #include "chrome/browser/download/download_manager.h" | 39 #include "chrome/browser/download/download_manager.h" |
40 #include "chrome/browser/download/download_shelf.h" | 40 #include "chrome/browser/download/download_shelf.h" |
41 #include "chrome/browser/download/download_started_animation.h" | 41 #include "chrome/browser/download/download_started_animation.h" |
42 #include "chrome/browser/download/save_package.h" | 42 #include "chrome/browser/download/save_package.h" |
| 43 #include "chrome/browser/event_disposition.h" |
43 #include "chrome/browser/extensions/crx_installer.h" | 44 #include "chrome/browser/extensions/crx_installer.h" |
44 #include "chrome/browser/extensions/extension_browser_event_router.h" | 45 #include "chrome/browser/extensions/extension_browser_event_router.h" |
45 #include "chrome/browser/extensions/extension_disabled_infobar_delegate.h" | 46 #include "chrome/browser/extensions/extension_disabled_infobar_delegate.h" |
46 #include "chrome/browser/extensions/extension_host.h" | 47 #include "chrome/browser/extensions/extension_host.h" |
47 #include "chrome/browser/extensions/extension_prefs.h" | 48 #include "chrome/browser/extensions/extension_prefs.h" |
48 #include "chrome/browser/extensions/extension_service.h" | 49 #include "chrome/browser/extensions/extension_service.h" |
49 #include "chrome/browser/extensions/extension_tab_helper.h" | 50 #include "chrome/browser/extensions/extension_tab_helper.h" |
50 #include "chrome/browser/extensions/extension_tabs_module.h" | 51 #include "chrome/browser/extensions/extension_tabs_module.h" |
51 #include "chrome/browser/favicon/favicon_tab_helper.h" | 52 #include "chrome/browser/favicon/favicon_tab_helper.h" |
52 #include "chrome/browser/first_run/first_run.h" | 53 #include "chrome/browser/first_run/first_run.h" |
(...skipping 1132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1185 tab_handler_->GetTabStripModel()->active_index(), | 1186 tab_handler_->GetTabStripModel()->active_index(), |
1186 wrapper); | 1187 wrapper); |
1187 } | 1188 } |
1188 | 1189 |
1189 bool Browser::CanRestoreTab() { | 1190 bool Browser::CanRestoreTab() { |
1190 return command_updater_.IsCommandEnabled(IDC_RESTORE_TAB); | 1191 return command_updater_.IsCommandEnabled(IDC_RESTORE_TAB); |
1191 } | 1192 } |
1192 | 1193 |
1193 bool Browser::NavigateToIndexWithDisposition(int index, | 1194 bool Browser::NavigateToIndexWithDisposition(int index, |
1194 WindowOpenDisposition disp) { | 1195 WindowOpenDisposition disp) { |
1195 NavigationController& controller = | 1196 TabContentsWrapper* tab = GetOrCloneTabWrapperForDisposition(disp); |
1196 GetOrCloneTabForDisposition(disp)->controller(); | 1197 |
| 1198 NavigationController& controller = tab->controller(); |
1197 if (index < 0 || index >= controller.entry_count()) | 1199 if (index < 0 || index >= controller.entry_count()) |
1198 return false; | 1200 return false; |
1199 controller.GoToIndex(index); | 1201 controller.GoToIndex(index); |
| 1202 |
| 1203 CreateNewBrowserForDisposition(tab, disp); |
| 1204 |
1200 return true; | 1205 return true; |
1201 } | 1206 } |
1202 | 1207 |
1203 browser::NavigateParams Browser::GetSingletonTabNavigateParams( | 1208 browser::NavigateParams Browser::GetSingletonTabNavigateParams( |
1204 const GURL& url) { | 1209 const GURL& url) { |
1205 browser::NavigateParams params(this, url, PageTransition::AUTO_BOOKMARK); | 1210 browser::NavigateParams params(this, url, PageTransition::AUTO_BOOKMARK); |
1206 params.disposition = SINGLETON_TAB; | 1211 params.disposition = SINGLETON_TAB; |
1207 params.window_action = browser::NavigateParams::SHOW_WINDOW; | 1212 params.window_action = browser::NavigateParams::SHOW_WINDOW; |
1208 params.user_gesture = true; | 1213 params.user_gesture = true; |
1209 return params; | 1214 return params; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1262 command_updater_.UpdateCommandEnabled(IDC_TOGGLE_VERTICAL_TABS, show_main_ui); | 1267 command_updater_.UpdateCommandEnabled(IDC_TOGGLE_VERTICAL_TABS, show_main_ui); |
1263 command_updater_.UpdateCommandEnabled(IDC_COMPACT_NAVBAR, show_main_ui); | 1268 command_updater_.UpdateCommandEnabled(IDC_COMPACT_NAVBAR, show_main_ui); |
1264 #if defined (ENABLE_PROFILING) && !defined(NO_TCMALLOC) | 1269 #if defined (ENABLE_PROFILING) && !defined(NO_TCMALLOC) |
1265 command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui); | 1270 command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui); |
1266 #endif | 1271 #endif |
1267 } | 1272 } |
1268 | 1273 |
1269 /////////////////////////////////////////////////////////////////////////////// | 1274 /////////////////////////////////////////////////////////////////////////////// |
1270 // Browser, Assorted browser commands: | 1275 // Browser, Assorted browser commands: |
1271 | 1276 |
1272 bool Browser::ShouldOpenNewTabForWindowDisposition( | 1277 bool Browser::ShouldOpenNewTabForDisposition( |
1273 WindowOpenDisposition disposition) { | 1278 WindowOpenDisposition disposition) { |
1274 return (disposition == NEW_FOREGROUND_TAB || | 1279 return (disposition == NEW_FOREGROUND_TAB || |
1275 disposition == NEW_BACKGROUND_TAB); | 1280 disposition == NEW_BACKGROUND_TAB); |
1276 } | 1281 } |
1277 | 1282 |
1278 TabContents* Browser::GetOrCloneTabForDisposition( | 1283 TabContents* Browser::GetOrCloneTabForDisposition( |
1279 WindowOpenDisposition disposition) { | 1284 WindowOpenDisposition disposition) { |
| 1285 return GetOrCloneTabWrapperForDisposition(disposition)->tab_contents(); |
| 1286 } |
| 1287 |
| 1288 TabContentsWrapper* Browser::GetOrCloneTabWrapperForDisposition( |
| 1289 WindowOpenDisposition disposition) { |
1280 TabContentsWrapper* current_tab = GetSelectedTabContentsWrapper(); | 1290 TabContentsWrapper* current_tab = GetSelectedTabContentsWrapper(); |
1281 if (ShouldOpenNewTabForWindowDisposition(disposition)) { | 1291 |
1282 current_tab = current_tab->Clone(); | 1292 if (disposition == NEW_WINDOW) |
| 1293 return current_tab->Clone(); |
| 1294 |
| 1295 if (ShouldOpenNewTabForDisposition(disposition)) { |
| 1296 TabContentsWrapper* new_tab = current_tab->Clone(); |
1283 tab_handler_->GetTabStripModel()->AddTabContents( | 1297 tab_handler_->GetTabStripModel()->AddTabContents( |
1284 current_tab, -1, PageTransition::LINK, | 1298 new_tab, -1, PageTransition::LINK, |
1285 disposition == NEW_FOREGROUND_TAB ? TabStripModel::ADD_ACTIVE : | 1299 disposition == NEW_FOREGROUND_TAB ? TabStripModel::ADD_ACTIVE : |
1286 TabStripModel::ADD_NONE); | 1300 TabStripModel::ADD_NONE); |
| 1301 return new_tab; |
1287 } | 1302 } |
1288 return current_tab->tab_contents(); | 1303 |
| 1304 return current_tab; |
| 1305 } |
| 1306 |
| 1307 void Browser::CreateNewBrowserForDisposition( |
| 1308 TabContentsWrapper* tab_contents, WindowOpenDisposition disposition) { |
| 1309 if (disposition == NEW_WINDOW) { |
| 1310 Browser* browser = Create(profile_); |
| 1311 browser->AddTab(tab_contents, PageTransition::LINK); |
| 1312 browser->window()->Show(); |
| 1313 } |
1289 } | 1314 } |
1290 | 1315 |
1291 void Browser::UpdateTabStripModelInsertionPolicy() { | 1316 void Browser::UpdateTabStripModelInsertionPolicy() { |
1292 tab_handler_->GetTabStripModel()->SetInsertionPolicy(UseVerticalTabs() ? | 1317 tab_handler_->GetTabStripModel()->SetInsertionPolicy(UseVerticalTabs() ? |
1293 TabStripModel::INSERT_BEFORE : TabStripModel::INSERT_AFTER); | 1318 TabStripModel::INSERT_BEFORE : TabStripModel::INSERT_AFTER); |
1294 } | 1319 } |
1295 | 1320 |
1296 void Browser::UseVerticalTabsChanged() { | 1321 void Browser::UseVerticalTabsChanged() { |
1297 UpdateTabStripModelInsertionPolicy(); | 1322 UpdateTabStripModelInsertionPolicy(); |
1298 window()->ToggleTabStripMode(); | 1323 window()->ToggleTabStripMode(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1345 bool can_close = !watcher || watcher->CanCloseBrowser(this); | 1370 bool can_close = !watcher || watcher->CanCloseBrowser(this); |
1346 if (!can_close && is_attempting_to_close_browser_) | 1371 if (!can_close && is_attempting_to_close_browser_) |
1347 CancelWindowClose(); | 1372 CancelWindowClose(); |
1348 return can_close; | 1373 return can_close; |
1349 } | 1374 } |
1350 | 1375 |
1351 void Browser::GoBack(WindowOpenDisposition disposition) { | 1376 void Browser::GoBack(WindowOpenDisposition disposition) { |
1352 UserMetrics::RecordAction(UserMetricsAction("Back")); | 1377 UserMetrics::RecordAction(UserMetricsAction("Back")); |
1353 | 1378 |
1354 TabContentsWrapper* current_tab = GetSelectedTabContentsWrapper(); | 1379 TabContentsWrapper* current_tab = GetSelectedTabContentsWrapper(); |
1355 if (current_tab->controller().CanGoBack()) { | 1380 if (!current_tab->controller().CanGoBack()) |
1356 TabContents* new_tab = GetOrCloneTabForDisposition(disposition); | 1381 return; |
1357 // If we are on an interstitial page and clone the tab, it won't be copied | 1382 |
1358 // to the new tab, so we don't need to go back. | 1383 TabContentsWrapper* new_tab = GetOrCloneTabWrapperForDisposition(disposition); |
1359 if (current_tab->tab_contents()->showing_interstitial_page() && | 1384 if (current_tab->tab_contents()->showing_interstitial_page() && |
1360 (new_tab != current_tab->tab_contents())) | 1385 (new_tab != current_tab)) |
1361 return; | 1386 return; |
1362 new_tab->controller().GoBack(); | 1387 |
1363 } | 1388 new_tab->controller().GoBack(); |
| 1389 |
| 1390 CreateNewBrowserForDisposition(new_tab, disposition); |
1364 } | 1391 } |
1365 | 1392 |
1366 void Browser::GoForward(WindowOpenDisposition disposition) { | 1393 void Browser::GoForward(WindowOpenDisposition disposition) { |
1367 UserMetrics::RecordAction(UserMetricsAction("Forward")); | 1394 UserMetrics::RecordAction(UserMetricsAction("Forward")); |
1368 if (GetSelectedTabContentsWrapper()->controller().CanGoForward()) | 1395 |
1369 GetOrCloneTabForDisposition(disposition)->controller().GoForward(); | 1396 TabContentsWrapper* current_tab = GetSelectedTabContentsWrapper(); |
| 1397 if (!current_tab->controller().CanGoForward()) |
| 1398 return; |
| 1399 |
| 1400 TabContentsWrapper* new_tab = GetOrCloneTabWrapperForDisposition(disposition); |
| 1401 new_tab->controller().GoForward(); |
| 1402 |
| 1403 CreateNewBrowserForDisposition(new_tab, disposition); |
1370 } | 1404 } |
1371 | 1405 |
1372 void Browser::Reload(WindowOpenDisposition disposition) { | 1406 void Browser::Reload(WindowOpenDisposition disposition) { |
1373 UserMetrics::RecordAction(UserMetricsAction("Reload")); | 1407 UserMetrics::RecordAction(UserMetricsAction("Reload")); |
1374 ReloadInternal(disposition, false); | 1408 ReloadInternal(disposition, false); |
1375 } | 1409 } |
1376 | 1410 |
1377 void Browser::ReloadIgnoringCache(WindowOpenDisposition disposition) { | 1411 void Browser::ReloadIgnoringCache(WindowOpenDisposition disposition) { |
1378 UserMetrics::RecordAction(UserMetricsAction("ReloadIgnoringCache")); | 1412 UserMetrics::RecordAction(UserMetricsAction("ReloadIgnoringCache")); |
1379 ReloadInternal(disposition, true); | 1413 ReloadInternal(disposition, true); |
(...skipping 1109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2489 | 2523 |
2490 bool Browser::ExecuteCommandIfEnabled(int id) { | 2524 bool Browser::ExecuteCommandIfEnabled(int id) { |
2491 if (command_updater_.SupportsCommand(id) && | 2525 if (command_updater_.SupportsCommand(id) && |
2492 command_updater_.IsCommandEnabled(id)) { | 2526 command_updater_.IsCommandEnabled(id)) { |
2493 ExecuteCommand(id); | 2527 ExecuteCommand(id); |
2494 return true; | 2528 return true; |
2495 } | 2529 } |
2496 return false; | 2530 return false; |
2497 } | 2531 } |
2498 | 2532 |
| 2533 bool Browser::ExecuteContextMenuCommand(int id, int event_flags) { |
| 2534 switch (id) { |
| 2535 case IDC_BACK: |
| 2536 GoBack(browser::DispositionFromEventFlags(event_flags)); |
| 2537 return true; |
| 2538 case IDC_FORWARD: |
| 2539 GoForward(browser::DispositionFromEventFlags(event_flags)); |
| 2540 return true; |
| 2541 case IDC_RELOAD: |
| 2542 Reload(browser::DispositionFromEventFlags(event_flags)); |
| 2543 return true; |
| 2544 } |
| 2545 |
| 2546 return false; |
| 2547 } |
| 2548 |
2499 bool Browser::IsReservedCommandOrKey(int command_id, | 2549 bool Browser::IsReservedCommandOrKey(int command_id, |
2500 const NativeWebKeyboardEvent& event) { | 2550 const NativeWebKeyboardEvent& event) { |
2501 #if defined(OS_CHROMEOS) | 2551 #if defined(OS_CHROMEOS) |
2502 // Chrome OS's top row of keys produces F1-10. Make sure that web pages | 2552 // Chrome OS's top row of keys produces F1-10. Make sure that web pages |
2503 // aren't able to block Chrome from performing the standard actions for F1-F4 | 2553 // aren't able to block Chrome from performing the standard actions for F1-F4 |
2504 // (F5-7 are grabbed by other X clients and hence don't need this protection, | 2554 // (F5-7 are grabbed by other X clients and hence don't need this protection, |
2505 // and F8-10 are handled separately in Chrome via a GDK event filter, but | 2555 // and F8-10 are handled separately in Chrome via a GDK event filter, but |
2506 // let's future-proof this). | 2556 // let's future-proof this). |
2507 ui::KeyboardCode key_code = | 2557 ui::KeyboardCode key_code = |
2508 static_cast<ui::KeyboardCode>(event.windowsKeyCode); | 2558 static_cast<ui::KeyboardCode>(event.windowsKeyCode); |
(...skipping 2187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4696 TabContents* current_tab = GetSelectedTabContents(); | 4746 TabContents* current_tab = GetSelectedTabContents(); |
4697 if (current_tab) { | 4747 if (current_tab) { |
4698 content_restrictions = current_tab->content_restrictions(); | 4748 content_restrictions = current_tab->content_restrictions(); |
4699 NavigationEntry* active_entry = current_tab->controller().GetActiveEntry(); | 4749 NavigationEntry* active_entry = current_tab->controller().GetActiveEntry(); |
4700 // See comment in UpdateCommandsForTabState about why we call url(). | 4750 // See comment in UpdateCommandsForTabState about why we call url(). |
4701 if (!SavePackage::IsSavableURL(active_entry ? active_entry->url() : GURL())) | 4751 if (!SavePackage::IsSavableURL(active_entry ? active_entry->url() : GURL())) |
4702 content_restrictions |= CONTENT_RESTRICTION_SAVE; | 4752 content_restrictions |= CONTENT_RESTRICTION_SAVE; |
4703 } | 4753 } |
4704 return content_restrictions; | 4754 return content_restrictions; |
4705 } | 4755 } |
OLD | NEW |