web_contents_impl.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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" 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/manifest/manifest_manager_host.h" 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/media/audio_stream_monitor.h" 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/media/capture/web_contents_audio_muter.h" 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/browser/media/midi_dispatcher_host.h" 458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_message_filter.h" 468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_service.h" 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/power_save_blocker_impl.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_delegate_view.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_base.h" 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/screen_orientation/screen_orientation_dispatcher_host_impl.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h" 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_guest.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h" 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h" 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h" 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/frame_messages.h" 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/image_messages.h" 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/common/input_messages.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/ax_event_notification_details.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/browser_plugin_guest_manager.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/javascript_dialog_manager.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_widget_host_iterator.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h" 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/screen_orientation_dispatcher_host.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 9058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/result_codes.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_utils.h" 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/web_preferences.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_cache.h" 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_transaction_factory.h" 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_request_context.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/android/content_view_core_impl.h" 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/date_time_chooser_android.h" 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h" 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/web_contents/web_contents_android.h" 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cross-Site Navigations 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a WebContentsImpl is told to navigate to a different web site (as 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determined by SiteInstance), it will replace its current RenderViewHost with 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new RenderViewHost dedicated to the new SiteInstance. This works as 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follows: 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - RVHM::Navigate determines whether the destination is cross-site, and if so, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it creates a pending_render_view_host_. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH is "suspended," so that no navigation messages are sent to 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// its renderer until the beforeunload JavaScript handler has a chance to 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run in the current RVH. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH tells CrossSiteRequestManager (a thread-safe singleton) 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// that it has a pending cross-site request. We will check this on the IO 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// thread when deciding how to handle the response. 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - The current RVH runs its beforeunload handler. If it returns false, we 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cancel all the pending logic. Otherwise we allow the pending RVH to send 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the navigation request to its renderer. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// main resource load on the pending RVH. It creates a 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// CrossSiteResourceHandler to check whether a process swap is needed when 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// the request is ready to commit. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - When RDH receives a response, the BufferedResourceHandler determines 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether it is a download. If so, it sends a message to the new renderer 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// causing it to cancel the request, and the download proceeds. For now, the 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH remains until the next DidNavigate event for this 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl. This isn't ideal, but it doesn't affect any functionality. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - After RDH receives a response and determines that it is safe and not a 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// download, the CrossSiteResourceHandler checks whether a process swap is 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// needed (either because CrossSiteRequestManager has state for it or because 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a transfer was needed for a redirect). 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If so, CrossSiteResourceHandler pauses the response to first run the old 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// page's unload handler. It does this by asynchronously calling the 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// OnCrossSiteResponse method of RenderFrameHostManager on the UI thread, 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// which sends a SwapOut message to the current RVH. 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - Once the unload handler is finished, RVHM::SwappedOut checks if a transfer 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// to a new process is needed, based on the stored pending_nav_params_. (This 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// is independent of whether we started out with a cross-process navigation.) 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If not, it just tells the ResourceDispatcherHost to resume the response 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// to its current RenderViewHost. 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If so, it cancels the current pending RenderViewHost and sets up a new 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// navigation using RequestTransferURL. When the transferred request 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// arrives in the ResourceDispatcherHost, we transfer the response and 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// resume it. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending renderer sends a FrameNavigate message that invokes the 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidNavigate method. This replaces the current RVH with the 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH. 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// - The previous renderer is kept swapped out in RenderFrameHostManager in case 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the user goes back. The process only stays live if another tab is using 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it, but if so, the existing frame relationships will be maintained. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kMinimumDelayBetweenLoadingUpdatesMS = 100; 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This matches what Blink's ProgressTracker has traditionally used for a 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// minimum progress value. 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const double kMinimumLoadingProgress = 0.1; 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com"; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID) 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kWebContentsAndroidKey[] = "web_contents_android"; 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // OS_ANDROID 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::LazyInstance<std::vector<WebContentsImpl::CreatedCallback> > 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER; 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int StartDownload(RenderFrameHost* rfh, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_favicon, 190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uint32_t max_bitmap_size) { 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int g_next_image_download_id = 0; 192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch rfh->Send(new ImageMsg_DownloadImage(rfh->GetRoutingID(), 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++g_next_image_download_id, 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_favicon, 196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) max_bitmap_size)); 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_next_image_download_id; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void NotifyCacheOnIO( 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context, 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& url, 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& http_method) { 20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) request_context->GetURLRequestContext()->http_transaction_factory()-> 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetCache()->OnExternalCacheHit(url, http_method); 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Helper function for retrieving all the sites in a frame tree. 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CollectSites(BrowserContext* context, 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::set<GURL>* sites, 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FrameTreeNode* node) { 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sites->insert(SiteInstance::GetSiteForURL(context, node->current_url())); 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ForEachFrameInternal( 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame, 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTreeNode* node) { 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) on_frame.Run(node->current_frame_host()); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ForEachPendingFrameInternal( 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(RenderFrameHost*)>& on_frame, 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FrameTreeNode* node) { 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* pending_frame_host = 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch node->render_manager()->pending_frame_host(); 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (pending_frame_host) 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch on_frame.Run(pending_frame_host); 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SendToAllFramesInternal(IPC::Message* message, RenderFrameHost* rfh) { 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* message_copy = new IPC::Message(*message); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_copy->set_routing_id(rfh->GetRoutingID()); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rfh->Send(message_copy); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void AddRenderWidgetHostViewToSet(std::set<RenderWidgetHostView*>* set, 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderFrameHost* rfh) { 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderWidgetHostView* rwhv = static_cast<RenderFrameHostImpl*>(rfh) 242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->frame_tree_node() 243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->render_manager() 244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetRenderWidgetHostView(); 245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) set->insert(rwhv); 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SetAccessibilityModeOnFrame(AccessibilityMode mode, 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* frame_host) { 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<RenderFrameHostImpl*>(frame_host)->SetAccessibilityMode(mode); 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContents::Create(const WebContents::CreateParams& params) { 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return WebContentsImpl::CreateWithOpener( 257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params, static_cast<WebContentsImpl*>(params.opener)); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage( 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 262ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const SessionStorageNamespaceMap& session_storage_namespace_map) { 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, NULL); 265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (SessionStorageNamespaceMap::const_iterator it = 267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session_storage_namespace_map.begin(); 268ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch it != session_storage_namespace_map.end(); 269ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++it) { 270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new_contents->GetController() 271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch .SetSessionStorageNamespace(it->first, it->second.get()); 272ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 273ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::AddCreatedCallback(const CreatedCallback& callback) { 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().push_back(callback); 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::RemoveCreatedCallback(const CreatedCallback& callback) { 283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) { 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (g_created_callbacks.Get().at(i).Equals(callback)) { 285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i); 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetDelegate()->GetAsWebContents(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContents::FromRenderFrameHost(RenderFrameHost* rfh) { 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* rfh_impl = static_cast<RenderFrameHostImpl*>(rfh); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!rfh_impl) 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return rfh_impl->delegate()->GetAsWebContents(); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebContentsImpl::DestructionObserver ---------------------------------------- 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsImpl::DestructionObserver : public WebContentsObserver { 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents) 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : WebContentsObserver(watched_contents), 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_(owner) { 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // WebContentsObserver: 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void WebContentsDestroyed() OVERRIDE { 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) owner_->OnWebContentsDestroyed( 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<WebContentsImpl*>(web_contents())); 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebContentsImpl* owner_; 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionObserver); 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 323a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochWebContentsImpl::ColorChooserInfo::ColorChooserInfo(int render_process_id, 324a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int render_frame_id, 325a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ColorChooser* chooser, 326a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int identifier) 327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : render_process_id(render_process_id), 328a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_id(render_frame_id), 329a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch chooser(chooser), 330a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch identifier(identifier) { 331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 333a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochWebContentsImpl::ColorChooserInfo::~ColorChooserInfo() { 334a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 335a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl ------------------------------------------------------------- 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(NULL), 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_(this, browser_context), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_delegate_view_(NULL), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_(opener), 3450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch created_with_opener_(!!opener), 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_(NULL), 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_tree_(new NavigatorImpl(&controller_, this), 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, this, this, this), 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_load_to_different_document_(false), 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_(0), 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_(false), 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) load_state_(net::LOAD_STATE_IDLE, base::string16()), 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_(0.0), 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_frames_in_progress_(0), 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_(0), 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_(0), 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_(false), 3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_(false), 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capturer_count_(0), 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_(true), 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_(false), 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_(false), 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_(NULL), 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_(false), 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_active_time_(base::TimeTicks::Now()), 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_(false), 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)), 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)), 373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch totalPinchGestureAmount_(0), 374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_(0), 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_message_source_(NULL), 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fullscreen_widget_routing_id_(MSG_ROUTING_NONE), 377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_widget_had_focus_at_shutdown_(false), 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_subframe_(false), 37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) force_disable_overscroll_content_(false), 380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_dialog_suppressed_(false), 381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accessibility_mode_( 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()), 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_stream_monitor_(this), 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci loading_weak_factory_(this) { 385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().at(i).Run(this); 3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_.SetFrameRemoveListener( 3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&WebContentsImpl::OnFrameRemoved, 3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this))); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_ = true; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Delete all RFH pending shutdown, which will lead the corresponding RVH to 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // shutdown and be deleted as well. 397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_.ForEach( 398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&RenderFrameHostManager::ClearRFHsPendingShutdown)); 399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 400ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearAllPowerSaveBlockers(); 401ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<RenderWidgetHostImpl*>::iterator iter = 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->DetachDelegate(); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.clear(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear out any JavaScript state. 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dialog_manager_) 410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dialog_manager_->WebContentsDestroyed(this); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_.get()) 413a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify any observer that have a reference on this WebContents. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DESTROYED, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Destroy all frame tree nodes except for the root; this notifies observers. 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frame_tree_.ResetForMainFrameSwap(); 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetRenderManager()->ResetProxyHosts(); 426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Manually call the observer methods for the root frame tree node. 428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostManager* root = GetRenderManager(); 429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (root->pending_frame_host()) { 4308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) observers_, 432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameDeleted(root->pending_frame_host())); 4338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) observers_, 436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameDeleted(root->current_frame_host())); 4378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (root->pending_render_view_host()) { 439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) observers_, 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewDeleted(root->pending_render_view_host())); 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) observers_, 446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewDeleted(root->current_host())); 4478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsDestroyed()); 451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) observers_, 454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ResetWebContents()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDelegate(NULL); 45790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STLDeleteContainerPairSecondPointers(destruction_observers_.begin(), 45990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.end()); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener( 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) { 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener"); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.browser_context, params.opener_suppressed ? NULL : opener); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (params.guest_delegate) { 470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This makes |new_contents| act as a guest. 471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 47203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) BrowserPluginGuest::Create(new_contents, params.guest_delegate); 473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We are instantiating a WebContents for browser plugin. Set its subframe 474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // bit to true. 475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->is_subframe_ = true; 476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 482116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::vector<WebContentsImpl*> WebContentsImpl::GetAllWebContents() { 483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<WebContentsImpl*> result; 484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<RenderWidgetHostIterator> widgets( 485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostImpl::GetRenderWidgetHosts()); 486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::set<WebContentsImpl*> web_contents_set; 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch while (RenderWidgetHost* rwh = widgets->GetNextHost()) { 488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!rwh->IsRenderView()) 489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderViewHost* rvh = RenderViewHost::From(rwh); 491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!rvh) 492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContents* web_contents = WebContents::FromRenderViewHost(rvh); 494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!web_contents) 495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsImpl* wci = static_cast<WebContentsImpl*>(web_contents); 497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (web_contents_set.find(wci) == web_contents_set.end()) { 498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_set.insert(wci); 499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result.push_back(wci); 500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return result; 503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManagerForTesting() { 506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return OnMessageReceived(render_view_host, NULL, message); 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHost* render_frame_host, 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const IPC::Message& message) { 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(render_view_host || render_frame_host); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetWebUI() && 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<WebContentsObserver>::Iterator it(observers_); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver* observer; 525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (render_frame_host) { 526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (observer->OnMessageReceived(message, render_frame_host)) 528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (observer->OnMessageReceived(message)) 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Message handlers should be aware of which 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RenderViewHost/RenderFrameHost sent the message, which is temporarily 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // stored in render_(view|frame)_message_source_. 5386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (render_frame_host) 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_message_source_ = render_frame_host; 5406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) else 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_message_source_ = render_view_host; 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(WebContentsImpl, message) 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_PepperPluginHung, OnPepperPluginHung) 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_PluginCrashed, OnPluginCrashed) 547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DomOperationResponse, 548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnDomOperationResponse) 549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeThemeColor, 550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnThemeColorChanged) 551a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishDocumentLoad, 552a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnDocumentLoadedInFrame) 553a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishLoad, OnDidFinishLoad) 554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartLoading, OnDidStartLoading) 555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading) 556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeLoadProgress, 557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnDidChangeLoadProgress) 558a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_OpenColorChooser, OnOpenColorChooser) 559a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_EndColorChooser, OnEndColorChooser) 560a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_SetSelectedColorInColorChooser, 561a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnSetSelectedColorInColorChooser) 562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPlayingNotification, 563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnMediaPlayingNotification) 564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPausedNotification, 565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnMediaPausedNotification) 5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidFirstVisuallyNonEmptyPaint, 5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnFirstVisuallyNonEmptyPaint) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache, 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidLoadResourceFromMemoryCache) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidDisplayInsecureContent) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidRunInsecureContent) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRegisterProtocolHandler) 579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_UnregisterProtocolHandler, 580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnUnregisterProtocolHandler) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend) 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_PLUGINS) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRequestPpapiBrokerPermission) 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_Attach, 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ImageHostMsg_DidDownloadImage, OnDidDownloadImage) 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL) 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_ShowValidationMessage, 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnShowValidationMessage) 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_HideValidationMessage, 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHideValidationMessage) 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_MoveValidationMessage, 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnMoveValidationMessage) 598a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_ANDROID) 599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply, 600a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnFindMatchRectsReply) 601a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_OpenDateTimeDialog, 602a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnOpenDateTimeDialog) 603a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_message_source_ = NULL; 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_message_source_ = NULL; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser( 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params) { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RunFileChooser(this, params); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const { 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetBrowserContext(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const { 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 637ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst GURL& WebContentsImpl::GetVisibleURL() const { 63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 64190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetLastCommittedURL() const { 64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 64790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cbentzel): remove this debugging code? 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate == delegate_) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Detach(this); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Attach(this); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the visible RVH reflects the new delegate's preferences. 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { 669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostImpl* host = GetRenderManager()->current_host(); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host ? host->GetProcess() : NULL; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetMainFrame() { 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame_tree_.root()->current_frame_host(); 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetFocusedFrame() { 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!frame_tree_.GetFocusedFrame()) 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return NULL; 680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return frame_tree_.GetFocusedFrame()->current_frame_host(); 681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ForEachFrame( 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame) { 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&ForEachFrameInternal, on_frame)); 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SendToAllFrames(IPC::Message* message) { 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ForEachFrame(base::Bind(&SendToAllFramesInternal, message)); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete message; 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const { 694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host(); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->GetRoutingID(); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetFullscreenWidgetRoutingID() const { 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fullscreen_widget_routing_id_; 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const { 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->GetRenderWidgetHostView(); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 712d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetFullscreenRenderWidgetHostView() 713d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const { 714d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHost* const widget_host = 715d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostImpl::FromID(GetRenderProcessHost()->GetID(), 716d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetFullscreenWidgetRoutingID()); 717d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return widget_host ? widget_host->GetView() : NULL; 718d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 719d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_.get(); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 724116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::SetAccessibilityMode(AccessibilityMode mode) { 725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (mode == accessibility_mode_) 726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accessibility_mode_ = mode; 729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_tree_.ForEach( 730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&ForEachFrameInternal, 731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&SetAccessibilityModeOnFrame, mode))); 732116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_tree_.ForEach( 733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&ForEachPendingFrameInternal, 734116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&SetAccessibilityModeOnFrame, mode))); 735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 737116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::AddAccessibilityMode(AccessibilityMode mode) { 7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetAccessibilityMode(AddAccessibilityModeTo(accessibility_mode_, mode)); 739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 741116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::RemoveAccessibilityMode(AccessibilityMode mode) { 7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetAccessibilityMode(RemoveAccessibilityModeFrom(accessibility_mode_, mode)); 743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIImpl* web_ui = new WebUIImpl(this); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()-> 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateWebUIControllerForURL(web_ui, url); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller) { 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui->AddMessageHandler(new GenericHandler()); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->SetController(controller); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete web_ui; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const { 760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->web_ui() ? GetRenderManager()->web_ui() 761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : GetRenderManager()->pending_web_ui(); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const { 765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->web_ui(); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUserAgentOverride() == override) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.user_agent_override = override; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the new override string to the renderer. 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->SyncRendererPrefs(); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload the page if a load is currently in progress to avoid having 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different parts of the page loaded using different user agents. 7814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent()) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ReloadIgnoringCache(true); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserAgentOverrideSet(override)); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.user_agent_override; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 793116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::EnableTreeOnlyAccessibilityMode() { 794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddAccessibilityMode(AccessibilityModeTreeOnly); 795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 797116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebContentsImpl::IsTreeOnlyAccessibilityModeForTesting() const { 798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return accessibility_mode_ == AccessibilityModeTreeOnly; 799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 801116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebContentsImpl::IsFullAccessibilityModeForTesting() const { 802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return accessibility_mode_ == AccessibilityModeComplete; 803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::SetParentNativeViewAccessible( 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible accessible_parent) { 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_ = accessible_parent; 809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); 810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (rfh) 811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rfh->SetParentNativeViewAccessible(accessible_parent); 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetTitle() const { 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transient entries take precedence. They are used for interstitial pages 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that are shown on top of existing pages. 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetTransientEntry(); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_languages = 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext()); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebUI* our_web_ui = GetRenderManager()->pending_web_ui() ? 826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_web_ui() : GetRenderManager()->web_ui(); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (our_web_ui) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't override the title in view source mode. 829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry = controller_.GetVisibleEntry(); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(entry && entry->IsViewSourceMode())) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the Web UI the chance to override our title. 832a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title = our_web_ui->GetOverriddenTitle(); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title.empty()) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the title for the last committed entry rather than a pending 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation entry. For example, when the user types in a URL, we want to 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep the old page's title until the new load has committed and we get a new 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title. 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetLastCommittedEntry(); 843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We make an exception for initial navigations. 845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (controller_.IsInitialNavigation()) { 846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We only want to use the title from the visible entry in one of two cases: 847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1. There's already a committed entry for an initial navigation, in which 848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // case we are doing a history navigation in a new tab (e.g., Ctrl+Back). 849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2. The pending entry has been explicitly assigned a title to display. 850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If there's no last committed entry and no assigned title, we should fall 852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // back to |page_title_when_no_navigation_entry_| rather than showing the 853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // URL. 854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (entry || 855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (controller_.GetVisibleEntry() && 856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !controller_.GetVisibleEntry()->GetTitle().empty())) { 857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) entry = controller_.GetVisibleEntry(); 858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| is finally used 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if no title cannot be retrieved. 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_title_when_no_navigation_entry_; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetMaxPageIDForSiteInstance(GetSiteInstance()); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance( 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end()) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = -1; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return max_page_ids_[site_instance->GetId()]; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) { 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance( 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, int32 page_id) { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetMaxPageIDForSiteInstance(site_instance) < page_id) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = page_id; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContents* web_contents) { 8931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebContentsImpl* contents = static_cast<WebContentsImpl*>(web_contents); 8941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) max_page_ids_ = contents->max_page_ids_; 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const { 898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetSiteInstance(); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const { 902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHost* dest_rvh = GetRenderManager()->pending_render_view_host() ? 903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_render_view_host() : 904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->current_host(); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest_rvh->GetSiteInstance(); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const { 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_loading_; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebContentsImpl::IsLoadingToDifferentDocument() const { 913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return is_loading_ && is_load_to_different_document_; 914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const { 917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return waiting_for_response_ && is_load_to_different_document_; 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const { 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetLoadStateHost() const { 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_host_; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_size_; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const { 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_position_; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::set<GURL> WebContentsImpl::GetSitesInTab() const { 9377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::set<GURL> sites; 9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&CollectSites, 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(GetBrowserContext()), 9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(&sites))); 9417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return sites; 9427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const { 945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return canonical_encoding_; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const { 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return displayed_insecure_content_; 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::IncrementCapturerCount(const gfx::Size& capture_size) { 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!is_being_destroyed_); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++capturer_count_; 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: This provides a hint to upstream code to size the views optimally 9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for quality (e.g., to avoid scaling). 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!capture_size.IsEmpty() && preferred_size_for_capture_.IsEmpty()) { 9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_size_for_capture_ = capture_size; 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(preferred_size_); 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DecrementCapturerCount() { 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --capturer_count_; 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_LE(0, capturer_count_); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_being_destroyed_) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (capturer_count_ == 0) { 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size old_size = preferred_size_for_capture_; 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_size_for_capture_ = gfx::Size(); 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(old_size); 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsHidden()) { 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Executing delayed WasHidden()."; 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WasHidden(); 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 987ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint WebContentsImpl::GetCapturerCount() const { 988ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return capturer_count_; 989ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 990ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 9911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool WebContentsImpl::IsAudioMuted() const { 9921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return audio_muter_.get() && audio_muter_->is_muting(); 9931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 9941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::SetAudioMuted(bool mute) { 9961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DVLOG(1) << "SetAudioMuted(mute=" << mute << "), was " << IsAudioMuted() 9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << " for WebContentsImpl@" << this; 9981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (mute == IsAudioMuted()) 10001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 10011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (mute) { 10031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!audio_muter_) 10041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_muter_.reset(new WebContentsAudioMuter(this)); 10051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_muter_->StartMuting(); 10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 10071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(audio_muter_); 10081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_muter_->StopMuting(); 10091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Notification for UI updates in response to the changed muting state. 10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); 10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 10141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED || 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status, 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == crashed_status_) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ = status; 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_ = error_code; 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crashed_status_; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const { 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_being_destroyed_; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged( 10406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InvalidateTypes changed_flags) { 10411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create and release the audio power save blocker depending on whether the 10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // tab is actively producing audio or not. 10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (changed_flags == INVALIDATE_TYPE_TAB && 10441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AudioStreamMonitor::monitoring_available()) { 10451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (WasRecentlyAudible()) { 10461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!audio_power_save_blocker_) 10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAudioPowerSaveBlocker(); 10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_power_save_blocker_.reset(); 10501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->NavigationStateChanged(this, changed_flags); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastActiveTime() const { 10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return last_active_time_; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() { 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.SetActive(true); 1063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1064f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> widgets = GetRenderWidgetHostViewsInTree(); 1065f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (std::set<RenderWidgetHostView*>::iterator iter = widgets.begin(); 1066cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter != widgets.end(); 1067cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter++) { 1068f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (*iter) { 1069f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->Show(); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1071f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->SetActive(true); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1073cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_active_time_ = base::TimeTicks::Now(); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resize rect might have changed while this was inactive -- send the new 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one to make sure it's up to date. 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->ResizeRectChanged(GetRootWindowResizerRect()); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Restore power save blocker if there are active video players running. 10871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!active_video_players_.empty() && !video_power_save_blocker_) 10881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateVideoPowerSaveBlocker(); 10891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown()); 10914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = true; 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() { 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there are entities capturing screenshots or video (e.g., mirroring), 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // don't activate the "disable rendering" optimization. 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capturer_count_ == 0) { 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |GetRenderViewHost()| can be NULL if the user middle clicks a link to 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // open a tab in the background, then closes the tab before selecting it. 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is because closing the tab calls WebContentsImpl::Destroy(), which 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removes the |GetRenderViewHost()|; then when we actually destroy the 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window, OnWindowPosChanged() notices and calls WasHidden() (which 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls us). 1105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> widgets = GetRenderWidgetHostViewsInTree(); 1106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (std::set<RenderWidgetHostView*>::iterator iter = widgets.begin(); 1107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter != widgets.end(); 1108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter++) { 1109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (*iter) 1110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->Hide(); 1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 11121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Release any video power save blockers held as video is not visible. 11141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_power_save_blocker_.reset(); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasHidden()); 11184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = false; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() { 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Should we fire even for interstitial pages? 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WillNotifyDisconnection() && 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !ShowingInterstitialPage() && 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !static_cast<RenderViewHostImpl*>( 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost())->SuddenTerminationAllowed(); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::DispatchBeforeUnload(bool for_cross_site_transition) { 1131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<RenderFrameHostImpl*>(GetMainFrame())->DispatchBeforeUnload( 1132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for_cross_site_transition); 1133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() { 1136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->Stop(); 11373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped()); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() { 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use our current SiteInstance since the cloned entry will use it anyway. 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We pass our own opener so that the cloned page can access it if it was 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before. 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams create_params(GetBrowserContext(), GetSiteInstance()); 1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) create_params.initial_size = GetContainerBounds().size(); 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* tc = CreateWithOpener(create_params, opener_); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tc->GetController().CopyStateFrom(controller_); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCloneToNewWebContents(this, tc)); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tc; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type, 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 1160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* view = host->GetView(); 1161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view == GetFullscreenRenderWidgetHostView()) { 1162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We cannot just call view_->RestoreFocus() here. On some platforms, 1163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // attempting to focus the currently-invisible WebContentsView will be 1164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // flat-out ignored. Therefore, this boolean is used to track whether 1165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // we will request focus after the fullscreen widget has been 1166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // destroyed. 1167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_widget_had_focus_at_shutdown_ = (view && view->HasFocus()); 1168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 1169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 1170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch i != pending_widget_views_.end(); ++i) { 1171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host->GetView() == i->second) { 1172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_widget_views_.erase(i); 1173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 1174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebContents* WebContentsImpl::GetWebContents() { 11851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return this; 11861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 11871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::Init(const WebContents::CreateParams& params) { 1189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is set before initializing the render manager since 1190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // RenderFrameHostManager::Init calls back into us via its delegate to ask if 1191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it should be hidden. 11928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) should_normally_be_visible_ = !params.initially_hidden; 11938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->Init( 1195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.browser_context, params.site_instance, params.routing_id, 1196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.main_frame_routing_id); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsViewDelegate* delegate = 1199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetContentClient()->browser()->GetWebContentsViewDelegate(this); 1200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (browser_plugin_guest_) { 1202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<WebContentsView> platform_view(CreateWebContentsView( 1203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 1204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsViewGuest* rv = new WebContentsViewGuest( 1206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, browser_plugin_guest_.get(), platform_view.Pass(), 1207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_view_host_delegate_view_); 1208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_view_host_delegate_view_ = rv; 1209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_.reset(rv); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Regular WebContentsView. 1212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_.reset(CreateWebContentsView( 1213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(render_view_host_delegate_view_); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(view_.get()); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size initial_size = params.initial_size; 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateView(initial_size, params.context); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for whether our opener gets destroyed. 122290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (opener_) 122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(opener_); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllBrowserContextsAndSources()); 1228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) geolocation_dispatcher_host_.reset(new GeolocationDispatcherHost(this)); 1230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) midi_dispatcher_host_.reset(new MidiDispatcherHost(this)); 1231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) screen_orientation_dispatcher_host_.reset( 12331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new ScreenOrientationDispatcherHostImpl(this)); 12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manifest_manager_host_.reset(new ManifestManagerHost(this)); 1236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_chooser_.reset(new DateTimeChooserAndroid()); 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { 124390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(web_contents); 124490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the opener if it has been closed. 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents == opener_) { 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_ = NULL; 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear a pending contents that has been closed before being shown. 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (PendingContents::iterator iter = pending_contents_.begin(); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != pending_contents_.end(); 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second != web_contents) 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_contents_.erase(iter); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) { 126390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!ContainsKey(destruction_observers_, web_contents)) { 126490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_[web_contents] = 126590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new DestructionObserver(this, web_contents); 126690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 126790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 126890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 126990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) { 127090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObservers::iterator iter = 127190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.find(web_contents); 127290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (iter != destruction_observers_.end()) { 127390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete destruction_observers_[web_contents]; 127490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.erase(iter); 127590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 127690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 127790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::set<RenderWidgetHostView*> 1287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)WebContentsImpl::GetRenderWidgetHostViewsInTree() { 1288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> set; 1289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (ShowingInterstitialPage()) { 1290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) set.insert(GetRenderWidgetHostView()); 1291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 1292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ForEachFrame( 1293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&AddRenderWidgetHostViewToSet, base::Unretained(&set))); 1294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return set; 1296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() { 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ActivateContents(this); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() { 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DeactivateContents(this); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() { 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostCapture(); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted( 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host) { 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_being_destroyed_) { 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |created_widgets_| might have been destroyed. 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<RenderWidgetHostImpl*>::iterator iter = 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.find(render_widget_host); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != created_widgets_.end()) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.erase(iter); 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host && 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) { 1327d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate_ && delegate_->EmbedsFullscreenWidget()) 1328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, false); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDestroyFullscreenWidget( 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_)); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_ = MSG_ROUTING_NONE; 1334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_widget_had_focus_at_shutdown_) 1335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->RestoreFocus(); 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent( 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ && 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 134703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (browser_plugin_embedder_ && 134803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) browser_plugin_embedder_->HandleKeyboardEvent(event)) { 134903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return; 135003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleKeyboardEvent(this, event); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool WebContentsImpl::HandleWheelEvent( 1356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseWheelEvent& event) { 1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_MACOSX) 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On platforms other than Mac, control+mousewheel changes zoom. On Mac, this 1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // isn't done for two reasons: 1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -the OS already has a gesture to do this through pinch-zoom 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -if a user starts an inertial scroll, let's go, and presses control 1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (i.e. control+tab) then the OS's buffered scroll events will come in 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with control key set which isn't what the user wants 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_ && 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.wheelTicksY && 13660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch (event.modifiers & blink::WebInputEvent::ControlKey) && 13670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Avoid adjusting the zoom in response to two-finger-scrolling touchpad 13680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // gestures, which are regrettably easy to trigger accidentally. 13690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch !event.hasPreciseScrollingDeltas) { 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->ContentsZoomChange(event.wheelTicksY > 0); 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::PreHandleGestureEvent( 13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebGestureEvent& event) { 13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return delegate_ && delegate_->PreHandleGestureEvent(this, event); 13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool WebContentsImpl::HandleGestureEvent( 1383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const blink::WebGestureEvent& event) { 1384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Some platforms (eg. Mac) send GesturePinch events for trackpad pinch-zoom. 1385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Use them to implement browser zoom, as for HandleWheelEvent above. 1386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (event.type == blink::WebInputEvent::GesturePinchUpdate && 138746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) event.sourceDevice == blink::WebGestureDeviceTouchpad) { 1388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The scale difference necessary to trigger a zoom action. Derived from 1389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // experimentation to find a value that feels reasonable. 1390effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const float kZoomStepValue = 0.6f; 1391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Find the (absolute) thresholds on either side of the current zoom factor, 1393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // then convert those to actual numbers to trigger a zoom in or out. 1394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This logic deliberately makes the range around the starting zoom value 1395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // for the gesture twice as large as the other ranges (i.e., the notches are 1396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // at ..., -3*step, -2*step, -step, step, 2*step, 3*step, ... but not at 0) 1397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // so that it's easier to get back to your starting point than it is to 1398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // overshoot. 1399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float nextStep = (abs(currentPinchZoomStepDelta_) + 1) * kZoomStepValue; 1400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float backStep = abs(currentPinchZoomStepDelta_) * kZoomStepValue; 1401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float zoomInThreshold = (currentPinchZoomStepDelta_ >= 0) ? nextStep 1402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : -backStep; 1403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float zoomOutThreshold = (currentPinchZoomStepDelta_ <= 0) ? -nextStep 1404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : backStep; 1405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 14065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu totalPinchGestureAmount_ += (event.data.pinchUpdate.scale - 1.0); 1407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (totalPinchGestureAmount_ > zoomInThreshold) { 1408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_++; 14090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (delegate_) 14100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->ContentsZoomChange(true); 1411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (totalPinchGestureAmount_ < zoomOutThreshold) { 1412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_--; 14130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (delegate_) 14140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->ContentsZoomChange(false); 1415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 1417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 1420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() { 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseDown(); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() { 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseUp(); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() { 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandlePointerActivate(); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() { 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureBegin(); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() { 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureEnd(); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) { 1448d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This method is being called to enter or leave renderer-initiated fullscreen 1449d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // mode. Either way, make sure any existing fullscreen widget is shut down 1450d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // first. 1451d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostView* const widget_view = GetFullscreenRenderWidgetHostView(); 1452d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (widget_view) 1453d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostImpl::From(widget_view->GetRenderWidgetHost())->Shutdown(); 1454d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen); 145723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 145823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 145923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) observers_, 146023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DidToggleFullscreenModeForTab(IsFullscreenForCurrentTab())); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const { 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture, 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target); 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(false); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() { 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostMouseLock(); 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow( 1482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int render_process_id, 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int main_frame_route_id, 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_CreateWindow_Params& params, 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespace* session_storage_namespace) { 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We usually create the new window in the same BrowsingInstance (group of 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script-related windows), by passing in the current SiteInstance. However, 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the opener is being suppressed (in a non-guest), we create a new 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SiteInstance in its own BrowsingInstance. 1491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_guest = BrowserPluginGuest::IsGuest(this); 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the opener is to be suppressed, the new window can be in any process. 1494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Since routing ids are process specific, we must not have one passed in 1495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // as argument here. 1496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE); 1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SiteInstance> site_instance = 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.opener_suppressed && !is_guest ? 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) : 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSiteInstance(); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A message to create a new window can only come from the active process for 1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this WebContentsImpl instance. If any other process sends the request, 1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // it is invalid and the process must be terminated. 1506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (GetRenderProcessHost()->GetID() != render_process_id) { 1507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessHandle process_handle = 1508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost::FromID(render_process_id)->GetHandle(); 1509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process_handle != base::kNullProcessHandle) { 1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RecordAction( 15115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWindow")); 15121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::KillProcess(process_handle, RESULT_CODE_KILLED, false); 1513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must assign the SessionStorageNamespace before calling Init(). 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/142685 1520ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& partition_id = 1521ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetContentClient()->browser()-> 1522ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetStoragePartitionIdForSite(GetBrowserContext(), 1523ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch site_instance->GetSiteURL()); 1524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StoragePartition* partition = BrowserContext::GetStoragePartition( 1525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetBrowserContext(), site_instance.get()); 1526bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DOMStorageContextWrapper* dom_storage_context = 1527bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext()); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespaceImpl* session_storage_namespace_impl = 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); 15313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 15323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (delegate_ && 15333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !delegate_->ShouldCreateWebContents(this, 15343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) route_id, 15353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.window_container_type, 15363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.frame_name, 15373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.target_url, 15383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) partition_id, 15393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) session_storage_namespace)) { 15405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (route_id != MSG_ROUTING_NONE && 15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !RenderViewHost::FromID(render_process_id, route_id)) { 15425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the embedder didn't create a WebContents for this route, we need to 15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // delete the RenderView that had already been created. 15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_Close(route_id)); 15455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id); 15473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView( 15483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) main_frame_route_id); 15493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 15503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 15513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 15523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Create the new web contents. This will automatically create the new 15533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // WebContentsView. In the future, we may want to create the view separately. 1554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateParams create_params(GetBrowserContext(), site_instance.get()); 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = route_id; 1556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) create_params.main_frame_routing_id = main_frame_route_id; 1557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.opener = this; 1558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.opener_suppressed = params.opener_suppressed; 1559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.disposition == NEW_BACKGROUND_TAB) 1560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.initially_hidden = true; 1561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsImpl* new_contents = NULL; 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_guest) { 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.context = view_->GetNativeView(); 1565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) create_params.initial_size = GetContainerBounds().size(); 1566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new_contents = static_cast<WebContentsImpl*>( 1567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContents::Create(create_params)); 1568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 1569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new_contents = GetBrowserPluginGuest()->CreateNewGuestWindow(create_params); 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->GetController().SetSessionStorageNamespace( 1572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) partition_id, 1573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) session_storage_namespace); 1574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->RenderViewCreated(new_contents->GetRenderViewHost()); 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Save the window for later if we're not suppressing the opener (since it 1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will be shown immediately). 1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.opener_suppressed) { 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_guest) { 1580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsView* new_view = new_contents->view_.get(); 1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(brettw): It seems bogus that we have to call this function on the 1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // newly created object and give it one of its own member variables. 1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created window associated with the route so we can show it 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(MSG_ROUTING_NONE, route_id); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_[route_id] = new_contents; 159090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(new_contents); 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebContentsCreated( 1595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this, params.opener_render_frame_id, params.frame_name, 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.target_url, new_contents); 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.opener_suppressed) { 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the opener is suppressed, the original renderer cannot access the 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window. As a result, we need to show and navigate the window here. 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_blocked = false; 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect initial_pos; 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->AddNewContents( 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new_contents, params.disposition, initial_pos, 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.user_gesture, &was_blocked); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_blocked) { 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams open_params(params.target_url, 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(), 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 16131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK, 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* is_renderer_initiated */); 16157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch open_params.user_gesture = params.user_gesture; 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->OpenURL(open_params); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id, 1622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id, 1623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type) { 1624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateNewWidget(render_process_id, route_id, false, popup_type); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int render_process_id, 1628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id) { 1629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateNewWidget(render_process_id, route_id, true, blink::WebPopupTypeNone); 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id, 1633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id, 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 1635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type) { 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* process = GetRenderProcessHost(); 1637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A message to create a new widget can only come from the active process for 1638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this WebContentsImpl instance. If any other process sends the request, 1639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // it is invalid and the process must be terminated. 1640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process->GetID() != render_process_id) { 1641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessHandle process_handle = 1642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost::FromID(render_process_id)->GetHandle(); 1643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process_handle != base::kNullProcessHandle) { 1644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RecordAction( 16455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWidget")); 16461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::KillProcess(process_handle, RESULT_CODE_KILLED, false); 1647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* widget_host = 16523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new RenderWidgetHostImpl(this, process, route_id, IsHidden()); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.insert(widget_host); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* widget_view = 1656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderWidgetHostViewBase*>( 1657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->CreateViewForPopupWidget(widget_host)); 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!widget_view) 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_fullscreen) { 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Popups should not get activated. 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_view->SetPopupType(popup_type); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created widget associated with the route so we can show it later. 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_[route_id] = widget_view; 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allow it to survive the trip without being hosted. 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(widget_view->GetNativeView()); 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id, 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents = GetCreatedWindow(route_id); 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate = GetDelegate(); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) { 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNewContents( 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, contents, disposition, initial_pos, user_gesture, NULL); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, false, initial_pos); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) { 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, true, gfx::Rect()); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 1700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* widget_host_view = 1701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id)); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host_view) 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostView* view = NULL; 1706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 1707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (guest && guest->embedder_web_contents()) { 1708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view = guest->embedder_web_contents()->GetRenderWidgetHostView(); 1709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 1710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view = GetRenderWidgetHostView(); 1711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1713d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (is_fullscreen) { 17144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); 1715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->StoreFocus(); 17164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fullscreen_widget_routing_id_ = route_id; 1717d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate_ && delegate_->EmbedsFullscreenWidget()) { 1718d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView()); 1719d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, true); 1720d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 1721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) widget_host_view->InitAsFullscreen(view); 1722d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1723d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 1724d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) observers_, 1725d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DidShowFullscreenWidget(route_id)); 1726d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!widget_host_view->HasFocus()) 1727d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->Focus(); 1728d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 1729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) widget_host_view->InitAsPopup(view, initial_pos); 1730d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host_impl = 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost()); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->Init(); 17354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Only allow privileged mouse lock for fullscreen render widget, which is 17364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // used to implement Pepper Flash fullscreen. 17374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly embedded (or purposefully ignored) we can release the retain we 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // took in CreateNewWidget(). 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRelease(widget_host_view->GetNativeView()); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) { 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingContents::iterator iter = pending_contents_.find(route_id); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certain systems can block the creation of new windows. If we didn't succeed 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in creating one, just return NULL. 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_contents_.end()) { 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = iter->second; 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_.erase(route_id); 175890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(new_contents); 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't initialize the guest WebContents immediately. 1761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (BrowserPluginGuest::IsGuest(new_contents)) 1762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new_contents; 1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_contents->GetRenderProcessHost()->HasConnection() || 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !new_contents->GetRenderViewHost()->GetView()) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Resume blocked requests for both the RenderViewHost and RenderFrameHost. 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): It seems bogus to reach into here and initialize the host. 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); 17711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<RenderFrameHostImpl*>(new_contents->GetMainFrame())->Init(); 17721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_widget_views_.end()) { 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* widget_host_view = iter->second; 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(route_id); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost(); 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host->GetProcess()->HasConnection()) { 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view has gone away or the renderer crashed. Nothing to do. 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_host_view; 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission( 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaStreamRequest& request, 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MediaResponseCallback& callback) { 1798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (delegate_) { 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestMediaAccessPermission(this, request, callback); 1800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 1801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback.Run(MediaStreamDevices(), 18021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN, 1803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MediaStreamUI>()); 1804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool WebContentsImpl::CheckMediaAccessPermission(const GURL& security_origin, 18081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MediaStreamType type) { 18091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 18101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci type == MEDIA_DEVICE_VIDEO_CAPTURE); 18111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return delegate_ && 18121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate_->CheckMediaAccessPermission(this, security_origin, type); 18131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1815a3f7b4e666c476898878fa745f637129375cd889Ben MurdochSessionStorageNamespace* WebContentsImpl::GetSessionStorageNamespace( 1816a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SiteInstance* instance) { 1817a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return controller_.GetSessionStorageNamespace(instance); 1818a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 1819a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 182046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SessionStorageNamespaceMap WebContentsImpl::GetSessionStorageNamespaceMap() { 182146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return controller_.GetSessionStorageNamespaceMap(); 182246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 182346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FrameTree* WebContentsImpl::GetFrameTree() { 18254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return &frame_tree_; 18264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 18274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1828116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAccessibilityMode WebContentsImpl::GetAccessibilityMode() const { 1829116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return accessibility_mode_; 1830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::AccessibilityEventReceived( 1833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<AXEventNotificationDetails>& details) { 1834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER( 1835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebContentsObserver, observers_, AccessibilityEventReceived(details)); 1836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRenderFrameHost* WebContentsImpl::GetGuestByInstanceID( 18391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int browser_plugin_instance_id) { 18401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserPluginGuestManager* guest_manager = 18411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetBrowserContext()->GetGuestManager(); 18421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebContents* guest = guest_manager->GetGuestByInstanceID( 18431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, browser_plugin_instance_id); 18441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!guest) 18451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 18461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return guest->GetMainFrame(); 18471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 18481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 18495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnShowValidationMessage( 18505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view, 18515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& main_text, 18525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sub_text) { 18535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 18545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->ShowValidationMessage( 18555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, anchor_in_root_view, main_text, sub_text); 18565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 18575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnHideValidationMessage() { 18595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 18605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->HideValidationMessage(this); 18615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 18625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMoveValidationMessage( 18645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view) { 18655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 18665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->MoveValidationMessage(this, anchor_in_root_view); 18675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 18685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 186990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) { 187090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (browser_plugin_embedder_) 18717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_plugin_embedder_->DidSendScreenRects(); 187290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 187390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1874116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserAccessibilityManager* 1875116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsImpl::GetRootBrowserAccessibilityManager() { 1876116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); 1877116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return rfh ? rfh->browser_accessibility_manager() : NULL; 1878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1879116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1880116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserAccessibilityManager* 1881116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsImpl::GetOrCreateRootBrowserAccessibilityManager() { 1882116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); 1883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return rfh ? rfh->GetOrCreateBrowserAccessibilityManager() : NULL; 1884116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1885116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { 18875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size old_size = GetPreferredSize(); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_ = pref_size; 18895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(old_size); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) { 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ResizeDueToAutoResize(this, new_size); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::OpenURL(const OpenURLParams& params) { 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = delegate_->OpenURLFromTab(this, params); 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::Send(IPC::Message* message) { 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) { 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->Send(message); 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToPendingEntry( 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 1916effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FrameTreeNode* node = frame_tree_.root(); 1917effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 19181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Navigate in the FrameTreeNode specified in the pending entry, if any. This 19191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // is currently only used in --site-per-process and tests. 1920effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NavigationEntryImpl* pending_entry = 1921effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()); 19221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pending_entry->frame_tree_node_id() != -1) { 19231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FrameTreeNode* subframe = 19241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_tree_.FindByID(pending_entry->frame_tree_node_id()); 19251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(subframe); 19261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (subframe) 19271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci node = subframe; 1928effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1929effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1930effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return node->navigator()->NavigateToPendingEntry( 1931effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch node->current_frame_host(), reload_type); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::RenderFrameForInterstitialPageCreated( 19355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHost* render_frame_host) { 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 19375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameForInterstitialPageCreated(render_frame_host)); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::AttachInterstitialPage( 19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterstitialPageImpl* interstitial_page) { 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(interstitial_page); 1943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->set_interstitial_page(interstitial_page); 194468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 194568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Cancel any visible dialogs so that they don't interfere with the 194668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // interstitial. 194768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (dialog_manager_) 194868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 194968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidAttachInterstitialPage()); 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DetachInterstitialPage() { 19555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (ShowingInterstitialPage()) 1956f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->remove_interstitial_page(); 19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDetachInterstitialPage()); 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetHistoryLengthAndPrune( 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SiteInstance* site_instance, 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int history_length, 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 minimum_page_id) { 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetHistoryLengthAndPrune doesn't work when there are pending cross-site 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigations. Callers should ensure that this is the case. 1967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_render_view_host()) { 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = GetRenderViewHostImpl(); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_instance && rvh->GetSiteInstance() != site_instance) { 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetHistoryLengthAndPrune(GetRoutingID(), 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_length, 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_page_id)); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebContentsImpl::ReloadFocusedFrame(bool ignore_cache) { 1986c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1989c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1990c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_Reload( 1991c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), ignore_cache)); 1992c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1993c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1994c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Undo() { 1995c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1996c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1998c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1999c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Undo(focused_frame->GetRoutingID())); 2000c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Undo")); 2001c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2002c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2003c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Redo() { 2004c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2005c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2006c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2007c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Redo(focused_frame->GetRoutingID())); 2008c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Redo")); 2009c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2010c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Cut() { 2012c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2013c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2014c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2015c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2016c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Cut(focused_frame->GetRoutingID())); 2017c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Cut")); 2018c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2019c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2020c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Copy() { 2021c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2022c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2023c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2024c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2025c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Copy(focused_frame->GetRoutingID())); 2026c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Copy")); 2027c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2028c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2029c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::CopyToFindPboard() { 2030c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_MACOSX) 2031c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2032c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2033c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2034c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2035c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Windows/Linux don't have the concept of a find pasteboard. 2036c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send( 2037c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new InputMsg_CopyToFindPboard(focused_frame->GetRoutingID())); 2038c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("CopyToFindPboard")); 2039c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 2040c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2041c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2042c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Paste() { 2043c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2044c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2045c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2046c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2047c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Paste(focused_frame->GetRoutingID())); 2048c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Paste")); 2049c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2050c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2051c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::PasteAndMatchStyle() { 2052c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2053c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2054c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2055c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2056c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_PasteAndMatchStyle( 2057c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID())); 2058c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("PasteAndMatchStyle")); 2059c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2060c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2061c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Delete() { 2062c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2063c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2064c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2065c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2066c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Delete(focused_frame->GetRoutingID())); 2067c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("DeleteSelection")); 2068c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2069c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2070c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::SelectAll() { 2071c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2072c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2073c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2074c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2075c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_SelectAll(focused_frame->GetRoutingID())); 2076c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("SelectAll")); 2077c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2078c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2079c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Unselect() { 2080c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2081c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2082c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2083c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2084c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Unselect(focused_frame->GetRoutingID())); 2085c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Unselect")); 2086c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2087c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2088c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Replace(const base::string16& word) { 2089c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2090c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2091c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2092c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2093c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Replace( 2094c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), word)); 2095c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2096c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2097c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::ReplaceMisspelling(const base::string16& word) { 2098c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2099c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_ReplaceMisspelling( 2103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), word)); 2104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::NotifyContextMenuClosed( 2107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const CustomContextMenuContext& context) { 2108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_ContextMenuClosed( 2113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), context)); 2114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::ExecuteCustomContextMenuCommand( 2117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int action, const CustomContextMenuContext& context) { 2118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 2119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 2120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 2121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_CustomContextMenuAction( 2123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), context, action)); 2124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 2125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 2126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeView WebContentsImpl::GetNativeView() { 2127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetNativeView(); 2128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeView WebContentsImpl::GetContentNativeView() { 2131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetContentNativeView(); 2132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeWindow WebContentsImpl::GetTopLevelNativeWindow() { 2135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetTopLevelNativeWindow(); 2136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Rect WebContentsImpl::GetViewBounds() { 2139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetViewBounds(); 2140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Rect WebContentsImpl::GetContainerBounds() { 2143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gfx::Rect rv; 2144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->GetContainerBounds(&rv); 2145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return rv; 2146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DropData* WebContentsImpl::GetDropData() { 2149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetDropData(); 2150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::Focus() { 2153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* const fullscreen_view = 2154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFullscreenRenderWidgetHostView(); 2155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_view) 2156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_view->Focus(); 2157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 2158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->Focus(); 2159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetInitialFocus() { 2162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* const fullscreen_view = 2163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFullscreenRenderWidgetHostView(); 2164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_view) 2165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_view->Focus(); 2166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 2167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->SetInitialFocus(); 2168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::StoreFocus() { 2171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!GetFullscreenRenderWidgetHostView()) 2172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->StoreFocus(); 2173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::RestoreFocus() { 2176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* const fullscreen_view = 2177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFullscreenRenderWidgetHostView(); 2178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_view) 2179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_view->Focus(); 2180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 2181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->RestoreFocus(); 2182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::FocusThroughTabTraversal(bool reverse) { 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 2186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->interstitial_page()->FocusThroughTabTraversal(reverse); 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* const fullscreen_view = 2190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetFullscreenRenderWidgetHostView(); 2191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (fullscreen_view) { 2192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fullscreen_view->Focus(); 2193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 2194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->SetInitialFocus(reverse); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShowingInterstitialPage() const { 2199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->interstitial_page() != NULL; 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPage* WebContentsImpl::GetInterstitialPage() const { 2203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->interstitial_page(); 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsSavable() { 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit creates Document object when MIME type is application/xhtml+xml, 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we also support this MIME type. 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_ == "text/html" || 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/xml" || 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "application/xhtml+xml" || 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/plain" || 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/css" || 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IsSupportedJavascriptMimeType(contents_mime_type_.c_str()); 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSavePage() { 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we can not save the page, try to download it. 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsSavable()) { 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordDownloadSource(INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML); 2221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SaveFrame(GetURL(), Referrer()); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the save package and possibly prompt the user for the name to save 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page as. The user prompt is an asynchronous operation that runs on 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another thread. 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_->GetSaveInfo(); 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in automated testing to bypass prompting the user for file names. 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, the names and paths are hard coded rather than running them through 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file name sanitation and extension / mime checking. 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::SavePage(const base::FilePath& main_file, 22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& dir_path, 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePageType save_type) { 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the page from navigating. 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this, save_type, main_file, dir_path); 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return save_package_->Init(SavePackageDownloadCreatedCallback()); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::SaveFrame(const GURL& url, 2248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Referrer& referrer) { 2249ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!GetURL().is_valid()) 2250ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_main_frame = (url == GetURL()); 2252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadManager* dlm = 2254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BrowserContext::GetDownloadManager(GetBrowserContext()); 2255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!dlm) 2256ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2257ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int64 post_id = -1; 2258ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (is_main_frame) { 22594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const NavigationEntry* entry = controller_.GetLastCommittedEntry(); 2260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (entry) 2261ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch post_id = entry->GetPostID(); 2262ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 2263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<DownloadUrlParameters> params( 2264ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadUrlParameters::FromWebContents(this, url)); 2265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_referrer(referrer); 2266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_post_id(post_id); 2267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prefer_cache(true); 2268ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (post_id >= 0) 2269ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_method("POST"); 2270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prompt(true); 2271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch dlm->DownloadUrl(params.Pass()); 2272ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 2273ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML( 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file, 2276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::Callback<void(int64)>& callback) { 2277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MHTMLGenerationManager::GetInstance()->SaveMHTML(this, file, callback); 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const { 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_; 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const { 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_disconnection_; 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() { 2294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canonical_encoding_.clear(); 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &renderer_preferences_; 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() { 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(GetRenderViewHost()); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceEndedAt(int client_x, int client_y, 2307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int screen_x, int screen_y, blink::WebDragOperation operation) { 2308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 2309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceEndedAt(client_x, client_y, 2310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 2312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceEndedAt(client_x, client_y, 2313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 2314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetResourceResponseStart( 23175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceRequestDetails& details) { 23185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_.ssl_manager()->DidStartResourceResponse(details); 23195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 23215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetResourceResponseStart(details)); 23225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 23245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotificationService::current()->Notify( 23255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTIFICATION_RESOURCE_RESPONSE_STARTED, 23265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Source<WebContents>(this), 23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Details<const ResourceRequestDetails>(&details)); 23285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetRedirectForResourceRequest( 23315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host, 23325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceRedirectDetails& details) { 23335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_.ssl_manager()->DidReceiveResourceRedirect(details); 23345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 23365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 23375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 23385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetRedirectForResourceRequest(render_view_host, details)); 23395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 23415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotificationService::current()->Notify( 23425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, 23435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Source<WebContents>(this), 23445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Details<const ResourceRedirectDetails>(&details)); 23455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() { 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetRenderViewHost()) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->DragSourceSystemDragEnded(); 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DragEnded(); 2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->SystemDragEnded(); 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() { 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) { 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_ = value; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const { 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closed_by_user_gesture_; 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() { 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = GetController().GetLastCommittedEntry(); 23734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!entry) 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate_->ViewSourceForTab(this, entry->GetURL()); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url, 238090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 238490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->ViewSourceForFrame(this, url, page_state); 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const { 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return minimum_zoom_percent_; 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const { 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return maximum_zoom_percent_; 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const { 23965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return capturer_count_ == 0 ? preferred_size_ : preferred_size_for_capture_; 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { 2400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetBrowserPluginGuest()) 2401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetBrowserPluginGuest()->LockMouse(allowed); 2402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost() ? 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false; 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const { 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_ != NULL; 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 241190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) { 2412a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!color_chooser_info_.get()) 2413a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2414a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch RenderFrameHost* rfh = RenderFrameHost::FromID( 2415a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_process_id, 2416a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_frame_id); 2417a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!rfh) 2418a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2419a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2420a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->Send(new FrameMsg_DidChooseColorResponse( 2421a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->GetRoutingID(), color_chooser_info_->identifier, color)); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidEndColorChooser() { 2425a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!color_chooser_info_.get()) 2426a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2427a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch RenderFrameHost* rfh = RenderFrameHost::FromID( 2428a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_process_id, 2429a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_frame_id); 2430a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!rfh) 2431a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2432a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2433a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->Send(new FrameMsg_DidEndColorChooser( 2434a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->GetRoutingID(), color_chooser_info_->identifier)); 2435a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_.reset(); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int WebContentsImpl::DownloadImage(const GURL& url, 2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_favicon, 2440d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uint32_t max_bitmap_size, 2441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ImageDownloadCallback& callback) { 2442e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int id = StartDownload(GetMainFrame(), url, is_favicon, max_bitmap_size); 2443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_[id] = callback; 24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id; 24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::IsSubframe() const { 24485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return is_subframe_; 24495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::Find(int request_id, 24525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& search_text, 24535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebFindOptions& options) { 24545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_Find(GetRoutingID(), request_id, search_text, options)); 24555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::StopFinding(StopFindAction action) { 24585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_StopFinding(GetRoutingID(), action)); 24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::InsertCSS(const std::string& css) { 2462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetMainFrame()->Send(new FrameMsg_CSSInsertRequest( 2463c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetMainFrame()->GetRoutingID(), css)); 2464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 24661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool WebContentsImpl::WasRecentlyAudible() { 24671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return audio_stream_monitor_.WasRecentlyAudible(); 24681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 24691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 24701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::GetManifest(const GetManifestCallback& callback) { 24711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manifest_manager_host_->GetManifest(GetMainFrame(), callback); 24721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 24731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() { 24754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 2476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (entry && entry->GetURL() == GURL(url::kAboutBlankURL)) 24772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) { 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SetFocusToLocationBar(select_all); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoad( 2487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 2488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& validated_url, 2489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_error_page, 2490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_iframe_srcdoc) { 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the start of the provisional load. 2492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 2493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, 2494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 2495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidStartProvisionalLoadForFrame( 2496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host, validated_url, is_error_page, is_iframe_srcdoc)); 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebContentsImpl::DidStartNavigationTransition( 25005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHostImpl* render_frame_host) { 25015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_ANDROID) 25025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int render_frame_id = render_frame_host->GetRoutingID(); 25036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GetWebContentsAndroid()->DidStartNavigationTransitionForFrame( 25046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) render_frame_id); 25055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 25065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 25075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 25085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError( 25095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 25105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) { 25115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL validated_url(params.url); 2512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(WebContentsObserver, 2513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 2514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidFailProvisionalLoad(render_frame_host, 2515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch validated_url, 2516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.error_code, 2517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.error_description)); 25185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 25205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailLoadWithError( 25215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 25225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 25235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int error_code, 25245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& error_description) { 2525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 2526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, 2527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 2528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidFailLoad(render_frame_host, url, error_code, error_description)); 25295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::NotifyChangedNavigationState( 2532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InvalidateTypes changed_flags) { 2533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NotifyNavigationStateChanged(changed_flags); 2534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 25365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::AboutToNavigateRenderFrame( 25375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host) { 25385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers that we will navigate in this RenderView. 253923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = render_frame_host->render_view_host(); 25405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 25415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 25425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 254323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) AboutToNavigateRenderView(render_view_host)); 25445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 25465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStartNavigationToPendingEntry( 25475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 25485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 25495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationController::ReloadType reload_type) { 25505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 25515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 25525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 25535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 25545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidStartNavigationToPendingEntry(url, reload_type)); 25555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderFrameHostImpl* render_frame_host, 2558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OpenURLParams& params) { 2559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int source_render_frame_id = render_frame_host->GetRoutingID(); 2560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebContents* new_contents = OpenURL(params); 2561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (new_contents) { 2563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Notify observers. 2564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidOpenRequestedURL(new_contents, 2566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url, 2567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.referrer, 2568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.disposition, 2569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.transition, 2570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) source_render_frame_id)); 2571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 25740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool WebContentsImpl::ShouldPreserveAbortedURLs() { 25750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!delegate_) 25760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 25770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return delegate_->ShouldPreserveAbortedURLs(this); 25780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 25790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 25805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidCommitProvisionalLoad( 2581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 25825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 25831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition transition_type) { 25845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about the commit of the provisional load. 2585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(WebContentsObserver, 2586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 2587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidCommitProvisionalLoadForFrame( 2588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host, url, transition_type)); 25895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2591e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebContentsImpl::DidNavigateMainFramePreCommit( 2592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool navigation_is_within_page) { 2593e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ensure fullscreen mode is exited before committing the navigation to a 2594e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // different page. The next page will not start out assuming it is in 2595e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // fullscreen mode. 2596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (navigation_is_within_page) { 2597c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // No page change? Then, the renderer and browser can remain in fullscreen. 2598e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 2599e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 2600e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (IsFullscreenForCurrentTab()) 2601e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch GetRenderViewHost()->ExitFullscreen(); 2602e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(!IsFullscreenForCurrentTab()); 2603e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 2604e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 26055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit( 26065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const LoadCommittedDetails& details, 26075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 26085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.is_navigation_to_different_page()) { 26095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clear the status bubble. This is a workaround for a bug where WebKit 26105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // doesn't let us know that the cursor left an element during a 26115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // transition (this is also why the mouse cursor remains as a hand after 26125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clicking on a link); see bugs 1184641 and 980803. We don't want to 26135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clear the bubble when a user navigates to a named anchor in the same 26145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page. 26151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UpdateTargetURL(GURL()); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!details.is_in_page) { 26195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Once the main frame is navigated, we're no longer considered to have 26205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // displayed insecure content. 26215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) displayed_insecure_content_ = false; 26225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 26235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetController().GetBrowserContext()); 26245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 26255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 26265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidNavigateMainFrame(details, params)); 26295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (delegate_) 26315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->DidNavigateMainFramePostCommit(this); 2632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit( 26365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 26375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const LoadCommittedDetails& details, 26385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 26395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Now that something has committed, we don't need to track whether the 26405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // initial page has been accessed. 26415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_ = false; 26425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 26435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we navigate off the page, close all JavaScript dialogs. 26445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (dialog_manager_ && !details.is_in_page) 26455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 26485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidNavigateAnyFrame(details, params)); 26505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SetMainFrameMimeType(const std::string& mime_type) { 26535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_mime_type_ = mime_type; 26545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 265558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 265646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool WebContentsImpl::CanOverscrollContent() const { 2657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Disable overscroll when touch emulation is on. See crbug.com/369938. 265803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (force_disable_overscroll_content_) 2659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 2660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 26625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return delegate_->CanOverscrollContent(); 26635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 26645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2667116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::OnThemeColorChanged(SkColor theme_color) { 26686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DidChangeThemeColor(theme_color)); 26706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 26716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache( 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& http_method, 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 26775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResourceType resource_type) { 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatsCounter cache("WebKit.CacheHit"); 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Increment(); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out a notification that we loaded a resource from our memory cache. 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_id = 0; 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CertStatus cert_status = 0; 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int security_bits = -1; 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_status = 0; 2686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SignedCertificateTimestampIDStatusList signed_certificate_timestamp_ids; 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeserializeSecurityInfo(security_info, &cert_id, &cert_status, 2688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &security_bits, &connection_status, 2689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &signed_certificate_timestamp_ids); 2690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(alcutter,eranm): Pass signed_certificate_timestamp_ids into details 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadFromMemoryCacheDetails details( 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method, 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type, resource_type); 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 269558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) controller_.ssl_manager()->DidLoadFromMemoryCache(details); 269658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 269758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 269858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DidLoadResourceFromMemoryCache(details)); 269958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 270058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) { 270158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context( 27025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) resource_type == RESOURCE_TYPE_MEDIA ? 270358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetBrowserContext()->GetMediaRequestContextForRenderProcess( 270458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetRenderProcessHost()->GetID()) : 270558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetBrowserContext()->GetRequestContextForRenderProcess( 270658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetRenderProcessHost()->GetID())); 270758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::PostTask( 270858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::IO, 270958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 271058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&NotifyCacheOnIO, request_context, url, http_method)); 271158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() { 27155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.DisplayedInsecureContent")); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent( 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_origin, const GURL& target_url) { 2723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << security_origin << " ran insecure content from " 2724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << target_url.possibly_invalid_spec(); 27255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.RanInsecureContent")); 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EndsWith(security_origin, kDotGoogleDotCom, false)) 27275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.RanInsecureContentGoogle")); 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ssl_manager()->DidRunInsecureContent(security_origin); 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame() { 27355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(render_frame_message_source_); 27365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!render_view_message_source_); 27375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* rfh = 27385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 2740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, observers_, DocumentLoadedInFrame(rfh)); 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad( 2744effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& url) { 2745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!render_frame_message_source_) { 27465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("BadMessageTerminate_RVD2")); 27475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderProcessHost()->ReceivedBadMessage(); 27485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 27495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 27505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL validated_url(url); 2752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost* render_process_host = 2753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_message_source_->GetProcess(); 27545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_process_host->FilterURL(false, &validated_url); 2755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2756effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RenderFrameHostImpl* rfh = 2757effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 2759116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, observers_, DidFinishLoad(rfh, validated_url)); 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidStartLoading(bool to_different_document) { 2763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It is possible to get multiple calls to OnDidStartLoading that don't have 2768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // corresponding calls to OnDidStopLoading: 2769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - With "swappedout://" URLs, this happens when a RenderView gets swapped 2770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // out for a cross-process navigation, and it turns into a placeholder for 2771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // one being rendered in a different process. 2772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - Also, there might be more than one RenderFrameHost sharing the same 2773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // FrameTreeNode (and thus sharing its ID) each sending a start. 2774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - But in the future, once clamy@ moves navigation network requests to the 2775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // browser process, there's a good chance that callbacks about starting and 2776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // stopping will all be handled by the browser. When that happens, there 2777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // should no longer be a start/stop call imbalance. TODO(avi): When this 2778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // future arrives, update this code to not allow this case. 2779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_GE(loading_frames_in_progress_, 0); 2780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_progresses_.find(render_frame_id) == loading_progresses_.end()) { 2781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidStartLoading(rfh, to_different_document); 2783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++loading_frames_in_progress_; 2784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2786cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = kMinimumLoadingProgress; 2787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2788cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2789cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2790cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidStopLoading() { 2791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_progresses_.find(render_frame_id) != loading_progresses_.end()) { 2796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Load stopped while we were still tracking load. Make sure we update 2797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // progress based on this frame's completion. 2798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = 1.0; 2799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2800cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Then we clean-up our states. 2801cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_total_progress_ == 1.0) 2802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 2803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(japhet): This should be a DCHECK, but the pdf plugin sometimes 2806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // calls DidStopLoading() without a matching DidStartLoading(). 2807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) --loading_frames_in_progress_; 2810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidStopLoading(rfh); 2812cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2813cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidChangeLoadProgress(double load_progress) { 2815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = load_progress; 2820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We notify progress change immediately for the first and last updates. 2822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Also, since the message loop may be pretty busy when a page is loaded, it 2823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // might not execute a posted task in a timely manner so we make sure to 2824cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // immediately send progress report if enough time has passed. 2825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta min_delay = 2826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kMinimumDelayBetweenLoadingUpdatesMS); 2827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (load_progress == 1.0 || loading_last_progress_update_.is_null() || 2828cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks::Now() - loading_last_progress_update_ > min_delay) { 2829cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If there is a pending task to send progress, it is now obsolete. 2830cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.InvalidateWeakPtrs(); 2831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_total_progress_ == 1.0) 2833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 2834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2835cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_weak_factory_.HasWeakPtrs()) 2838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 2841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 2842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&WebContentsImpl::SendLoadProgressChanged, 2843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.GetWeakPtr()), 2844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) min_delay); 2845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) { 2848a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!delegate_ || delegate_->OnGoToEntryOffset(offset)) 2849a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_.GoToOffset(offset); 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent, 2853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int maximum_percent) { 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_ = minimum_percent; 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_ = maximum_percent; 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id, 28592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 28654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (policy->CanReadFile(GetRenderProcessHost()->GetID(), path)) 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->EnumerateDirectory(this, request_id, path); 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol, 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 2878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (policy->IsPseudoScheme(protocol)) 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate_->RegisterProtocolHandler(this, protocol, url, user_gesture); 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2884116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::OnUnregisterProtocolHandler(const std::string& protocol, 2885116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url, 2886116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool user_gesture) { 2887116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!delegate_) 2888116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 2889116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2890116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChildProcessSecurityPolicyImpl* policy = 2891116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChildProcessSecurityPolicyImpl::GetInstance(); 2892116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (policy->IsPseudoScheme(protocol)) 2893116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 2894116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2895116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate_->UnregisterProtocolHandler(this, protocol, url, user_gesture); 2896116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 2897116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id, 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindReply(this, request_id, number_of_matches, selection_rect, 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, final_update); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply( 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version, 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::RectF>& rects, 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::RectF& active_rect) { 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindMatchRectsReply(this, version, rects, active_rect); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnOpenDateTimeDialog( 29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ViewHostMsg_DateTimeDialogValue_Params& value) { 29203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) date_time_chooser_->ShowDialog(ContentViewCore::FromWebContents(this), 29213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost(), 29223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.dialog_type, 2923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.dialog_value, 29243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.minimum, 29253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.maximum, 2926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.step, 2927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.suggestions); 29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id, 2933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::FilePath& path, 2934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_hung) { 2935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1); 2936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2937a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PluginHungStatusChanged(plugin_child_id, path, is_hung)); 2939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPluginCrashed(const base::FilePath& plugin_path, 29422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId plugin_pid) { 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 29442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginCrashed(plugin_path, plugin_pid)); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2947a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDomOperationResponse(const std::string& json_string, 2948a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int automation_id) { 2949a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DomOperationNotificationDetails details(json_string, automation_id); 2950a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotificationService::current()->Notify( 2951a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTIFICATION_DOM_OPERATION_RESPONSE, 2952a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Source<WebContents>(this), 2953a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Details<DomOperationNotificationDetails>(&details)); 2954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url, 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheAccessed(manifest_url, blocked_by_policy)); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser( 2964a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int color_chooser_id, 2965a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SkColor color, 2966a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::vector<ColorSuggestion>& suggestions) { 29670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ColorChooser* new_color_chooser = delegate_ ? 29680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->OpenColorChooser(this, color, suggestions) : 29690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NULL; 29705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!new_color_chooser) 297190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 2972a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_.get()) 2973a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 2974a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2975a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_.reset(new ColorChooserInfo( 2976a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_message_source_->GetProcess()->GetID(), 2977a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_message_source_->GetRoutingID(), 2978a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new_color_chooser, 2979a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id)); 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) { 2983a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_ && 2984a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id == color_chooser_info_->identifier) 2985a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id, 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 2990a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_ && 2991a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id == color_chooser_info_->identifier) 2992a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->SetSelectedColor(color); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled. 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url, 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& args) { 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebUISend(this, source_url, name, args); 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_PLUGINS) 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission( 30063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int routing_id, 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 30082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path) { 30092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_) { 30103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 30112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_->RequestPpapiBrokerPermission( 30152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, url, plugin_path, 30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult, 30173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch base::Unretained(this), routing_id))) { 30182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 30193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 30202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WebContentsImpl::OnPpapiBrokerPermissionResult(int routing_id, 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result) { 30253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch Send(new ViewMsg_PpapiBrokerPermissionResult(routing_id, result)); 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnBrowserPluginMessage(const IPC::Message& message) { 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin 30302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // specific messages for this WebContents. This means that any message from 30312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a BrowserPlugin prior to this will be ignored. 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above classes BrowserPluginEmbedder and 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginGuest. 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!browser_plugin_embedder_.get()); 30352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this)); 30362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_->OnMessageReceived(message); 30372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::OnDidDownloadImage( 30412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 304290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int http_status_code, 30432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& image_url, 3044d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<SkBitmap>& bitmaps, 3045d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<gfx::Size>& original_bitmap_sizes) { 30465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bitmaps.size() != original_bitmap_sizes.size()) 30475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 30485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageDownloadMap::iterator iter = image_download_map_.find(id); 3050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iter == image_download_map_.end()) { 30512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently WebContents notifies us of ANY downloads so that it is 30522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // possible to get here. 30532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!iter->second.is_null()) { 3056d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) iter->second.Run( 3057d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) id, http_status_code, image_url, bitmaps, original_bitmap_sizes); 30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_.erase(id); 30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnUpdateFaviconURL( 30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<FaviconURL>& candidates) { 30642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DidUpdateFaviconURL(candidates)); 30662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::CreateAudioPowerSaveBlocker() { 30691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ChromeOS has its own way of handling power save blocks for media. 3070ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_CHROMEOS) 30711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!audio_power_save_blocker_); 30721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_power_save_blocker_ = PowerSaveBlocker::Create( 30731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing Audio"); 30741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 30751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 30761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::CreateVideoPowerSaveBlocker() { 30781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ChromeOS has its own way of handling power save blocks for media. 30791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(OS_CHROMEOS) 30801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!video_power_save_blocker_); 30811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!active_video_players_.empty()); 30821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_power_save_blocker_ = PowerSaveBlocker::Create( 30831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing Video"); 3084ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID) 30851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<PowerSaveBlockerImpl*>(video_power_save_blocker_.get()) 30861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->InitDisplaySleepBlocker(GetView()->GetNativeView()); 3087ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 30881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 30891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 30901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 30911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::MaybeReleasePowerSaveBlockers() { 30921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If there are no more audio players and we don't have audio stream 30931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // monitoring, release the audio power save blocker here instead of during 30941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // NotifyNavigationStateChanged(). 30951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (active_audio_players_.empty() && 30961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !AudioStreamMonitor::monitoring_available()) { 30971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_power_save_blocker_.reset(); 30985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3099ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 31001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If there are no more video players, clear the video power save blocker. 31011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (active_video_players_.empty()) 31021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_power_save_blocker_.reset(); 31031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 31041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, 31061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_video, 31071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_audio) { 31081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (has_audio) { 31091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AddMediaPlayerEntry(player_cookie, &active_audio_players_); 31101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If we don't have audio stream monitoring, allocate the audio power save 31121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // blocker here instead of during NotifyNavigationStateChanged(). 31131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!audio_power_save_blocker_ && 31141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !AudioStreamMonitor::monitoring_available()) { 31151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAudioPowerSaveBlocker(); 31166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 3117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 31181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (has_video) { 31201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AddMediaPlayerEntry(player_cookie, &active_video_players_); 31211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If we're not hidden and have just created a player, create a blocker. 31231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!video_power_save_blocker_ && !IsHidden()) 31241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateVideoPowerSaveBlocker(); 31251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 31285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) { 31291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RemoveMediaPlayerEntry(player_cookie, &active_audio_players_); 31301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RemoveMediaPlayerEntry(player_cookie, &active_video_players_); 31311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MaybeReleasePowerSaveBlockers(); 31325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 31335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::OnFirstVisuallyNonEmptyPaint() { 3135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DidFirstVisuallyNonEmptyPaint()); 3137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidChangeVisibleSSLState() { 314046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (delegate_) 314146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delegate_->VisibleSSLStateChanged(this); 31422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifyBeforeFormRepostWarningShow() { 31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeforeFormRepostWarningShow()); 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::ActivateAndShowRepostFormWarningDialog() { 31501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Activate(); 31511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate_) 31521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate_->ShowRepostFormWarningDialog(this); 31531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 31541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 31555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool WebContentsImpl::HasAccessedInitialDocument() { 31565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return has_accessed_initial_document_; 31575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 31585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is 31604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// loading, or done loading. 31614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::SetIsLoading(RenderViewHost* render_view_host, 31624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool is_loading, 3163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document, 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNotificationDetails* details) { 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading == is_loading_) 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading) { 3169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE, 3170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_.clear(); 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = 0; 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = 0; 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->SetIsLoading(is_loading); 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = is_loading; 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_ = is_loading; 3180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_load_to_different_document_ = to_different_document; 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 3183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch delegate_->LoadingStateChanged(this, to_different_document); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD); 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string url = (details ? details->url.possibly_invalid_spec() : "NULL"); 31874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (is_loading) { 31881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_BEGIN1("browser,navigation", "WebContentsImpl Loading", 31891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, "URL", url); 31904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DidStartLoading(render_view_host)); 31924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 31931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_END1("browser,navigation", "WebContentsImpl Loading", 31941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, "URL", url); 31954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DidStopLoading(render_view_host)); 31974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 31984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP; 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDetails det = NotificationService::NoDetails(); 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details) 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) det = Details<LoadNotificationDetails>(details); 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, Source<NavigationController>(&controller_), det); 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::SelectRange(const gfx::Point& start, 3209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Point& end) { 3210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 3211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 3212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 3213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send( 3215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new InputMsg_SelectRange(focused_frame->GetRoutingID(), start, end)); 3216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) { 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are creating a RVH for a restored controller, then we need to make 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the RenderView starts with a next_page_id_ larger than the number 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of restored entries. This must be called before the RenderView starts 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating (to avoid a race between the browser updating max_page_id and 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the renderer updating next_page_id_). Because of this, we only call this 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from CreateRenderView and allow that to notify the RenderView for us. 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_restored_page_id = controller_.GetMaxRestoredPageID(); 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_restored_page_id > 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(rvh->GetSiteInstance())) 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(), 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_restored_page_id); 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry, 3233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For file URLs without a title, use the pathname instead. In the case of a 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synthesized title, we don't want the update to count toward the "one set 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per page of the title to history." 3237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 final_title; 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool explicit_set; 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry && entry->GetURL().SchemeIsFile() && title.empty()) { 32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final_title = base::UTF8ToUTF16(entry->GetURL().ExtractFileName()); 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = false; // Don't count synthetic titles toward the set limit. 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(title, base::TRIM_ALL, &final_title); 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = true; 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a page is created via window.open and never navigated, 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there will be no navigation entry. In this situation, 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| will be used for page title. 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_title == entry->GetTitle()) 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTitle(final_title); 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_title_when_no_navigation_entry_ == final_title) 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_title_when_no_navigation_entry_ = final_title; 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, set the title for the view. 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetPageTitle(final_title); 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 32664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TitleWasSet(entry, explicit_set)); 32674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 32684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<NavigationEntry*, bool> details = 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(entry, explicit_set); 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<NavigationEntry*, bool> >(&details)); 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::SendLoadProgressChanged() { 3280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_last_progress_update_ = base::TimeTicks::Now(); 3281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double progress = 0.0; 3282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int frame_count = 0; 3283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (LoadingProgressMap::iterator it = loading_progresses_.begin(); 3285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != loading_progresses_.end(); 3286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 3287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress += it->second; 3288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++frame_count; 3289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 3290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (frame_count == 0) 3291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress /= frame_count; 3293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(progress <= 1.0); 3294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (progress <= loading_total_progress_) 3296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_ = progress; 3298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (delegate_) 3300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate_->LoadProgressChanged(this, progress); 3301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::ResetLoadProgressState() { 3304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_.clear(); 3305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_ = 0.0; 3306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.InvalidateWeakPtrs(); 3307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_last_progress_update_ = base::TimeTicks(); 3308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3310116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::NotifyViewSwapped(RenderViewHost* old_host, 3311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderViewHost* new_host) { 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After sending out a swap notification, we need to send a disconnect 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification so that clients that pick up a pointer to |this| can NULL the 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer. See Bug 1230284. 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 331658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 33174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHostChanged(old_host, new_host)); 331858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 331958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 33204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::pair<RenderViewHost*, RenderViewHost*> details = 33214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::make_pair(old_host, new_host); 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 33234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTIFICATION_RENDER_VIEW_HOST_CHANGED, 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 33254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Details<std::pair<RenderViewHost*, RenderViewHost*> >(&details)); 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that the associated embedder gets cleared after a RenderViewHost 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets swapped, so we don't reuse the same embedder next time a 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is attached to this WebContents. 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveBrowserPluginEmbedder(); 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3333116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::NotifyFrameSwapped(RenderFrameHost* old_host, 3334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* new_host) { 3335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(WebContentsObserver, 3336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch observers_, 3337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostChanged(old_host, new_host)); 3338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 334058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(avi): Remove this entire function because this notification is already 334158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// covered by two observer functions. http://crbug.com/170921 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() { 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notify_disconnection_) 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = false; 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::NotifyNavigationEntryCommitted( 3354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const LoadCommittedDetails& load_details) { 3355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FOR_EACH_OBSERVER( 3356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContentsObserver, observers_, NavigationEntryCommitted(load_details)); 3357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderFrameHost* render_frame_host, 3360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const IPC::Message& message) { 3361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return OnMessageReceived(NULL, render_frame_host, message); 3362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst GURL& WebContentsImpl::GetMainFrameLastCommittedURL() const { 3365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetLastCommittedURL(); 3366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameCreated(RenderFrameHost* render_frame_host) { 3369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Note this is only for subframes, the notification for the main frame 3370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // happens in RenderViewCreated. 3371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 3373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameCreated(render_frame_host)); 3374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAccessibilityModeOnFrame(accessibility_mode_, render_frame_host); 3375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) { 3378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClearPowerSaveBlockers(render_frame_host); 3379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 3381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameDeleted(render_frame_host)); 3382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 33845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::WorkerCrashed(RenderFrameHost* render_frame_host) { 33855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 33865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->WorkerCrashed(this); 33875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ShowContextMenu(RenderFrameHost* render_frame_host, 33905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ContextMenuParams& params) { 3391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ContextMenuParams context_menu_params(params); 33925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Allow WebContentsDelegates to handle the context menu operation first. 3393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetBrowserPluginGuest()) { 3394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebContentsViewGuest* view_guest = 3395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<WebContentsViewGuest*>(GetView()); 3396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_menu_params = view_guest->ConvertContextMenuParams(params); 3397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 3398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (delegate_ && delegate_->HandleContextMenu(context_menu_params)) 33995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 34005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_host_delegate_view_->ShowContextMenu(render_frame_host, 3402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_menu_params); 34035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 34045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::RunJavaScriptMessage( 3406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host, 3407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 3408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& default_prompt, 3409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& frame_url, 3410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch JavaScriptMessageType javascript_message_type, 3411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg) { 3412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Suppress JavaScript dialogs when requested. Also suppress messages when 3413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // showing an interstitial as it's shown over the previous page and we don't 3414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // want the hidden page's dialogs to interfere with the interstitial. 3415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool suppress_this_message = 3416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderViewHostImpl*>(render_frame_host->GetRenderViewHost())-> 3417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IsSwappedOut() || 3418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ShowingInterstitialPage() || 3419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_ || 3420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->ShouldSuppressDialogs() || 3421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_->GetJavaScriptDialogManager(); 3422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!suppress_this_message) { 3424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string accept_lang = GetContentClient()->browser()-> 3425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetAcceptLangs(GetBrowserContext()); 3426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 3427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_->RunJavaScriptDialog( 3428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, 3429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_url.GetOrigin(), 3430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch accept_lang, 3431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch javascript_message_type, 3432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message, 3433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch default_prompt, 3434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&WebContentsImpl::OnDialogClosed, 3435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Unretained(this), 3436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetProcess()->GetID(), 3437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), 3438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reply_msg, 3439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch false), 3440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &suppress_this_message); 3441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (suppress_this_message) { 3444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If we are suppressing messages, just reply as if the user immediately 3445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // pressed "Cancel", passing true to |dialog_was_suppressed|. 3446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnDialogClosed(render_frame_host->GetProcess()->GetID(), 3447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), reply_msg, 34485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu true, false, base::string16()); 3449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // OnDialogClosed (two lines up) may have caused deletion of this object (see 3452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // http://crbug.com/288961 ). The only safe thing to do here is return. 3453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::RunBeforeUnloadConfirm( 3456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host, 3457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 3458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_reload, 3459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg) { 3460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHostImpl* rfhi = 3461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_host); 3462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderViewHostImpl* rvhi = 3463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderViewHostImpl*>(render_frame_host->GetRenderViewHost()); 3464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (delegate_) 3465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->WillRunBeforeUnloadConfirm(); 3466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool suppress_this_message = 3468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch rvhi->rvh_state() != RenderViewHostImpl::STATE_DEFAULT || 3469c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_ || 3470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->ShouldSuppressDialogs() || 3471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_->GetJavaScriptDialogManager(); 3472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (suppress_this_message) { 3473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch rfhi->JavaScriptDialogClosed(reply_msg, true, base::string16(), true); 3474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 3475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_showing_before_unload_dialog_ = true; 3478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 3479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_->RunBeforeUnloadDialog( 3480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, message, is_reload, 3481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), 3482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetProcess()->GetID(), 3483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), reply_msg, 34845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu false)); 3485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 34875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() { 34885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return this; 34895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 34905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool WebContentsImpl::IsNeverVisible() { 34920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!delegate_) 34930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 34940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return delegate_->IsNeverVisible(this); 34950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 34960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) 3498116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { 3499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return accessible_parent_; 3500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 3502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_view_host_delegate_view_; 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs( 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context) const { 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_; 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetRootWindowResizerRect(); 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() { 3519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_) 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_.reset(); 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send notifications if we are just creating a swapped-out RVH for 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the opener chain. These won't be used for view-source or WebUI, so it's 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ok to return early. 35275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(render_view_host)->IsSwappedOut()) 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 3531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 35322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<RenderViewHost>(render_view_host)); 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're creating views, we're still doing initial setup, so we always 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the pending Web UI rather than any possibly existing committed one. 3540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_web_ui()) 3541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_web_ui()->RenderViewCreated(render_view_host); 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetPendingEntry(); 3544424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (entry && entry->IsViewSourceMode()) { 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put the renderer in view source mode. 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->Send( 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID())); 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->RenderViewCreated(render_view_host); 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, observers_, RenderViewCreated(render_view_host)); 3554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We tell the observers now instead of when the main RenderFrameHostImpl is 3556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // constructed because otherwise it would be too early (i.e. IPCs sent to the 3557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // frame would be dropped because it's not created yet). 3558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* main_frame = render_view_host->GetMainFrame(); 3559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER( 3560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsObserver, observers_, RenderFrameCreated(main_frame)); 3561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetAccessibilityModeOnFrame(accessibility_mode_, main_frame); 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify the world, since this came from a renderer in the 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 357158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notify_disconnection_ = true; 357258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 357358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NotificationService::current()->Notify( 357458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTIFICATION_WEB_CONTENTS_CONNECTED, 357558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Source<WebContents>(this), 357658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NotificationService::NoDetails()); 357758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_crashed = IsCrashed(); 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0); 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the focus to the tab (otherwise the focus will be on the top 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window). 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_crashed && !FocusLocationBarByDefault() && 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) { 35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Focus(); 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady()); 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, 3592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TerminationStatus status, 3593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int error_code) { 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pending page's RenderViewHost is gone. 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure fullscreen mode is exited in the |delegate_| since a crashed 3600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // renderer may not have made a clean exit. 3601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsFullscreenForCurrentTab()) 3602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ToggleFullscreenMode(false); 3603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cancel any visible dialogs so they are not left dangling over the sad tab. 3605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dialog_manager_) 3606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 3607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (delegate_) 3609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate_->HideValidationMessage(this); 3610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3611effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(rvh, false, true, NULL); 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(status, error_code); 3614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Reset the loading progress. TODO(avi): What does it mean to have a 3616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // "renderer crash" when there is more than one renderer process serving a 3617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // webpage? Once this function is called at a more granular frame level, we 3618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // probably will need to more granularly reset the state here. 3619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 3620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_frames_in_progress_ = 0; 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 36247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RenderProcessGone(GetCrashedStatus())); 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh, 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 363390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that this state update comes from either the active RVH or one of 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the swapped out RVHs. We don't expect to hear from any other RVHs. 36365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(nasko): This should go through RenderFrameHost. 36375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(creis): We can't update state for cross-process subframes until we 36385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have FrameNavigationEntries. Once we do, this should be a DCHECK. 36395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rvh != GetRenderViewHost() && 36405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetRenderManager()->IsRVHOnSwappedOutList( 36415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderViewHostImpl*>(rvh))) 36425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must be prepared to handle state updates for any page, these occur 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the user is scrolling and entering form data, as well as when we're 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leaving a page, in which case our state may have already been moved to 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the next page. The navigation controller will look up the appropriate 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationEntry and update it when it is notified via the delegate. 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entry_index = controller_.GetEntryIndexWithPageID( 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_index < 0) 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (page_state == entry->GetPageState()) 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 365890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) entry->SetPageState(page_state); 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.NotifyEntryChanged(entry, entry_index); 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::UpdateTargetURL(const GURL& url) { 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 36641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate_->UpdateTargetURL(this, url); 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) { 36682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The UI may be in an event-tracking loop, such as between the 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse-down and mouse-up in text selection or a button click. 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer the close until after tracking is complete, so that we 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't free objects out from under the UI. 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(shess): This could get more fine-grained. For instance, 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing a tab in another window while selecting text in the 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current window's Omnibox should be just fine. 36762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_->IsEventTracking()) { 36772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CloseTabAfterEventTracking(); 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore this if it comes from a RenderViewHost that we aren't showing. 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->CloseContents(this); 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3687effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsImpl::SwappedOut(RenderFrameHost* rfh) { 3688e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (delegate_ && rfh->GetRenderViewHost() == GetRenderViewHost()) 3689e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch delegate_->SwappedOut(this); 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebContentsImpl::DidDeferAfterResponseStarted( 36936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const TransitionLayerData& transition_data) { 3694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_ANDROID) 36956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GetWebContentsAndroid()->DidDeferAfterResponseStarted(transition_data); 3696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 3697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3699116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebContentsImpl::WillHandleDeferAfterResponseStarted() { 3700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_ANDROID) 37016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return GetWebContentsAndroid()->WillHandleDeferAfterResponseStarted(); 3702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 3703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 3704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 3705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) { 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->IsPopupOrPanel(this)) 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->MoveContents(this, new_bounds); 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3712effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsImpl::DidStartLoading(RenderFrameHost* render_frame_host, 3713effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document) { 3714effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(render_frame_host->GetRenderViewHost(), true, 3715effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch to_different_document, NULL); 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderFrameHost* render_frame_host) { 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoadNotificationDetails> details; 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use the last committed entry rather than the active one, in case a 3722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pending entry has been created. 3723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 37245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Navigator* navigator = frame_tree_.root()->navigator(); 3725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An entry may not exist for a stop when loading an initial blank page or 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if an iframe injected by script into a blank page finishes loading. 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 37295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta elapsed = 37305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks::Now() - navigator->GetCurrentLoadStart(); 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.reset(new LoadNotificationDetails( 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetVirtualURL(), 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType(), 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elapsed, 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &controller_, 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetCurrentEntryIndex())); 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3740effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(render_frame_host->GetRenderViewHost(), false, true, 3741effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch details.get()); 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() { 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the URL display. 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::DidAccessInitialDocument() { 37525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_ = true; 37535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 37540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // We may have left a failed browser-initiated navigation in the address bar 37550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // to let the user edit it and try again. Clear it now that content might 37560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // show up underneath it. 37570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!IsLoading() && controller_.GetPendingEntry()) 37580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch controller_.DiscardPendingEntry(); 37590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Update the URL display. 37611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 3762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DidDisownOpener(RenderFrameHost* render_frame_host) { 376503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // No action is necessary if the opener has already been cleared. 376603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!opener_) 376703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return; 376803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 376903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Clear our opener so that future cross-process navigations don't have an 377003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // opener assigned. 377103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RemoveDestructionObserver(opener_); 377203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) opener_ = NULL; 3773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Notify all swapped out RenderViewHosts for this tab. This is important 3775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // in case we go back to them, or if another window in those processes tries 3776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // to access window.opener. 37771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetRenderManager()->DidDisownOpener(render_frame_host); 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompleted( 3781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host) { 37824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DocumentOnLoadCompletedInMainFrame()); 37844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 3789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotificationService::NoDetails()); 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderFrameHost* render_frame_host, 3793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 page_id, 3794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::string16& title, 3795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::i18n::TextDirection title_direction) { 3796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewHost* rvh = render_frame_host->GetRenderViewHost(); 3797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If we have a title, that's a pretty good indication that we've started 3799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // getting useful data. 3800cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetNotWaitingForResponse(); 3801cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Try to find the navigation entry, which might not be the current one. 3803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For example, it might be from a pending RVH for the pending entry. 3804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NavigationEntryImpl* entry = controller_.GetEntryWithPageID( 3805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 3806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We can handle title updates when we don't have an entry in 3808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // UpdateTitleForEntry, but only if the update is from the current RVH. 3809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(avi): Change to make decisions based on the RenderFrameHost. 3810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!entry && rvh != GetRenderViewHost()) 3811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3812cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3813cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(evan): make use of title_direction. 3814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=27094 3815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!UpdateTitleForEntry(entry, title)) 3816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Broadcast notifications when the UI should be updated. 3819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (entry == controller_.GetEntryAtOffset(0)) 3820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); 3821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderFrameHost* render_frame_host, 3824cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& encoding) { 3825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetEncoding(encoding); 3826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame( 3829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderViewHost* render_view_host) { 3830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DocumentAvailableInMainFrame()); 3832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the active RenderViewHost to run unload handlers and close, as long 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the request came from a RenderViewHost in the same BrowsingInstance. 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->ClosePage(); 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent( 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only deliver the message to the active RenderViewHost if the request 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // came from a RenderViewHost in the same BrowsingInstance or if this 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents is dedicated to a browser plugin guest. 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This check means that an embedder could theoretically receive a 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // postMessage from anyone (not just its own guests). However, this is 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probably not a risk for apps since other pages won't have references 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to App windows. 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params new_params(params); 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!params.message_port_ids.empty()) { 38608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MessagePortMessageFilter* message_port_message_filter = 38618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static_cast<RenderProcessHostImpl*>(GetRenderProcessHost()) 38628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ->message_port_message_filter(); 3863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) message_port_message_filter->UpdateMessagePortsWithNewRoutes( 3864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.message_port_ids, 3865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &new_params.new_routing_ids); 38668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 38678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a source_routing_id, translate it to the routing ID for 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the equivalent swapped out RVH in the target process. If we need 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to create a swapped out RVH for the source tab, we create its opener 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chain as well, since those will also be accessible to the target page. 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_params.source_routing_id != MSG_ROUTING_NONE) { 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to look up the WebContents for the source page. 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* source_contents = NULL; 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID(), params.source_routing_id); 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_rvh) { 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents = static_cast<WebContentsImpl*>( 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_rvh->GetDelegate()->GetAsWebContents()); 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_contents) { 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBrowserPluginGuest()) { 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create a swapped out RenderView for the embedder in the guest's 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // render process but we intentionally do not expose the embedder's 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener chain to it. 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateSwappedOutRenderView(GetSiteInstance()); 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateOpenerRenderViews(GetSiteInstance()); 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We couldn't find it, so don't pass a source frame. 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = MSG_ROUTING_NONE; 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level, 3906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message, 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 3908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& source_id) { 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AddMessageToConsole(this, level, message, line_no, 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_id); 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)WebPreferences WebContentsImpl::ComputeWebkitPrefs() { 39164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We want to base the page config off of the actual URL, rather than the 39174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // virtual URL. 39184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(nasko): Investigate how to remove the GetActiveEntry usage here, 39194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // as it is deprecated and can be out of sync with GetRenderViewHost(). 392068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GURL url = controller_.GetActiveEntry() 392168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); 39221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 39236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return GetRenderManager()->current_host()->ComputeWebkitPrefs(url); 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView( 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 39285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return GetRenderManager()->CreateRenderFrame( 39295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) instance, MSG_ROUTING_NONE, true, true, true); 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() { 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); 39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh) // NULL in unittests. 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rdh->OnUserGesture(this); 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() { 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent()); 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh, 39473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_during_beforeunload, 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_during_unload) { 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't show hung renderer dialog for a swapped out RVH. 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore renderer unresponsive event if debugger is attached to the tab 39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the event may be a result of the renderer sitting on a breakpoint. 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/65458 39582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (DevToolsAgentHost::IsDebuggerAttached(this)) 39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (is_during_beforeunload || is_during_unload) { 39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hang occurred while firing the beforeunload/unload handler. 39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend the handler fired so tab closing continues as if it had. 39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->set_sudden_termination_allowed(true); 39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer()) 39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab hangs in the beforeunload/unload handler there's really 39703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // nothing we can do to recover. If the hang is in the beforeunload handler, 39713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // pretend the beforeunload listeners have all fired and allow the delegate 39723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // to continue closing; the user will not have the option of cancelling the 39733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // close. Otherwise, pretend the unload listeners have all fired and close 39743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the tab. 39753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool close = true; 39760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (is_during_beforeunload && delegate_) { 39773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) delegate_->BeforeUnloadFired(this, true, &close); 39783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 39793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (close) 39803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Close(rvh); 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive()) 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererUnresponsive(this); 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) { 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererResponsive(this); 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged( 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::LoadStateWithParam& load_state, 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_position, 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_size) { 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = load_state; 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = upload_position; 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = upload_size; 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_ = net::IDNToUnicode(url.host(), 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext())); 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_state_.state == net::LOAD_STATE_READING_RESPONSE) 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsLoading()) { 40106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NotifyNavigationStateChanged(static_cast<InvalidateTypes>( 40116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB)); 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager( 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, const base::TimeTicks& proceed_time, 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 40187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 40197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadFired(proceed_time)); 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload); 4022eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note: |this| might be deleted at this point. 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebContentsImpl::RenderProcessGoneFromRenderManager( 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING); 4028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderViewTerminated(render_view_host, crashed_status_, crashed_error_code_); 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() { 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this is a hack. See WebContentsView::SizeContents. 4033424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size = GetSizeForNewRenderView(); 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here during container initialization and normal window size will be set 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. In case of tab duplication this resizing to 0x0 prevents setting 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal size later so just ignore it. 40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!size.IsEmpty()) 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SizeContents(size); 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::CancelModalDialogsForRenderManager() { 40434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We need to cancel modal dialogs when doing a process swap, since the load 40444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // deferrer would prevent us from swapping out. 40454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (dialog_manager_) 40464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 40474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 40484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4049116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::NotifySwappedFromRenderManager(RenderFrameHost* old_host, 4050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* new_host, 4051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_main_frame) { 4052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (is_main_frame) { 4053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NotifyViewSwapped(old_host ? old_host->GetRenderViewHost() : NULL, 4054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new_host->GetRenderViewHost()); 40552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Make sure the visible RVH reflects the new delegate's preferences. 4057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (delegate_) 4058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 4059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->RenderViewSwappedIn(new_host->GetRenderViewHost()); 4061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 40622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NotifyFrameSwapped(old_host, new_host); 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager( 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_) 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recursively create RenderViews for anything else in the opener chain. 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_->CreateOpenerRenderViews(instance); 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opener_route_id = MSG_ROUTING_NONE; 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this tab has an opener, ensure it has a RenderView in the given 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance as well. 40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_) 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id = opener_->CreateOpenerRenderViews(instance); 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any of the renderers (current, pending, or swapped out) for this 40842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents has the same SiteInstance, use it. 4085f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->current_host()->GetSiteInstance() == instance) 4086f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetRoutingID(); 40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4088f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_render_view_host() && 4089f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_render_view_host()->GetSiteInstance() == 4090f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) instance) 4091f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->pending_render_view_host()->GetRoutingID(); 40922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4093f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostImpl* rvh = GetRenderManager()->GetSwappedOutRenderViewHost( 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance); 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetRoutingID(); 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a swapped out RenderView in the given SiteInstance if none exists, 40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setting its opener to the given route_id. Return the new view's route_id. 41005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return GetRenderManager()->CreateRenderFrame( 41015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) instance, opener_route_id, true, true, true); 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetController(); 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebUIImpl*>(CreateWebUI(url)); 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry* 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() { 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetLastCommittedEntry(); 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager( 41185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host, 41195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int opener_route_id, 4120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int proxy_routing_id, 41215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool for_main_frame_navigation) { 41221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT0("browser,navigation", 41231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "WebContentsImpl::CreateRenderViewForRenderManager"); 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 4125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* rwh_view; 41265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary 41275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // until RenderWidgetHost is attached to RenderFrameHost. We need to special 41285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // case this because RWH is still a base class of RenderViewHost, and child 41295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // frame RWHVs are unique in that they do not have their own WebContents. 41305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!for_main_frame_navigation) { 41315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostViewChildFrame* rwh_view_child = 41325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new RenderWidgetHostViewChildFrame(render_view_host); 41335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwh_view = rwh_view_child; 41345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 41355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwh_view = view_->CreateViewForWidget(render_view_host); 41365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the RenderView has been created, we need to tell it its size. 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 4140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) rwh_view->SetSize(GetSizeForNewRenderView()); 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we use the correct starting page_id in the new RenderView. 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDIfNecessary(render_view_host); 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 max_page_id = 41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance()); 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<RenderViewHostImpl*>( 4148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_host)->CreateRenderView(base::string16(), 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id, 4150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) proxy_routing_id, 41510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch max_page_id, 41520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch created_with_opener_)) { 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a ViewMsg_Resize to be sent, needed to make plugins show up on 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // linux. See crbug.com/83941. 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) { 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost()) 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host->WasResized(); 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool WebContentsImpl::CreateRenderFrameForRenderManager( 41695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHost* render_frame_host, 41705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int parent_routing_id) { 41711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT0("browser,navigation", 41721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "WebContentsImpl::CreateRenderFrameForRenderManager"); 41735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 41745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHostImpl* rfh = 41755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_host); 41765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!rfh->CreateRenderFrame(parent_routing_id)) 41775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 41785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 41795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(nasko): When RenderWidgetHost is owned by RenderFrameHost, the passed 41805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // RenderFrameHost will have to be associated with the appropriate 41815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // RenderWidgetHostView or a new one should be created here. 41825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 41835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 41845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 41855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 41863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID) 4187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> 4189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebContentsImpl::GetJavaWebContents() { 4190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 41916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return GetWebContentsAndroid()->GetJavaObject(); 41926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 4193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 41946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)WebContentsAndroid* WebContentsImpl::GetWebContentsAndroid() { 4195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsAndroid* web_contents_android = 4196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<WebContentsAndroid*>(GetUserData(kWebContentsAndroidKey)); 4197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!web_contents_android) { 4198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_contents_android = new WebContentsAndroid(this); 4199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUserData(kWebContentsAndroidKey, web_contents_android); 4200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 42016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return web_contents_android; 4202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 4203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 42043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() { 42053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return CreateRenderViewForRenderManager(GetRenderViewHost(), 42065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MSG_ROUTING_NONE, 4207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MSG_ROUTING_NONE, 4208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true); 42093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_MACOSX) 4212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4213116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::SetAllowOtherViews(bool allow) { 4214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view_->SetAllowOtherViews(allow); 4215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 4216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4217116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebContentsImpl::GetAllowOtherViews() { 4218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return view_->GetAllowOtherViews(); 4219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 4220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 42213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 42223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 42235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid WebContentsImpl::OnDialogClosed(int render_process_id, 42245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int render_frame_id, 42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 4226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool dialog_was_suppressed, 42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 4228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& user_input) { 42295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RenderFrameHostImpl* rfh = RenderFrameHostImpl::FromID(render_process_id, 42305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu render_frame_id); 4231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch last_dialog_suppressed_ = dialog_was_suppressed; 4232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_showing_before_unload_dialog_ && !success) { 42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a beforeunload dialog is canceled, we need to stop the throbber from 42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spinning, since we forced it to start spinning in Navigate. 42365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (rfh) 42375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidStopLoading(rfh); 42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 42397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 42407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 42417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadDialogCancelled()); 42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = false; 42455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (rfh) { 42465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu rfh->JavaScriptDialogClosed(reply_msg, success, user_input, 42475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dialog_was_suppressed); 42485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 42495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Don't leak the sync IPC reply if the RFH or process is gone. 42505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete reply_msg; 42515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) { 4255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (encoding == last_reported_encoding_) 4256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 4257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) last_reported_encoding_ = encoding; 4258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canonical_encoding_ = GetContentClient()->browser()-> 42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCanonicalEncodingNameByAliasName(encoding); 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 4264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* rwh_view = view_->CreateViewForWidget(rvh); 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 4267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) rwh_view->SetSize(GetContainerBounds().size()); 42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::IsHidden() { 42713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return capturer_count_ == 0 && !should_normally_be_visible_; 42723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 42733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManager() const { 4275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return frame_tree_.root()->render_manager(); 4276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 4277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_guest_.get(); 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { 4287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(!browser_plugin_guest_); 4288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_plugin_guest_.reset(guest); 4289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 42912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_embedder_.get(); 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearPowerSaveBlockers( 4296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host) { 42971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RemoveAllMediaPlayerEntries(render_frame_host, &active_audio_players_); 42981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RemoveAllMediaPlayerEntries(render_frame_host, &active_video_players_); 42991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MaybeReleasePowerSaveBlockers(); 4300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 4301ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4302ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearAllPowerSaveBlockers() { 43031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci active_audio_players_.clear(); 43041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci active_video_players_.clear(); 43051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_power_save_blocker_.reset(); 43061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_power_save_blocker_.reset(); 4307ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 4308ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size WebContentsImpl::GetSizeForNewRenderView() { 4310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size; 4311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (delegate_) 4312424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size = delegate_->GetSizeForNewRenderView(this); 4313424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (size.IsEmpty()) 4314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size = GetContainerBounds().size(); 4315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return size; 4316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 4317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 4318116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::OnFrameRemoved(RenderFrameHost* render_frame_host) { 4319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER( 4320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebContentsObserver, observers_, FrameDetached(render_frame_host)); 43214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 43224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 43235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) { 43245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!delegate_) 43255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 43265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size new_size = GetPreferredSize(); 43275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_size != old_size) 43285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->UpdatePreferredSize(this, new_size); 43295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 43305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 43311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::AddMediaPlayerEntry(int64 player_cookie, 43321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ActiveMediaPlayerMap* player_map) { 43331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uintptr_t key = 43341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<uintptr_t>(render_frame_message_source_); 43351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(std::find((*player_map)[key].begin(), 43361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*player_map)[key].end(), 43371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci player_cookie) == (*player_map)[key].end()); 43381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*player_map)[key].push_back(player_cookie); 43391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 43401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 43411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::RemoveMediaPlayerEntry(int64 player_cookie, 43421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ActiveMediaPlayerMap* player_map) { 43431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uintptr_t key = 43441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<uintptr_t>(render_frame_message_source_); 43451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ActiveMediaPlayerMap::iterator it = player_map->find(key); 43461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (it == player_map->end()) 43471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 43481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 43491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Remove the player. 43501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PlayerList::iterator player_it = 43511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::find(it->second.begin(), it->second.end(), player_cookie); 43521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (player_it != it->second.end()) 43531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it->second.erase(player_it); 43541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 43551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If there are no players left, remove the map entry. 43561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (it->second.empty()) 43571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci player_map->erase(it); 43581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 43591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 43601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentsImpl::RemoveAllMediaPlayerEntries( 43611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderFrameHost* render_frame_host, 43621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ActiveMediaPlayerMap* player_map) { 43631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ActiveMediaPlayerMap::iterator it = 43641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci player_map->find(reinterpret_cast<uintptr_t>(render_frame_host)); 43651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (it == player_map->end()) 43661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 43671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci player_map->erase(it); 43681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 43691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4370116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsImpl::ResumeResponseDeferredAtStart() { 4371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FrameTreeNode* node = frame_tree_.root(); 4372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch node->render_manager()->ResumeResponseDeferredAtStart(); 4373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 4374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 437503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { 437603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) force_disable_overscroll_content_ = force_disable; 437703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (view_) 437803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 437903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 438003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 4382