web_contents_impl.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 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 "content/browser/web_contents/web_contents_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/debug/trace_event.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/lazy_instance.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/logging.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/stats_counters.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/process/process.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/accessibility/accessibility_mode_helper.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/accessibility/browser_accessibility_state_impl.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_embedder.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/devtools/render_view_devtools_agent_host.h" 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/dom_storage/dom_storage_context_wrapper.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_stats.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mhtml_generation_manager.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_package.h" 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/cross_process_frame_connector.h" 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h" 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/navigator_impl.h" 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h" 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/render_widget_host_view_child_frame.h" 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/geolocation/geolocation_dispatcher_host.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/browser/media/midi_dispatcher_host.h" 428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_message_filter.h" 438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_service.h" 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/power_save_blocker_impl.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_delegate_view.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_base.h" 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/browser/screen_orientation/screen_orientation_dispatcher_host.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_guest.h" 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h" 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/frame_messages.h" 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/image_messages.h" 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/common/input_messages.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/ax_event_notification_details.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/browser_plugin_guest_manager.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/javascript_dialog_manager.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_widget_host_iterator.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 8658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/result_codes.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_utils.h" 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/web_preferences.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_cache.h" 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_transaction_factory.h" 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_request_context.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/android/content_view_core_impl.h" 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/date_time_chooser_android.h" 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h" 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/web_contents/web_contents_android.h" 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cross-Site Navigations 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a WebContentsImpl is told to navigate to a different web site (as 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determined by SiteInstance), it will replace its current RenderViewHost with 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new RenderViewHost dedicated to the new SiteInstance. This works as 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follows: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - RVHM::Navigate determines whether the destination is cross-site, and if so, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it creates a pending_render_view_host_. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH is "suspended," so that no navigation messages are sent to 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// its renderer until the beforeunload JavaScript handler has a chance to 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run in the current RVH. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH tells CrossSiteRequestManager (a thread-safe singleton) 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// that it has a pending cross-site request. We will check this on the IO 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// thread when deciding how to handle the response. 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - The current RVH runs its beforeunload handler. If it returns false, we 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cancel all the pending logic. Otherwise we allow the pending RVH to send 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the navigation request to its renderer. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// main resource load on the pending RVH. It creates a 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// CrossSiteResourceHandler to check whether a process swap is needed when 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// the request is ready to commit. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - When RDH receives a response, the BufferedResourceHandler determines 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether it is a download. If so, it sends a message to the new renderer 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// causing it to cancel the request, and the download proceeds. For now, the 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH remains until the next DidNavigate event for this 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl. This isn't ideal, but it doesn't affect any functionality. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - After RDH receives a response and determines that it is safe and not a 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// download, the CrossSiteResourceHandler checks whether a process swap is 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// needed (either because CrossSiteRequestManager has state for it or because 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a transfer was needed for a redirect). 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If so, CrossSiteResourceHandler pauses the response to first run the old 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// page's unload handler. It does this by asynchronously calling the 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// OnCrossSiteResponse method of RenderFrameHostManager on the UI thread, 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// which sends a SwapOut message to the current RVH. 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - Once the unload handler is finished, RVHM::SwappedOut checks if a transfer 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// to a new process is needed, based on the stored pending_nav_params_. (This 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// is independent of whether we started out with a cross-process navigation.) 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If not, it just tells the ResourceDispatcherHost to resume the response 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// to its current RenderViewHost. 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If so, it cancels the current pending RenderViewHost and sets up a new 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// navigation using RequestTransferURL. When the transferred request 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// arrives in the ResourceDispatcherHost, we transfer the response and 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// resume it. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending renderer sends a FrameNavigate message that invokes the 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidNavigate method. This replaces the current RVH with the 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH. 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// - The previous renderer is kept swapped out in RenderFrameHostManager in case 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the user goes back. The process only stays live if another tab is using 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it, but if so, the existing frame relationships will be maintained. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kMinimumDelayBetweenLoadingUpdatesMS = 100; 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This matches what Blink's ProgressTracker has traditionally used for a 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// minimum progress value. 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const double kMinimumLoadingProgress = 0.1; 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com"; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID) 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kWebContentsAndroidKey[] = "web_contents_android"; 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // OS_ANDROID 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::LazyInstance<std::vector<WebContentsImpl::CreatedCallback> > 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER; 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 183e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochstatic int StartDownload(content::RenderFrameHost* rfh, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_favicon, 186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uint32_t max_bitmap_size) { 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int g_next_image_download_id = 0; 188e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch rfh->Send(new ImageMsg_DownloadImage(rfh->GetRoutingID(), 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++g_next_image_download_id, 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_favicon, 192d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) max_bitmap_size)); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_next_image_download_id; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void NotifyCacheOnIO( 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context, 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& url, 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& http_method) { 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) request_context->GetURLRequestContext()->http_transaction_factory()-> 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetCache()->OnExternalCacheHit(url, http_method); 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Helper function for retrieving all the sites in a frame tree. 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CollectSites(BrowserContext* context, 2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::set<GURL>* sites, 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FrameTreeNode* node) { 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sites->insert(SiteInstance::GetSiteForURL(context, node->current_url())); 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ForEachFrameInternal( 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame, 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTreeNode* node) { 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) on_frame.Run(node->current_frame_host()); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ForEachPendingFrameInternal( 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(RenderFrameHost*)>& on_frame, 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FrameTreeNode* node) { 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* pending_frame_host = 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch node->render_manager()->pending_frame_host(); 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (pending_frame_host) 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch on_frame.Run(pending_frame_host); 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SendToAllFramesInternal(IPC::Message* message, RenderFrameHost* rfh) { 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* message_copy = new IPC::Message(*message); 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_copy->set_routing_id(rfh->GetRoutingID()); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rfh->Send(message_copy); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void AddRenderWidgetHostViewToSet(std::set<RenderWidgetHostView*>* set, 236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderFrameHost* rfh) { 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderWidgetHostView* rwhv = static_cast<RenderFrameHostImpl*>(rfh) 238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->frame_tree_node() 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->render_manager() 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetRenderWidgetHostView(); 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) set->insert(rwhv); 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SetAccessibilityModeOnFrame(AccessibilityMode mode, 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* frame_host) { 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<RenderFrameHostImpl*>(frame_host)->SetAccessibilityMode(mode); 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContents::Create(const WebContents::CreateParams& params) { 252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return WebContentsImpl::CreateWithOpener( 253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params, static_cast<WebContentsImpl*>(params.opener)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage( 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 258ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const SessionStorageNamespaceMap& session_storage_namespace_map) { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, NULL); 261ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 262ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (SessionStorageNamespaceMap::const_iterator it = 263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session_storage_namespace_map.begin(); 264ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch it != session_storage_namespace_map.end(); 265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++it) { 266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new_contents->GetController() 267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch .SetSessionStorageNamespace(it->first, it->second.get()); 268ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 269ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::AddCreatedCallback(const CreatedCallback& callback) { 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().push_back(callback); 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::RemoveCreatedCallback(const CreatedCallback& callback) { 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) { 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (g_created_callbacks.Get().at(i).Equals(callback)) { 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i); 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetDelegate()->GetAsWebContents(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContents::FromRenderFrameHost(RenderFrameHost* rfh) { 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* rfh_impl = static_cast<RenderFrameHostImpl*>(rfh); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!rfh_impl) 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return rfh_impl->delegate()->GetAsWebContents(); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebContentsImpl::DestructionObserver ---------------------------------------- 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsImpl::DestructionObserver : public WebContentsObserver { 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents) 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : WebContentsObserver(watched_contents), 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_(owner) { 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // WebContentsObserver: 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void WebContentsDestroyed() OVERRIDE { 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) owner_->OnWebContentsDestroyed( 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<WebContentsImpl*>(web_contents())); 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebContentsImpl* owner_; 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionObserver); 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 319a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochWebContentsImpl::ColorChooserInfo::ColorChooserInfo(int render_process_id, 320a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int render_frame_id, 321a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ColorChooser* chooser, 322a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int identifier) 323a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : render_process_id(render_process_id), 324a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_id(render_frame_id), 325a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch chooser(chooser), 326a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch identifier(identifier) { 327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 328a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 329a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochWebContentsImpl::ColorChooserInfo::~ColorChooserInfo() { 330a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl ------------------------------------------------------------- 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl( 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(NULL), 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_(this, browser_context), 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_delegate_view_(NULL), 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_(opener), 3410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch created_with_opener_(!!opener), 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_(NULL), 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_tree_(new NavigatorImpl(&controller_, this), 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, this, this, this), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_load_to_different_document_(false), 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_(0), 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_(false), 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) load_state_(net::LOAD_STATE_IDLE, base::string16()), 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_(0.0), 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_(this), 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_frames_in_progress_(0), 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_(0), 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_(0), 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_(false), 3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_(false), 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capturer_count_(0), 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_(true), 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_(false), 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_(false), 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_(NULL), 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_(false), 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_active_time_(base::TimeTicks::Now()), 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_(false), 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)), 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)), 370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch totalPinchGestureAmount_(0), 371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_(0), 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_message_source_(NULL), 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fullscreen_widget_routing_id_(MSG_ROUTING_NONE), 374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_widget_had_focus_at_shutdown_(false), 375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_subframe_(false), 376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) touch_emulation_enabled_(false), 377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_dialog_suppressed_(false), 378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accessibility_mode_( 379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()) { 380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().at(i).Run(this); 3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_.SetFrameRemoveListener( 3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&WebContentsImpl::OnFrameRemoved, 3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this))); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_ = true; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Delete all RFH pending shutdown, which will lead the corresponding RVH to 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // shutdown and be deleted as well. 392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_.ForEach( 393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&RenderFrameHostManager::ClearRFHsPendingShutdown)); 394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 395ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearAllPowerSaveBlockers(); 396ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<RenderWidgetHostImpl*>::iterator iter = 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->DetachDelegate(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.clear(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear out any JavaScript state. 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dialog_manager_) 405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dialog_manager_->WebContentsDestroyed(this); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 407a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_.get()) 408a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify any observer that have a reference on this WebContents. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DESTROYED, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Destroy all frame tree nodes except for the root; this notifies observers. 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frame_tree_.ResetForMainFrameSwap(); 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetRenderManager()->ResetProxyHosts(); 421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Manually call the observer methods for the root frame tree node. 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostManager* root = GetRenderManager(); 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (root->pending_frame_host()) { 4258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) observers_, 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameDeleted(root->pending_frame_host())); 4288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) observers_, 431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameDeleted(root->current_frame_host())); 4328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (root->pending_render_view_host()) { 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) observers_, 436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewDeleted(root->pending_render_view_host())); 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) observers_, 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewDeleted(root->current_host())); 4428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsDestroyed()); 446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) observers_, 449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ResetWebContents()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDelegate(NULL); 45290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 45390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STLDeleteContainerPairSecondPointers(destruction_observers_.begin(), 45490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.end()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener( 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) { 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener"); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.browser_context, params.opener_suppressed ? NULL : opener); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (params.guest_delegate) { 465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This makes |new_contents| act as a guest. 466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BrowserPluginGuest::Create(params.guest_delegate->GetGuestInstanceID(), 468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents, 469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.guest_delegate); 470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We are instantiating a WebContents for browser plugin. Set its subframe 471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // bit to true. 472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->is_subframe_ = true; 473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 479116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::vector<WebContentsImpl*> WebContentsImpl::GetAllWebContents() { 480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<WebContentsImpl*> result; 481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<RenderWidgetHostIterator> widgets( 482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostImpl::GetRenderWidgetHosts()); 483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::set<WebContentsImpl*> web_contents_set; 484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch while (RenderWidgetHost* rwh = widgets->GetNextHost()) { 485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!rwh->IsRenderView()) 486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderViewHost* rvh = RenderViewHost::From(rwh); 488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!rvh) 489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContents* web_contents = WebContents::FromRenderViewHost(rvh); 491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!web_contents) 492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsImpl* wci = static_cast<WebContentsImpl*>(web_contents); 494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (web_contents_set.find(wci) == web_contents_set.end()) { 495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_set.insert(wci); 496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result.push_back(wci); 497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return result; 500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManagerForTesting() { 503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return OnMessageReceived(render_view_host, NULL, message); 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHost* render_frame_host, 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const IPC::Message& message) { 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(render_view_host || render_frame_host); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetWebUI() && 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<WebContentsObserver>::Iterator it(observers_); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver* observer; 522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (render_frame_host) { 523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (observer->OnMessageReceived(message, render_frame_host)) 525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (observer->OnMessageReceived(message)) 529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Message handlers should be aware of which 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RenderViewHost/RenderFrameHost sent the message, which is temporarily 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // stored in render_(view|frame)_message_source_. 5356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (render_frame_host) 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_message_source_ = render_frame_host; 5376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) else 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_message_source_ = render_view_host; 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(WebContentsImpl, message) 542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_PepperPluginHung, OnPepperPluginHung) 543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_PluginCrashed, OnPluginCrashed) 544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DomOperationResponse, 545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnDomOperationResponse) 546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeThemeColor, 547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnThemeColorChanged) 548a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishDocumentLoad, 549a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnDocumentLoadedInFrame) 550a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishLoad, OnDidFinishLoad) 551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartLoading, OnDidStartLoading) 552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading) 553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeLoadProgress, 554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnDidChangeLoadProgress) 555a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_OpenColorChooser, OnOpenColorChooser) 556a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_EndColorChooser, OnEndColorChooser) 557a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_SetSelectedColorInColorChooser, 558a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnSetSelectedColorInColorChooser) 559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPlayingNotification, 560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnMediaPlayingNotification) 561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPausedNotification, 562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnMediaPausedNotification) 5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidFirstVisuallyNonEmptyPaint, 5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnFirstVisuallyNonEmptyPaint) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidLoadResourceFromMemoryCache) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidDisplayInsecureContent) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidRunInsecureContent) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler, 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRegisterProtocolHandler) 576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_UnregisterProtocolHandler, 577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnUnregisterProtocolHandler) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission, 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRequestPpapiBrokerPermission) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_Attach, 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ImageHostMsg_DidDownloadImage, OnDidDownloadImage) 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL) 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_ShowValidationMessage, 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnShowValidationMessage) 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_HideValidationMessage, 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHideValidationMessage) 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_MoveValidationMessage, 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnMoveValidationMessage) 593a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_ANDROID) 594a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply, 595a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnFindMatchRectsReply) 596a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_OpenDateTimeDialog, 597a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnOpenDateTimeDialog) 598a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_message_source_ = NULL; 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_message_source_ = NULL; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser( 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params) { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RunFileChooser(this, params); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetBrowserContext(); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const { 62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 632ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst GURL& WebContentsImpl::GetVisibleURL() const { 63390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetLastCommittedURL() const { 63990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() { 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cbentzel): remove this debugging code? 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate == delegate_) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Detach(this); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Attach(this); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the visible RVH reflects the new delegate's preferences. 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { 664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostImpl* host = GetRenderManager()->current_host(); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host ? host->GetProcess() : NULL; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetMainFrame() { 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame_tree_.root()->current_frame_host(); 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetFocusedFrame() { 673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!frame_tree_.GetFocusedFrame()) 674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return NULL; 675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return frame_tree_.GetFocusedFrame()->current_frame_host(); 676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ForEachFrame( 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame) { 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&ForEachFrameInternal, on_frame)); 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SendToAllFrames(IPC::Message* message) { 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ForEachFrame(base::Bind(&SendToAllFramesInternal, message)); 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete message; 686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const { 689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host(); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->GetRoutingID(); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetFullscreenWidgetRoutingID() const { 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fullscreen_widget_routing_id_; 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const { 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->GetRenderWidgetHostView(); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 707d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetFullscreenRenderWidgetHostView() 708d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const { 709d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHost* const widget_host = 710d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostImpl::FromID(GetRenderProcessHost()->GetID(), 711d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetFullscreenWidgetRoutingID()); 712d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return widget_host ? widget_host->GetView() : NULL; 713d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 714d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const { 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_.get(); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 719116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::SetAccessibilityMode(AccessibilityMode mode) { 720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (mode == accessibility_mode_) 721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accessibility_mode_ = mode; 724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_tree_.ForEach( 725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&ForEachFrameInternal, 726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&SetAccessibilityModeOnFrame, mode))); 727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_tree_.ForEach( 728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&ForEachPendingFrameInternal, 729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&SetAccessibilityModeOnFrame, mode))); 730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 732116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::AddAccessibilityMode(AccessibilityMode mode) { 733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAccessibilityMode( 734116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::AddAccessibilityModeTo(accessibility_mode_, mode)); 735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 737116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::RemoveAccessibilityMode(AccessibilityMode mode) { 738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAccessibilityMode( 739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RemoveAccessibilityModeFrom(accessibility_mode_, mode)); 740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIImpl* web_ui = new WebUIImpl(this); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()-> 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateWebUIControllerForURL(web_ui, url); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller) { 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui->AddMessageHandler(new GenericHandler()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->SetController(controller); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete web_ui; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const { 757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->web_ui() ? GetRenderManager()->web_ui() 758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : GetRenderManager()->pending_web_ui(); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const { 762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->web_ui(); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUserAgentOverride() == override) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.user_agent_override = override; 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the new override string to the renderer. 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->SyncRendererPrefs(); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload the page if a load is currently in progress to avoid having 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different parts of the page loaded using different user agents. 7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent()) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ReloadIgnoringCache(true); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserAgentOverrideSet(override)); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const { 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.user_agent_override; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 790116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::EnableTreeOnlyAccessibilityMode() { 791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddAccessibilityMode(AccessibilityModeTreeOnly); 792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 794116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebContentsImpl::IsTreeOnlyAccessibilityModeForTesting() const { 795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return accessibility_mode_ == AccessibilityModeTreeOnly; 796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 798116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebContentsImpl::IsFullAccessibilityModeForTesting() const { 799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return accessibility_mode_ == AccessibilityModeComplete; 800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::SetParentNativeViewAccessible( 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible accessible_parent) { 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_ = accessible_parent; 806116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); 807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (rfh) 808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rfh->SetParentNativeViewAccessible(accessible_parent); 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 812a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetTitle() const { 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transient entries take precedence. They are used for interstitial pages 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that are shown on top of existing pages. 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetTransientEntry(); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_languages = 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext()); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebUI* our_web_ui = GetRenderManager()->pending_web_ui() ? 823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_web_ui() : GetRenderManager()->web_ui(); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (our_web_ui) { 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't override the title in view source mode. 826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry = controller_.GetVisibleEntry(); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(entry && entry->IsViewSourceMode())) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the Web UI the chance to override our title. 829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title = our_web_ui->GetOverriddenTitle(); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title.empty()) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the title for the last committed entry rather than a pending 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation entry. For example, when the user types in a URL, we want to 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep the old page's title until the new load has committed and we get a new 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title. 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetLastCommittedEntry(); 840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 841f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We make an exception for initial navigations. 842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (controller_.IsInitialNavigation()) { 843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We only want to use the title from the visible entry in one of two cases: 844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1. There's already a committed entry for an initial navigation, in which 845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // case we are doing a history navigation in a new tab (e.g., Ctrl+Back). 846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2. The pending entry has been explicitly assigned a title to display. 847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If there's no last committed entry and no assigned title, we should fall 849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // back to |page_title_when_no_navigation_entry_| rather than showing the 850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // URL. 851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (entry || 852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (controller_.GetVisibleEntry() && 853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !controller_.GetVisibleEntry()->GetTitle().empty())) { 854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) entry = controller_.GetVisibleEntry(); 855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| is finally used 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if no title cannot be retrieved. 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_title_when_no_navigation_entry_; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() { 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetMaxPageIDForSiteInstance(GetSiteInstance()); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance( 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end()) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = -1; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return max_page_ids_[site_instance->GetId()]; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance( 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, int32 page_id) { 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetMaxPageIDForSiteInstance(site_instance) < page_id) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = page_id; 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContents* web_contents) { 8901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebContentsImpl* contents = static_cast<WebContentsImpl*>(web_contents); 8911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) max_page_ids_ = contents->max_page_ids_; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const { 895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetSiteInstance(); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const { 899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHost* dest_rvh = GetRenderManager()->pending_render_view_host() ? 900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_render_view_host() : 901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->current_host(); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest_rvh->GetSiteInstance(); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const { 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_loading_; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebContentsImpl::IsLoadingToDifferentDocument() const { 910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return is_loading_ && is_load_to_different_document_; 911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const { 914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return waiting_for_response_ && is_load_to_different_document_; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_; 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetLoadStateHost() const { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_host_; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const { 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_size_; 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const { 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_position_; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::set<GURL> WebContentsImpl::GetSitesInTab() const { 9347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::set<GURL> sites; 9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&CollectSites, 9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(GetBrowserContext()), 9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(&sites))); 9387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return sites; 9397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const { 942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return canonical_encoding_; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const { 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return displayed_insecure_content_; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::IncrementCapturerCount(const gfx::Size& capture_size) { 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!is_being_destroyed_); 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++capturer_count_; 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: This provides a hint to upstream code to size the views optimally 9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for quality (e.g., to avoid scaling). 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!capture_size.IsEmpty() && preferred_size_for_capture_.IsEmpty()) { 9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_size_for_capture_ = capture_size; 9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(preferred_size_); 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DecrementCapturerCount() { 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --capturer_count_; 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_LE(0, capturer_count_); 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_being_destroyed_) 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (capturer_count_ == 0) { 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size old_size = preferred_size_for_capture_; 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_size_for_capture_ = gfx::Size(); 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(old_size); 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsHidden()) { 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Executing delayed WasHidden()."; 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WasHidden(); 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 984ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint WebContentsImpl::GetCapturerCount() const { 985ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return capturer_count_; 986ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 987ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const { 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED || 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status, 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == crashed_status_) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ = status; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_ = error_code; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const { 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crashed_status_; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_being_destroyed_; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged( 10136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InvalidateTypes changed_flags) { 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->NavigationStateChanged(this, changed_flags); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastActiveTime() const { 10195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return last_active_time_; 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() { 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.SetActive(true); 1024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1025f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> widgets = GetRenderWidgetHostViewsInTree(); 1026f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (std::set<RenderWidgetHostView*>::iterator iter = widgets.begin(); 1027cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter != widgets.end(); 1028cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter++) { 1029f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (*iter) { 1030f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->Show(); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1032f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->SetActive(true); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1034cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_active_time_ = base::TimeTicks::Now(); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resize rect might have changed while this was inactive -- send the new 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one to make sure it's up to date. 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->ResizeRectChanged(GetRootWindowResizerRect()); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown()); 10484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = true; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() { 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there are entities capturing screenshots or video (e.g., mirroring), 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // don't activate the "disable rendering" optimization. 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capturer_count_ == 0) { 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |GetRenderViewHost()| can be NULL if the user middle clicks a link to 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // open a tab in the background, then closes the tab before selecting it. 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is because closing the tab calls WebContentsImpl::Destroy(), which 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removes the |GetRenderViewHost()|; then when we actually destroy the 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window, OnWindowPosChanged() notices and calls WasHidden() (which 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls us). 1062f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> widgets = GetRenderWidgetHostViewsInTree(); 1063f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (std::set<RenderWidgetHostView*>::iterator iter = widgets.begin(); 1064cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter != widgets.end(); 1065cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter++) { 1066f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (*iter) 1067f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->Hide(); 1068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasHidden()); 10724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = false; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() { 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Should we fire even for interstitial pages? 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WillNotifyDisconnection() && 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !ShowingInterstitialPage() && 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !static_cast<RenderViewHostImpl*>( 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost())->SuddenTerminationAllowed(); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1084c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::DispatchBeforeUnload(bool for_cross_site_transition) { 1085c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<RenderFrameHostImpl*>(GetMainFrame())->DispatchBeforeUnload( 1086c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for_cross_site_transition); 1087c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1088c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() { 1090f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->Stop(); 10913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped()); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use our current SiteInstance since the cloned entry will use it anyway. 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We pass our own opener so that the cloned page can access it if it was 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before. 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams create_params(GetBrowserContext(), GetSiteInstance()); 1099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) create_params.initial_size = GetContainerBounds().size(); 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* tc = CreateWithOpener(create_params, opener_); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tc->GetController().CopyStateFrom(controller_); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCloneToNewWebContents(this, tc)); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tc; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type, 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 1114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* view = host->GetView(); 1115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view == GetFullscreenRenderWidgetHostView()) { 1116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We cannot just call view_->RestoreFocus() here. On some platforms, 1117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // attempting to focus the currently-invisible WebContentsView will be 1118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // flat-out ignored. Therefore, this boolean is used to track whether 1119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // we will request focus after the fullscreen widget has been 1120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // destroyed. 1121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_widget_had_focus_at_shutdown_ = (view && view->HasFocus()); 1122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 1123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 1124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch i != pending_widget_views_.end(); ++i) { 1125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host->GetView() == i->second) { 1126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_widget_views_.erase(i); 1127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 1128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebContents* WebContentsImpl::GetWebContents() { 11391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return this; 11401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 11411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::Init(const WebContents::CreateParams& params) { 1143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is set before initializing the render manager since 1144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // RenderFrameHostManager::Init calls back into us via its delegate to ask if 1145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it should be hidden. 11468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) should_normally_be_visible_ = !params.initially_hidden; 11478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->Init( 1149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.browser_context, params.site_instance, params.routing_id, 1150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.main_frame_routing_id); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsViewDelegate* delegate = 1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetContentClient()->browser()->GetWebContentsViewDelegate(this); 1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (browser_plugin_guest_) { 1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<WebContentsView> platform_view(CreateWebContentsView( 1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsViewGuest* rv = new WebContentsViewGuest( 1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, browser_plugin_guest_.get(), platform_view.Pass(), 1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_view_host_delegate_view_); 1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_view_host_delegate_view_ = rv; 1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_.reset(rv); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Regular WebContentsView. 1166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_.reset(CreateWebContentsView( 1167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(render_view_host_delegate_view_); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(view_.get()); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size initial_size = params.initial_size; 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateView(initial_size, params.context); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for whether our opener gets destroyed. 117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (opener_) 117790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(opener_); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllBrowserContextsAndSources()); 1182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) geolocation_dispatcher_host_.reset(new GeolocationDispatcherHost(this)); 1184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) midi_dispatcher_host_.reset(new MidiDispatcherHost(this)); 1185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) screen_orientation_dispatcher_host_.reset( 1187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new ScreenOrientationDispatcherHost(this)); 1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_chooser_.reset(new DateTimeChooserAndroid()); 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { 119590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(web_contents); 119690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the opener if it has been closed. 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents == opener_) { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_ = NULL; 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear a pending contents that has been closed before being shown. 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (PendingContents::iterator iter = pending_contents_.begin(); 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != pending_contents_.end(); 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second != web_contents) 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_contents_.erase(iter); 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) { 121590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!ContainsKey(destruction_observers_, web_contents)) { 121690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_[web_contents] = 121790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new DestructionObserver(this, web_contents); 121890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 121990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 122090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 122190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) { 122290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObservers::iterator iter = 122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.find(web_contents); 122490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (iter != destruction_observers_.end()) { 122590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete destruction_observers_[web_contents]; 122690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.erase(iter); 122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 122890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 122990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::set<RenderWidgetHostView*> 1239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)WebContentsImpl::GetRenderWidgetHostViewsInTree() { 1240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> set; 1241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (ShowingInterstitialPage()) { 1242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) set.insert(GetRenderWidgetHostView()); 1243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 1244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ForEachFrame( 1245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&AddRenderWidgetHostViewToSet, base::Unretained(&set))); 1246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return set; 1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() { 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ActivateContents(this); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() { 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DeactivateContents(this); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostCapture(); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted( 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host) { 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_being_destroyed_) { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |created_widgets_| might have been destroyed. 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<RenderWidgetHostImpl*>::iterator iter = 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.find(render_widget_host); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != created_widgets_.end()) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.erase(iter); 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host && 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) { 1279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate_ && delegate_->EmbedsFullscreenWidget()) 1280d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, false); 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDestroyFullscreenWidget( 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_)); 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_ = MSG_ROUTING_NONE; 1286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_widget_had_focus_at_shutdown_) 1287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->RestoreFocus(); 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent( 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ && 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleKeyboardEvent(this, event); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool WebContentsImpl::HandleWheelEvent( 1304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseWheelEvent& event) { 1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_MACOSX) 1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On platforms other than Mac, control+mousewheel changes zoom. On Mac, this 1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // isn't done for two reasons: 1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -the OS already has a gesture to do this through pinch-zoom 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -if a user starts an inertial scroll, let's go, and presses control 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (i.e. control+tab) then the OS's buffered scroll events will come in 1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with control key set which isn't what the user wants 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_ && 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.wheelTicksY && 13140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch (event.modifiers & blink::WebInputEvent::ControlKey) && 13150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Avoid adjusting the zoom in response to two-finger-scrolling touchpad 13160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // gestures, which are regrettably easy to trigger accidentally. 13170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch !event.hasPreciseScrollingDeltas) { 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->ContentsZoomChange(event.wheelTicksY > 0); 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::PreHandleGestureEvent( 13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebGestureEvent& event) { 13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return delegate_ && delegate_->PreHandleGestureEvent(this, event); 13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool WebContentsImpl::HandleGestureEvent( 1331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const blink::WebGestureEvent& event) { 1332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Some platforms (eg. Mac) send GesturePinch events for trackpad pinch-zoom. 1333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Use them to implement browser zoom, as for HandleWheelEvent above. 1334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (event.type == blink::WebInputEvent::GesturePinchUpdate && 133546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) event.sourceDevice == blink::WebGestureDeviceTouchpad) { 1336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The scale difference necessary to trigger a zoom action. Derived from 1337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // experimentation to find a value that feels reasonable. 1338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const float kZoomStepValue = 0.6f; 1339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Find the (absolute) thresholds on either side of the current zoom factor, 1341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // then convert those to actual numbers to trigger a zoom in or out. 1342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This logic deliberately makes the range around the starting zoom value 1343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // for the gesture twice as large as the other ranges (i.e., the notches are 1344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // at ..., -3*step, -2*step, -step, step, 2*step, 3*step, ... but not at 0) 1345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // so that it's easier to get back to your starting point than it is to 1346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // overshoot. 1347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float nextStep = (abs(currentPinchZoomStepDelta_) + 1) * kZoomStepValue; 1348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float backStep = abs(currentPinchZoomStepDelta_) * kZoomStepValue; 1349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float zoomInThreshold = (currentPinchZoomStepDelta_ >= 0) ? nextStep 1350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : -backStep; 1351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float zoomOutThreshold = (currentPinchZoomStepDelta_ <= 0) ? -nextStep 1352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : backStep; 1353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 13545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu totalPinchGestureAmount_ += (event.data.pinchUpdate.scale - 1.0); 1355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (totalPinchGestureAmount_ > zoomInThreshold) { 1356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_++; 13570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (delegate_) 13580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->ContentsZoomChange(true); 1359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (totalPinchGestureAmount_ < zoomOutThreshold) { 1360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_--; 13610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (delegate_) 13620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->ContentsZoomChange(false); 1363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 1365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 1368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() { 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseDown(); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() { 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseUp(); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() { 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandlePointerActivate(); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() { 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureBegin(); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() { 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureEnd(); 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) { 1396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This method is being called to enter or leave renderer-initiated fullscreen 1397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // mode. Either way, make sure any existing fullscreen widget is shut down 1398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // first. 1399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostView* const widget_view = GetFullscreenRenderWidgetHostView(); 1400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (widget_view) 1401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostImpl::From(widget_view->GetRenderWidgetHost())->Shutdown(); 1402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen); 140523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 140623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 140723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) observers_, 140823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DidToggleFullscreenModeForTab(IsFullscreenForCurrentTab())); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const { 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false; 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture, 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(false); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() { 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostMouseLock(); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow( 1430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int render_process_id, 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int main_frame_route_id, 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_CreateWindow_Params& params, 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespace* session_storage_namespace) { 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We usually create the new window in the same BrowsingInstance (group of 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script-related windows), by passing in the current SiteInstance. However, 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the opener is being suppressed (in a non-guest), we create a new 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SiteInstance in its own BrowsingInstance. 1439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_guest = BrowserPluginGuest::IsGuest(this); 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the opener is to be suppressed, the new window can be in any process. 1442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Since routing ids are process specific, we must not have one passed in 1443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // as argument here. 1444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE); 1445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SiteInstance> site_instance = 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.opener_suppressed && !is_guest ? 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) : 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSiteInstance(); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A message to create a new window can only come from the active process for 1452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this WebContentsImpl instance. If any other process sends the request, 1453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // it is invalid and the process must be terminated. 1454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (GetRenderProcessHost()->GetID() != render_process_id) { 1455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessHandle process_handle = 1456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost::FromID(render_process_id)->GetHandle(); 1457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process_handle != base::kNullProcessHandle) { 1458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RecordAction( 14595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWindow")); 1460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::KillProcess(process_handle, content::RESULT_CODE_KILLED, false); 1461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must assign the SessionStorageNamespace before calling Init(). 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/142685 1468ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& partition_id = 1469ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetContentClient()->browser()-> 1470ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetStoragePartitionIdForSite(GetBrowserContext(), 1471ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch site_instance->GetSiteURL()); 1472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StoragePartition* partition = BrowserContext::GetStoragePartition( 1473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetBrowserContext(), site_instance.get()); 1474bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DOMStorageContextWrapper* dom_storage_context = 1475bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext()); 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespaceImpl* session_storage_namespace_impl = 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); 14793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 14803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (delegate_ && 14813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !delegate_->ShouldCreateWebContents(this, 14823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) route_id, 14833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.window_container_type, 14843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.frame_name, 14853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.target_url, 14863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) partition_id, 14873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) session_storage_namespace)) { 14885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (route_id != MSG_ROUTING_NONE && 14895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !RenderViewHost::FromID(render_process_id, route_id)) { 14905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the embedder didn't create a WebContents for this route, we need to 14915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // delete the RenderView that had already been created. 14925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_Close(route_id)); 14935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id); 14953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView( 14963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) main_frame_route_id); 14973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 14983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 14993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 15003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Create the new web contents. This will automatically create the new 15013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // WebContentsView. In the future, we may want to create the view separately. 1502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateParams create_params(GetBrowserContext(), site_instance.get()); 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = route_id; 1504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) create_params.main_frame_routing_id = main_frame_route_id; 1505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.opener = this; 1506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.opener_suppressed = params.opener_suppressed; 1507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.disposition == NEW_BACKGROUND_TAB) 1508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.initially_hidden = true; 1509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsImpl* new_contents = NULL; 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_guest) { 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.context = view_->GetNativeView(); 1513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) create_params.initial_size = GetContainerBounds().size(); 1514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new_contents = static_cast<WebContentsImpl*>( 1515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContents::Create(create_params)); 1516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 1517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new_contents = GetBrowserPluginGuest()->CreateNewGuestWindow(create_params); 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->GetController().SetSessionStorageNamespace( 1520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) partition_id, 1521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) session_storage_namespace); 1522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->RenderViewCreated(new_contents->GetRenderViewHost()); 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Save the window for later if we're not suppressing the opener (since it 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will be shown immediately). 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.opener_suppressed) { 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_guest) { 1528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsView* new_view = new_contents->view_.get(); 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(brettw): It seems bogus that we have to call this function on the 1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // newly created object and give it one of its own member variables. 1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created window associated with the route so we can show it 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(MSG_ROUTING_NONE, route_id); 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_[route_id] = new_contents; 153890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(new_contents); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebContentsCreated( 1543effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this, params.opener_render_frame_id, params.frame_name, 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.target_url, new_contents); 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.opener_suppressed) { 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the opener is suppressed, the original renderer cannot access the 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window. As a result, we need to show and navigate the window here. 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_blocked = false; 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect initial_pos; 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->AddNewContents( 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new_contents, params.disposition, initial_pos, 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.user_gesture, &was_blocked); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_blocked) { 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams open_params(params.target_url, 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(), 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* is_renderer_initiated */); 15637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch open_params.user_gesture = params.user_gesture; 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->OpenURL(open_params); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id, 1570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id, 1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type) { 1572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateNewWidget(render_process_id, route_id, false, popup_type); 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int render_process_id, 1576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id) { 1577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateNewWidget(render_process_id, route_id, true, blink::WebPopupTypeNone); 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id, 1581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id, 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 1583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type) { 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* process = GetRenderProcessHost(); 1585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A message to create a new widget can only come from the active process for 1586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this WebContentsImpl instance. If any other process sends the request, 1587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // it is invalid and the process must be terminated. 1588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process->GetID() != render_process_id) { 1589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessHandle process_handle = 1590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost::FromID(render_process_id)->GetHandle(); 1591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process_handle != base::kNullProcessHandle) { 1592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RecordAction( 15935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWidget")); 1594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::KillProcess(process_handle, content::RESULT_CODE_KILLED, false); 1595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* widget_host = 16003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new RenderWidgetHostImpl(this, process, route_id, IsHidden()); 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.insert(widget_host); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* widget_view = 1604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderWidgetHostViewBase*>( 1605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->CreateViewForPopupWidget(widget_host)); 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!widget_view) 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_fullscreen) { 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Popups should not get activated. 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_view->SetPopupType(popup_type); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created widget associated with the route so we can show it later. 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_[route_id] = widget_view; 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allow it to survive the trip without being hosted. 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(widget_view->GetNativeView()); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id, 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents = GetCreatedWindow(route_id); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate = GetDelegate(); 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) { 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNewContents( 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, contents, disposition, initial_pos, user_gesture, NULL); 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, false, initial_pos); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) { 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, true, gfx::Rect()); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 1648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* widget_host_view = 1649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id)); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host_view) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostView* view = NULL; 1654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 1655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (guest && guest->embedder_web_contents()) { 1656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view = guest->embedder_web_contents()->GetRenderWidgetHostView(); 1657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 1658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view = GetRenderWidgetHostView(); 1659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (is_fullscreen) { 16624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); 1663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->StoreFocus(); 16644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fullscreen_widget_routing_id_ = route_id; 1665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate_ && delegate_->EmbedsFullscreenWidget()) { 1666d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView()); 1667d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, true); 1668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 1669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) widget_host_view->InitAsFullscreen(view); 1670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 1672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) observers_, 1673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DidShowFullscreenWidget(route_id)); 1674d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!widget_host_view->HasFocus()) 1675d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->Focus(); 1676d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 1677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) widget_host_view->InitAsPopup(view, initial_pos); 1678d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host_impl = 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost()); 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->Init(); 16834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Only allow privileged mouse lock for fullscreen render widget, which is 16844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // used to implement Pepper Flash fullscreen. 16854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen); 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly embedded (or purposefully ignored) we can release the retain we 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // took in CreateNewWidget(). 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRelease(widget_host_view->GetNativeView()); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) { 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingContents::iterator iter = pending_contents_.find(route_id); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certain systems can block the creation of new windows. If we didn't succeed 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in creating one, just return NULL. 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_contents_.end()) { 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = iter->second; 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_.erase(route_id); 170690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(new_contents); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't initialize the guest WebContents immediately. 1709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (BrowserPluginGuest::IsGuest(new_contents)) 1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new_contents; 1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_contents->GetRenderProcessHost()->HasConnection() || 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !new_contents->GetRenderViewHost()->GetView()) 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): It seems bogus to reach into here and initialize the host. 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_widget_views_.end()) { 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* widget_host_view = iter->second; 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(route_id); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost(); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host->GetProcess()->HasConnection()) { 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view has gone away or the renderer crashed. Nothing to do. 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_host_view; 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission( 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaStreamRequest& request, 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MediaResponseCallback& callback) { 1743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (delegate_) { 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestMediaAccessPermission(this, request, callback); 1745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 1746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback.Run(MediaStreamDevices(), 1747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MEDIA_DEVICE_INVALID_STATE, 1748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MediaStreamUI>()); 1749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a3f7b4e666c476898878fa745f637129375cd889Ben MurdochSessionStorageNamespace* WebContentsImpl::GetSessionStorageNamespace( 1753a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SiteInstance* instance) { 1754a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return controller_.GetSessionStorageNamespace(instance); 1755a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 1756a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 175746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SessionStorageNamespaceMap WebContentsImpl::GetSessionStorageNamespaceMap() { 175846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return controller_.GetSessionStorageNamespaceMap(); 175946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 176046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FrameTree* WebContentsImpl::GetFrameTree() { 17624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return &frame_tree_; 17634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 17644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1765116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAccessibilityMode WebContentsImpl::GetAccessibilityMode() const { 1766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return accessibility_mode_; 1767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::AccessibilityEventReceived( 1770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<AXEventNotificationDetails>& details) { 1771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER( 1772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebContentsObserver, observers_, AccessibilityEventReceived(details)); 1773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnShowValidationMessage( 17765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view, 17775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& main_text, 17785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sub_text) { 17795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 17805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->ShowValidationMessage( 17815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, anchor_in_root_view, main_text, sub_text); 17825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnHideValidationMessage() { 17855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 17865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->HideValidationMessage(this); 17875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMoveValidationMessage( 17905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view) { 17915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 17925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->MoveValidationMessage(this, anchor_in_root_view); 17935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 179590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) { 179690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (browser_plugin_embedder_) 17977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_plugin_embedder_->DidSendScreenRects(); 179890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 179990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1800f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WebContentsImpl::OnTouchEmulationEnabled(bool enabled) { 1801f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) touch_emulation_enabled_ = enabled; 1802f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (view_) 1803f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 1804f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1805f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1806116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserAccessibilityManager* 1807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsImpl::GetRootBrowserAccessibilityManager() { 1808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); 1809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return rfh ? rfh->browser_accessibility_manager() : NULL; 1810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1812116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserAccessibilityManager* 1813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsImpl::GetOrCreateRootBrowserAccessibilityManager() { 1814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); 1815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return rfh ? rfh->GetOrCreateBrowserAccessibilityManager() : NULL; 1816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { 18195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size old_size = GetPreferredSize(); 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_ = pref_size; 18215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(old_size); 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) { 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ResizeDueToAutoResize(this, new_size); 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::OpenURL(const OpenURLParams& params) { 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = delegate_->OpenURLFromTab(this, params); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::Send(IPC::Message* message) { 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) { 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->Send(message); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToPendingEntry( 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 1848effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FrameTreeNode* node = frame_tree_.root(); 1849effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1850effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // If we are using --site-per-process, we should navigate in the FrameTreeNode 1851effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // specified in the pending entry. 1852effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NavigationEntryImpl* pending_entry = 1853effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()); 1854effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) && 1855effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pending_entry->frame_tree_node_id() != -1) { 1856effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch node = frame_tree_.FindByID(pending_entry->frame_tree_node_id()); 1857effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1858effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1859effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return node->navigator()->NavigateToPendingEntry( 1860effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch node->current_frame_host(), reload_type); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::RenderFrameForInterstitialPageCreated( 18645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHost* render_frame_host) { 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 18665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameForInterstitialPageCreated(render_frame_host)); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::AttachInterstitialPage( 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterstitialPageImpl* interstitial_page) { 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(interstitial_page); 1872f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->set_interstitial_page(interstitial_page); 187368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 187468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Cancel any visible dialogs so that they don't interfere with the 187568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // interstitial. 187668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (dialog_manager_) 187768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 187868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidAttachInterstitialPage()); 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DetachInterstitialPage() { 18845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (ShowingInterstitialPage()) 1885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->remove_interstitial_page(); 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDetachInterstitialPage()); 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetHistoryLengthAndPrune( 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SiteInstance* site_instance, 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int history_length, 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 minimum_page_id) { 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetHistoryLengthAndPrune doesn't work when there are pending cross-site 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigations. Callers should ensure that this is the case. 1896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_render_view_host()) { 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = GetRenderViewHostImpl(); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_instance && rvh->GetSiteInstance() != site_instance) { 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetHistoryLengthAndPrune(GetRoutingID(), 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_length, 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_page_id)); 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1914e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebContentsImpl::ReloadFocusedFrame(bool ignore_cache) { 1915c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1916c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1917c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1918c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_Reload( 1920c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), ignore_cache)); 1921c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1923c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Undo() { 1924c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1925c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1926c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1927c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Undo(focused_frame->GetRoutingID())); 1929c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Undo")); 1930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Redo() { 1933c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1934c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1935c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1936c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Redo(focused_frame->GetRoutingID())); 1937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Redo")); 1938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Cut() { 1941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1942c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1943c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1944c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1945c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Cut(focused_frame->GetRoutingID())); 1946c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Cut")); 1947c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1949c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Copy() { 1950c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1951c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1952c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1953c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1954c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Copy(focused_frame->GetRoutingID())); 1955c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Copy")); 1956c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1957c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1958c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::CopyToFindPboard() { 1959c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_MACOSX) 1960c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1961c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1962c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1963c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1964c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Windows/Linux don't have the concept of a find pasteboard. 1965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send( 1966c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new InputMsg_CopyToFindPboard(focused_frame->GetRoutingID())); 1967c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("CopyToFindPboard")); 1968c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 1969c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1970c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Paste() { 1972c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1973c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1974c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1975c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1976c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Paste(focused_frame->GetRoutingID())); 1977c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Paste")); 1978c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1979c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1980c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::PasteAndMatchStyle() { 1981c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1983c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1984c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1985c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_PasteAndMatchStyle( 1986c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID())); 1987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("PasteAndMatchStyle")); 1988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1989c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1990c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Delete() { 1991c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1992c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1993c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1994c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1995c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Delete(focused_frame->GetRoutingID())); 1996c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("DeleteSelection")); 1997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1998c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1999c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::SelectAll() { 2000c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2001c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2002c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2003c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2004c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_SelectAll(focused_frame->GetRoutingID())); 2005c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("SelectAll")); 2006c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2007c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2008c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Unselect() { 2009c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2010c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2012c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2013c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Unselect(focused_frame->GetRoutingID())); 2014c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Unselect")); 2015c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2016c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2017c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Replace(const base::string16& word) { 2018c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2019c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2020c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2021c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2022c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Replace( 2023c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), word)); 2024c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2025c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2026c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::ReplaceMisspelling(const base::string16& word) { 2027c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2028c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2029c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2030c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2031c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_ReplaceMisspelling( 2032c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), word)); 2033c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2034c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2035c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::NotifyContextMenuClosed( 2036c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const CustomContextMenuContext& context) { 2037c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2038c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2039c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2040c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2041c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_ContextMenuClosed( 2042c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), context)); 2043c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2044c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2045c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::ExecuteCustomContextMenuCommand( 2046c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int action, const CustomContextMenuContext& context) { 2047c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2048c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2049c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2050c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2051c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_CustomContextMenuAction( 2052c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), context, action)); 2053e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 2054e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 2055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeView WebContentsImpl::GetNativeView() { 2056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetNativeView(); 2057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeView WebContentsImpl::GetContentNativeView() { 2060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetContentNativeView(); 2061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeWindow WebContentsImpl::GetTopLevelNativeWindow() { 2064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetTopLevelNativeWindow(); 2065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Rect WebContentsImpl::GetViewBounds() { 2068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetViewBounds(); 2069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Rect WebContentsImpl::GetContainerBounds() { 2072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gfx::Rect rv; 2073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->GetContainerBounds(&rv); 2074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return rv; 2075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DropData* WebContentsImpl::GetDropData() { 2078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetDropData(); 2079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::Focus() { 2082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* const fullscreen_view = 2083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFullscreenRenderWidgetHostView(); 2084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_view) 2085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_view->Focus(); 2086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 2087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->Focus(); 2088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetInitialFocus() { 2091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* const fullscreen_view = 2092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFullscreenRenderWidgetHostView(); 2093116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_view) 2094116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_view->Focus(); 2095116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 2096116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->SetInitialFocus(); 2097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::StoreFocus() { 2100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!GetFullscreenRenderWidgetHostView()) 2101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->StoreFocus(); 2102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::RestoreFocus() { 2105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* const fullscreen_view = 2106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFullscreenRenderWidgetHostView(); 2107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_view) 2108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_view->Focus(); 2109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 2110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->RestoreFocus(); 2111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::FocusThroughTabTraversal(bool reverse) { 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 2115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->interstitial_page()->FocusThroughTabTraversal(reverse); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* const fullscreen_view = 2119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFullscreenRenderWidgetHostView(); 2120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_view) { 2121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_view->Focus(); 2122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 2123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->SetInitialFocus(reverse); 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShowingInterstitialPage() const { 2128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->interstitial_page() != NULL; 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPage* WebContentsImpl::GetInterstitialPage() const { 2132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->interstitial_page(); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsSavable() { 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit creates Document object when MIME type is application/xhtml+xml, 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we also support this MIME type. 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_ == "text/html" || 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/xml" || 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "application/xhtml+xml" || 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/plain" || 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/css" || 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IsSupportedJavascriptMimeType(contents_mime_type_.c_str()); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSavePage() { 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we can not save the page, try to download it. 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsSavable()) { 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordDownloadSource(INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML); 2150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SaveFrame(GetURL(), Referrer()); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the save package and possibly prompt the user for the name to save 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page as. The user prompt is an asynchronous operation that runs on 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another thread. 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_->GetSaveInfo(); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in automated testing to bypass prompting the user for file names. 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, the names and paths are hard coded rather than running them through 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file name sanitation and extension / mime checking. 21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::SavePage(const base::FilePath& main_file, 21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& dir_path, 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePageType save_type) { 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the page from navigating. 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this, save_type, main_file, dir_path); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return save_package_->Init(SavePackageDownloadCreatedCallback()); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::SaveFrame(const GURL& url, 2177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Referrer& referrer) { 2178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!GetURL().is_valid()) 2179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_main_frame = (url == GetURL()); 2181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadManager* dlm = 2183ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BrowserContext::GetDownloadManager(GetBrowserContext()); 2184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!dlm) 2185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int64 post_id = -1; 2187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (is_main_frame) { 21884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const NavigationEntry* entry = controller_.GetLastCommittedEntry(); 2189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (entry) 2190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch post_id = entry->GetPostID(); 2191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 2192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<DownloadUrlParameters> params( 2193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadUrlParameters::FromWebContents(this, url)); 2194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_referrer(referrer); 2195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_post_id(post_id); 2196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prefer_cache(true); 2197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (post_id >= 0) 2198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_method("POST"); 2199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prompt(true); 2200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch dlm->DownloadUrl(params.Pass()); 2201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 2202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML( 22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file, 2205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::Callback<void(int64)>& callback) { 2206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MHTMLGenerationManager::GetInstance()->SaveMHTML(this, file, callback); 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const { 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_; 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_disconnection_; 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() { 2223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canonical_encoding_.clear(); 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &renderer_preferences_; 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() { 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(GetRenderViewHost()); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceEndedAt(int client_x, int client_y, 2236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int screen_x, int screen_y, blink::WebDragOperation operation) { 2237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceEndedAt(client_x, client_y, 2239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 2240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 2241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceEndedAt(client_x, client_y, 2242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 2243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetResourceResponseStart( 22465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceRequestDetails& details) { 22475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_.ssl_manager()->DidStartResourceResponse(details); 22485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetResourceResponseStart(details)); 22515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 22535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotificationService::current()->Notify( 22545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTIFICATION_RESOURCE_RESPONSE_STARTED, 22555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Source<WebContents>(this), 22565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Details<const ResourceRequestDetails>(&details)); 22575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 22585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetRedirectForResourceRequest( 22605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host, 22615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceRedirectDetails& details) { 22625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_.ssl_manager()->DidReceiveResourceRedirect(details); 22635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 22655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 22665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 22675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetRedirectForResourceRequest(render_view_host, details)); 22685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 22705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotificationService::current()->Notify( 22715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, 22725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Source<WebContents>(this), 22735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Details<const ResourceRedirectDetails>(&details)); 22745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 22755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() { 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetRenderViewHost()) 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->DragSourceSystemDragEnded(); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DragEnded(); 2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 2282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->SystemDragEnded(); 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() { 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) { 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_ = value; 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const { 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closed_by_user_gesture_; 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() { 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = GetController().GetLastCommittedEntry(); 23024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!entry) 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate_->ViewSourceForTab(this, entry->GetURL()); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url, 230990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 231390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->ViewSourceForFrame(this, url, page_state); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const { 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return minimum_zoom_percent_; 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const { 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return maximum_zoom_percent_; 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const { 23255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return capturer_count_ == 0 ? preferred_size_ : preferred_size_for_capture_; 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { 2329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetBrowserPluginGuest()) 2330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetBrowserPluginGuest()->LockMouse(allowed); 2331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost() ? 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false; 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const { 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_ != NULL; 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) { 2341a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!color_chooser_info_.get()) 2342a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2343a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch RenderFrameHost* rfh = RenderFrameHost::FromID( 2344a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_process_id, 2345a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_frame_id); 2346a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!rfh) 2347a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2348a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2349a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->Send(new FrameMsg_DidChooseColorResponse( 2350a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->GetRoutingID(), color_chooser_info_->identifier, color)); 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidEndColorChooser() { 2354a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!color_chooser_info_.get()) 2355a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2356a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch RenderFrameHost* rfh = RenderFrameHost::FromID( 2357a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_process_id, 2358a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_frame_id); 2359a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!rfh) 2360a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2361a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2362a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->Send(new FrameMsg_DidEndColorChooser( 2363a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->GetRoutingID(), color_chooser_info_->identifier)); 2364a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_.reset(); 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int WebContentsImpl::DownloadImage(const GURL& url, 2368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_favicon, 2369d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uint32_t max_bitmap_size, 2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ImageDownloadCallback& callback) { 2371e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int id = StartDownload(GetMainFrame(), url, is_favicon, max_bitmap_size); 2372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_[id] = callback; 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id; 23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::IsSubframe() const { 23775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return is_subframe_; 23785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::Find(int request_id, 23815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& search_text, 23825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebFindOptions& options) { 23835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_Find(GetRoutingID(), request_id, search_text, options)); 23845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::StopFinding(StopFindAction action) { 23875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_StopFinding(GetRoutingID(), action)); 23885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::InsertCSS(const std::string& css) { 2391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetMainFrame()->Send(new FrameMsg_CSSInsertRequest( 2392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetMainFrame()->GetRoutingID(), css)); 2393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() { 23964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 2397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (entry && entry->GetURL() == GURL(url::kAboutBlankURL)) 23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this); 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) { 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SetFocusToLocationBar(select_all); 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoad( 2408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 2409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& validated_url, 2410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_error_page, 2411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_iframe_srcdoc) { 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the start of the provisional load. 2413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 2414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, 2415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 2416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidStartProvisionalLoadForFrame( 2417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host, validated_url, is_error_page, is_iframe_srcdoc)); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!render_frame_host->GetParent()) { 2420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER( 2421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsObserver, 2422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 2423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_url, 24245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host)); 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebContentsImpl::DidStartNavigationTransition( 24295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHostImpl* render_frame_host) { 24305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_ANDROID) 24315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int render_frame_id = render_frame_host->GetRoutingID(); 24326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GetWebContentsAndroid()->DidStartNavigationTransitionForFrame( 24336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) render_frame_id); 24345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 24355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 24365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 24375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError( 24385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 24395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) { 24405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL validated_url(params.url); 2441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(WebContentsObserver, 2442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 2443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidFailProvisionalLoad(render_frame_host, 2444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch validated_url, 2445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.error_code, 2446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.error_description)); 24475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailLoadWithError( 24505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 24515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 24525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int error_code, 24535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& error_description) { 2454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 2455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, 2456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 2457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidFailLoad(render_frame_host, url, error_code, error_description)); 24585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::NotifyChangedNavigationState( 2461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InvalidateTypes changed_flags) { 2462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NotifyNavigationStateChanged(changed_flags); 2463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 24655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::AboutToNavigateRenderFrame( 24665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host) { 24675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers that we will navigate in this RenderView. 246823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = render_frame_host->render_view_host(); 24695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 24705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 24715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 247223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) AboutToNavigateRenderView(render_view_host)); 24735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStartNavigationToPendingEntry( 24765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 24775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 24785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationController::ReloadType reload_type) { 24795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 24805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 24815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 24825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 24835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidStartNavigationToPendingEntry(url, reload_type)); 24845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderFrameHostImpl* render_frame_host, 2487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OpenURLParams& params) { 2488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int source_render_frame_id = render_frame_host->GetRoutingID(); 2489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebContents* new_contents = OpenURL(params); 2490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (new_contents) { 2492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Notify observers. 2493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidOpenRequestedURL(new_contents, 2495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url, 2496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.referrer, 2497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.disposition, 2498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.transition, 2499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) source_render_frame_id)); 2500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 25030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool WebContentsImpl::ShouldPreserveAbortedURLs() { 25040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!delegate_) 25050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 25060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return delegate_->ShouldPreserveAbortedURLs(this); 25070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 25080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidRedirectProvisionalLoad( 25105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 25115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& validated_target_url) { 25125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 25135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 25145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 25155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 25165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_target_url, 25175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host)); 25185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 25205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidCommitProvisionalLoad( 2521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 25225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 2523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PageTransition transition_type) { 25245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about the commit of the provisional load. 2525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(WebContentsObserver, 2526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 2527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidCommitProvisionalLoadForFrame( 2528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host, url, transition_type)); 25295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2531e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebContentsImpl::DidNavigateMainFramePreCommit( 2532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool navigation_is_within_page) { 2533e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ensure fullscreen mode is exited before committing the navigation to a 2534e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // different page. The next page will not start out assuming it is in 2535e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // fullscreen mode. 2536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (navigation_is_within_page) { 2537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // No page change? Then, the renderer and browser can remain in fullscreen. 2538e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 2539e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 2540e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (IsFullscreenForCurrentTab()) 2541e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch GetRenderViewHost()->ExitFullscreen(); 2542e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(!IsFullscreenForCurrentTab()); 2543e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 2544e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 25455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit( 25465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const LoadCommittedDetails& details, 25475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 25485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.is_navigation_to_different_page()) { 25495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clear the status bubble. This is a workaround for a bug where WebKit 25505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // doesn't let us know that the cursor left an element during a 25515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // transition (this is also why the mouse cursor remains as a hand after 25525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clicking on a link); see bugs 1184641 and 980803. We don't want to 25535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clear the bubble when a user navigates to a named anchor in the same 25545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page. 25555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateTargetURL(details.entry->GetPageID(), GURL()); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!details.is_in_page) { 25595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Once the main frame is navigated, we're no longer considered to have 25605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // displayed insecure content. 25615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) displayed_insecure_content_ = false; 25625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 25635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetController().GetBrowserContext()); 25645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 25655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 25665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidNavigateMainFrame(details, params)); 25695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (delegate_) 25715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->DidNavigateMainFramePostCommit(this); 2572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit( 25765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 25775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const LoadCommittedDetails& details, 25785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 25795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Now that something has committed, we don't need to track whether the 25805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // initial page has been accessed. 25815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_ = false; 25825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 25835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we navigate off the page, close all JavaScript dialogs. 25845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (dialog_manager_ && !details.is_in_page) 25855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 25885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidNavigateAnyFrame(details, params)); 25905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SetMainFrameMimeType(const std::string& mime_type) { 25935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_mime_type_ = mime_type; 25945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 259558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 259646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool WebContentsImpl::CanOverscrollContent() const { 2597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Disable overscroll when touch emulation is on. See crbug.com/369938. 2598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (touch_emulation_enabled_) 2599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 2600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 26025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return delegate_->CanOverscrollContent(); 26035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 26045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2607116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::OnThemeColorChanged(SkColor theme_color) { 26086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidChangeThemeColor(theme_color)); 26106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 26116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache( 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& http_method, 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 26175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResourceType resource_type) { 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatsCounter cache("WebKit.CacheHit"); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Increment(); 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out a notification that we loaded a resource from our memory cache. 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_id = 0; 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CertStatus cert_status = 0; 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int security_bits = -1; 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_status = 0; 2626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SignedCertificateTimestampIDStatusList signed_certificate_timestamp_ids; 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeserializeSecurityInfo(security_info, &cert_id, &cert_status, 2628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &security_bits, &connection_status, 2629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &signed_certificate_timestamp_ids); 2630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(alcutter,eranm): Pass signed_certificate_timestamp_ids into details 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadFromMemoryCacheDetails details( 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method, 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type, resource_type); 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 263558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) controller_.ssl_manager()->DidLoadFromMemoryCache(details); 263658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 263758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 263858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DidLoadResourceFromMemoryCache(details)); 263958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 264058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) { 264158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context( 26425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) resource_type == RESOURCE_TYPE_MEDIA ? 264358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetBrowserContext()->GetMediaRequestContextForRenderProcess( 264458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetRenderProcessHost()->GetID()) : 264558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetBrowserContext()->GetRequestContextForRenderProcess( 264658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetRenderProcessHost()->GetID())); 264758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::PostTask( 264858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::IO, 264958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 265058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&NotifyCacheOnIO, request_context, url, http_method)); 265158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() { 26555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.DisplayedInsecureContent")); 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent( 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_origin, const GURL& target_url) { 2663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << security_origin << " ran insecure content from " 2664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << target_url.possibly_invalid_spec(); 26655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.RanInsecureContent")); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EndsWith(security_origin, kDotGoogleDotCom, false)) 26675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.RanInsecureContentGoogle")); 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ssl_manager()->DidRunInsecureContent(security_origin); 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame() { 26755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(render_frame_message_source_); 26765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!render_view_message_source_); 26775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* rfh = 26785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 2680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, observers_, DocumentLoadedInFrame(rfh)); 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad( 2684effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& url) { 2685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!render_frame_message_source_) { 26865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("BadMessageTerminate_RVD2")); 26875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderProcessHost()->ReceivedBadMessage(); 26885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 26895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 26905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 26912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL validated_url(url); 2692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost* render_process_host = 2693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_message_source_->GetProcess(); 26945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_process_host->FilterURL(false, &validated_url); 2695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2696effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RenderFrameHostImpl* rfh = 2697effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 2699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, observers_, DidFinishLoad(rfh, validated_url)); 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidStartLoading(bool to_different_document) { 2703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It is possible to get multiple calls to OnDidStartLoading that don't have 2708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // corresponding calls to OnDidStopLoading: 2709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - With "swappedout://" URLs, this happens when a RenderView gets swapped 2710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // out for a cross-process navigation, and it turns into a placeholder for 2711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // one being rendered in a different process. 2712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - Also, there might be more than one RenderFrameHost sharing the same 2713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // FrameTreeNode (and thus sharing its ID) each sending a start. 2714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - But in the future, once clamy@ moves navigation network requests to the 2715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // browser process, there's a good chance that callbacks about starting and 2716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // stopping will all be handled by the browser. When that happens, there 2717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // should no longer be a start/stop call imbalance. TODO(avi): When this 2718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // future arrives, update this code to not allow this case. 2719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_GE(loading_frames_in_progress_, 0); 2720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_progresses_.find(render_frame_id) == loading_progresses_.end()) { 2721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidStartLoading(rfh, to_different_document); 2723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++loading_frames_in_progress_; 2724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = kMinimumLoadingProgress; 2727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidStopLoading() { 2731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_progresses_.find(render_frame_id) != loading_progresses_.end()) { 2736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Load stopped while we were still tracking load. Make sure we update 2737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // progress based on this frame's completion. 2738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = 1.0; 2739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Then we clean-up our states. 2741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_total_progress_ == 1.0) 2742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 2743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(japhet): This should be a DCHECK, but the pdf plugin sometimes 2746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // calls DidStopLoading() without a matching DidStartLoading(). 2747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) --loading_frames_in_progress_; 2750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidStopLoading(rfh); 2752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidChangeLoadProgress(double load_progress) { 2755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = load_progress; 2760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We notify progress change immediately for the first and last updates. 2762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Also, since the message loop may be pretty busy when a page is loaded, it 2763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // might not execute a posted task in a timely manner so we make sure to 2764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // immediately send progress report if enough time has passed. 2765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta min_delay = 2766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kMinimumDelayBetweenLoadingUpdatesMS); 2767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (load_progress == 1.0 || loading_last_progress_update_.is_null() || 2768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks::Now() - loading_last_progress_update_ > min_delay) { 2769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If there is a pending task to send progress, it is now obsolete. 2770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.InvalidateWeakPtrs(); 2771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_total_progress_ == 1.0) 2773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 2774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_weak_factory_.HasWeakPtrs()) 2778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 2781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 2782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&WebContentsImpl::SendLoadProgressChanged, 2783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.GetWeakPtr()), 2784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) min_delay); 2785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2786cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) { 2788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!delegate_ || delegate_->OnGoToEntryOffset(offset)) 2789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_.GoToOffset(offset); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent, 2793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int maximum_percent) { 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_ = minimum_percent; 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_ = maximum_percent; 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id, 27992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 28054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (policy->CanReadFile(GetRenderProcessHost()->GetID(), path)) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->EnumerateDirectory(this, request_id, path); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol, 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2811a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 2818868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (policy->IsPseudoScheme(protocol)) 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2820868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate_->RegisterProtocolHandler(this, protocol, url, user_gesture); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2824116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::OnUnregisterProtocolHandler(const std::string& protocol, 2825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 2826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool user_gesture) { 2827116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!delegate_) 2828116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 2829116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChildProcessSecurityPolicyImpl* policy = 2831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChildProcessSecurityPolicyImpl::GetInstance(); 2832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (policy->IsPseudoScheme(protocol)) 2833116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 2834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate_->UnregisterProtocolHandler(this, protocol, url, user_gesture); 2836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 2837116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id, 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindReply(this, request_id, number_of_matches, selection_rect, 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, final_update); 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply( 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version, 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::RectF>& rects, 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::RectF& active_rect) { 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindMatchRectsReply(this, version, rects, active_rect); 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnOpenDateTimeDialog( 28592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ViewHostMsg_DateTimeDialogValue_Params& value) { 28603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) date_time_chooser_->ShowDialog(ContentViewCore::FromWebContents(this), 28613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost(), 28623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.dialog_type, 2863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.dialog_value, 28643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.minimum, 28653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.maximum, 2866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.step, 2867a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.suggestions); 28682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id, 2873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::FilePath& path, 2874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_hung) { 2875a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1); 2876a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2877a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PluginHungStatusChanged(plugin_child_id, path, is_hung)); 2879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2881a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPluginCrashed(const base::FilePath& plugin_path, 28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId plugin_pid) { 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 28842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginCrashed(plugin_path, plugin_pid)); 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2887a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDomOperationResponse(const std::string& json_string, 2888a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int automation_id) { 2889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DomOperationNotificationDetails details(json_string, automation_id); 2890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotificationService::current()->Notify( 2891a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTIFICATION_DOM_OPERATION_RESPONSE, 2892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Source<WebContents>(this), 2893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Details<DomOperationNotificationDetails>(&details)); 2894a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url, 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheAccessed(manifest_url, blocked_by_policy)); 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser( 2904a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int color_chooser_id, 2905a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SkColor color, 2906a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::vector<ColorSuggestion>& suggestions) { 29070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ColorChooser* new_color_chooser = delegate_ ? 29080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->OpenColorChooser(this, color, suggestions) : 29090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NULL; 29105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!new_color_chooser) 291190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 2912a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_.get()) 2913a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 2914a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2915a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_.reset(new ColorChooserInfo( 2916a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_message_source_->GetProcess()->GetID(), 2917a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_message_source_->GetRoutingID(), 2918a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new_color_chooser, 2919a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id)); 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) { 2923a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_ && 2924a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id == color_chooser_info_->identifier) 2925a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id, 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 2930a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_ && 2931a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id == color_chooser_info_->identifier) 2932a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->SetSelectedColor(color); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled. 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url, 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& args) { 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebUISend(this, source_url, name, args); 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission( 29453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int routing_id, 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 29472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path) { 29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_) { 29493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_->RequestPpapiBrokerPermission( 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, url, plugin_path, 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult, 29563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch base::Unretained(this), routing_id))) { 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 29583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WebContentsImpl::OnPpapiBrokerPermissionResult(int routing_id, 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result) { 29643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch Send(new ViewMsg_PpapiBrokerPermissionResult(routing_id, result)); 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnBrowserPluginMessage(const IPC::Message& message) { 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin 29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // specific messages for this WebContents. This means that any message from 29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a BrowserPlugin prior to this will be ignored. 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above classes BrowserPluginEmbedder and 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginGuest. 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!browser_plugin_embedder_.get()); 29742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this)); 29752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_->OnMessageReceived(message); 29762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::OnDidDownloadImage( 29792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 298090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int http_status_code, 29812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& image_url, 2982d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<SkBitmap>& bitmaps, 2983d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<gfx::Size>& original_bitmap_sizes) { 29845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bitmaps.size() != original_bitmap_sizes.size()) 29855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 29865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageDownloadMap::iterator iter = image_download_map_.find(id); 2988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iter == image_download_map_.end()) { 29892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently WebContents notifies us of ANY downloads so that it is 29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // possible to get here. 29912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 29922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!iter->second.is_null()) { 2994d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) iter->second.Run( 2995d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) id, http_status_code, image_url, bitmaps, original_bitmap_sizes); 29962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_.erase(id); 29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnUpdateFaviconURL( 30012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<FaviconURL>& candidates) { 30022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3003010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DidUpdateFaviconURL(candidates)); 30042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, 30075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_video, 30085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_audio) { 3009ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_CHROMEOS) 30105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<PowerSaveBlocker> blocker; 30115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (has_video) { 30125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocker = PowerSaveBlocker::Create( 30135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing video"); 3014ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID) 30155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<PowerSaveBlockerImpl*>(blocker.get()) 30165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->InitDisplaySleepBlocker(GetView()->GetNativeView()); 3017ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 30185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (has_audio) { 30195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocker = PowerSaveBlocker::Create( 30205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing audio"); 30215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3022ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 30235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (blocker) { 30246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_); 30256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!power_save_blockers_.contains(key)) { 30266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) power_save_blockers_.add(key, 30276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) make_scoped_ptr(new PowerSaveBlockerMapEntry)); 30286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 30296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PowerSaveBlockerMapEntry* map_entry = 30306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) power_save_blockers_.get(key); 30316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) map_entry->set(player_cookie, blocker.Pass()); 3032ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 3033ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // !defined(OS_CHROMEOS) 3034ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3035ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 30365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) { 30375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_CHROMEOS) 30386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_); 30396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PowerSaveBlockerMapEntry* map_entry = power_save_blockers_.get(key); 30406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (map_entry) 30416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) map_entry->erase(player_cookie); 30425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 30435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 30445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3045010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::OnFirstVisuallyNonEmptyPaint() { 3046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DidFirstVisuallyNonEmptyPaint()); 3048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3049ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 30502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidChangeVisibleSSLState() { 305146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (delegate_) 305246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delegate_->VisibleSSLStateChanged(this); 30532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifyBeforeFormRepostWarningShow() { 30562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 30572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeforeFormRepostWarningShow()); 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 30611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::ActivateAndShowRepostFormWarningDialog() { 30621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Activate(); 30631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate_) 30641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate_->ShowRepostFormWarningDialog(this); 30651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 30661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 30675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool WebContentsImpl::HasAccessedInitialDocument() { 30685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return has_accessed_initial_document_; 30695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 30705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is 30724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// loading, or done loading. 30734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::SetIsLoading(RenderViewHost* render_view_host, 30744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool is_loading, 3075effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document, 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNotificationDetails* details) { 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading == is_loading_) 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading) { 3081a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE, 3082a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_.clear(); 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = 0; 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = 0; 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3088f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->SetIsLoading(is_loading); 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = is_loading; 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_ = is_loading; 3092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_load_to_different_document_ = to_different_document; 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 3095effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch delegate_->LoadingStateChanged(this, to_different_document); 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD); 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string url = (details ? details->url.possibly_invalid_spec() : "NULL"); 30994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (is_loading) { 3100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN1("browser", "WebContentsImpl Loading", this, 3101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "URL", url); 31024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DidStartLoading(render_view_host)); 31044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 3105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT_ASYNC_END1("browser", "WebContentsImpl Loading", this, 3106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "URL", url); 31074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DidStopLoading(render_view_host)); 31094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 31104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP; 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDetails det = NotificationService::NoDetails(); 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details) 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) det = Details<LoadNotificationDetails>(details); 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, Source<NavigationController>(&controller_), det); 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::SelectRange(const gfx::Point& start, 3121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Point& end) { 3122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 3123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 3124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 3125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send( 3127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new InputMsg_SelectRange(focused_frame->GetRoutingID(), start, end)); 3128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) { 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are creating a RVH for a restored controller, then we need to make 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the RenderView starts with a next_page_id_ larger than the number 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of restored entries. This must be called before the RenderView starts 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating (to avoid a race between the browser updating max_page_id and 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the renderer updating next_page_id_). Because of this, we only call this 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from CreateRenderView and allow that to notify the RenderView for us. 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_restored_page_id = controller_.GetMaxRestoredPageID(); 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_restored_page_id > 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(rvh->GetSiteInstance())) 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(), 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_restored_page_id); 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry, 3145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For file URLs without a title, use the pathname instead. In the case of a 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synthesized title, we don't want the update to count toward the "one set 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per page of the title to history." 3149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 final_title; 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool explicit_set; 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry && entry->GetURL().SchemeIsFile() && title.empty()) { 31525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final_title = base::UTF8ToUTF16(entry->GetURL().ExtractFileName()); 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = false; // Don't count synthetic titles toward the set limit. 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(title, base::TRIM_ALL, &final_title); 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = true; 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a page is created via window.open and never navigated, 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there will be no navigation entry. In this situation, 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| will be used for page title. 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_title == entry->GetTitle()) 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTitle(final_title); 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_title_when_no_navigation_entry_ == final_title) 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_title_when_no_navigation_entry_ = final_title; 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, set the title for the view. 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetPageTitle(final_title); 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TitleWasSet(entry, explicit_set)); 31794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<NavigationEntry*, bool> details = 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(entry, explicit_set); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<NavigationEntry*, bool> >(&details)); 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::SendLoadProgressChanged() { 3192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_last_progress_update_ = base::TimeTicks::Now(); 3193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double progress = 0.0; 3194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int frame_count = 0; 3195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (LoadingProgressMap::iterator it = loading_progresses_.begin(); 3197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != loading_progresses_.end(); 3198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 3199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress += it->second; 3200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++frame_count; 3201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 3202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (frame_count == 0) 3203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress /= frame_count; 3205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(progress <= 1.0); 3206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (progress <= loading_total_progress_) 3208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_ = progress; 3210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (delegate_) 3212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate_->LoadProgressChanged(this, progress); 3213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::ResetLoadProgressState() { 3216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_.clear(); 3217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_ = 0.0; 3218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.InvalidateWeakPtrs(); 3219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_last_progress_update_ = base::TimeTicks(); 3220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3222116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::NotifyViewSwapped(RenderViewHost* old_host, 3223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderViewHost* new_host) { 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After sending out a swap notification, we need to send a disconnect 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification so that clients that pick up a pointer to |this| can NULL the 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer. See Bug 1230284. 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 322858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 32294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHostChanged(old_host, new_host)); 323058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 323158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 32324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::pair<RenderViewHost*, RenderViewHost*> details = 32334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::make_pair(old_host, new_host); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 32354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTIFICATION_RENDER_VIEW_HOST_CHANGED, 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 32374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Details<std::pair<RenderViewHost*, RenderViewHost*> >(&details)); 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that the associated embedder gets cleared after a RenderViewHost 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets swapped, so we don't reuse the same embedder next time a 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is attached to this WebContents. 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveBrowserPluginEmbedder(); 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::NotifyFrameSwapped(RenderFrameHost* old_host, 3246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* new_host) { 3247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(WebContentsObserver, 3248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 3249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostChanged(old_host, new_host)); 3250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 325258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(avi): Remove this entire function because this notification is already 325358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// covered by two observer functions. http://crbug.com/170921 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() { 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notify_disconnection_) 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = false; 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::NotifyNavigationEntryCommitted( 3266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const LoadCommittedDetails& load_details) { 3267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FOR_EACH_OBSERVER( 3268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContentsObserver, observers_, NavigationEntryCommitted(load_details)); 3269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderFrameHost* render_frame_host, 3272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const IPC::Message& message) { 3273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return OnMessageReceived(NULL, render_frame_host, message); 3274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst GURL& WebContentsImpl::GetMainFrameLastCommittedURL() const { 3277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetLastCommittedURL(); 3278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameCreated(RenderFrameHost* render_frame_host) { 3281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Note this is only for subframes, the notification for the main frame 3282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // happens in RenderViewCreated. 3283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 3285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameCreated(render_frame_host)); 3286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAccessibilityModeOnFrame(accessibility_mode_, render_frame_host); 3287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) { 3290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClearPowerSaveBlockers(render_frame_host); 3291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 3293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameDeleted(render_frame_host)); 3294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 32965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::WorkerCrashed(RenderFrameHost* render_frame_host) { 32975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 32985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->WorkerCrashed(this); 32995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ShowContextMenu(RenderFrameHost* render_frame_host, 33025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ContextMenuParams& params) { 3303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ContextMenuParams context_menu_params(params); 33045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Allow WebContentsDelegates to handle the context menu operation first. 3305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetBrowserPluginGuest()) { 3306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebContentsViewGuest* view_guest = 3307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<WebContentsViewGuest*>(GetView()); 3308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_menu_params = view_guest->ConvertContextMenuParams(params); 3309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 3310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (delegate_ && delegate_->HandleContextMenu(context_menu_params)) 33115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 33125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_host_delegate_view_->ShowContextMenu(render_frame_host, 3314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_menu_params); 33155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::RunJavaScriptMessage( 3318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host, 3319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 3320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& default_prompt, 3321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& frame_url, 3322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch JavaScriptMessageType javascript_message_type, 3323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg) { 3324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Suppress JavaScript dialogs when requested. Also suppress messages when 3325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // showing an interstitial as it's shown over the previous page and we don't 3326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // want the hidden page's dialogs to interfere with the interstitial. 3327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool suppress_this_message = 3328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderViewHostImpl*>(render_frame_host->GetRenderViewHost())-> 3329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IsSwappedOut() || 3330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ShowingInterstitialPage() || 3331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_ || 3332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->ShouldSuppressDialogs() || 3333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_->GetJavaScriptDialogManager(); 3334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!suppress_this_message) { 3336c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string accept_lang = GetContentClient()->browser()-> 3337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetAcceptLangs(GetBrowserContext()); 3338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 3339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_->RunJavaScriptDialog( 3340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, 3341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_url.GetOrigin(), 3342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch accept_lang, 3343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch javascript_message_type, 3344c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message, 3345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch default_prompt, 3346c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&WebContentsImpl::OnDialogClosed, 3347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Unretained(this), 3348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetProcess()->GetID(), 3349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), 3350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reply_msg, 3351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch false), 3352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &suppress_this_message); 3353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (suppress_this_message) { 3356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If we are suppressing messages, just reply as if the user immediately 3357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // pressed "Cancel", passing true to |dialog_was_suppressed|. 3358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnDialogClosed(render_frame_host->GetProcess()->GetID(), 3359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), reply_msg, 33605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu true, false, base::string16()); 3361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // OnDialogClosed (two lines up) may have caused deletion of this object (see 3364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // http://crbug.com/288961 ). The only safe thing to do here is return. 3365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::RunBeforeUnloadConfirm( 3368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host, 3369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 3370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_reload, 3371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg) { 3372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHostImpl* rfhi = 3373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_host); 3374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderViewHostImpl* rvhi = 3375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderViewHostImpl*>(render_frame_host->GetRenderViewHost()); 3376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (delegate_) 3377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->WillRunBeforeUnloadConfirm(); 3378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool suppress_this_message = 3380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch rvhi->rvh_state() != RenderViewHostImpl::STATE_DEFAULT || 3381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_ || 3382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->ShouldSuppressDialogs() || 3383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_->GetJavaScriptDialogManager(); 3384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (suppress_this_message) { 3385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch rfhi->JavaScriptDialogClosed(reply_msg, true, base::string16(), true); 3386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 3387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_showing_before_unload_dialog_ = true; 3390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 3391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_->RunBeforeUnloadDialog( 3392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, message, is_reload, 3393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), 3394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetProcess()->GetID(), 3395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), reply_msg, 33965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu false)); 3397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 33995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() { 34005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return this; 34015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 34025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool WebContentsImpl::IsNeverVisible() { 34040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!delegate_) 34050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 34060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return delegate_->IsNeverVisible(this); 34070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 34080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) 3410116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { 3411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return accessible_parent_; 3412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 3414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_view_host_delegate_view_; 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs( 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context) const { 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_; 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetRootWindowResizerRect(); 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() { 3431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_) 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_.reset(); 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send notifications if we are just creating a swapped-out RVH for 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the opener chain. These won't be used for view-source or WebUI, so it's 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ok to return early. 34395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(render_view_host)->IsSwappedOut()) 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 3443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 34442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<RenderViewHost>(render_view_host)); 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're creating views, we're still doing initial setup, so we always 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the pending Web UI rather than any possibly existing committed one. 3452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_web_ui()) 3453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_web_ui()->RenderViewCreated(render_view_host); 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetPendingEntry(); 3456424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (entry && entry->IsViewSourceMode()) { 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put the renderer in view source mode. 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->Send( 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID())); 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->RenderViewCreated(render_view_host); 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, observers_, RenderViewCreated(render_view_host)); 3466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We tell the observers now instead of when the main RenderFrameHostImpl is 3468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // constructed because otherwise it would be too early (i.e. IPCs sent to the 3469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // frame would be dropped because it's not created yet). 3470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* main_frame = render_view_host->GetMainFrame(); 3471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER( 3472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsObserver, observers_, RenderFrameCreated(main_frame)); 3473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAccessibilityModeOnFrame(accessibility_mode_, main_frame); 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify the world, since this came from a renderer in the 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 348358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notify_disconnection_ = true; 348458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 348558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NotificationService::current()->Notify( 348658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTIFICATION_WEB_CONTENTS_CONNECTED, 348758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Source<WebContents>(this), 348858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NotificationService::NoDetails()); 348958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_crashed = IsCrashed(); 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0); 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the focus to the tab (otherwise the focus will be on the top 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window). 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_crashed && !FocusLocationBarByDefault() && 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) { 34972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Focus(); 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady()); 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, 3504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TerminationStatus status, 3505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int error_code) { 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pending page's RenderViewHost is gone. 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure fullscreen mode is exited in the |delegate_| since a crashed 3512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // renderer may not have made a clean exit. 3513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsFullscreenForCurrentTab()) 3514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ToggleFullscreenMode(false); 3515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cancel any visible dialogs so they are not left dangling over the sad tab. 3517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dialog_manager_) 3518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 3519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (delegate_) 3521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate_->HideValidationMessage(this); 3522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3523effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(rvh, false, true, NULL); 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(status, error_code); 3526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Reset the loading progress. TODO(avi): What does it mean to have a 3528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // "renderer crash" when there is more than one renderer process serving a 3529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // webpage? Once this function is called at a more granular frame level, we 3530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // probably will need to more granularly reset the state here. 3531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 3532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_frames_in_progress_ = 0; 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 35367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RenderProcessGone(GetCrashedStatus())); 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh, 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 354590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that this state update comes from either the active RVH or one of 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the swapped out RVHs. We don't expect to hear from any other RVHs. 35485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(nasko): This should go through RenderFrameHost. 35495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(creis): We can't update state for cross-process subframes until we 35505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have FrameNavigationEntries. Once we do, this should be a DCHECK. 35515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rvh != GetRenderViewHost() && 35525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetRenderManager()->IsRVHOnSwappedOutList( 35535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderViewHostImpl*>(rvh))) 35545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must be prepared to handle state updates for any page, these occur 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the user is scrolling and entering form data, as well as when we're 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leaving a page, in which case our state may have already been moved to 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the next page. The navigation controller will look up the appropriate 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationEntry and update it when it is notified via the delegate. 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entry_index = controller_.GetEntryIndexWithPageID( 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_index < 0) 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 356890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (page_state == entry->GetPageState()) 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 357090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) entry->SetPageState(page_state); 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.NotifyEntryChanged(entry, entry_index); 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) { 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->UpdateTargetURL(this, page_id, url); 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) { 35802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The UI may be in an event-tracking loop, such as between the 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse-down and mouse-up in text selection or a button click. 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer the close until after tracking is complete, so that we 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't free objects out from under the UI. 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(shess): This could get more fine-grained. For instance, 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing a tab in another window while selecting text in the 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current window's Omnibox should be just fine. 35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_->IsEventTracking()) { 35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CloseTabAfterEventTracking(); 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore this if it comes from a RenderViewHost that we aren't showing. 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->CloseContents(this); 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3599effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsImpl::SwappedOut(RenderFrameHost* rfh) { 3600e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (delegate_ && rfh->GetRenderViewHost() == GetRenderViewHost()) 3601e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch delegate_->SwappedOut(this); 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebContentsImpl::DidDeferAfterResponseStarted( 36056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const TransitionLayerData& transition_data) { 3606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_ANDROID) 36076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GetWebContentsAndroid()->DidDeferAfterResponseStarted(transition_data); 3608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 3609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3611116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebContentsImpl::WillHandleDeferAfterResponseStarted() { 3612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_ANDROID) 36136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return GetWebContentsAndroid()->WillHandleDeferAfterResponseStarted(); 3614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 3615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 3616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 3617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) { 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->IsPopupOrPanel(this)) 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->MoveContents(this, new_bounds); 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3624effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsImpl::DidStartLoading(RenderFrameHost* render_frame_host, 3625effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document) { 3626effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(render_frame_host->GetRenderViewHost(), true, 3627effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch to_different_document, NULL); 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderFrameHost* render_frame_host) { 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoadNotificationDetails> details; 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use the last committed entry rather than the active one, in case a 3634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pending entry has been created. 3635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 36365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Navigator* navigator = frame_tree_.root()->navigator(); 3637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An entry may not exist for a stop when loading an initial blank page or 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if an iframe injected by script into a blank page finishes loading. 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 36415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta elapsed = 36425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks::Now() - navigator->GetCurrentLoadStart(); 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.reset(new LoadNotificationDetails( 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetVirtualURL(), 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType(), 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elapsed, 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &controller_, 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetCurrentEntryIndex())); 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3652effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(render_frame_host->GetRenderViewHost(), false, true, 3653effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch details.get()); 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() { 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the URL display. 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::DidAccessInitialDocument() { 36645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_ = true; 36655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 36660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // We may have left a failed browser-initiated navigation in the address bar 36670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // to let the user edit it and try again. Clear it now that content might 36680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // show up underneath it. 36690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!IsLoading() && controller_.GetPendingEntry()) 36700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch controller_.DiscardPendingEntry(); 36710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Update the URL display. 3673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL); 3674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DidDisownOpener(RenderFrameHost* render_frame_host) { 3677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (opener_) { 3678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Clear our opener so that future cross-process navigations don't have an 3679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // opener assigned. 3680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RemoveDestructionObserver(opener_); 3681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) opener_ = NULL; 3682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Notify all swapped out RenderViewHosts for this tab. This is important 3685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // in case we go back to them, or if another window in those processes tries 3686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // to access window.opener. 3687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetRenderManager()->DidDisownOpener(render_frame_host->GetRenderViewHost()); 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompleted( 3691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host) { 36924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DocumentOnLoadCompletedInMainFrame()); 36944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 3699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotificationService::NoDetails()); 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderFrameHost* render_frame_host, 3703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 page_id, 3704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::string16& title, 3705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::i18n::TextDirection title_direction) { 3706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewHost* rvh = render_frame_host->GetRenderViewHost(); 3707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If we have a title, that's a pretty good indication that we've started 3709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // getting useful data. 3710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetNotWaitingForResponse(); 3711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Try to find the navigation entry, which might not be the current one. 3713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For example, it might be from a pending RVH for the pending entry. 3714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NavigationEntryImpl* entry = controller_.GetEntryWithPageID( 3715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 3716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We can handle title updates when we don't have an entry in 3718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // UpdateTitleForEntry, but only if the update is from the current RVH. 3719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(avi): Change to make decisions based on the RenderFrameHost. 3720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!entry && rvh != GetRenderViewHost()) 3721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(evan): make use of title_direction. 3724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=27094 3725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!UpdateTitleForEntry(entry, title)) 3726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Broadcast notifications when the UI should be updated. 3729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (entry == controller_.GetEntryAtOffset(0)) 3730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); 3731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderFrameHost* render_frame_host, 3734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& encoding) { 3735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetEncoding(encoding); 3736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame( 3739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderViewHost* render_view_host) { 3740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DocumentAvailableInMainFrame()); 3742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the active RenderViewHost to run unload handlers and close, as long 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the request came from a RenderViewHost in the same BrowsingInstance. 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->ClosePage(); 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent( 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only deliver the message to the active RenderViewHost if the request 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // came from a RenderViewHost in the same BrowsingInstance or if this 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents is dedicated to a browser plugin guest. 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This check means that an embedder could theoretically receive a 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // postMessage from anyone (not just its own guests). However, this is 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probably not a risk for apps since other pages won't have references 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to App windows. 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params new_params(params); 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!params.message_port_ids.empty()) { 37708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MessagePortMessageFilter* message_port_message_filter = 37718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static_cast<RenderProcessHostImpl*>(GetRenderProcessHost()) 37728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ->message_port_message_filter(); 3773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) message_port_message_filter->UpdateMessagePortsWithNewRoutes( 3774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.message_port_ids, 3775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &new_params.new_routing_ids); 37768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 37778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a source_routing_id, translate it to the routing ID for 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the equivalent swapped out RVH in the target process. If we need 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to create a swapped out RVH for the source tab, we create its opener 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chain as well, since those will also be accessible to the target page. 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_params.source_routing_id != MSG_ROUTING_NONE) { 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to look up the WebContents for the source page. 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* source_contents = NULL; 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID(), params.source_routing_id); 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_rvh) { 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents = static_cast<WebContentsImpl*>( 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_rvh->GetDelegate()->GetAsWebContents()); 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_contents) { 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBrowserPluginGuest()) { 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create a swapped out RenderView for the embedder in the guest's 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // render process but we intentionally do not expose the embedder's 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener chain to it. 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateSwappedOutRenderView(GetSiteInstance()); 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateOpenerRenderViews(GetSiteInstance()); 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We couldn't find it, so don't pass a source frame. 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = MSG_ROUTING_NONE; 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level, 3816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message, 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 3818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& source_id) { 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AddMessageToConsole(this, level, message, line_no, 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_id); 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)WebPreferences WebContentsImpl::ComputeWebkitPrefs() { 38264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We want to base the page config off of the actual URL, rather than the 38274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // virtual URL. 38284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(nasko): Investigate how to remove the GetActiveEntry usage here, 38294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // as it is deprecated and can be out of sync with GetRenderViewHost(). 383068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GURL url = controller_.GetActiveEntry() 383168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); 38321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 38336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return GetRenderManager()->current_host()->ComputeWebkitPrefs(url); 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView( 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 38385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return GetRenderManager()->CreateRenderFrame( 38395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) instance, MSG_ROUTING_NONE, true, true, true); 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() { 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh) // NULL in unittests. 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rdh->OnUserGesture(this); 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() { 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent()); 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh, 38573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_during_beforeunload, 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_during_unload) { 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't show hung renderer dialog for a swapped out RVH. 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore renderer unresponsive event if debugger is attached to the tab 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the event may be a result of the renderer sitting on a breakpoint. 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/65458 38682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (DevToolsAgentHost::IsDebuggerAttached(this)) 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (is_during_beforeunload || is_during_unload) { 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hang occurred while firing the beforeunload/unload handler. 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend the handler fired so tab closing continues as if it had. 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->set_sudden_termination_allowed(true); 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer()) 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab hangs in the beforeunload/unload handler there's really 38803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // nothing we can do to recover. If the hang is in the beforeunload handler, 38813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // pretend the beforeunload listeners have all fired and allow the delegate 38823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // to continue closing; the user will not have the option of cancelling the 38833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // close. Otherwise, pretend the unload listeners have all fired and close 38843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the tab. 38853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool close = true; 38860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (is_during_beforeunload && delegate_) { 38873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) delegate_->BeforeUnloadFired(this, true, &close); 38883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 38893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (close) 38903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Close(rvh); 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive()) 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererUnresponsive(this); 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) { 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererResponsive(this); 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged( 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::LoadStateWithParam& load_state, 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_position, 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_size) { 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = load_state; 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = upload_position; 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = upload_size; 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_ = net::IDNToUnicode(url.host(), 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext())); 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_state_.state == net::LOAD_STATE_READING_RESPONSE) 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsLoading()) { 39206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NotifyNavigationStateChanged(static_cast<InvalidateTypes>( 39216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB)); 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager( 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, const base::TimeTicks& proceed_time, 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 39287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 39297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadFired(proceed_time)); 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload); 3932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note: |this| might be deleted at this point. 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebContentsImpl::RenderProcessGoneFromRenderManager( 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING); 3938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderViewTerminated(render_view_host, crashed_status_, crashed_error_code_); 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() { 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this is a hack. See WebContentsView::SizeContents. 3943424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size = GetSizeForNewRenderView(); 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here during container initialization and normal window size will be set 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. In case of tab duplication this resizing to 0x0 prevents setting 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal size later so just ignore it. 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!size.IsEmpty()) 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SizeContents(size); 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::CancelModalDialogsForRenderManager() { 39534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We need to cancel modal dialogs when doing a process swap, since the load 39544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // deferrer would prevent us from swapping out. 39554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (dialog_manager_) 39564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 39574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 39584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3959116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::NotifySwappedFromRenderManager(RenderFrameHost* old_host, 3960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* new_host, 3961116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_main_frame) { 3962116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (is_main_frame) { 3963116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NotifyViewSwapped(old_host ? old_host->GetRenderViewHost() : NULL, 3964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new_host->GetRenderViewHost()); 39652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Make sure the visible RVH reflects the new delegate's preferences. 3967116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (delegate_) 3968116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 3969116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->RenderViewSwappedIn(new_host->GetRenderViewHost()); 3971116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 39722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3973116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NotifyFrameSwapped(old_host, new_host); 39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager( 39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_) 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recursively create RenderViews for anything else in the opener chain. 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_->CreateOpenerRenderViews(instance); 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opener_route_id = MSG_ROUTING_NONE; 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this tab has an opener, ensure it has a RenderView in the given 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance as well. 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_) 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id = opener_->CreateOpenerRenderViews(instance); 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any of the renderers (current, pending, or swapped out) for this 39942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents has the same SiteInstance, use it. 3995f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->current_host()->GetSiteInstance() == instance) 3996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetRoutingID(); 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_render_view_host() && 3999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_render_view_host()->GetSiteInstance() == 4000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) instance) 4001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->pending_render_view_host()->GetRoutingID(); 40022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostImpl* rvh = GetRenderManager()->GetSwappedOutRenderViewHost( 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance); 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetRoutingID(); 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a swapped out RenderView in the given SiteInstance if none exists, 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setting its opener to the given route_id. Return the new view's route_id. 40105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return GetRenderManager()->CreateRenderFrame( 40115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) instance, opener_route_id, true, true, true); 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetController(); 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebUIImpl*>(CreateWebUI(url)); 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry* 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() { 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetLastCommittedEntry(); 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager( 40285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host, 40295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int opener_route_id, 4030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int proxy_routing_id, 40315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool for_main_frame_navigation) { 40327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateRenderViewForRenderManager"); 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 4034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* rwh_view; 40355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary 40365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // until RenderWidgetHost is attached to RenderFrameHost. We need to special 40375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // case this because RWH is still a base class of RenderViewHost, and child 40385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // frame RWHVs are unique in that they do not have their own WebContents. 40395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!for_main_frame_navigation) { 40405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostViewChildFrame* rwh_view_child = 40415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new RenderWidgetHostViewChildFrame(render_view_host); 40425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwh_view = rwh_view_child; 40435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 40445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwh_view = view_->CreateViewForWidget(render_view_host); 40455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the RenderView has been created, we need to tell it its size. 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 4049424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) rwh_view->SetSize(GetSizeForNewRenderView()); 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we use the correct starting page_id in the new RenderView. 40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDIfNecessary(render_view_host); 40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 max_page_id = 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance()); 40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<RenderViewHostImpl*>( 4057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_host)->CreateRenderView(base::string16(), 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id, 4059cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) proxy_routing_id, 40600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch max_page_id, 40610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch created_with_opener_)) { 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 406568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a ViewMsg_Resize to be sent, needed to make plugins show up on 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // linux. See crbug.com/83941. 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) { 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost()) 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host->WasResized(); 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool WebContentsImpl::CreateRenderFrameForRenderManager( 40785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHost* render_frame_host, 40795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int parent_routing_id) { 40805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateRenderFrameForRenderManager"); 40815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 40825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHostImpl* rfh = 40835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_host); 40845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!rfh->CreateRenderFrame(parent_routing_id)) 40855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 40865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 40875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(nasko): When RenderWidgetHost is owned by RenderFrameHost, the passed 40885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // RenderFrameHost will have to be associated with the appropriate 40895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // RenderWidgetHostView or a new one should be created here. 40905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 40915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 40925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 40935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 40943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID) 4095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4096a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> 4097a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebContentsImpl::GetJavaWebContents() { 4098a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 40996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return GetWebContentsAndroid()->GetJavaObject(); 41006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 4101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 41026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)WebContentsAndroid* WebContentsImpl::GetWebContentsAndroid() { 4103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsAndroid* web_contents_android = 4104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<WebContentsAndroid*>(GetUserData(kWebContentsAndroidKey)); 4105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!web_contents_android) { 4106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_contents_android = new WebContentsAndroid(this); 4107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUserData(kWebContentsAndroidKey, web_contents_android); 4108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 41096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return web_contents_android; 4110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 4111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 41123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() { 41133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return CreateRenderViewForRenderManager(GetRenderViewHost(), 41145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MSG_ROUTING_NONE, 4115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MSG_ROUTING_NONE, 4116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true); 41173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_MACOSX) 4120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetAllowOverlappingViews(bool overlapping) { 4122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->SetAllowOverlappingViews(overlapping); 4123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 4124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WebContentsImpl::GetAllowOverlappingViews() { 4126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetAllowOverlappingViews(); 4127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 4128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4129116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::SetAllowOtherViews(bool allow) { 4130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->SetAllowOtherViews(allow); 4131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 4132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4133116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebContentsImpl::GetAllowOtherViews() { 4134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return view_->GetAllowOtherViews(); 4135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 4136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 41373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 41383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 41395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid WebContentsImpl::OnDialogClosed(int render_process_id, 41405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int render_frame_id, 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 4142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool dialog_was_suppressed, 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 4144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& user_input) { 41455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RenderFrameHostImpl* rfh = RenderFrameHostImpl::FromID(render_process_id, 41465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu render_frame_id); 4147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch last_dialog_suppressed_ = dialog_was_suppressed; 4148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_showing_before_unload_dialog_ && !success) { 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a beforeunload dialog is canceled, we need to stop the throbber from 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spinning, since we forced it to start spinning in Navigate. 41525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (rfh) 41535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidStopLoading(rfh); 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 41557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 41567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 41577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadDialogCancelled()); 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = false; 41615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (rfh) { 41625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu rfh->JavaScriptDialogClosed(reply_msg, success, user_input, 41635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dialog_was_suppressed); 41645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 41655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Don't leak the sync IPC reply if the RFH or process is gone. 41665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete reply_msg; 41675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) { 4171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (encoding == last_reported_encoding_) 4172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 4173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) last_reported_encoding_ = encoding; 4174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canonical_encoding_ = GetContentClient()->browser()-> 41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCanonicalEncodingNameByAliasName(encoding); 41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 4180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* rwh_view = view_->CreateViewForWidget(rvh); 41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 4183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) rwh_view->SetSize(GetContainerBounds().size()); 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::IsHidden() { 41873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return capturer_count_ == 0 && !should_normally_be_visible_; 41883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 41893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManager() const { 4191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return frame_tree_.root()->render_manager(); 4192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 4193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { 41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_guest_.get(); 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { 4203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(!browser_plugin_guest_); 4204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_plugin_guest_.reset(guest); 4205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 42072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_embedder_.get(); 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearPowerSaveBlockers( 4212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host) { 42136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_CHROMEOS) 42146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_host); 42156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<PowerSaveBlockerMapEntry> map_entry = 42166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) power_save_blockers_.take_and_erase(key); 42176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (map_entry) 42186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) map_entry->clear(); 42196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 4220ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 4221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4222ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearAllPowerSaveBlockers() { 42236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_CHROMEOS) 4224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch power_save_blockers_.clear(); 42256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 4226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 4227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size WebContentsImpl::GetSizeForNewRenderView() { 4229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size; 4230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (delegate_) 4231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size = delegate_->GetSizeForNewRenderView(this); 4232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (size.IsEmpty()) 4233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size = GetContainerBounds().size(); 4234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return size; 4235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 4236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 4237116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::OnFrameRemoved(RenderFrameHost* render_frame_host) { 4238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 4239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, observers_, FrameDetached(render_frame_host)); 42404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 42414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 42425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) { 42435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!delegate_) 42445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 42455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size new_size = GetPreferredSize(); 42465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_size != old_size) 42475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->UpdatePreferredSize(this, new_size); 42485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 42495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4250116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::ResumeResponseDeferredAtStart() { 4251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FrameTreeNode* node = frame_tree_.root(); 4252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch node->render_manager()->ResumeResponseDeferredAtStart(); 4253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 4254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 4256