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" 22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/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/browser_process.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/character_encoding.h" 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_page_zoom.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h" 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/register_protocol_handler_infobar_delegate.h" 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/custom_handlers/register_protocol_handler_permission_request.h" 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/defaults.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" 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/api/tabs/tabs_event_router.h" 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/browser_extension_window_controller.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_util.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/file_select_helper.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h" 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/history/top_sites.h" 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/simple_alert_infobar_delegate.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_ui_manager.h" 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/pepper_broker_infobar_delegate.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_destroyer.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_metrics.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/repost_form_warning_controller.h" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_types.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_factory.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_ui_util.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/background_contents.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/retargeting_details.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service_factory.h" 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/translate/chrome_translate_client.h" 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_manager.h" 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/autofill/chrome_autofill_client.h" 91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_utils.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_command_controller.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h" 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser_content_translate_driver_observer.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_instant_controller.h" 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tab_restore_service_delegate.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tab_strip_model_delegate.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_toolbar_model_delegate.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_ui_prefs.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h" 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/fast_unload_controller.h" 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar_controller.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_tab_helper.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error.h" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h" 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/location_bar.h" 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/ui/media_utils.h" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search/search_delegate.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search/search_model.h" 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/search/search_tab_helper.h" 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ui/settings_window_manager.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/status_bubble.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sync/browser_synced_window_delegate.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/core_tab_helper.h" 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/tab_helpers.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_modal_confirm_dialog.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_menu_model.h" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/tabs/tab_strip_model_utils.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/toolbar/toolbar_model_impl.h" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/unload_controller.h" 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/validation_message_bubble.h" 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/website_settings/permission_bubble_manager.h" 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h" 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/window_sizer/window_sizer.h" 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_controller.h" 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/upgrade_detector.h" 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h" 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/custom_handlers/protocol_handler.h" 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/profiling.h" 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/search_types.h" 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/url_constants.h" 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h" 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/locale_settings.h" 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h" 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_utils.h" 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/google/core/browser/google_url_tracker.h" 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/search/search.h" 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/startup_metric_utils/startup_metric_utils.h" 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/web_modal/popup_manager.h" 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h" 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h" 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h" 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/site_instance.h" 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_zoom.h" 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/renderer_preferences.h" 182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h" 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/background_info.h" 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 192a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "third_party/WebKit/public/web/WebWindowFeatures.h" 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h" 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/metro.h" 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ssl/ssl_error_info.h" 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h" 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_ie_toolbar_import_win.h" 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/shell.h" 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_WIN 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/fileapi/external_file_url_util.h" 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NativeWebKeyboardEvent; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PluginService; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::RenderWidgetHostView; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::SiteInstance; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogDelegate; 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogManager; 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebWindowFeatures; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How long we wait before updating the browser chrome while loading a page. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kUIUpdateCoalescingTimeMS = 200; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserWindow* CreateBrowserWindow(Browser* browser) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BrowserWindow::CreateBrowserWindow(browser); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Is the fast tab unload experiment enabled? 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsFastTabUnloadEnabled() { 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return CommandLine::ForCurrentProcess()->HasSwitch( 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switches::kEnableFastUnload); 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, CreateParams: 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Browser::CreateParams::CreateParams(Profile* profile, 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType host_desktop_type) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(TYPE_TABBED), 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile(profile), 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_desktop_type(host_desktop_type), 258a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch trusted_source(false), 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_show_state(ui::SHOW_STATE_DEFAULT), 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_session_restore(false), 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window(NULL) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::CreateParams::CreateParams(Type type, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::HostDesktopType host_desktop_type) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(type), 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile(profile), 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_desktop_type(host_desktop_type), 270a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch trusted_source(false), 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_show_state(ui::SHOW_STATE_DEFAULT), 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_session_restore(false), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window(NULL) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::CreateParams Browser::CreateParams::CreateForApp( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& app_name, 279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool trusted_source, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& window_bounds, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType host_desktop_type) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!app_name.empty()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch CreateParams params(TYPE_POPUP, profile, host_desktop_type); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.app_name = app_name; 287a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch params.trusted_source = trusted_source; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.initial_bounds = window_bounds; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::CreateParams Browser::CreateParams::CreateForDevTools( 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType host_desktop_type) { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams params(TYPE_POPUP, profile, host_desktop_type); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.app_name = DevToolsWindow::kDevToolsApp; 299a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch params.trusted_source = true; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Browser, InterstitialObserver: 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Browser::InterstitialObserver : public content::WebContentsObserver { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterstitialObserver(Browser* browser, content::WebContents* web_contents) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : WebContentsObserver(web_contents), 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_(browser) { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidAttachInterstitialPage() OVERRIDE { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_->UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidDetachInterstitialPage() OVERRIDE { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_->UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser_; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InterstitialObserver); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Constructors, Creation, Showing: 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::Browser(const CreateParams& params) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(params.type), 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(params.profile), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_(NULL), 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab_strip_model_delegate_(new chrome::BrowserTabStripModelDelegate(this)), 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_(new TabStripModel(tab_strip_model_delegate_.get(), 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.profile)), 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_name_(params.app_name), 338a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch is_trusted_source_(params.trusted_source), 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_download_confirmation_state_(NOT_PROMPTED), 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_bounds_(params.initial_bounds), 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_show_state_(params.initial_show_state), 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_session_restore_(params.is_session_restore), 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) host_desktop_type_(BrowserWindow::AdjustHostDesktopType( 344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) params.host_desktop_type)), 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_setting_bubble_model_delegate_( 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new BrowserContentSettingBubbleModelDelegate(this)), 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) toolbar_model_delegate_(new BrowserToolbarModelDelegate(this)), 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab_restore_service_delegate_(new BrowserTabRestoreServiceDelegate(this)), 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) synced_window_delegate_(new BrowserSyncedWindowDelegate(this)), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_bar_state_(BookmarkBar::HIDDEN), 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_controller_(new chrome::BrowserCommandController(this)), 3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_has_shown_(false), 3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chrome_updater_factory_(this), 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) translate_driver_observer_( 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new BrowserContentTranslateDriverObserver(this)), 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_(this) { 357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If this causes a crash then a window is being opened using a profile type 358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // that is disallowed by policy. The crash prevents the disabled window type 359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // from opening at all, but the path that triggered it should be fixed. 360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(IncognitoModePrefs::CanOpenBrowser(profile_)); 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!profile_->IsGuestSession() || profile_->IsOffTheRecord()) 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Only off the record browser may be opened in guest mode"; 363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(jeremy): Move to initializer list once flag is removed. 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fast_unload_controller_.reset(new chrome::FastUnloadController(this)); 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unload_controller_.reset(new chrome::UnloadController(this)); 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->AddObserver(this); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toolbar_model_.reset(new ToolbarModelImpl(toolbar_model_delegate_.get())); 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_model_.reset(new SearchModel()); 3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) search_delegate_.reset(new SearchDelegate(search_model_.get())); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch registrar_.Add(this, 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_->GetOriginalProfile())); 3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registrar_.Add(this, 3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_->GetOriginalProfile())); 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) registrar_.Add(this, 3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_->GetOriginalProfile())); 3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registrar_.Add(this, 3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_THEMES) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<ThemeService>( 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThemeServiceFactory::GetForProfile(profile_))); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_pref_registrar_.Init(profile_->GetPrefs()); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_pref_registrar_.Add( 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kDevToolsDisabled, 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&Browser::OnDevToolsDisabledChanged, base::Unretained(this))); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_pref_registrar_.Add( 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bookmarks::prefs::kShowBookmarkBar, 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&Browser::UpdateBookmarkBarState, base::Unretained(this), 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE)); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserList::AddBrowser(this); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: These prefs all need to be explicitly destroyed in the destructor 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or you'll get a nasty surprise when you run the incognito tests. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_auto_detect_.Init(prefs::kWebKitUsesUniversalDetector, 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_->GetPrefs()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (chrome::IsInstantExtendedAPIEnabled() && is_type_tabbed()) 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) instant_controller_.reset(new BrowserInstantController(this)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_INIT); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProfileMetrics::LogProfileLaunch(profile_); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_ = params.window ? params.window : CreateBrowserWindow(this); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the extension window controller before sending notifications. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_window_controller_.reset( 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BrowserExtensionWindowController(this)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SessionService* session_service = 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SessionServiceFactory::GetForProfileForSessionRestore(profile_); 428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (session_service) 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) session_service->WindowOpened(this); 430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): Move BrowserList::AddBrowser() to the end of this function and 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // replace uses of this with BL's notifications. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_WINDOW_READY, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(this), 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): move to ChromeBrowserMain: 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (first_run::ShouldDoPersonalDataManagerFirstRun()) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Notify PDM that this is a first run. 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImportAutofillDataWin( 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) autofill::PersonalDataManagerFactory::GetForProfile(profile_)); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_.reset(new FullscreenController(this)); 448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Must be initialized after window_. 450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Also: surprise! a modal dialog host is not necessary to host modal dialogs 451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // without a modal dialog host, so that value may be null. 452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch popup_manager_.reset(new web_modal::PopupManager( 453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetWebContentsModalDialogHost())); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::~Browser() { 457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Stop observing notifications before continuing with destruction. Profile 458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // destruction will unload extensions and reentrant calls to Browser:: should 459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // be avoided while it is being torn down. 460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) registrar_.RemoveAll(); 461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tab strip should not have any tabs at this point. 463effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(tab_strip_model_->empty()); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->RemoveObserver(this); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Destroy the BrowserCommandController before removing the browser, so that 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it doesn't act on any notifications that are sent as a result of removing 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the browser. 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_controller_.reset(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserList::RemoveBrowser(this); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile_); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->WindowClosed(session_id_); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreService* tab_restore_service = 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreServiceFactory::GetForProfile(profile()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tab_restore_service) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_restore_service->BrowserClosed(tab_restore_service_delegate()); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!chrome::GetTotalBrowserCountForProfile(profile_)) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're the last browser window with this profile. We need to nuke the 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TabRestoreService, which will start the shutdown of the 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationControllers and allow for proper shutdown. If we don't do this 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome won't shutdown cleanly, and may end up crashing when some 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread tries to use the IO thread (or another thread) that is no longer 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // valid. 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This isn't a valid assumption for Mac OS, as it stays running after 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the last browser has closed. The Mac equivalent is in its app 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // controller. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreServiceFactory::ResetForProfile(profile_); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_pref_registrar_.RemoveAll(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_auto_detect_.Destroy(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Destroy BrowserExtensionWindowController before the incognito profile 50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // is destroyed to make sure the chrome.windows.onRemoved event is sent. 50390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extension_window_controller_.reset(); 50490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 505eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Destroy BrowserInstantController before the incongnito profile is destroyed 506eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // because the InstantController destructor depends on this profile. 507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch instant_controller_.reset(); 508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_->IsOffTheRecord() && 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !BrowserList::IsOffTheRecordSessionActiveForProfile(profile_)) { 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An incognito profile is no longer needed, this indirectly frees 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its cache and cookies once it gets destroyed at the appropriate time. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileDestroyer::DestroyProfileWhenAppropriate(profile_); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There may be pending file dialogs, we need to tell them that we've gone 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // away so they don't try and call back to us. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (select_file_dialog_.get()) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_->ListenerDestroyed(); 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int num_downloads; 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (OkToCloseWithInProgressDownloads(&num_downloads) == 523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DOWNLOAD_CLOSE_BROWSER_SHUTDOWN && 524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !browser_defaults::kBrowserAliveWithNoWindows) { 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadService::CancelAllDownloads(); 526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Getters & Setters 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FindBarController* Browser::GetFindBarController() { 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!find_bar_controller_.get()) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindBar* find_bar = window_->CreateFindBar(); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar_controller_.reset(new FindBarController(find_bar)); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar->SetFindBarController(find_bar_controller_.get()); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) find_bar_controller_->ChangeWebContents( 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar_controller_->find_bar()->MoveWindowIfNecessary(gfx::Rect(), true); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return find_bar_controller_.get(); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::HasFindBarController() const { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return find_bar_controller_.get() != NULL; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::is_app() const { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !app_name_.empty(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::is_devtools() const { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return app_name_ == DevToolsWindow::kDevToolsApp; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, State Storage and Retrieval for UI: 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Image Browser::GetCurrentPageIcon() const { 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = tab_strip_model_->GetActiveWebContents(); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |web_contents| can be NULL since GetCurrentPageIcon() is called by the 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window during the window's creation (before tabs have been added). 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconTabHelper* favicon_tab_helper = 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents ? FaviconTabHelper::FromWebContents(web_contents) : NULL; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return favicon_tab_helper ? favicon_tab_helper->GetFavicon() : gfx::Image(); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 Browser::GetWindowTitleForCurrentTab() const { 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = tab_strip_model_->GetActiveWebContents(); 570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |contents| can be NULL because GetWindowTitleForCurrentTab is called by the 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window during the window's creation (before tabs have been added). 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 57503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Streamlined hosted apps use the host instead of the title. 5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (is_app() && extensions::util::IsStreamlinedHostedAppsEnabled()) 57703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return base::UTF8ToUTF16(contents->GetURL().host()); 57803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title = contents->GetTitle(); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormatTitleForDisplay(&title); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title.empty()) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title = CoreTabHelper::GetDefaultTitle(); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Mac, we don't want to suffix the page title with 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the application name. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(USE_ASH) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Ash, we don't want to suffix the page title with the application name, 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but on Windows, where USE_ASH can also be true, we still want the prefix 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on desktop. 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return title; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't append the app name to window titles on app frames and app popups 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_app() ? 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title : 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_BROWSER_WINDOW_TITLE_FORMAT, title); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void Browser::FormatTitleForDisplay(base::string16* title) { 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t current_index = 0; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t match_index; 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while ((match_index = title->find(L'\n', current_index)) != 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16::npos) { 608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) title->replace(match_index, 1, base::string16()); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_index = match_index; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, OnBeforeUnload handling: 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::ShouldCloseWindow() { 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanCloseWithInProgressDownloads()) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return fast_unload_controller_->ShouldCloseWindow(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unload_controller_->ShouldCloseWindow(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool Browser::CallBeforeUnloadHandlers( 6263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const base::Callback<void(bool)>& on_close_confirmed) { 6273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) cancel_download_confirmation_state_ = RESPONSE_RECEIVED; 6283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsFastTabUnloadEnabled()) { 6293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return fast_unload_controller_->CallBeforeUnloadHandlers( 6303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) on_close_confirmed); 6313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 6323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return unload_controller_->CallBeforeUnloadHandlers(on_close_confirmed); 6333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Browser::ResetBeforeUnloadHandlers() { 6363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) cancel_download_confirmation_state_ = NOT_PROMPTED; 6373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsFastTabUnloadEnabled()) 6383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) fast_unload_controller_->ResetBeforeUnloadHandlers(); 6393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) else 6403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unload_controller_->ResetBeforeUnloadHandlers(); 6413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool Browser::HasCompletedUnloadProcessing() const { 644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(IsFastTabUnloadEnabled()); 645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return fast_unload_controller_->HasCompletedUnloadProcessing(); 646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::IsAttemptingToCloseBrowser() const { 649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return fast_unload_controller_->is_attempting_to_close_browser(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unload_controller_->is_attempting_to_close_browser(); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OnWindowClosing() { 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ShouldCloseWindow()) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Application should shutdown on last window close if the user is explicitly 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // trying to quit, or if there is nothing keeping the browser alive (such as 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AppController on the Mac, or BackgroundContentsService for background 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pages). 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_quit_if_last_browser = 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_shutdown::IsTryingToQuit() || !chrome::WillKeepAlive(); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (should_quit_if_last_browser && chrome::ShouldStartShutdown(this)) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_shutdown::OnShutdownStarting(browser_shutdown::WINDOW_CLOSE); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't use GetForProfileIfExisting here, we want to force creation of the 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session service so that user can restore what was open. 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->WindowClosing(session_id()); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreService* tab_restore_service = 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabRestoreServiceFactory::GetForProfile(profile()); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 6790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (tab_restore_service && is_app() && !is_devtools()) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_restore_service->BrowserClosing(tab_restore_service_delegate()); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tab_restore_service && is_type_tabbed() && tab_strip_model_->count()) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_restore_service->BrowserClosing(tab_restore_service_delegate()); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sky): convert session/tab restore to use notification. 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSING, 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(this), 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!IsFastTabUnloadEnabled()) 693eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tab_strip_model_->CloseAllTabs(); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In-progress download termination handling: 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::InProgressDownloadResponse(bool cancel_downloads) { 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_downloads) { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_download_confirmation_state_ = RESPONSE_RECEIVED; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::CloseWindow(this); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the confirmation state to NOT_PROMPTED so that if the user tries to 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // close again we'll show the warning again. 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_download_confirmation_state_ = NOT_PROMPTED; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the download page so the user can figure-out what downloads are still 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in-progress. 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowDownloads(this); 713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Reset UnloadController::is_attempting_to_close_browser_ so that we don't 715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // prompt every time any tab is closed. http://crbug.com/305516 716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsFastTabUnloadEnabled()) 717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fast_unload_controller_->CancelWindowClose(); 718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unload_controller_->CancelWindowClose(); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser::DownloadClosePreventionType Browser::OkToCloseWithInProgressDownloads( 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* num_downloads_blocking) const { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(num_downloads_blocking); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_downloads_blocking = 0; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're not running a full browser process with a profile manager 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (testing), it's ok to close the browser. 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_browser_process->profile_manager()) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_OK; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int total_download_count = 7338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DownloadService::NonMaliciousDownloadCountAllProfiles(); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (total_download_count == 0) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_OK; // No downloads; can definitely close. 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Figure out how many windows are open total, and associated with this 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile, that are relevant for the ok-to-close decision. 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int profile_window_count = 0; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_window_count = 0; 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (chrome::BrowserIterator it; !it.done(); it.Next()) { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't count this browser window or any other in the process of closing. 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* const browser = *it; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window closing may be delayed, and windows that are in the process of 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing don't count against our totals. 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser == this || browser->IsAttemptingToCloseBrowser()) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->profile() == profile()) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_window_count++; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_window_count++; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there aren't any other windows, we're at browser shutdown, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which would cancel all current downloads. 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (total_window_count == 0) { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_downloads_blocking = total_download_count; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_BROWSER_SHUTDOWN; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there aren't any other windows on our profile, and we're an incognito 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile, and there are downloads associated with that profile, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // those downloads would be cancelled by our window (-> profile) close. 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadService* download_service = 765a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DownloadServiceFactory::GetForBrowserContext(profile()); 766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if ((profile_window_count == 0) && 7678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) (download_service->NonMaliciousDownloadCount() > 0) && 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->IsOffTheRecord()) { 7698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) *num_downloads_blocking = download_service->NonMaliciousDownloadCount(); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_LAST_WINDOW_IN_INCOGNITO_PROFILE; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Those are the only conditions under which we will block shutdown. 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DOWNLOAD_CLOSE_OK; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Tab adding/showing functions: 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::WindowFullscreenStateChanged() { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->WindowFullscreenStateChanged(); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->FullscreenStateChanged(); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Assorted browser commands: 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ToggleFullscreenModeWithExtension(const GURL& extension_url) { 790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fullscreen_controller_-> 791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ToggleBrowserFullscreenModeWithExtension(extension_url); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::SupportsWindowFeature(WindowFeature feature) const { 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SupportsWindowFeatureImpl(feature, true); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::CanSupportWindowFeature(WindowFeature feature) const { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SupportsWindowFeatureImpl(feature, false); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ToggleEncodingAutoDetect() { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("AutoDetectChange")); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_auto_detect_.SetValue(!encoding_auto_detect_.GetValue()); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If "auto detect" is turned on, then any current override encoding 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is cleared. This also implicitly performs a reload. 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OTOH, if "auto detect" is turned off, we don't change the currently 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active encoding. 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encoding_auto_detect_.GetValue()) { 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = tab_strip_model_->GetActiveWebContents(); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->ResetOverrideEncoding(); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OverrideEncoding(int encoding_id) { 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("OverrideEncoding")); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string selected_encoding = 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterEncoding::GetCanonicalEncodingNameByCommandId(encoding_id); 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = tab_strip_model_->GetActiveWebContents(); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!selected_encoding.empty() && contents) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetOverrideEncoding(selected_encoding); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the list of recently selected encodings. 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_selected_encoding_list; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CharacterEncoding::UpdateRecentlySelectedEncoding( 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs()->GetString(prefs::kRecentlySelectedEncoding), 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_id, 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &new_selected_encoding_list)) { 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs()->SetString(prefs::kRecentlySelectedEncoding, 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_selected_encoding_list); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OpenFile() { 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(UserMetricsAction("OpenFile")); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_ = ui::SelectFileDialog::Create( 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new ChromeSelectFilePolicy( 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents())); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath directory = profile_->last_selected_directory(); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): figure out how to juggle this. 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent_window = window_->GetNativeWindow(); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::FileTypeInfo file_types; 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_types.support_drive = true; 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_->SelectFile(ui::SelectFileDialog::SELECT_OPEN_FILE, 847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), 848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) directory, 849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &file_types, 850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath::StringType(), 852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_window, 853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdateDownloadShelfVisibility(bool visible) { 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetStatusBubble()) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->UpdateDownloadShelfVisibility(visible); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::UpdateUIForNavigationInTab(WebContents* contents, 8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition transition, 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_initiated) { 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->TabNavigating(contents, transition); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool contents_is_selected = 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents == tab_strip_model_->GetActiveWebContents(); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_initiated && contents_is_selected && window()->GetLocationBar()) { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Forcibly reset the location bar if the url is going to change in the 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current tab, since otherwise it won't discard any ongoing user edits, 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since it doesn't realize this is a user-initiated action. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->Revert(); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetStatusBubble()) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->Hide(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the location bar. This is synchronous. We specifically don't 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update the load state since the load hasn't started yet and updating it 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will put it out of sync with the actual state like whether we're 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // displaying a favicon, which controls the throbber. If we updated it here, 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the throbber will show the default favicon for a split second when 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating away from the new tab page. 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScheduleUIUpdate(contents, content::INVALIDATE_TYPE_URL); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents_is_selected) 889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) contents->SetInitialFocus(); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, PageNavigator implementation: 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* Browser::OpenURL(const OpenURLParams& params) { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OpenURLFromTab(NULL, params); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, TabStripModelObserver implementation: 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabInsertedAt(WebContents* contents, 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool foreground) { 905116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAsDelegate(contents, true); 906116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 907116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (popup_manager_) 908116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch popup_manager_->RegisterWith(contents); 909116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper* session_tab_helper = 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::FromWebContents(contents); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_tab_helper->SetWindowID(session_id()); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_PARENTED, 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<content::WebContents>(contents), 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncHistoryWithTabs(index); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the loading state is updated correctly, otherwise the throbber 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // won't start if the page is loading. 923effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch LoadingStateChanged(contents, true); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interstitial_observers_.push_back(new InterstitialObserver(this, contents)); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile_); 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (session_service) { 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->TabInserted(contents); 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int new_active_index = tab_strip_model_->active_index(); 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (index < new_active_index) 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_service->SetSelectedTabInWindow(session_id(), 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_active_index); 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabClosingAt(TabStripModel* tab_strip_model, 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents, 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->OnTabClosing(contents); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile_); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->TabClosing(contents); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_CLOSING, 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>(&contents->GetController()), 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 951116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (popup_manager_) 952116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch popup_manager_->UnregisterWith(contents); 953116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sever the WebContents' connection back to us. 955116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAsDelegate(contents, false); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabDetachedAt(WebContents* contents, int index) { 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TabDetachedAt is called before TabStripModel has updated the 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // active index. 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int old_active_index = tab_strip_model_->active_index(); 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (index < old_active_index && !tab_strip_model_->closing_all()) { 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SessionService* session_service = 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SessionServiceFactory::GetForProfileIfExisting(profile_); 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (session_service) 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_service->SetSelectedTabInWindow(session_id(), 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) old_active_index - 1); 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 969116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (popup_manager_) 971116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch popup_manager_->UnregisterWith(contents); 972116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabDetachedAtImpl(contents, index, DETACH_TYPE_DETACH); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::TabDeactivated(WebContents* contents) { 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->OnTabDeactivated(contents); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) search_delegate_->OnTabDeactivated(contents); 9791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SearchTabHelper::FromWebContents(contents)->OnTabDeactivated(); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save what the user's currently typing, so it can be restored when we 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // switch back to this tab. 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->GetLocationBar()->SaveStateToContents(contents); 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_controller_) 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_controller_->TabDeactivated(contents); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::ActiveTabChanged(WebContents* old_contents, 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* new_contents, 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int reason) { 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RecordAction(UserMetricsAction("ActiveTabChanged")); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Update the bookmark state, since the BrowserWindow may query it during 9964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // OnActiveTabChanged() below. 9974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_SWITCH); 99868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 99968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Let the BrowserWindow do its handling. On e.g. views this changes the 100068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // focused object, which should happen before we update the toolbar below, 100168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // since the omnibox expects the correct element to already be focused when it 100268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // is updated. 100368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_->OnActiveTabChanged(old_contents, new_contents, index, reason); 100468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fullscreen_controller_->OnTabDetachedFromView(old_contents); 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Discarded tabs always get reloaded. 100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (tab_strip_model_->IsTabDiscarded(index)) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Reloading discarded tab at " << index; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int reload_count = 0; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS( 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Tabs.Discard.ReloadCount", ++reload_count, 1, 1000, 50); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Reload(this, CURRENT_TAB); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have any update pending, do it now. 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chrome_updater_factory_.HasWeakPtrs() && old_contents) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingUIUpdates(); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Propagate the profile to the location bar. 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateToolbar((reason & CHANGE_REASON_REPLACED) == 0); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (chrome::IsInstantExtendedAPIEnabled()) 10241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) search_delegate_->OnTabActivated(new_contents); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update reload/stop state. 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_controller_->LoadingStateChanged(new_contents->IsLoading(), true); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update commands to reflect current state. 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->TabStateChanged(); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the status bubble. 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StatusBubble* status_bubble = GetStatusBubble(); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status_bubble) { 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_bubble->Hide(); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the loading state (if any). 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_bubble->SetStatus(CoreTabHelper::FromWebContents( 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents())->GetStatusText()); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (HasFindBarController()) { 10434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) find_bar_controller_->ChangeWebContents(new_contents); 10444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) find_bar_controller_->find_bar()->MoveWindowIfNecessary(gfx::Rect(), true); 10454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 10464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update sessions. Don't force creation of sessions. If sessions doesn't 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exist, the change will be picked up by sessions when created. 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfileIfExisting(profile_); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service && !tab_strip_model_->closing_all()) { 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_service->SetSelectedTabInWindow(session_id(), 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->active_index()); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This needs to be called after notifying SearchDelegate. 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_controller_) 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_controller_->ActiveTabChanged(); 105958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 1060f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) autofill::ChromeAutofillClient::FromWebContents(new_contents)->TabActivated(); 10611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SearchTabHelper::FromWebContents(new_contents)->OnTabActivated(); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::TabMoved(WebContents* contents, 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int from_index, 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int to_index) { 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(from_index >= 0 && to_index >= 0); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the history service. 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncHistoryWithTabs(std::min(from_index, to_index)); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabReplacedAt(TabStripModel* tab_strip_model, 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* old_contents, 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* new_contents, 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) { 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabDetachedAtImpl(old_contents, index, DETACH_TYPE_REPLACE); 1077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fullscreen_controller_->OnTabClosing(old_contents); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfile(profile_); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_service->TabClosing(old_contents); 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabInsertedAt(new_contents, 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index, 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (index == tab_strip_model_->active_index())); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int entry_count = new_contents->GetController().GetEntryCount(); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_count > 0) { 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out notification so that observers are updated appropriately. 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->GetController().NotifyEntryChanged( 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->GetController().GetEntryAtIndex(entry_count - 1), 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_count - 1); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The new_contents may end up with a different navigation stack. Force 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the session service to update itself. 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->TabRestored(new_contents, 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->IsTabPinned(index)); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabPinnedStateChanged(WebContents* contents, int index) { 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfileIfExisting(profile()); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) { 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper* session_tab_helper = 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::FromWebContents(contents); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->SetPinnedState(session_id(), 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_tab_helper->session_id(), 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->IsTabPinned(index)); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabStripEmpty() { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the frame after we return to the message loop (not immediately, 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise it will destroy this object before the stack has a chance to 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cleanly unwind.) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This will be called several times if TabStripEmpty is called several 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // times. This is because it does not close the window if tabs are 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still present. 1121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&Browser::CloseFrame, weak_factory_.GetWeakPtr())); 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Instant may have visible WebContents that need to be detached before the 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // window system closes. 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_controller_.reset(); 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Browser::CanOverscrollContent() const { 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 1131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string value = CommandLine::ForCurrentProcess()-> 1132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetSwitchValueASCII(switches::kOverscrollHistoryNavigation); 1133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool overscroll_enabled = value != "0"; 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!overscroll_enabled) 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_app() || is_devtools() || !is_type_tabbed()) 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The detached bookmark bar has appearance of floating above the 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // web-contents. This does not play nicely with overscroll navigation 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // gestures. So disable overscroll navigation when the bookmark bar is in the 1142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // detached state and the overscroll effect moves the layers. 1143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (value == "1" && bookmark_bar_state_ == BookmarkBar::DETACHED) 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool Browser::ShouldPreserveAbortedURLs(WebContents* source) { 11520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Allow failed URLs to stick around in the omnibox on the NTP, but not when 11530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // other pages have committed. 11540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Profile* profile = Profile::FromBrowserContext(source->GetBrowserContext()); 11550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!profile || !source->GetController().GetLastCommittedEntry()) 11560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 11570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GURL committed_url(source->GetController().GetLastCommittedEntry()->GetURL()); 11580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return chrome::IsNTPURL(committed_url, profile); 11590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 11600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::PreHandleKeyboardEvent(content::WebContents* source, 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Escape exits tabbed fullscreen mode. 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(koz): Write a test for this http://crbug.com/100441. 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.windowsKeyCode == 27 && 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->HandleUserPressedEscape()) { 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window()->PreHandleKeyboardEvent(event, is_keyboard_shortcut); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::HandleKeyboardEvent(content::WebContents* source, 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event) { 1175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DevToolsWindow* devtools_window = 1176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DevToolsWindow::GetInstanceForInspectedWebContents(source); 1177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool handled = false; 1178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (devtools_window) 1179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch handled = devtools_window->ForwardKeyboardEvent(event); 1180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!handled) 1182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch window()->HandleKeyboardEvent(event); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Browser::TabsNeedBeforeUnloadFired() { 1186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 1187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return fast_unload_controller_->TabsNeedBeforeUnloadFired(); 1188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return unload_controller_->TabsNeedBeforeUnloadFired(); 1189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1191bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid Browser::OverscrollUpdate(int delta_y) { 1192bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch window_->OverscrollUpdate(delta_y); 1193bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 1194bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Browser::ShowValidationMessage(content::WebContents* web_contents, 11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view, 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& main_text, 11985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sub_text) { 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents->GetRenderWidgetHostView(); 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rwhv) { 12015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validation_message_bubble_ = 12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::ValidationMessageBubble::CreateAndShow( 12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwhv->GetRenderWidgetHost(), 12045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) anchor_in_root_view, 12055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) main_text, 12065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sub_text); 12075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Browser::HideValidationMessage(content::WebContents* web_contents) { 12115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validation_message_bubble_.reset(); 12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Browser::MoveValidationMessage(content::WebContents* web_contents, 12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view) { 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!validation_message_bubble_) 12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents->GetRenderWidgetHostView(); 12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rwhv) { 12205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validation_message_bubble_->SetPositionRelativeToAnchor( 12215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwhv->GetRenderWidgetHost(), anchor_in_root_view); 12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool Browser::PreHandleGestureEvent(content::WebContents* source, 1226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const blink::WebGestureEvent& event) { 1227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Disable pinch zooming in undocked dev tools window due to poor UX. 1228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (app_name() == DevToolsWindow::kDevToolsApp) 1229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return event.type == blink::WebGestureEvent::GesturePinchBegin || 1230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) event.type == blink::WebGestureEvent::GesturePinchUpdate || 1231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) event.type == blink::WebGestureEvent::GesturePinchEnd; 1232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 1234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 12365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool Browser::CanDragEnter(content::WebContents* source, 12375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const content::DropData& data, 12385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blink::WebDragOperationsMask operations_allowed) { 12395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Disallow drag-and-drop navigation for Settings windows which do not support 12405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // external navigation. 12415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if ((operations_allowed & blink::WebDragOperationLink) && 12425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) chrome::SettingsWindowManager::GetInstance()->IsSettingsBrowser(this)) { 12435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 12445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 12455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 12465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 12475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::IsMouseLocked() const { 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fullscreen_controller_->IsMouseLocked(); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::OnWindowDidShow() { 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_has_shown_) 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_has_shown_ = true; 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// CurrentProcessInfo::CreationTime() is missing on some platforms. 1258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Measure the latency from startup till the first browser window becomes 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visible. 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool is_first_browser_window = true; 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_first_browser_window && 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !startup_metric_utils::WasNonBrowserUIDisplayed()) { 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_first_browser_window = false; 1265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Time process_creation_time = 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CurrentProcessInfo::CreationTime(); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!process_creation_time.is_null()) { 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES( 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Startup.BrowserWindowDisplay", 1271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - process_creation_time); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif // defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing to do for non-tabbed windows. 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_type_tabbed()) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show any pending global error bubble. 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalErrorService* service = 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalErrorServiceFactory::GetForProfile(profile()); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalError* error = service->GetFirstGlobalErrorWithBubbleView(); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error->ShowBubbleView(this); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ShowFirstRunBubble() { 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->ShowFirstRunBubble(); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::ShowDownload(content::DownloadItem* download) { 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!window()) 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the download occurs in a new tab, and it's not a save page 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // download (started before initial navigation completed) close it. 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* source = download->GetWebContents(); 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source && source->GetController().IsInitialNavigation() && 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->count() > 1 && !download->IsSavePackageDownload()) { 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CloseContents(source); 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Some (app downloads) are not supposed to appear on the shelf. 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!DownloadItemModel(download).ShouldShowInShelf()) 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // GetDownloadShelf creates the download shelf if it was not yet created. 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadShelf* shelf = window()->GetDownloadShelf(); 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf->AddDownload(download); 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, content::WebContentsDelegate implementation: 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* Browser::OpenURLFromTab(WebContents* source, 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OpenURLParams& params) { 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NavigateParams nav_params(this, params.url, params.transition); 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillNavigateParamsFromOpenURLParams(&nav_params, params); 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_params.source_contents = source; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nav_params.tabstrip_add_types = TabStripModel::ADD_NONE; 13220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (params.user_gesture) 13230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch nav_params.window_action = chrome::NavigateParams::SHOW_WINDOW; 13247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch nav_params.user_gesture = params.user_gesture; 13257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1326ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PopupBlockerTabHelper* popup_blocker_helper = NULL; 13277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (source) 1328ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch popup_blocker_helper = PopupBlockerTabHelper::FromWebContents(source); 13297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 13303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (popup_blocker_helper) { 13317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if ((params.disposition == NEW_POPUP || 13327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params.disposition == NEW_FOREGROUND_TAB || 13332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch params.disposition == NEW_BACKGROUND_TAB || 13342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch params.disposition == NEW_WINDOW) && 13357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !params.user_gesture && !CommandLine::ForCurrentProcess()->HasSwitch( 13367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kDisablePopupBlocking)) { 133758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (popup_blocker_helper->MaybeBlockPopup(nav_params, 133858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch WebWindowFeatures())) { 1339ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return NULL; 134058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 13417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 13427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 13437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Navigate(&nav_params); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return nav_params.target_contents; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::NavigationStateChanged(const WebContents* source, 13506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::InvalidateTypes changed_flags) { 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only update the UI when something visible has changed. 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleUIUpdate(source, changed_flags); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can synchronously update commands since they will only change once per 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation, so we don't have to worry about flickering. We do, however, 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to update the command state early on load to always present usable 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // actions in the face of slow-to-commit pages. 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags & (content::INVALIDATE_TYPE_URL | 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::INVALIDATE_TYPE_LOAD)) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->TabStateChanged(); 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Browser::VisibleSSLStateChanged(const WebContents* source) { 136546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // When the current tab's SSL state changes, we need to update the URL 136646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // bar to reflect the new state. 136746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(source); 136846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (tab_strip_model_->GetActiveWebContents() == source) 136946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UpdateToolbar(false); 137046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 137146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::AddNewContents(WebContents* source, 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents, 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture, 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* was_blocked) { 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::AddWebContents(this, source, new_contents, disposition, initial_pos, 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture, was_blocked); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ActivateContents(WebContents* contents) { 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->ActivateTabAt( 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetIndexOfWebContents(contents), false); 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Activate(); 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::DeactivateContents(WebContents* contents) { 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Deactivate(); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid Browser::LoadingStateChanged(WebContents* source, 1393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document) { 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->UpdateLoadingAnimations(tab_strip_model_->TabsAreLoading()); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->UpdateTitleBar(); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* selected_contents = tab_strip_model_->GetActiveWebContents(); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source == selected_contents) { 1399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool is_loading = source->IsLoading() && to_different_document; 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_controller_->LoadingStateChanged(is_loading, false); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetStatusBubble()) { 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStatusBubble()->SetStatus(CoreTabHelper::FromWebContents( 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents())->GetStatusText()); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::CloseContents(WebContents* source) { 1409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool can_close_contents; 1410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) 1411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch can_close_contents = fast_unload_controller_->CanCloseContents(source); 1412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 1413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch can_close_contents = unload_controller_->CanCloseContents(source); 1414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (can_close_contents) 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::CloseWebContents(this, source, true); 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::MoveContents(WebContents* source, const gfx::Rect& pos) { 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsPopupOrPanel(source)) { 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "moving invalid browser type"; 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(pos); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::IsPopupOrPanel(const WebContents* source) const { 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return is_type_popup(); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Browser::UpdateTargetURL(WebContents* source, const GURL& url) { 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetStatusBubble()) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source == tab_strip_model_->GetActiveWebContents()) { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->SetURL(url, prefs->GetString(prefs::kAcceptLanguages)); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ContentsMouseEvent( 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* source, const gfx::Point& location, bool motion) { 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetStatusBubble()) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (source == tab_strip_model_->GetActiveWebContents()) { 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->MouseMoved(location, !motion); 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!motion) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStatusBubble()->SetURL(GURL(), std::string()); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ContentsZoomChange(bool zoom_in) { 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ExecuteCommand(this, zoom_in ? IDC_ZOOM_PLUS : IDC_ZOOM_MINUS); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::WebContentsFocused(WebContents* contents) { 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->WebContentsFocused(contents); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::TakeFocus(content::WebContents* source, 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reverse) { 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_FOCUS_RETURNED_TO_BROWSER, 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Browser>(this), 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Browser::GetRootWindowResizerRect() const { 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_->GetRootWindowResizerRect(); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::BeforeUnloadFired(WebContents* web_contents, 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (is_devtools() && DevToolsWindow::HandleBeforeUnload(web_contents, 1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) proceed, proceed_to_fire_unload)) 1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsFastTabUnloadEnabled()) { 1482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *proceed_to_fire_unload = 1483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fast_unload_controller_->BeforeUnloadFired(web_contents, proceed); 1484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 1485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *proceed_to_fire_unload = 1486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unload_controller_->BeforeUnloadFired(web_contents, proceed); 1487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Browser::ShouldFocusLocationBarByDefault(WebContents* source) { 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NavigationEntry* entry = 14925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source->GetController().GetActiveEntry(); 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entry) { 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url = entry->GetURL(); 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL virtual_url = entry->GetVirtualURL(); 14965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((url.SchemeIs(content::kChromeUIScheme) && 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url.host() == chrome::kChromeUINewTabHost) || 14985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (virtual_url.SchemeIs(content::kChromeUIScheme) && 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual_url.host() == chrome::kChromeUINewTabHost)) { 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return chrome::NavEntryIsInstantNTP(source, entry); 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::SetFocusToLocationBar(bool select_all) { 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two differences between this and FocusLocationBar(): 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (1) This doesn't get recorded in user metrics, since it's called 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // internally. 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (2) This checks whether the location bar can be focused, and if not, clears 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the focus. FocusLocationBar() is only reached when the location bar is 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focusable, but this may be reached at other times, e.g. while in 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fullscreen mode, where we need to leave focus in a consistent state. 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetFocusToLocationBar(select_all); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Browser::GetExtraRenderViewHeight() const { 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_->GetExtraRenderViewHeight(); 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ViewSourceForTab(WebContents* source, const GURL& page_url) { 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(source); 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::ViewSource(this, source); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ViewSourceForFrame(WebContents* source, 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 152990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const content::PageState& frame_page_state) { 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(source); 153190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::ViewSource(this, source, frame_url, frame_page_state); 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ShowRepostFormWarningDialog(WebContents* source) { 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabModalConfirmDialog::Create(new RepostFormWarningController(source), 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source); 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::ShouldCreateWebContents( 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents, 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowContainerType window_container_type, 1543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& frame_name, 15447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const GURL& target_url, 15453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& partition_id, 15463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace) { 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_container_type == WINDOW_CONTAINER_TYPE_BACKGROUND) { 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a BackgroundContents is created, suppress the normal WebContents. 15493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return !MaybeCreateBackgroundContents(route_id, 15503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) web_contents, 15513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) frame_name, 15523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) target_url, 15533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) partition_id, 15543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) session_storage_namespace); 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::WebContentsCreated(WebContents* source_contents, 1561effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int opener_render_frame_id, 1562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& frame_name, 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& target_url, 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents) { 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adopt the WebContents now, so all observers are in place, as the network 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requests for its initial navigation will start immediately. The WebContents 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will later be inserted into this browser using Browser::Navigate via 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AddNewContents. 15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabHelpers::AttachTabHelpers(new_contents); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify. 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RetargetingDetails details; 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.source_web_contents = source_contents; 1574effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch details.source_render_frame_id = opener_render_frame_id; 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.target_url = target_url; 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.target_web_contents = new_contents; 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.not_yet_in_tabstrip = true; 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_RETARGETING, 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_), 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<RetargetingDetails>(&details)); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RendererUnresponsive(WebContents* source) { 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore hangs if a tab is blocked. 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index = tab_strip_model_->GetIndexOfWebContents(source); 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(TabStripModel::kNoTab, index); 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tab_strip_model_->IsTabBlocked(index)) 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowHungRendererDialog(source); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RendererResponsive(WebContents* source) { 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::HideHungRendererDialog(source); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::WorkerCrashed(WebContents* source) { 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SimpleAlertInfoBarDelegate::Create( 16000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch InfoBarService::FromWebContents(source), 16010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch infobars::InfoBarDelegate::kNoIconID, 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_WEBWORKER_CRASHED_PROMPT), true); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::DidNavigateMainFramePostCommit(WebContents* web_contents) { 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents == tab_strip_model_->GetActiveWebContents()) 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::DidNavigateToPendingEntry(WebContents* web_contents) { 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents == tab_strip_model_->GetActiveWebContents()) 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::JavaScriptDialogManager* Browser::GetJavaScriptDialogManager() { 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetJavaScriptDialogManagerInstance(); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)content::ColorChooser* Browser::OpenColorChooser( 1620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContents* web_contents, 1621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkColor initial_color, 1622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<content::ColorSuggestion>& suggestions) { 162390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return chrome::ShowColorChooser(web_contents, initial_color); 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RunFileChooser(WebContents* web_contents, 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FileChooserParams& params) { 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSelectHelper::RunFileChooser(web_contents, params); 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::EnumerateDirectory(WebContents* web_contents, 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSelectHelper::EnumerateDirectory(web_contents, request_id, path); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1637d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool Browser::EmbedsFullscreenWidget() const { 1638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 1639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1640d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ToggleFullscreenModeForTab(WebContents* web_contents, 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enter_fullscreen) { 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->ToggleFullscreenModeForTab(web_contents, 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter_fullscreen); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::IsFullscreenForTabOrPending( 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContents* web_contents) const { 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fullscreen_controller_->IsFullscreenForTabOrPending(web_contents); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RegisterProtocolHandler(WebContents* web_contents, 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol, 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 16565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::BrowserContext* context = web_contents->GetBrowserContext(); 16575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (context->IsOffTheRecord()) 16585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 16595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProtocolHandler handler = 1661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProtocolHandler::CreateProtocolHandler(protocol, url); 16625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProtocolHandlerRegistry* registry = 16645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProtocolHandlerRegistryFactory::GetForBrowserContext(context); 16655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (registry->SilentlyHandleRegisterHandlerRequest(handler)) 16665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabSpecificContentSettings* tab_content_settings = 16695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabSpecificContentSettings::FromWebContents(web_contents); 16705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!user_gesture && window_) { 16715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_content_settings->set_pending_protocol_handler(handler); 16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_content_settings->set_previous_protocol_handler( 16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry->GetHandlerFor(handler.protocol())); 16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->GetLocationBar()->UpdateContentSettingsIcons(); 16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 16765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure content-setting icon is turned off in case the page does 16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ungestured and gestured RPH calls. 16805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (window_) { 16815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_content_settings->ClearPendingProtocolHandler(); 16825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->GetLocationBar()->UpdateContentSettingsIcons(); 16835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 16845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PermissionBubbleManager* bubble_manager = 16865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PermissionBubbleManager::FromWebContents(web_contents); 16875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (PermissionBubbleManager::Enabled() && bubble_manager) { 16885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bubble_manager->AddRequest( 1689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new RegisterProtocolHandlerPermissionRequest(registry, handler, 1690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, user_gesture)); 16915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 16925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RegisterProtocolHandlerInfoBarDelegate::Create( 16935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InfoBarService::FromWebContents(web_contents), registry, handler); 16945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1697116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid Browser::UnregisterProtocolHandler(WebContents* web_contents, 1698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& protocol, 1699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 1700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool user_gesture) { 1701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // user_gesture will be used in case we decide to have confirmation bubble 1702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // for user while un-registering the handler. 17035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::BrowserContext* context = web_contents->GetBrowserContext(); 17045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (context->IsOffTheRecord()) 1705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 1706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1707116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProtocolHandler handler = 1708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProtocolHandler::CreateProtocolHandler(protocol, url); 1709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProtocolHandlerRegistry* registry = 17115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProtocolHandlerRegistryFactory::GetForBrowserContext(context); 1712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registry->RemoveHandler(handler); 1713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdatePreferredSize(WebContents* source, 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& pref_size) { 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->UpdatePreferredSize(source, pref_size); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ResizeDueToAutoResize(WebContents* source, 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& new_size) { 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->ResizeDueToAutoResize(source, new_size); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::FindReply(WebContents* web_contents, 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 17315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FindTabHelper* find_tab_helper = FindTabHelper::FromWebContents(web_contents); 17325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!find_tab_helper) 17335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 17345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) find_tab_helper->HandleFindReply(request_id, 17365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_matches, 17375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) selection_rect, 17385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) active_match_ordinal, 17395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final_update); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RequestToLockMouse(WebContents* web_contents, 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture, 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->RequestToLockMouse(web_contents, 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture, 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_unlocked_by_target); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::LostMouseLock() { 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_controller_->LostMouseLock(); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RequestMediaAccessPermission( 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::MediaStreamRequest& request, 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MediaResponseCallback& callback) { 1758d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ::RequestMediaAccessPermission(web_contents, profile_, request, callback); 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Browser::CheckMediaAccessPermission(content::WebContents* web_contents, 17621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& security_origin, 17631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MediaStreamType type) { 17641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ::CheckMediaAccessPermission(web_contents, security_origin, type); 17651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 17661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Browser::RequestPpapiBrokerPermission( 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents, 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path, 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(bool)>& callback) { 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PepperBrokerInfoBarDelegate::Create(web_contents, url, plugin_path, callback); 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size Browser::GetSizeForNewRenderView(WebContents* web_contents) const { 1777424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // When navigating away from NTP with unpinned bookmark bar, the bookmark bar 1778424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // would disappear on non-NTP pages, resulting in a bigger size for the new 1779424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // render view. 1780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gfx::Size size = web_contents->GetContainerBounds().size(); 1781424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Don't change render view size if bookmark bar is currently not detached, 1782424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // or there's no pending entry, or navigating to a NTP page. 1783424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (size.IsEmpty() || bookmark_bar_state_ != BookmarkBar::DETACHED) 1784424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return size; 1785424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const NavigationEntry* pending_entry = 1786424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) web_contents->GetController().GetPendingEntry(); 1787424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (pending_entry && 1788424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) !chrome::IsNTPURL(pending_entry->GetVirtualURL(), profile_)) { 1789424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size.Enlarge( 1790424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 0, window()->GetRenderViewHeightInsetWithDetachedBookmarkBar()); 1791424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1792424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return size; 1793424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 1794424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, CoreTabHelperDelegate implementation: 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::SwapTabContents(content::WebContents* old_contents, 17995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* new_contents, 18005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_start_load, 18015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_finish_load) { 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = tab_strip_model_->GetIndexOfWebContents(old_contents); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(TabStripModel::kNoTab, index); 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->ReplaceWebContentsAt(index, new_contents); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::CanReloadContents(content::WebContents* web_contents) const { 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::CanReload(this); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::CanSaveContents(content::WebContents* web_contents) const { 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::CanSavePage(this); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, SearchEngineTabHelperDelegate implementation: 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ConfirmAddSearchProvider(TemplateURL* template_url, 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) { 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->ConfirmAddSearchProvider(template_url, profile); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1824c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Browser, SearchTabHelperDelegate implementation: 1825c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1826c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid Browser::NavigateOnThumbnailClick(const GURL& url, 1827c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch WindowOpenDisposition disposition, 1828c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::WebContents* source_contents) { 1829c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(source_contents); 1830c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // We're guaranteed that AUTO_BOOKMARK is the right transition since this only 1831c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // gets called to handle clicks in the new tab page (to navigate to most 1832c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // visited item URLs) and in the search results page (to navigate to 1833c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // privileged destinations (e.g. chrome://URLs)). 1834c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // 1835c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(kmadhusu): Page transitions to privileged destinations should be 1836c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // marked as "LINK" instead of "AUTO_BOOKMARK"? 1837c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chrome::NavigateParams params(this, url, 18381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_AUTO_BOOKMARK); 1839c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.referrer = content::Referrer(); 1840c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.source_contents = source_contents; 1841c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.disposition = disposition; 1842c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.is_renderer_initiated = false; 1843c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.initiating_profile = profile_; 1844c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chrome::Navigate(¶ms); 1845c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1846c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1847c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid Browser::OnWebContentsInstantSupportDisabled( 1848c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const content::WebContents* web_contents) { 1849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(web_contents); 1850c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (tab_strip_model_->GetActiveWebContents() == web_contents) 1851c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UpdateToolbar(false); 1852c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1853c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1854c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochOmniboxView* Browser::GetOmniboxView() { 1855c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return window_->GetLocationBar()->GetOmniboxView(); 1856c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1858c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::set<std::string> Browser::GetOpenUrls() { 1859c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch history::TopSites* top_sites = profile_->GetTopSites(); 1860c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!top_sites) // NULL for Incognito profiles. 1861c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return std::set<std::string>(); 1862c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1863c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::set<std::string> open_urls; 1864c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chrome::GetOpenUrls(*tab_strip_model_, *top_sites, &open_urls); 1865c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return open_urls; 1866c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1867c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1868c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch/////////////////////////////////////////////////////////////////////////////// 186990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Browser, web_modal::WebContentsModalDialogManagerDelegate implementation: 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::SetWebContentsBlocked(content::WebContents* web_contents, 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool blocked) { 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = tab_strip_model_->GetIndexOfWebContents(web_contents); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == TabStripModel::kNoTab) { 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->SetTabBlocked(index, blocked); 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!blocked && tab_strip_model_->GetActiveWebContents() == web_contents) 1880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents->Focus(); 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)web_modal::WebContentsModalDialogHost* 188490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Browser::GetWebContentsModalDialogHost() { 1885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return window_->GetWebContentsModalDialogHost(); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, BookmarkTabHelperDelegate implementation: 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::URLStarredChanged(content::WebContents* web_contents, 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool starred) { 18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents == tab_strip_model_->GetActiveWebContents()) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetStarredState(starred); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, ZoomObserver implementation: 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1900116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid Browser::OnZoomChanged(const ZoomController::ZoomChangedEventData& data) { 1901116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (data.web_contents == tab_strip_model_->GetActiveWebContents()) { 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only show the zoom bubble for zoom changes in the active window. 1903116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window_->ZoomChangedForActiveTab(data.can_show_bubble && 1904116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window_->IsActive()); 19055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Change the zoom commands state based on the zoom state 19065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) command_controller_->ZoomStateChanged(); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, ui::SelectFileDialog::Listener implementation: 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::FileSelected(const base::FilePath& path, int index, 19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* params) { 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSelectedWithExtraInfo(ui::SelectedFileInfo(path, path), index, params); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Browser::FileSelectedWithExtraInfo(const ui::SelectedFileInfo& file_info, 1919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int index, 1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void* params) { 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->set_last_selected_directory(file_info.file_path.DirName()); 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url = net::FilePathToFileURL(file_info.local_path); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 19261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL external_url = 19271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chromeos::CreateExternalFileURLFromPath(profile_, file_info.file_path); 19281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!external_url.is_empty()) 19291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url = external_url; 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (url.is_empty()) 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(OpenURLParams( 19361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false)); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, content::NotificationObserver implementation: 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::Observe(int type, 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 19465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { 1947a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::UpdateCommandEnabled( 1948a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this, 1949a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDC_BOOKMARK_PAGE, 1950a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !chrome::ShouldRemoveBookmarkThisPageUI(profile_)); 1951effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch chrome::UpdateCommandEnabled( 1952effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this, 1953effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDC_BOOKMARK_ALL_TABS, 1954effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch !chrome::ShouldRemoveBookmarkOpenPagesUI(profile_)); 1955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window()->GetLocationBar()) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->UpdatePageActions(); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const extensions::UnloadedExtensionInfo* extension_info = 1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<extensions::UnloadedExtensionInfo>(details).ptr(); 1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close any tabs from the unloaded extension, unless it's terminated, 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case let the sad tabs remain. 19641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (extension_info->reason != 19651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) extensions::UnloadedExtensionInfo::REASON_TERMINATE) { 1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Extension* extension = extension_info->extension; 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iterate backwards as we may remove items while iterating. 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = tab_strip_model_->count() - 1; i >= 0; --i) { 19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = tab_strip_model_->GetWebContentsAt(i); 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Two cases are handled here: 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - The scheme check is for when an extension page is loaded in a 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tab, e.g. chrome-extension://id/page.html. 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - The extension_app check is for apps, which can have non-extension 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // schemes, e.g. https://mail.google.com if you have the Gmail app 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // installed. 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((web_contents->GetURL().SchemeIs(extensions::kExtensionScheme) && 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetURL().host() == extension->id()) || 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (extensions::TabHelper::FromWebContents( 19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents)->extension_app() == extension)) { 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->CloseWebContentsAt(i, TabStripModel::CLOSE_NONE); 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: { 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = content::Source<Profile>(source).ptr(); 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_->IsSameProfile(profile) && window()->GetLocationBar()) 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->InvalidatePageActions(); 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: 1995a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::UpdateCommandEnabled( 1996a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this, 1997a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDC_BOOKMARK_PAGE, 1998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !chrome::ShouldRemoveBookmarkThisPageUI(profile_)); 1999effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch chrome::UpdateCommandEnabled( 2000effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this, 2001effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDC_BOOKMARK_ALL_TABS, 2002effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch !chrome::ShouldRemoveBookmarkOpenPagesUI(profile_)); 2003a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // fallthrough 20045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case extensions::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED: 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // During window creation on Windows we may end up calling into 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SHAppBarMessage, which internally spawns a nested message loop. This 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // makes it possible for us to end up here before window creation has 2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // completed, at which point window_ is NULL. See 94752 for details. 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window() && window()->GetLocationBar()) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->GetLocationBar()->UpdatePageActions(); 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_THEMES) 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window()->UserChangedTheme(); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED: { 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = content::Source<WebContents>(source).ptr(); 20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents == tab_strip_model_->GetActiveWebContents()) { 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationBar* location_bar = window()->GetLocationBar(); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location_bar) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_bar->UpdateContentSettingsIcons(); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Got a notification we didn't register for."; 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Command and state updating (private): 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Browser::OnDevToolsDisabledChanged() { 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled)) 203903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) content::DevToolsAgentHost::DetachAllClients(); 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, UI update coalescing and handling (private): 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdateToolbar(bool should_restore_state) { 20463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->UpdateToolbar(should_restore_state ? 20473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) tab_strip_model_->GetActiveWebContents() : NULL); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ScheduleUIUpdate(const WebContents* source, 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned changed_flags) { 20525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(source); 20535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int index = tab_strip_model_->GetIndexOfWebContents(source); 20545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(TabStripModel::kNoTab, index); 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do some synchronous updates. 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags & content::INVALIDATE_TYPE_URL && 20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source == tab_strip_model_->GetActiveWebContents()) { 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only update the URL for the current tab. Note that we do not update 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the navigation commands since those would have already been updated 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synchronously by NavigationStateChanged. 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateToolbar(false); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changed_flags &= ~content::INVALIDATE_TYPE_URL; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags & content::INVALIDATE_TYPE_LOAD) { 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the loading state synchronously. This is so the throbber will 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately start/stop, which gives a more snappy feel. We want to do 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this for any tab so they start & stop quickly. 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->UpdateWebContentsStateAt( 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetIndexOfWebContents(source), 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModelObserver::LOADING_ONLY); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The status bubble needs to be updated during INVALIDATE_TYPE_LOAD too, 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but we do that asynchronously by not stripping INVALIDATE_TYPE_LOAD from 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed_flags. 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags & content::INVALIDATE_TYPE_TITLE && !source->IsLoading()) { 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To correctly calculate whether the title changed while not loading 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we need to process the update synchronously. This state only matters for 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the TabStripModel, so we notify the TabStripModel now and notify others 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->UpdateWebContentsStateAt( 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetIndexOfWebContents(source), 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModelObserver::TITLE_NOT_LOADING); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the only updates were synchronously handled above, we're done. 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (changed_flags == 0) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the dirty bits. 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_updates_[source] |= changed_flags; 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!chrome_updater_factory_.HasWeakPtrs()) { 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No task currently scheduled, start another. 2096b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&Browser::ProcessPendingUIUpdates, 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_updater_factory_.GetWeakPtr()), 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kUIUpdateCoalescingTimeMS)); 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::ProcessPendingUIUpdates() { 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that all tabs we have pending updates for exist. This is scary 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the pending list must be kept in sync with any detached or 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleted tabs. 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (UpdateMap::const_iterator i = scheduled_updates_.begin(); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != scheduled_updates_.end(); ++i) { 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int tab = 0; tab < tab_strip_model_->count(); tab++) { 21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tab_strip_model_->GetWebContentsAt(tab) == i->first) { 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = true; 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(found); 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_updater_factory_.InvalidateWeakPtrs(); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (UpdateMap::const_iterator i = scheduled_updates_.begin(); 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != scheduled_updates_.end(); ++i) { 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not dereference |contents|, it may be out-of-date! 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContents* contents = i->first; 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned flags = i->second; 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents == tab_strip_model_->GetActiveWebContents()) { 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates that only matter when the tab is selected go here. 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updating the URL happens synchronously in ScheduleUIUpdate. 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & content::INVALIDATE_TYPE_LOAD && GetStatusBubble()) { 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStatusBubble()->SetStatus(CoreTabHelper::FromWebContents( 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->GetActiveWebContents())->GetStatusText()); 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & (content::INVALIDATE_TYPE_TAB | 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::INVALIDATE_TYPE_TITLE)) { 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->UpdateTitleBar(); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates that don't depend upon the selected state go here. 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (content::INVALIDATE_TYPE_TAB | content::INVALIDATE_TYPE_TITLE)) { 21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip_model_->UpdateWebContentsStateAt( 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->GetIndexOfWebContents(contents), 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModelObserver::ALL); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update the bookmark bar. It may happen that the tab is crashed, and if 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so, the bookmark bar should be hidden. 21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (flags & content::INVALIDATE_TYPE_TAB) 21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE); 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't need to process INVALIDATE_STATE, since that's not visible. 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_updates_.clear(); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::RemoveScheduledUpdatesFor(WebContents* contents) { 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents) 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMap::iterator i = scheduled_updates_.find(contents); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != scheduled_updates_.end()) 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_updates_.erase(i); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Getters for UI (private): 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StatusBubble* Browser::GetStatusBubble() { 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In kiosk and exclusive app mode, we want to always hide the status bubble. 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chrome::IsRunningInAppMode()) 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_ ? window_->GetStatusBubble() : NULL; 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Session restore functions (private): 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::SyncHistoryWithTabs(int index) { 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionService* session_service = 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionServiceFactory::GetForProfileIfExisting(profile()); 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (session_service) { 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = index; i < tab_strip_model_->count(); ++i) { 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = tab_strip_model_->GetWebContentsAt(i); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents) { 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper* session_tab_helper = 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::FromWebContents(web_contents); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->SetTabIndexInWindow( 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id(), session_tab_helper->session_id(), i); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_service->SetPinnedState( 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id(), 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_tab_helper->session_id(), 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->IsTabPinned(i)); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, In-progress download termination handling (private): 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::CanCloseWithInProgressDownloads() { 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we've prompted, we need to hear from the user before we 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can close. 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_download_confirmation_state_ != NOT_PROMPTED) 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cancel_download_confirmation_state_ != WAITING_FOR_RESPONSE; 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_downloads_blocking; 22173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Browser::DownloadClosePreventionType dialog_type = 22183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) OkToCloseWithInProgressDownloads(&num_downloads_blocking); 22193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (dialog_type == DOWNLOAD_CLOSE_OK) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closing this window will kill some downloads; prompt to make sure 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that's ok. 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_download_confirmation_state_ = WAITING_FOR_RESPONSE; 22253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->ConfirmBrowserCloseWithPendingDownloads( 22263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) num_downloads_blocking, 22273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) dialog_type, 22283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) false, 22293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&Browser::InProgressDownloadResponse, 22303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) weak_factory_.GetWeakPtr())); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return false so the browser does not close. We'll close if the user 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // confirms in the dialog. 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser, Assorted utility functions (private): 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2240116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { 2241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Browser* delegate = set_delegate ? this : NULL; 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents... 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->SetDelegate(delegate); 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ...and all the helpers. 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BookmarkTabHelper::FromWebContents(web_contents)->set_delegate(delegate); 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsModalDialogManager::FromWebContents(web_contents)-> 22483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetDelegate(delegate); 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CoreTabHelper::FromWebContents(web_contents)->set_delegate(delegate); 22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SearchEngineTabHelper::FromWebContents(web_contents)->set_delegate(delegate); 2251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SearchTabHelper::FromWebContents(web_contents)->set_delegate(delegate); 22521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci translate::ContentTranslateDriver& content_translate_driver = 22531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ChromeTranslateClient::FromWebContents(web_contents)->translate_driver(); 22541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delegate) { 2255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ZoomController::FromWebContents(web_contents)->AddObserver(this); 22561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_translate_driver.AddObserver(translate_driver_observer_.get()); 22571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 2258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ZoomController::FromWebContents(web_contents)->RemoveObserver(this); 22591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_translate_driver.RemoveObserver(translate_driver_observer_.get()); 22601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::CloseFrame() { 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Close(); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::TabDetachedAtImpl(content::WebContents* contents, 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachType type) { 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == DETACH_TYPE_DETACH) { 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the current location bar state, but only if the tab being detached 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is the selected tab. Because saving state can conditionally revert the 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // location bar, saving the current tab's location bar state to a 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-selected tab can corrupt both tabs. 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents == tab_strip_model_->GetActiveWebContents()) { 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationBar* location_bar = window()->GetLocationBar(); 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location_bar) 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_bar->SaveStateToContents(contents); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tab_strip_model_->closing_all()) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncHistoryWithTabs(0); 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAsDelegate(contents, false); 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveScheduledUpdatesFor(contents); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (find_bar_controller_.get() && index == tab_strip_model_->active_index()) { 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_bar_controller_->ChangeWebContents(NULL); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop observing search model changes for this tab. 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_delegate_->OnTabDetached(contents); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < interstitial_observers_.size(); i++) { 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (interstitial_observers_[i]->web_contents() != contents) 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete interstitial_observers_[i]; 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interstitial_observers_.erase(interstitial_observers_.begin() + i); 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool Browser::ShouldShowLocationBar() const { 2306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Tabbed browser always show a location bar. 2307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (is_type_tabbed()) 2308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return true; 2309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 23105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (is_app()) { 23111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (extensions::util::IsStreamlinedHostedAppsEnabled() && 231203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) host_desktop_type() != chrome::HOST_DESKTOP_TYPE_ASH) { 23131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If streamlined hosted apps are enabled, show the location bar for 231403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // bookmark apps, except on ash which has the toolbar merged into the 231503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // frame. 23165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ExtensionService* service = 23175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu extensions::ExtensionSystem::Get(profile_)->extension_service(); 23185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const extensions::Extension* extension = 23195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu service ? service->GetInstalledExtension( 23205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_app::GetExtensionIdFromApplicationName(app_name())) 23215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : NULL; 23225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return (!extension || extension->from_bookmark()) && 23235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu app_name() != DevToolsWindow::kDevToolsApp; 23245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 23255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 23265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 2328effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 23295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Trusted app windows and system windows never show a location bar. 23300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return !is_trusted_source(); 2331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 2332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Browser::SupportsWindowFeatureImpl(WindowFeature feature, 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool check_fullscreen) const { 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool hide_ui_for_fullscreen = check_fullscreen && ShouldHideUIForFullscreen(); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF; 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_type_tabbed()) 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_BOOKMARKBAR; 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hide_ui_for_fullscreen) { 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_type_tabbed()) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_TITLEBAR; 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_type_tabbed()) 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_TABSTRIP; 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_type_tabbed()) 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_TOOLBAR; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (ShouldShowLocationBar()) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) features |= FEATURE_LOCATIONBAR; 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!(features & feature); 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Browser::UpdateBookmarkBarState(BookmarkBarStateChangeReason reason) { 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkBar::State state; 2360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The bookmark bar is always hidden for Guest Sessions and in fullscreen 2361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // mode, unless on the new tab page. 2362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (profile_->IsGuestSession()) { 2363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch state = BookmarkBar::HIDDEN; 2364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else if (browser_defaults::bookmarks_enabled && 23651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci profile_->GetPrefs()->GetBoolean(bookmarks::prefs::kShowBookmarkBar) && 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !ShouldHideUIForFullscreen()) { 23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state = BookmarkBar::SHOW; 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = tab_strip_model_->GetActiveWebContents(); 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkTabHelper* bookmark_tab_helper = 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents ? BookmarkTabHelper::FromWebContents(web_contents) : NULL; 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bookmark_tab_helper && bookmark_tab_helper->ShouldShowBookmarkBar()) 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = BookmarkBar::DETACHED; 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = BookmarkBar::HIDDEN; 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == bookmark_bar_state_) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_bar_state_ = state; 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window_) 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // This is called from the constructor when window_ is NULL. 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reason == BOOKMARK_BAR_STATE_CHANGE_TAB_SWITCH) { 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify BrowserWindow on a tab switch as at the time this is invoked 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserWindow hasn't yet switched tabs. The BrowserWindow implementations 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // end up querying state once they process the tab switch. 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool shouldAnimate = reason == BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE; 23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->BookmarkBarStateChanged(shouldAnimate ? 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkBar::ANIMATE_STATE_CHANGE : 23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BookmarkBar::DONT_ANIMATE_STATE_CHANGE); 23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Browser::ShouldHideUIForFullscreen() const { 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Windows and GTK remove the top controls in fullscreen, but Mac and Ash 24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // keep the controls in a slide-down panel. 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window_ && window_->ShouldHideUIForFullscreen(); 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool Browser::MaybeCreateBackgroundContents( 24063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int route_id, 24073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebContents* opener_web_contents, 2408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& frame_name, 24093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GURL& target_url, 24103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& partition_id, 24113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace) { 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL opener_url = opener_web_contents->GetURL(); 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extensions_service = 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile_)->extension_service(); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_url.is_valid() || 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_name.empty() || 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !extensions_service || 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !extensions_service->is_ready()) 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only hosted apps have web extents, so this ensures that only hosted apps 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can create BackgroundContents. We don't have to check for background 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission as that is checked in RenderMessageFilter when the CreateWindow 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message is processed. 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 2427ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extensions_service->extensions()->GetHostedAppByURL(opener_url); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No BackgroundContents allowed if BackgroundContentsService doesn't exist. 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackgroundContentsService* service = 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackgroundContentsServiceFactory::GetForProfile(profile_); 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that we're trying to open this from the extension's process. 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* opener_site_instance = opener_web_contents->GetSiteInstance(); 24395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile_); 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_site_instance->GetProcess() || 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !process_map->Contains( 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->id(), opener_site_instance->GetProcess()->GetID())) { 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only allow a single background contents per app. 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool allow_js_access = extensions::BackgroundInfo::AllowJSAccess(extension); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackgroundContents* existing = 24495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) service->GetAppBackgroundContents(base::ASCIIToUTF16(extension->id())); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (existing) { 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For non-scriptable background contents, ignore the request altogether, 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (returning true, so that a regular WebContents isn't created either). 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!allow_js_access) 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For scriptable background pages, if one already exists, close it (even 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if it was specified in the manifest). 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete existing; 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If script access is not allowed, create the the background contents in a 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new SiteInstance, so that a separate process is used. 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<content::SiteInstance> site_instance = 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allow_js_access ? 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_site_instance : 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SiteInstance::Create(opener_web_contents->GetBrowserContext()); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Passed all the checks, so this should be created as a BackgroundContents. 2468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BackgroundContents* contents = 2469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) service->CreateBackgroundContents(site_instance.get(), 2470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) route_id, 2471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_, 2472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) frame_name, 24735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(extension->id()), 24743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) partition_id, 24753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) session_storage_namespace); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a separate process is used, the original renderer cannot access the 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window later, thus we need to navigate the window now. 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents && !allow_js_access) { 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->web_contents()->GetController().LoadURL( 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url, 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Referrer(), 24831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK, 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); // No extra headers. 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents != NULL; 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2489