browser.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shellapi.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_info.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/background/background_contents_service.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/background/background_contents_service_factory.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_utils.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/character_encoding.h" 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_page_zoom.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h" 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/register_protocol_handler_infobar_delegate.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_toggle_action.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_item_model.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_shelf.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/browser_extension_window_controller.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_prefs.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/file_select_helper.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_url_tracker.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/simple_alert_infobar_delegate.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/url_fixer_upper.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_ui_manager.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/pepper_broker_infobar_delegate.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_destroyer.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_metrics.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/repost_form_warning_controller.h" 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_types.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_factory.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_ui_util.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/background_contents.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/retargeting_details.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service_factory.h" 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.h" 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_command_controller.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_instant_controller.h" 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_tab_contents.h" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tab_restore_service_delegate.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tab_strip_model_delegate.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_toolbar_model_delegate.h" 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_ui_prefs.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h" 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/fast_unload_controller.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar.h" 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar_controller.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_tab_helper.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/location_bar.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search/search_delegate.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search/search_model.h" 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/status_bubble.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sync/browser_synced_window_delegate.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/core_tab_helper.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_modal_confirm_dialog.h" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/dock_info.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_menu_model.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/toolbar/toolbar_model_impl.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/unload_controller.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/web_applications/web_app_ui.h" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/window_sizer/window_sizer.h" 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_controller.h" 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/upgrade_detector.h" 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h" 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/custom_handlers/protocol_handler.h" 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h" 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/profiling.h" 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/search_types.h" 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/startup_metric_utils.h" 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/url_constants.h" 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h" 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_manager.h" 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h" 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h" 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/site_instance.h" 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_restriction.h" 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_zoom.h" 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/renderer_preferences.h" 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h" 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h" 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/webplugininfo.h" 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/metro.h" 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration.h" 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ssl/ssl_error_info.h" 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h" 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_ie_toolbar_import_win.h" 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/shell.h" 195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ui/views/win/hwnd_util.h" 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_WIN 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NativeWebKeyboardEvent; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PluginService; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::SiteInstance; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogDelegate; 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogManager; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The URL to be loaded to display the "Report a broken page" form. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kBrokenPageUrl[] = 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "https://www.google.com/support/chrome/bin/request.py?contact_type=" 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "broken_website&format=inproduct&p.page_title=$1&p.page_url=$2"; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How long we wait before updating the browser chrome while loading a page. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kUIUpdateCoalescingTimeMS = 200; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserWindow* CreateBrowserWindow(Browser* browser) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserWindow::CreateBrowserWindow(browser); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Is the fast tab unload experiment enabled? 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsFastTabUnloadEnabled() { 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return CommandLine::ForCurrentProcess()->HasSwitch( 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switches::kEnableFastUnload); 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, CreateParams: 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Browser::CreateParams::CreateParams(Profile* profile, 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType host_desktop_type) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(TYPE_TABBED), 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile(profile), 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_desktop_type(host_desktop_type), 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_type(APP_TYPE_HOST), 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_show_state(ui::SHOW_STATE_DEFAULT), 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_session_restore(false), 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window(NULL) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::CreateParams::CreateParams(Type type, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::HostDesktopType host_desktop_type) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(type), 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile(profile), 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_desktop_type(host_desktop_type), 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_type(APP_TYPE_HOST), 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_show_state(ui::SHOW_STATE_DEFAULT), 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_session_restore(false), 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window(NULL) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::CreateParams Browser::CreateParams::CreateForApp( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type type, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& app_name, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& window_bounds, 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType host_desktop_type) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type != TYPE_TABBED); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!app_name.empty()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams params(type, profile, host_desktop_type); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.app_name = app_name; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.app_type = APP_TYPE_CHILD; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.initial_bounds = window_bounds; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::CreateParams Browser::CreateParams::CreateForDevTools( 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType host_desktop_type) { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams params(TYPE_POPUP, profile, host_desktop_type); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.app_name = DevToolsWindow::kDevToolsApp; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Browser, InterstitialObserver: 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Browser::InterstitialObserver : public content::WebContentsObserver { 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterstitialObserver(Browser* browser, content::WebContents* web_contents) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : WebContentsObserver(web_contents), 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_(browser) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) using content::WebContentsObserver::web_contents; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidAttachInterstitialPage() OVERRIDE { 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_->UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidDetachInterstitialPage() OVERRIDE { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_->UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser_; 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InterstitialObserver); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Constructors, Creation, Showing: 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::Browser(const CreateParams& params) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(params.type), 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(params.profile), 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_(NULL), 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab_strip_model_delegate_(new chrome::BrowserTabStripModelDelegate(this)), 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(), 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.profile)), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_name_(params.app_name), 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_type_(params.app_type), 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_updater_factory_(this), 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_download_confirmation_state_(NOT_PROMPTED), 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_bounds_(params.initial_bounds), 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_show_state_(params.initial_show_state), 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_session_restore_(params.is_session_restore), 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_desktop_type_(params.host_desktop_type), 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_(this), 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_setting_bubble_model_delegate_( 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new BrowserContentSettingBubbleModelDelegate(this)), 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) toolbar_model_delegate_(new BrowserToolbarModelDelegate(this)), 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab_restore_service_delegate_(new BrowserTabRestoreServiceDelegate(this)), 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) synced_window_delegate_(new BrowserSyncedWindowDelegate(this)), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_bar_state_(BookmarkBar::HIDDEN), 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_controller_(new chrome::BrowserCommandController( 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, g_browser_process->profile_manager())), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_has_shown_(false) { 351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If this causes a crash then a window is being opened using a profile type 352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // that is disallowed by policy. The crash prevents the disabled window type 353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // from opening at all, but the path that triggered it should be fixed. 354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(IncognitoModePrefs::CanOpenBrowser(profile_)); 355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(jeremy): Move to initializer list once flag is removed. 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fast_unload_controller_.reset(new chrome::FastUnloadController(this)); 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unload_controller_.reset(new chrome::UnloadController(this)); 361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!app_name_.empty()) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::RegisterAppPrefs(app_name_, profile_); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->AddObserver(this); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toolbar_model_.reset(new ToolbarModelImpl(toolbar_model_delegate_.get())); 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_model_.reset(new SearchModel()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_delegate_.reset( 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new SearchDelegate(search_model_.get(), toolbar_model_.get())); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_->GetOriginalProfile())); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_->GetOriginalProfile())); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_->GetOriginalProfile())); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_THEMES) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<ThemeService>( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThemeServiceFactory::GetForProfile(profile_))); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_pref_registrar_.Init(profile_->GetPrefs()); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_pref_registrar_.Add( 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kDevToolsDisabled, 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&Browser::OnDevToolsDisabledChanged, base::Unretained(this))); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_pref_registrar_.Add( 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kShowBookmarkBar, 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&Browser::UpdateBookmarkBarState, base::Unretained(this), 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserList::AddBrowser(this); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: These prefs all need to be explicitly destroyed in the destructor 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or you'll get a nasty surprise when you run the incognito tests. 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_auto_detect_.Init(prefs::kWebKitUsesUniversalDetector, 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_->GetPrefs()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_type_tabbed()) 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) instant_controller_.reset(new BrowserInstantController(this)); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_INIT); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProfileMetrics::LogProfileLaunch(profile_); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_ = params.window ? params.window : CreateBrowserWindow(this); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): move to BrowserFrameWin. 414b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_WIN) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the app user model id for this application to that of the application 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name. See http://crbug.com/7028. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::win::SetAppIdForWindow( 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_app() ? 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegration::GetAppModelIdForProfile(UTF8ToWide(app_name_), 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPath()) : 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegration::GetChromiumModelIdForProfile(profile_->GetPath()), 422b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) views::HWNDForNativeWindow(window()->GetNativeWindow())); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the extension window controller before sending notifications. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_window_controller_.reset( 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BrowserExtensionWindowController(this)); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): Move BrowserList::AddBrowser() to the end of this function and 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // replace uses of this with BL's notifications. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_WINDOW_READY, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(this), 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): move to ChromeBrowserMain: 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (first_run::ShouldDoPersonalDataManagerFirstRun()) { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Notify PDM that this is a first run. 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImportAutofillDataWin( 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) autofill::PersonalDataManagerFactory::GetForProfile(profile_)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_.reset(new FullscreenController(this)); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::~Browser() { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tab strip should not have any tabs at this point. 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!browser_shutdown::ShuttingDownWithoutClosingBrowsers()) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(tab_strip_model_->empty()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->RemoveObserver(this); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Destroy the BrowserCommandController before removing the browser, so that 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it doesn't act on any notifications that are sent as a result of removing 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the browser. 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_controller_.reset(); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserList::RemoveBrowser(this); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile_); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->WindowClosed(session_id_); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreService* tab_restore_service = 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreServiceFactory::GetForProfile(profile()); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tab_restore_service) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_restore_service->BrowserClosed(tab_restore_service_delegate()); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!chrome::GetTotalBrowserCountForProfile(profile_)) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're the last browser window with this profile. We need to nuke the 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TabRestoreService, which will start the shutdown of the 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationControllers and allow for proper shutdown. If we don't do this 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome won't shutdown cleanly, and may end up crashing when some 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread tries to use the IO thread (or another thread) that is no longer 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // valid. 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This isn't a valid assumption for Mac OS, as it stays running after 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the last browser has closed. The Mac equivalent is in its app 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // controller. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreServiceFactory::ResetForProfile(profile_); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_pref_registrar_.RemoveAll(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_auto_detect_.Destroy(); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Destroy BrowserExtensionWindowController before the incognito profile 49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // is destroyed to make sure the chrome.windows.onRemoved event is sent. 49290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extension_window_controller_.reset(); 49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Destroy BrowserInstantController before the incongnito profile is destroyed 495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // because the InstantController destructor depends on this profile. 496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch instant_controller_.reset(); 497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_->IsOffTheRecord() && 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !BrowserList::IsOffTheRecordSessionActiveForProfile(profile_)) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An incognito profile is no longer needed, this indirectly frees 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its cache and cookies once it gets destroyed at the appropriate time. 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileDestroyer::DestroyProfileWhenAppropriate(profile_); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There may be pending file dialogs, we need to tell them that we've gone 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // away so they don't try and call back to us. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (select_file_dialog_.get()) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_->ListenerDestroyed(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Getters & Setters 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FindBarController* Browser::GetFindBarController() { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!find_bar_controller_.get()) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindBar* find_bar = window_->CreateFindBar(); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar_controller_.reset(new FindBarController(find_bar)); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar->SetFindBarController(find_bar_controller_.get()); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) find_bar_controller_->ChangeWebContents( 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar_controller_->find_bar()->MoveWindowIfNecessary(gfx::Rect(), true); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return find_bar_controller_.get(); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::HasFindBarController() const { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return find_bar_controller_.get() != NULL; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::is_app() const { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !app_name_.empty(); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::is_devtools() const { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return app_name_ == DevToolsWindow::kDevToolsApp; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, State Storage and Retrieval for UI: 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Image Browser::GetCurrentPageIcon() const { 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = tab_strip_model_->GetActiveWebContents(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |web_contents| can be NULL since GetCurrentPageIcon() is called by the 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window during the window's creation (before tabs have been added). 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconTabHelper* favicon_tab_helper = 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents ? FaviconTabHelper::FromWebContents(web_contents) : NULL; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return favicon_tab_helper ? favicon_tab_helper->GetFavicon() : gfx::Image(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 Browser::GetWindowTitleForCurrentTab() const { 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = tab_strip_model_->GetActiveWebContents(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 title; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |contents| can be NULL because GetWindowTitleForCurrentTab is called by the 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window during the window's creation (before tabs have been added). 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title = contents->GetTitle(); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormatTitleForDisplay(&title); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title.empty()) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title = CoreTabHelper::GetDefaultTitle(); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Mac, we don't want to suffix the page title with 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the application name. 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(USE_ASH) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Ash, we don't want to suffix the page title with the application name, 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but on Windows, where USE_ASH can also be true, we still want the prefix 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on desktop. 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH) 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return title; 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't append the app name to window titles on app frames and app popups 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_app() ? 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title : 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_BROWSER_WINDOW_TITLE_FORMAT, title); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::FormatTitleForDisplay(string16* title) { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current_index = 0; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t match_index; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((match_index = title->find(L'\n', current_index)) != string16::npos) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title->replace(match_index, 1, string16()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_index = match_index; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, OnBeforeUnload handling: 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::ShouldCloseWindow() { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanCloseWithInProgressDownloads()) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return fast_unload_controller_->ShouldCloseWindow(); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unload_controller_->ShouldCloseWindow(); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool Browser::HasCompletedUnloadProcessing() const { 603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(IsFastTabUnloadEnabled()); 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return fast_unload_controller_->HasCompletedUnloadProcessing(); 605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::IsAttemptingToCloseBrowser() const { 608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return fast_unload_controller_->is_attempting_to_close_browser(); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unload_controller_->is_attempting_to_close_browser(); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OnWindowClosing() { 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ShouldCloseWindow()) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Application should shutdown on last window close if the user is explicitly 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // trying to quit, or if there is nothing keeping the browser alive (such as 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AppController on the Mac, or BackgroundContentsService for background 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pages). 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_quit_if_last_browser = 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_shutdown::IsTryingToQuit() || !chrome::WillKeepAlive(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (should_quit_if_last_browser && 62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserList::GetInstance(host_desktop_type_)->size() == 1) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_shutdown::OnShutdownStarting(browser_shutdown::WINDOW_CLOSE); 62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't use GetForProfileIfExisting here, we want to force creation of the 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session service so that user can restore what was open. 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile()); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->WindowClosing(session_id()); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreService* tab_restore_service = 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreServiceFactory::GetForProfile(profile()); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tab_restore_service && is_app()) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_restore_service->BrowserClosing(tab_restore_service_delegate()); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tab_restore_service && is_type_tabbed() && tab_strip_model_->count()) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_restore_service->BrowserClosing(tab_restore_service_delegate()); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sky): convert session/tab restore to use notification. 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSING, 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(this), 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!IsFastTabUnloadEnabled()) 654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tab_strip_model_->CloseAllTabs(); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In-progress download termination handling: 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::InProgressDownloadResponse(bool cancel_downloads) { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_downloads) { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_download_confirmation_state_ = RESPONSE_RECEIVED; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::CloseWindow(this); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the confirmation state to NOT_PROMPTED so that if the user tries to 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // close again we'll show the warning again. 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_download_confirmation_state_ = NOT_PROMPTED; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the download page so the user can figure-out what downloads are still 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in-progress. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowDownloads(this); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::DownloadClosePreventionType Browser::OkToCloseWithInProgressDownloads( 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* num_downloads_blocking) const { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(num_downloads_blocking); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_downloads_blocking = 0; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsAttemptingToCloseBrowser()) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_OK; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're not running a full browser process with a profile manager 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (testing), it's ok to close the browser. 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_browser_process->profile_manager()) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_OK; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_download_count = DownloadService::DownloadCountAllProfiles(); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (total_download_count == 0) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_OK; // No downloads; can definitely close. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Figure out how many windows are open total, and associated with this 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile, that are relevant for the ok-to-close decision. 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int profile_window_count = 0; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_window_count = 0; 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (chrome::BrowserIterator it; !it.done(); it.Next()) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't count this browser window or any other in the process of closing. 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* const browser = *it; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window closing may be delayed, and windows that are in the process of 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing don't count against our totals. 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser == this || browser->IsAttemptingToCloseBrowser()) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->profile() == profile()) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_window_count++; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_window_count++; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there aren't any other windows, we're at browser shutdown, 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which would cancel all current downloads. 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (total_window_count == 0) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_downloads_blocking = total_download_count; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_BROWSER_SHUTDOWN; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there aren't any other windows on our profile, and we're an incognito 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile, and there are downloads associated with that profile, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // those downloads would be cancelled by our window (-> profile) close. 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadService* download_service = 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadServiceFactory::GetForProfile(profile()); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_window_count == 0 && download_service->DownloadCount() > 0 && 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->IsOffTheRecord()) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_downloads_blocking = download_service->DownloadCount(); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_LAST_WINDOW_IN_INCOGNITO_PROFILE; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Those are the only conditions under which we will block shutdown. 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_OK; 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Tab adding/showing functions: 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::WindowFullscreenStateChanged() { 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->WindowFullscreenStateChanged(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->FullscreenStateChanged(); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::VisibleSSLStateChanged(content::WebContents* web_contents) { 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When the current tab's SSL state changes, we need to update the URL 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // bar to reflect the new state. 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(web_contents); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tab_strip_model_->GetActiveWebContents() == web_contents) 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateToolbar(false); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Assorted browser commands: 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ToggleFullscreenModeWithExtension(const GURL& extension_url) { 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->ToggleFullscreenModeWithExtension(extension_url); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::SupportsWindowFeature(WindowFeature feature) const { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SupportsWindowFeatureImpl(feature, true); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::CanSupportWindowFeature(WindowFeature feature) const { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SupportsWindowFeatureImpl(feature, false); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ToggleEncodingAutoDetect() { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("AutoDetectChange")); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_auto_detect_.SetValue(!encoding_auto_detect_.GetValue()); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If "auto detect" is turned on, then any current override encoding 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is cleared. This also implicitly performs a reload. 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OTOH, if "auto detect" is turned off, we don't change the currently 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active encoding. 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encoding_auto_detect_.GetValue()) { 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = tab_strip_model_->GetActiveWebContents(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->ResetOverrideEncoding(); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OverrideEncoding(int encoding_id) { 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("OverrideEncoding")); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string selected_encoding = 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterEncoding::GetCanonicalEncodingNameByCommandId(encoding_id); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = tab_strip_model_->GetActiveWebContents(); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!selected_encoding.empty() && contents) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetOverrideEncoding(selected_encoding); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the list of recently selected encodings. 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_selected_encoding_list; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CharacterEncoding::UpdateRecentlySelectedEncoding( 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs()->GetString(prefs::kRecentlySelectedEncoding), 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_id, 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &new_selected_encoding_list)) { 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs()->SetString(prefs::kRecentlySelectedEncoding, 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_selected_encoding_list); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OpenFile() { 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("OpenFile")); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_ = ui::SelectFileDialog::Create( 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new ChromeSelectFilePolicy( 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents())); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath directory = profile_->last_selected_directory(); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): figure out how to juggle this. 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent_window = window_->GetNativeWindow(); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::FileTypeInfo file_types; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_types.support_drive = true; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_->SelectFile(ui::SelectFileDialog::SELECT_OPEN_FILE, 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16(), 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) directory, 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &file_types, 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath::StringType(), 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_window, 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdateDownloadShelfVisibility(bool visible) { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetStatusBubble()) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->UpdateDownloadShelfVisibility(visible); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::RunUnloadEventsHelper(WebContents* contents) { 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the WebContents is not connected yet, then there's no unload 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handler we can fire even if the WebContents has an unload listener. 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One case where we hit this is in a tab that has an infinite loop 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before load. 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents->NeedToFireBeforeUnload()) { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the page has unload listeners, then we tell the renderer to fire 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // them. Once they have fired, we'll get a message back saying whether 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to proceed closing the page or not, which sends us back to this method 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the NeedToFireBeforeUnload bit cleared. 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->GetRenderViewHost()->FirePageBeforeUnload(false); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::JSOutOfMemoryHelper(WebContents* web_contents) { 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService* infobar_service = 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService::FromWebContents(web_contents); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!infobar_service) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimpleAlertInfoBarDelegate::Create( 84990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) infobar_service, InfoBarDelegate::kNoIconID, 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_JS_OUT_OF_MEMORY_PROMPT), true); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RegisterProtocolHandlerHelper(WebContents* web_contents, 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol, 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture, 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserWindow* window) { 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile->IsOffTheRecord()) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler handler = 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler::CreateProtocolHandler(protocol, url, title); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProtocolHandlerRegistry* registry = 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProtocolHandlerRegistryFactory::GetForProfile(profile); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (registry->SilentlyHandleRegisterHandlerRequest(handler)) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TabSpecificContentSettings* tab_content_settings = 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TabSpecificContentSettings::FromWebContents(web_contents); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!user_gesture && window) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_content_settings->set_pending_protocol_handler(handler); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_content_settings->set_previous_protocol_handler( 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetHandlerFor(handler.protocol())); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->GetLocationBar()->UpdateContentSettingsIcons(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure content-setting icon is turned off in case the page does 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ungestured and gestured RPH calls. 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window) { 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_content_settings->ClearPendingProtocolHandler(); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->GetLocationBar()->UpdateContentSettingsIcons(); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RegisterProtocolHandlerInfoBarDelegate::Create( 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InfoBarService::FromWebContents(web_contents), registry, handler); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::FindReplyHelper(WebContents* web_contents, 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindTabHelper* find_tab_helper = FindTabHelper::FromWebContents(web_contents); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!find_tab_helper) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_tab_helper->HandleFindReply(request_id, 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_matches, 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_rect, 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_update); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::UpdateUIForNavigationInTab(WebContents* contents, 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition, 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_initiated) { 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->TabNavigating(contents, transition); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool contents_is_selected = 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents == tab_strip_model_->GetActiveWebContents(); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_initiated && contents_is_selected && window()->GetLocationBar()) { 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Forcibly reset the location bar if the url is going to change in the 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current tab, since otherwise it won't discard any ongoing user edits, 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since it doesn't realize this is a user-initiated action. 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->Revert(); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetStatusBubble()) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->Hide(); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the location bar. This is synchronous. We specifically don't 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update the load state since the load hasn't started yet and updating it 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will put it out of sync with the actual state like whether we're 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // displaying a favicon, which controls the throbber. If we updated it here, 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the throbber will show the default favicon for a split second when 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating away from the new tab page. 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScheduleUIUpdate(contents, content::INVALIDATE_TYPE_URL); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents_is_selected) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents->GetView()->SetInitialFocus(); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, PageNavigator implementation: 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* Browser::OpenURL(const OpenURLParams& params) { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OpenURLFromTab(NULL, params); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, TabStripModelObserver implementation: 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabInsertedAt(WebContents* contents, 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool foreground) { 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAsDelegate(contents, this); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper* session_tab_helper = 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::FromWebContents(contents); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_tab_helper->SetWindowID(session_id()); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_PARENTED, 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<content::WebContents>(contents), 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncHistoryWithTabs(index); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the loading state is updated correctly, otherwise the throbber 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // won't start if the page is loading. 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadingStateChanged(contents); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interstitial_observers_.push_back(new InterstitialObserver(this, contents)); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile_); 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (session_service) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->TabInserted(contents); 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int new_active_index = tab_strip_model_->active_index(); 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (index < new_active_index) 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_service->SetSelectedTabInWindow(session_id(), 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_active_index); 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabClosingAt(TabStripModel* tab_strip_model, 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents, 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->OnTabClosing(contents); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile_); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->TabClosing(contents); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_CLOSING, 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>(&contents->GetController()), 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sever the WebContents' connection back to us. 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAsDelegate(contents, NULL); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabDetachedAt(WebContents* contents, int index) { 1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TabDetachedAt is called before TabStripModel has updated the 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // active index. 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int old_active_index = tab_strip_model_->active_index(); 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (index < old_active_index && !tab_strip_model_->closing_all()) { 1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SessionService* session_service = 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SessionServiceFactory::GetForProfileIfExisting(profile_); 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (session_service) 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_service->SetSelectedTabInWindow(session_id(), 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) old_active_index - 1); 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabDetachedAtImpl(contents, index, DETACH_TYPE_DETACH); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::TabDeactivated(WebContents* contents) { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->OnTabDeactivated(contents); 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) search_delegate_->OnTabDeactivated(contents); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save what the user's currently typing, so it can be restored when we 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // switch back to this tab. 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->GetLocationBar()->SaveStateToContents(contents); 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_controller_) 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_controller_->TabDeactivated(contents); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::ActiveTabChanged(WebContents* old_contents, 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* new_contents, 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int reason) { 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RecordAction(UserMetricsAction("ActiveTabChanged")); 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Discarded tabs always get reloaded. 103390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (tab_strip_model_->IsTabDiscarded(index)) { 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Reloading discarded tab at " << index; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int reload_count = 0; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS( 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Tabs.Discard.ReloadCount", ++reload_count, 1, 1000, 50); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Reload(this, CURRENT_TAB); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have any update pending, do it now. 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chrome_updater_factory_.HasWeakPtrs() && old_contents) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingUIUpdates(); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Propagate the profile to the location bar. 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateToolbar((reason & CHANGE_REASON_REPLACED) == 0); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Propagate tab state to toolbar, tab-strip, etc. 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSearchState(new_contents); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update reload/stop state. 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_controller_->LoadingStateChanged(new_contents->IsLoading(), true); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update commands to reflect current state. 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->TabStateChanged(); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the status bubble. 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StatusBubble* status_bubble = GetStatusBubble(); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status_bubble) { 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_bubble->Hide(); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the loading state (if any). 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_bubble->SetStatus(CoreTabHelper::FromWebContents( 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents())->GetStatusText()); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasFindBarController()) { 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) find_bar_controller_->ChangeWebContents(new_contents); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar_controller_->find_bar()->MoveWindowIfNecessary(gfx::Rect(), true); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update sessions. Don't force creation of sessions. If sessions doesn't 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exist, the change will be picked up by sessions when created. 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfileIfExisting(profile_); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service && !tab_strip_model_->closing_all()) { 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_service->SetSelectedTabInWindow(session_id(), 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->active_index()); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_SWITCH); 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This needs to be called after UpdateSearchState(). 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_controller_) 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_controller_->ActiveTabChanged(); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::TabMoved(WebContents* contents, 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int from_index, 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int to_index) { 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(from_index >= 0 && to_index >= 0); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the history service. 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncHistoryWithTabs(std::min(from_index, to_index)); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabReplacedAt(TabStripModel* tab_strip_model, 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* old_contents, 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* new_contents, 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) { 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabDetachedAtImpl(old_contents, index, DETACH_TYPE_REPLACE); 1101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fullscreen_controller_->OnTabClosing(old_contents); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile_); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_service->TabClosing(old_contents); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabInsertedAt(new_contents, 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index, 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (index == tab_strip_model_->active_index())); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int entry_count = new_contents->GetController().GetEntryCount(); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_count > 0) { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out notification so that observers are updated appropriately. 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->GetController().NotifyEntryChanged( 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->GetController().GetEntryAtIndex(entry_count - 1), 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_count - 1); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) { 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The new_contents may end up with a different navigation stack. Force 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the session service to update itself. 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->TabRestored(new_contents, 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->IsTabPinned(index)); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabPinnedStateChanged(WebContents* contents, int index) { 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfileIfExisting(profile()); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) { 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper* session_tab_helper = 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::FromWebContents(contents); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->SetPinnedState(session_id(), 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_tab_helper->session_id(), 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->IsTabPinned(index)); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabStripEmpty() { 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the frame after we return to the message loop (not immediately, 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise it will destroy this object before the stack has a chance to 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cleanly unwind.) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This will be called several times if TabStripEmpty is called several 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // times. This is because it does not close the window if tabs are 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still present. 1145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&Browser::CloseFrame, weak_factory_.GetWeakPtr())); 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Instant may have visible WebContents that need to be detached before the 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // window system closes. 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_controller_.reset(); 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Browser::CanOverscrollContent() const { 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool overscroll_enabled = CommandLine::ForCurrentProcess()-> 11565e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0"; 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!overscroll_enabled) 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_app() || is_devtools() || !is_type_tabbed()) 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The detached bookmark bar has appearance of floating above the 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // web-contents. This does not play nicely with overscroll navigation 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // gestures. So disable overscroll navigation when the bookmark bar is in the 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // detached state. 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bookmark_bar_state_ == BookmarkBar::DETACHED) 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::PreHandleKeyboardEvent(content::WebContents* source, 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Escape exits tabbed fullscreen mode. 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(koz): Write a test for this http://crbug.com/100441. 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.windowsKeyCode == 27 && 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->HandleUserPressedEscape()) { 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window()->PreHandleKeyboardEvent(event, is_keyboard_shortcut); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::HandleKeyboardEvent(content::WebContents* source, 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event) { 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->HandleKeyboardEvent(event); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Browser::TabsNeedBeforeUnloadFired() { 1192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 1193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return fast_unload_controller_->TabsNeedBeforeUnloadFired(); 1194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return unload_controller_->TabsNeedBeforeUnloadFired(); 1195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::IsMouseLocked() const { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fullscreen_controller_->IsMouseLocked(); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OnWindowDidShow() { 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_has_shown_) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_has_shown_ = true; 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CurrentProcessInfo::CreationTime() is currently only implemented on Mac and 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows. 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Measure the latency from startup till the first browser window becomes 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visible. 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool is_first_browser_window = true; 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_first_browser_window && 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !startup_metric_utils::WasNonBrowserUIDisplayed()) { 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_first_browser_window = false; 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time* process_creation_time = 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CurrentProcessInfo::CreationTime(); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_creation_time) { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES( 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Startup.BrowserWindowDisplay", 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - *process_creation_time); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) || defined(OS_WIN) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing to do for non-tabbed windows. 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_type_tabbed()) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show any pending global error bubble. 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalErrorService* service = 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalErrorServiceFactory::GetForProfile(profile()); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalError* error = service->GetFirstGlobalErrorWithBubbleView(); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error->ShowBubbleView(this); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ShowFirstRunBubble() { 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->ShowFirstRunBubble(); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::ShowDownload(content::DownloadItem* download) { 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!window()) 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the download occurs in a new tab, and it's not a save page 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // download (started before initial navigation completed) close it. 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* source = download->GetWebContents(); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source && source->GetController().IsInitialNavigation() && 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->count() > 1 && !download->IsSavePackageDownload()) { 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CloseContents(source); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Some (app downloads) are not supposed to appear on the shelf. 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!DownloadItemModel(download).ShouldShowInShelf()) 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // GetDownloadShelf creates the download shelf if it was not yet created. 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadShelf* shelf = window()->GetDownloadShelf(); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf->AddDownload(download); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, content::WebContentsDelegate implementation: 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* Browser::OpenURLFromTab(WebContents* source, 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OpenURLParams& params) { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NavigateParams nav_params(this, params.url, params.transition); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillNavigateParamsFromOpenURLParams(&nav_params, params); 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_params.source_contents = source; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nav_params.tabstrip_add_types = TabStripModel::ADD_NONE; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nav_params.window_action = chrome::NavigateParams::SHOW_WINDOW; 12737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch nav_params.user_gesture = params.user_gesture; 12747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 12757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BlockedContentTabHelper* blocked_content_helper = NULL; 12767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (source) 12777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch blocked_content_helper = BlockedContentTabHelper::FromWebContents(source); 12787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 12797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (CommandLine::ForCurrentProcess()->HasSwitch( 12807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kEnableBetterPopupBlocking) && 12817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch blocked_content_helper) { 12827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 12837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (blocked_content_helper->all_contents_blocked()) { 12847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(jochen): store information about the blocked pop-up in the 12857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // helper. 12867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return NULL; 12877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 12887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 12897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if ((params.disposition == NEW_POPUP || 12907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params.disposition == NEW_FOREGROUND_TAB || 12917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params.disposition == NEW_BACKGROUND_TAB) && 12927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !params.user_gesture && !CommandLine::ForCurrentProcess()->HasSwitch( 12937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kDisablePopupBlocking)) { 12947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return NULL; 12957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 12967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 12977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Navigate(&nav_params); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return nav_params.target_contents; 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::NavigationStateChanged(const WebContents* source, 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned changed_flags) { 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only update the UI when something visible has changed. 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags) 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleUIUpdate(source, changed_flags); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can synchronously update commands since they will only change once per 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation, so we don't have to worry about flickering. We do, however, 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to update the command state early on load to always present usable 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // actions in the face of slow-to-commit pages. 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags & (content::INVALIDATE_TYPE_URL | 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::INVALIDATE_TYPE_LOAD)) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->TabStateChanged(); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::AddNewContents(WebContents* source, 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents, 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture, 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* was_blocked) { 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::AddWebContents(this, source, new_contents, disposition, initial_pos, 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture, was_blocked); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ActivateContents(WebContents* contents) { 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->ActivateTabAt( 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetIndexOfWebContents(contents), false); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Activate(); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::DeactivateContents(WebContents* contents) { 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Deactivate(); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::LoadingStateChanged(WebContents* source) { 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->UpdateLoadingAnimations(tab_strip_model_->TabsAreLoading()); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->UpdateTitleBar(); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* selected_contents = tab_strip_model_->GetActiveWebContents(); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source == selected_contents) { 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_loading = source->IsLoading(); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->LoadingStateChanged(is_loading, false); 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetStatusBubble()) { 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStatusBubble()->SetStatus(CoreTabHelper::FromWebContents( 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents())->GetStatusText()); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::CloseContents(WebContents* source) { 1354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool can_close_contents; 1355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 1356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch can_close_contents = fast_unload_controller_->CanCloseContents(source); 1357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 1358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch can_close_contents = unload_controller_->CanCloseContents(source); 1359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (can_close_contents) 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CloseWebContents(this, source, true); 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::MoveContents(WebContents* source, const gfx::Rect& pos) { 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsPopupOrPanel(source)) { 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "moving invalid browser type"; 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(pos); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::IsPopupOrPanel(const WebContents* source) const { 1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return is_type_popup(); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdateTargetURL(WebContents* source, int32 page_id, 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetStatusBubble()) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source == tab_strip_model_->GetActiveWebContents()) { 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->SetURL(url, prefs->GetString(prefs::kAcceptLanguages)); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ContentsMouseEvent( 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* source, const gfx::Point& location, bool motion) { 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetStatusBubble()) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source == tab_strip_model_->GetActiveWebContents()) { 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->MouseMoved(location, !motion); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!motion) 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->SetURL(GURL(), std::string()); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ContentsZoomChange(bool zoom_in) { 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ExecuteCommand(this, zoom_in ? IDC_ZOOM_PLUS : IDC_ZOOM_MINUS); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::WebContentsFocused(WebContents* contents) { 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->WebContentsFocused(contents); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::TakeFocus(content::WebContents* source, 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reverse) { 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_FOCUS_RETURNED_TO_BROWSER, 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(this), 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Browser::GetRootWindowResizerRect() const { 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_->GetRootWindowResizerRect(); 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::BeforeUnloadFired(WebContents* web_contents, 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 1423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) { 1424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *proceed_to_fire_unload = 1425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fast_unload_controller_->BeforeUnloadFired(web_contents, proceed); 1426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 1427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *proceed_to_fire_unload = 1428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unload_controller_->BeforeUnloadFired(web_contents, proceed); 1429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Browser::ShouldFocusLocationBarByDefault(WebContents* source) { 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NavigationEntry* entry = 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->GetController().GetActiveEntry(); 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entry) { 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url = entry->GetURL(); 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL virtual_url = entry->GetVirtualURL(); 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((url.SchemeIs(chrome::kChromeUIScheme) && 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url.host() == chrome::kChromeUINewTabHost) || 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (virtual_url.SchemeIs(chrome::kChromeUIScheme) && 1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_url.host() == chrome::kChromeUINewTabHost)) { 1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return chrome::NavEntryIsInstantNTP(source, entry); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::SetFocusToLocationBar(bool select_all) { 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two differences between this and FocusLocationBar(): 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (1) This doesn't get recorded in user metrics, since it's called 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // internally. 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (2) This checks whether the location bar can be focused, and if not, clears 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the focus. FocusLocationBar() is only reached when the location bar is 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focusable, but this may be reached at other times, e.g. while in 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fullscreen mode, where we need to leave focus in a consistent state. 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetFocusToLocationBar(select_all); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RenderWidgetShowing() { 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->DisableInactiveFrame(); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Browser::GetExtraRenderViewHeight() const { 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_->GetExtraRenderViewHeight(); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ViewSourceForTab(WebContents* source, const GURL& page_url) { 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(source); 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::ViewSource(this, source); 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ViewSourceForFrame(WebContents* source, 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 147590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const content::PageState& frame_page_state) { 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(source); 147790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::ViewSource(this, source, frame_url, frame_page_state); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ShowRepostFormWarningDialog(WebContents* source) { 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabModalConfirmDialog::Create(new RepostFormWarningController(source), 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source); 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::ShouldCreateWebContents( 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents, 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowContainerType window_container_type, 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& frame_name, 14907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const GURL& target_url, 14917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WindowOpenDisposition disposition, 14927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool user_gesture) { 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_container_type == WINDOW_CONTAINER_TYPE_BACKGROUND) { 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a BackgroundContents is created, suppress the normal WebContents. 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !MaybeCreateBackgroundContents( 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route_id, web_contents, frame_name, target_url); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!CommandLine::ForCurrentProcess()->HasSwitch( 15007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kEnableBetterPopupBlocking)) { 15017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 15027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 15037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BlockedContentTabHelper* blocked_content_helper = 15057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BlockedContentTabHelper::FromWebContents(web_contents); 15067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!blocked_content_helper) 15077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 15087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (blocked_content_helper->all_contents_blocked()) { 15107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(jochen): store information about the blocked pop-up in the helper. 15117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 15127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 15137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if ((disposition == NEW_POPUP || disposition == NEW_FOREGROUND_TAB || 15157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch disposition == NEW_BACKGROUND_TAB) && !user_gesture && 15167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !CommandLine::ForCurrentProcess()->HasSwitch( 15177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kDisablePopupBlocking)) { 15187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 15197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 15207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::WebContentsCreated(WebContents* source_contents, 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 source_frame_id, 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& frame_name, 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& target_url, 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents) { 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adopt the WebContents now, so all observers are in place, as the network 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requests for its initial navigation will start immediately. The WebContents 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will later be inserted into this browser using Browser::Navigate via 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AddNewContents. 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserTabContents::AttachTabHelpers(new_contents); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify. 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RetargetingDetails details; 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.source_web_contents = source_contents; 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.source_frame_id = source_frame_id; 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.target_url = target_url; 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.target_web_contents = new_contents; 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.not_yet_in_tabstrip = true; 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_RETARGETING, 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_), 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<RetargetingDetails>(&details)); 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ContentRestrictionsChanged(WebContents* source) { 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->ContentRestrictionsChanged(); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RendererUnresponsive(WebContents* source) { 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore hangs if a tab is blocked. 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index = tab_strip_model_->GetIndexOfWebContents(source); 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(TabStripModel::kNoTab, index); 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tab_strip_model_->IsTabBlocked(index)) 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowHungRendererDialog(source); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RendererResponsive(WebContents* source) { 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::HideHungRendererDialog(source); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::WorkerCrashed(WebContents* source) { 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimpleAlertInfoBarDelegate::Create( 156890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InfoBarService::FromWebContents(source), InfoBarDelegate::kNoIconID, 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_WEBWORKER_CRASHED_PROMPT), true); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::DidNavigateMainFramePostCommit(WebContents* web_contents) { 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents == tab_strip_model_->GetActiveWebContents()) 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::DidNavigateToPendingEntry(WebContents* web_contents) { 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents == tab_strip_model_->GetActiveWebContents()) 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager() { 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetJavaScriptDialogManagerInstance(); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::ColorChooser* Browser::OpenColorChooser(WebContents* web_contents, 158790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SkColor initial_color) { 158890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return chrome::ShowColorChooser(web_contents, initial_color); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RunFileChooser(WebContents* web_contents, 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FileChooserParams& params) { 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSelectHelper::RunFileChooser(web_contents, params); 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::EnumerateDirectory(WebContents* web_contents, 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSelectHelper::EnumerateDirectory(web_contents, request_id, path); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ToggleFullscreenModeForTab(WebContents* web_contents, 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enter_fullscreen) { 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->ToggleFullscreenModeForTab(web_contents, 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter_fullscreen); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::IsFullscreenForTabOrPending( 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContents* web_contents) const { 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fullscreen_controller_->IsFullscreenForTabOrPending(web_contents); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::JSOutOfMemory(WebContents* web_contents) { 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSOutOfMemoryHelper(web_contents); 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RegisterProtocolHandler(WebContents* web_contents, 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol, 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterProtocolHandlerHelper( 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, protocol, url, title, user_gesture, window()); 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdatePreferredSize(WebContents* source, 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& pref_size) { 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->UpdatePreferredSize(source, pref_size); 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ResizeDueToAutoResize(WebContents* source, 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& new_size) { 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->ResizeDueToAutoResize(source, new_size); 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::FindReply(WebContents* web_contents, 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindReplyHelper(web_contents, request_id, number_of_matches, selection_rect, 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, final_update); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RequestToLockMouse(WebContents* web_contents, 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture, 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->RequestToLockMouse(web_contents, 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture, 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_unlocked_by_target); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::LostMouseLock() { 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->LostMouseLock(); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RequestMediaAccessPermission( 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::MediaStreamRequest& request, 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MediaResponseCallback& callback) { 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const extensions::Extension* extension = NULL; 1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL origin(request.security_origin); 1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (origin.SchemeIs(extensions::kExtensionScheme)) { 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionService* extensions_service = 1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(profile_)->extension_service(); 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension = extensions_service->extensions()->GetByID(origin.host()); 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(extension); 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest( 1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents, request, callback, extension); 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Browser::RequestPpapiBrokerPermission( 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents, 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path, 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(bool)>& callback) { 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PepperBrokerInfoBarDelegate::Create(web_contents, url, plugin_path, callback); 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, CoreTabHelperDelegate implementation: 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::SwapTabContents(content::WebContents* old_contents, 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* new_contents) { 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = tab_strip_model_->GetIndexOfWebContents(old_contents); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(TabStripModel::kNoTab, index); 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->ReplaceWebContentsAt(index, new_contents); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::CanReloadContents(content::WebContents* web_contents) const { 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::CanReload(this); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::CanSaveContents(content::WebContents* web_contents) const { 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::CanSavePage(this); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, SearchEngineTabHelperDelegate implementation: 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ConfirmAddSearchProvider(TemplateURL* template_url, 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) { 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->ConfirmAddSearchProvider(template_url, profile); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 171190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Browser, web_modal::WebContentsModalDialogManagerDelegate implementation: 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::SetWebContentsBlocked(content::WebContents* web_contents, 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool blocked) { 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = tab_strip_model_->GetIndexOfWebContents(web_contents); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == TabStripModel::kNoTab) { 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->SetTabBlocked(index, blocked); 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!blocked && tab_strip_model_->GetActiveWebContents() == web_contents) 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetView()->Focus(); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)web_modal::WebContentsModalDialogHost* 172690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Browser::GetWebContentsModalDialogHost() { 1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return window_->GetWebContentsModalDialogHost(); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, BlockedContentTabHelperDelegate implementation: 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* Browser::GetConstrainingWebContents( 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* source) { 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return source; 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, BookmarkTabHelperDelegate implementation: 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::URLStarredChanged(content::WebContents* web_contents, 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool starred) { 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents == tab_strip_model_->GetActiveWebContents()) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetStarredState(starred); 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, ZoomObserver implementation: 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OnZoomChanged(content::WebContents* source, 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_show_bubble) { 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source == tab_strip_model_->GetActiveWebContents()) { 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only show the zoom bubble for zoom changes in the active window. 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->ZoomChangedForActiveTab(can_show_bubble && window_->IsActive()); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, ui::SelectFileDialog::Listener implementation: 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::FileSelected(const base::FilePath& path, int index, 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* params) { 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSelectedWithExtraInfo(ui::SelectedFileInfo(path, path), index, params); 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Browser::FileSelectedWithExtraInfo(const ui::SelectedFileInfo& file_info, 1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int index, 1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void* params) { 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->set_last_selected_directory(file_info.file_path.DirName()); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url = net::FilePathToFileURL(file_info.local_path); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::util::MaybeSetDriveURL(profile_, file_info.file_path, &url); 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (url.is_empty()) 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(OpenURLParams( 1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, content::NotificationObserver implementation: 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::Observe(int type, 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_UNLOADED: { 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window()->GetLocationBar()) 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->UpdatePageActions(); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const extensions::UnloadedExtensionInfo* extension_info = 1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<extensions::UnloadedExtensionInfo>(details).ptr(); 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close any tabs from the unloaded extension, unless it's terminated, 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case let the sad tabs remain. 1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension_info->reason != extension_misc::UNLOAD_REASON_TERMINATE) { 1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Extension* extension = extension_info->extension; 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iterate backwards as we may remove items while iterating. 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = tab_strip_model_->count() - 1; i >= 0; --i) { 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = tab_strip_model_->GetWebContentsAt(i); 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Two cases are handled here: 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - The scheme check is for when an extension page is loaded in a 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tab, e.g. chrome-extension://id/page.html. 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - The extension_app check is for apps, which can have non-extension 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // schemes, e.g. https://mail.google.com if you have the Gmail app 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // installed. 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((web_contents->GetURL().SchemeIs(extensions::kExtensionScheme) && 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetURL().host() == extension->id()) || 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (extensions::TabHelper::FromWebContents( 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents)->extension_app() == extension)) { 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->CloseWebContentsAt(i, TabStripModel::CLOSE_NONE); 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: { 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = content::Source<Profile>(source).ptr(); 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_->IsSameProfile(profile) && window()->GetLocationBar()) 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->InvalidatePageActions(); 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_UNINSTALLED: 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_LOADED: 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // During window creation on Windows we may end up calling into 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SHAppBarMessage, which internally spawns a nested message loop. This 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // makes it possible for us to end up here before window creation has 1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // completed, at which point window_ is NULL. See 94752 for details. 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window() && window()->GetLocationBar()) 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->UpdatePageActions(); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_THEMES) 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->UserChangedTheme(); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED: { 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = content::Source<WebContents>(source).ptr(); 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents == tab_strip_model_->GetActiveWebContents()) { 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationBar* location_bar = window()->GetLocationBar(); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location_bar) 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_bar->UpdateContentSettingsIcons(); 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Got a notification we didn't register for."; 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Command and state updating (private): 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::OnDevToolsDisabledChanged() { 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled)) 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DevToolsManager::GetInstance()->CloseAllClientHosts(); 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, UI update coalescing and handling (private): 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdateToolbar(bool should_restore_state) { 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->UpdateToolbar(tab_strip_model_->GetActiveWebContents(), 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_restore_state); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::UpdateSearchState(WebContents* contents) { 1877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chrome::IsInstantExtendedAPIEnabled()) 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) search_delegate_->OnTabActivated(contents); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ScheduleUIUpdate(const WebContents* source, 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned changed_flags) { 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!source) 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do some synchronous updates. 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags & content::INVALIDATE_TYPE_URL && 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source == tab_strip_model_->GetActiveWebContents()) { 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only update the URL for the current tab. Note that we do not update 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the navigation commands since those would have already been updated 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synchronously by NavigationStateChanged. 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateToolbar(false); 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changed_flags &= ~content::INVALIDATE_TYPE_URL; 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags & content::INVALIDATE_TYPE_LOAD) { 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the loading state synchronously. This is so the throbber will 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately start/stop, which gives a more snappy feel. We want to do 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this for any tab so they start & stop quickly. 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->UpdateWebContentsStateAt( 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetIndexOfWebContents(source), 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModelObserver::LOADING_ONLY); 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The status bubble needs to be updated during INVALIDATE_TYPE_LOAD too, 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but we do that asynchronously by not stripping INVALIDATE_TYPE_LOAD from 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed_flags. 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags & content::INVALIDATE_TYPE_TITLE && !source->IsLoading()) { 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To correctly calculate whether the title changed while not loading 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we need to process the update synchronously. This state only matters for 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the TabStripModel, so we notify the TabStripModel now and notify others 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->UpdateWebContentsStateAt( 19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetIndexOfWebContents(source), 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModelObserver::TITLE_NOT_LOADING); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the only updates were synchronously handled above, we're done. 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags == 0) 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the dirty bits. 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_updates_[source] |= changed_flags; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!chrome_updater_factory_.HasWeakPtrs()) { 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No task currently scheduled, start another. 1926b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&Browser::ProcessPendingUIUpdates, 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_updater_factory_.GetWeakPtr()), 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kUIUpdateCoalescingTimeMS)); 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ProcessPendingUIUpdates() { 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that all tabs we have pending updates for exist. This is scary 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the pending list must be kept in sync with any detached or 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleted tabs. 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (UpdateMap::const_iterator i = scheduled_updates_.begin(); 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != scheduled_updates_.end(); ++i) { 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int tab = 0; tab < tab_strip_model_->count(); tab++) { 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tab_strip_model_->GetWebContentsAt(tab) == i->first) { 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = true; 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(found); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_updater_factory_.InvalidateWeakPtrs(); 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (UpdateMap::const_iterator i = scheduled_updates_.begin(); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != scheduled_updates_.end(); ++i) { 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not dereference |contents|, it may be out-of-date! 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContents* contents = i->first; 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned flags = i->second; 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents == tab_strip_model_->GetActiveWebContents()) { 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates that only matter when the tab is selected go here. 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & content::INVALIDATE_TYPE_PAGE_ACTIONS) { 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationBar* location_bar = window()->GetLocationBar(); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location_bar) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_bar->UpdatePageActions(); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updating the URL happens synchronously in ScheduleUIUpdate. 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & content::INVALIDATE_TYPE_LOAD && GetStatusBubble()) { 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStatusBubble()->SetStatus(CoreTabHelper::FromWebContents( 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents())->GetStatusText()); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & (content::INVALIDATE_TYPE_TAB | 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::INVALIDATE_TYPE_TITLE)) { 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->UpdateTitleBar(); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates that don't depend upon the selected state go here. 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (content::INVALIDATE_TYPE_TAB | content::INVALIDATE_TYPE_TITLE)) { 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->UpdateWebContentsStateAt( 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->GetIndexOfWebContents(contents), 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModelObserver::ALL); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update the bookmark bar. It may happen that the tab is crashed, and if 19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so, the bookmark bar should be hidden. 19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (flags & content::INVALIDATE_TYPE_TAB) 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't need to process INVALIDATE_STATE, since that's not visible. 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_updates_.clear(); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RemoveScheduledUpdatesFor(WebContents* contents) { 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMap::iterator i = scheduled_updates_.find(contents); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != scheduled_updates_.end()) 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_updates_.erase(i); 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Getters for UI (private): 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StatusBubble* Browser::GetStatusBubble() { 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In kiosk and exclusive app mode, we want to always hide the status bubble. 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chrome::IsRunningInAppMode()) 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_ ? window_->GetStatusBubble() : NULL; 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Session restore functions (private): 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::SyncHistoryWithTabs(int index) { 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfileIfExisting(profile()); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) { 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = index; i < tab_strip_model_->count(); ++i) { 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = tab_strip_model_->GetWebContentsAt(i); 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents) { 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper* session_tab_helper = 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::FromWebContents(web_contents); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->SetTabIndexInWindow( 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id(), session_tab_helper->session_id(), i); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->SetPinnedState( 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id(), 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_tab_helper->session_id(), 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->IsTabPinned(i)); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, In-progress download termination handling (private): 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::CanCloseWithInProgressDownloads() { 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we've prompted, we need to hear from the user before we 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can close. 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_download_confirmation_state_ != NOT_PROMPTED) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cancel_download_confirmation_state_ != WAITING_FOR_RESPONSE; 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_downloads_blocking; 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DOWNLOAD_CLOSE_OK == 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OkToCloseWithInProgressDownloads(&num_downloads_blocking)) 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closing this window will kill some downloads; prompt to make sure 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that's ok. 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_download_confirmation_state_ = WAITING_FOR_RESPONSE; 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->ConfirmBrowserCloseWithPendingDownloads(); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return false so the browser does not close. We'll close if the user 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // confirms in the dialog. 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Assorted utility functions (private): 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::SetAsDelegate(WebContents* web_contents, Browser* delegate) { 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents... 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->SetDelegate(delegate); 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ...and all the helpers. 20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlockedContentTabHelper::FromWebContents(web_contents)-> 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_delegate(delegate); 20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BookmarkTabHelper::FromWebContents(web_contents)->set_delegate(delegate); 20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsModalDialogManager::FromWebContents(web_contents)-> 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_delegate(delegate); 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CoreTabHelper::FromWebContents(web_contents)->set_delegate(delegate); 20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SearchEngineTabHelper::FromWebContents(web_contents)->set_delegate(delegate); 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZoomController::FromWebContents(web_contents)->set_observer(delegate); 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::CloseFrame() { 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Close(); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabDetachedAtImpl(content::WebContents* contents, 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachType type) { 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == DETACH_TYPE_DETACH) { 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the current location bar state, but only if the tab being detached 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is the selected tab. Because saving state can conditionally revert the 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // location bar, saving the current tab's location bar state to a 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-selected tab can corrupt both tabs. 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents == tab_strip_model_->GetActiveWebContents()) { 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationBar* location_bar = window()->GetLocationBar(); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location_bar) 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_bar->SaveStateToContents(contents); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tab_strip_model_->closing_all()) 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncHistoryWithTabs(0); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAsDelegate(contents, NULL); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveScheduledUpdatesFor(contents); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (find_bar_controller_.get() && index == tab_strip_model_->active_index()) { 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar_controller_->ChangeWebContents(NULL); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop observing search model changes for this tab. 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_delegate_->OnTabDetached(contents); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < interstitial_observers_.size(); i++) { 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (interstitial_observers_[i]->web_contents() != contents) 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete interstitial_observers_[i]; 21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interstitial_observers_.erase(interstitial_observers_.begin() + i); 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::SupportsWindowFeatureImpl(WindowFeature feature, 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool check_fullscreen) const { 21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool hide_ui_for_fullscreen = check_fullscreen && ShouldHideUIForFullscreen(); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF; 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_type_tabbed()) 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_BOOKMARKBAR; 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hide_ui_for_fullscreen) { 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_type_tabbed()) 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_TITLEBAR; 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_type_tabbed()) 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_TABSTRIP; 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_type_tabbed()) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_TOOLBAR; 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_app()) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_LOCATIONBAR; 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!(features & feature); 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdateBookmarkBarState(BookmarkBarStateChangeReason reason) { 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkBar::State state; 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bookmark bar is hidden in fullscreen mode, unless on the new tab page. 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_defaults::bookmarks_enabled && 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar) && 21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !ShouldHideUIForFullscreen()) { 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state = BookmarkBar::SHOW; 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = tab_strip_model_->GetActiveWebContents(); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkTabHelper* bookmark_tab_helper = 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents ? BookmarkTabHelper::FromWebContents(web_contents) : NULL; 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bookmark_tab_helper && bookmark_tab_helper->ShouldShowBookmarkBar()) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = BookmarkBar::DETACHED; 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = BookmarkBar::HIDDEN; 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == bookmark_bar_state_) 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_bar_state_ = state; 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window_) 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // This is called from the constructor when window_ is NULL. 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reason == BOOKMARK_BAR_STATE_CHANGE_TAB_SWITCH) { 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify BrowserWindow on a tab switch as at the time this is invoked 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserWindow hasn't yet switched tabs. The BrowserWindow implementations 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // end up querying state once they process the tab switch. 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool shouldAnimate = reason == BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE; 21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->BookmarkBarStateChanged(shouldAnimate ? 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkBar::ANIMATE_STATE_CHANGE : 21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BookmarkBar::DONT_ANIMATE_STATE_CHANGE); 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Browser::ShouldHideUIForFullscreen() const { 21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Windows and GTK remove the top controls in fullscreen, but Mac and Ash 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // keep the controls in a slide-down panel. 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window_ && window_->ShouldHideUIForFullscreen(); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::MaybeCreateBackgroundContents(int route_id, 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* opener_web_contents, 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& frame_name, 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& target_url) { 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL opener_url = opener_web_contents->GetURL(); 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extensions_service = 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile_)->extension_service(); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_url.is_valid() || 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_name.empty() || 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !extensions_service || 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !extensions_service->is_ready()) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only hosted apps have web extents, so this ensures that only hosted apps 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can create BackgroundContents. We don't have to check for background 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission as that is checked in RenderMessageFilter when the CreateWindow 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message is processed. 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_service->extensions()->GetHostedAppByURL( 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionURLInfo(opener_url)); 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No BackgroundContents allowed if BackgroundContentsService doesn't exist. 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackgroundContentsService* service = 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackgroundContentsServiceFactory::GetForProfile(profile_); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that we're trying to open this from the extension's process. 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* opener_site_instance = opener_web_contents->GetSiteInstance(); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ProcessMap* process_map = extensions_service->process_map(); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_site_instance->GetProcess() || 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !process_map->Contains( 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->id(), opener_site_instance->GetProcess()->GetID())) { 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only allow a single background contents per app. 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool allow_js_access = extensions::BackgroundInfo::AllowJSAccess(extension); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackgroundContents* existing = 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->GetAppBackgroundContents(ASCIIToUTF16(extension->id())); 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (existing) { 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For non-scriptable background contents, ignore the request altogether, 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (returning true, so that a regular WebContents isn't created either). 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!allow_js_access) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For scriptable background pages, if one already exists, close it (even 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if it was specified in the manifest). 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(INFO) << "Closing existing BackgroundContents for " << opener_url; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete existing; 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If script access is not allowed, create the the background contents in a 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new SiteInstance, so that a separate process is used. 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<content::SiteInstance> site_instance = 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allow_js_access ? 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_site_instance : 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SiteInstance::Create(opener_web_contents->GetBrowserContext()); 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Passed all the checks, so this should be created as a BackgroundContents. 2257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BackgroundContents* contents = 2258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) service->CreateBackgroundContents(site_instance.get(), 2259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) route_id, 2260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_, 2261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) frame_name, 2262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASCIIToUTF16(extension->id())); 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a separate process is used, the original renderer cannot access the 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window later, thus we need to navigate the window now. 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents && !allow_js_access) { 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->web_contents()->GetController().LoadURL( 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url, 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Referrer(), 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK, 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); // No extra headers. 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents != NULL; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2276