web_contents_impl.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_embedder.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/devtools/render_view_devtools_agent_host.h" 25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/dom_storage/dom_storage_context_wrapper.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_stats.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mhtml_generation_manager.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_package.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/cross_process_frame_connector.h" 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h" 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/navigator_impl.h" 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h" 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/render_widget_host_view_child_frame.h" 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/geolocation/geolocation_dispatcher_host.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/browser/media/midi_dispatcher_host.h" 408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_message_filter.h" 418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_service.h" 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/power_save_blocker_impl.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_delegate_view.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_base.h" 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/browser/screen_orientation/screen_orientation_dispatcher_host.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_guest.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h" 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h" 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/frame_messages.h" 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/image_messages.h" 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/common/input_messages.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/ax_event_notification_details.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/browser_plugin_guest_manager.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/javascript_dialog_manager.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 8358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/result_codes.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_utils.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_cache.h" 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_transaction_factory.h" 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_request_context.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h" 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/date_time_chooser_android.h" 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h" 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/web_contents/web_contents_android.h" 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cross-Site Navigations 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a WebContentsImpl is told to navigate to a different web site (as 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determined by SiteInstance), it will replace its current RenderViewHost with 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new RenderViewHost dedicated to the new SiteInstance. This works as 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follows: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - RVHM::Navigate determines whether the destination is cross-site, and if so, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it creates a pending_render_view_host_. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH is "suspended," so that no navigation messages are sent to 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// its renderer until the beforeunload JavaScript handler has a chance to 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run in the current RVH. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH tells CrossSiteRequestManager (a thread-safe singleton) 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// that it has a pending cross-site request. We will check this on the IO 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// thread when deciding how to handle the response. 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - The current RVH runs its beforeunload handler. If it returns false, we 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cancel all the pending logic. Otherwise we allow the pending RVH to send 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the navigation request to its renderer. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// main resource load on the pending RVH. It creates a 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// CrossSiteResourceHandler to check whether a process swap is needed when 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// the request is ready to commit. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - When RDH receives a response, the BufferedResourceHandler determines 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether it is a download. If so, it sends a message to the new renderer 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// causing it to cancel the request, and the download proceeds. For now, the 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH remains until the next DidNavigate event for this 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl. This isn't ideal, but it doesn't affect any functionality. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - After RDH receives a response and determines that it is safe and not a 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// download, the CrossSiteResourceHandler checks whether a process swap is 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// needed (either because CrossSiteRequestManager has state for it or because 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a transfer was needed for a redirect). 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If so, CrossSiteResourceHandler pauses the response to first run the old 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// page's unload handler. It does this by asynchronously calling the 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// OnCrossSiteResponse method of RenderFrameHostManager on the UI thread, 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// which sends a SwapOut message to the current RVH. 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - Once the unload handler is finished, RVHM::SwappedOut checks if a transfer 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// to a new process is needed, based on the stored pending_nav_params_. (This 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// is independent of whether we started out with a cross-process navigation.) 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If not, it just tells the ResourceDispatcherHost to resume the response 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// to its current RenderViewHost. 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// - If so, it cancels the current pending RenderViewHost and sets up a new 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// navigation using RequestTransferURL. When the transferred request 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// arrives in the ResourceDispatcherHost, we transfer the response and 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// resume it. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending renderer sends a FrameNavigate message that invokes the 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidNavigate method. This replaces the current RVH with the 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH. 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// - The previous renderer is kept swapped out in RenderFrameHostManager in case 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the user goes back. The process only stays live if another tab is using 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it, but if so, the existing frame relationships will be maintained. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kMinimumDelayBetweenLoadingUpdatesMS = 100; 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This matches what Blink's ProgressTracker has traditionally used for a 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// minimum progress value. 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const double kMinimumLoadingProgress = 0.1; 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com"; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID) 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kWebContentsAndroidKey[] = "web_contents_android"; 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // OS_ANDROID 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::LazyInstance<std::vector<WebContentsImpl::CreatedCallback> > 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER; 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 179e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochstatic int StartDownload(content::RenderFrameHost* rfh, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_favicon, 182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uint32_t max_bitmap_size) { 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int g_next_image_download_id = 0; 184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch rfh->Send(new ImageMsg_DownloadImage(rfh->GetRoutingID(), 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++g_next_image_download_id, 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_favicon, 188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) max_bitmap_size)); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_next_image_download_id; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void NotifyCacheOnIO( 19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context, 19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& url, 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& http_method) { 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) request_context->GetURLRequestContext()->http_transaction_factory()-> 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetCache()->OnExternalCacheHit(url, http_method); 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Helper function for retrieving all the sites in a frame tree. 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CollectSites(BrowserContext* context, 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::set<GURL>* sites, 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FrameTreeNode* node) { 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sites->insert(SiteInstance::GetSiteForURL(context, node->current_url())); 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ForEachFrameInternal( 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame, 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTreeNode* node) { 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) on_frame.Run(node->current_frame_host()); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SendToAllFramesInternal(IPC::Message* message, RenderFrameHost* rfh) { 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* message_copy = new IPC::Message(*message); 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_copy->set_routing_id(rfh->GetRoutingID()); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rfh->Send(message_copy); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void AddRenderWidgetHostViewToSet(std::set<RenderWidgetHostView*>* set, 222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderFrameHost* rfh) { 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderWidgetHostView* rwhv = static_cast<RenderFrameHostImpl*>(rfh) 224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->frame_tree_node() 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->render_manager() 226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ->GetRenderWidgetHostView(); 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) set->insert(rwhv); 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContents::Create(const WebContents::CreateParams& params) { 233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return WebContentsImpl::CreateWithOpener( 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params, static_cast<WebContentsImpl*>(params.opener)); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage( 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const SessionStorageNamespaceMap& session_storage_namespace_map) { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, NULL); 242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (SessionStorageNamespaceMap::const_iterator it = 244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session_storage_namespace_map.begin(); 245ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch it != session_storage_namespace_map.end(); 246ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++it) { 247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new_contents->GetController() 248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch .SetSessionStorageNamespace(it->first, it->second.get()); 249ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 250ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::AddCreatedCallback(const CreatedCallback& callback) { 256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().push_back(callback); 257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::RemoveCreatedCallback(const CreatedCallback& callback) { 260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) { 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (g_created_callbacks.Get().at(i).Equals(callback)) { 262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i); 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetDelegate()->GetAsWebContents(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContents::FromRenderFrameHost(RenderFrameHost* rfh) { 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* rfh_impl = static_cast<RenderFrameHostImpl*>(rfh); 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!rfh_impl) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return rfh_impl->delegate()->GetAsWebContents(); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebContentsImpl::DestructionObserver ---------------------------------------- 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsImpl::DestructionObserver : public WebContentsObserver { 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents) 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : WebContentsObserver(watched_contents), 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_(owner) { 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // WebContentsObserver: 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void WebContentsDestroyed() OVERRIDE { 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) owner_->OnWebContentsDestroyed( 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<WebContentsImpl*>(web_contents())); 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebContentsImpl* owner_; 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionObserver); 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 300a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochWebContentsImpl::ColorChooserInfo::ColorChooserInfo(int render_process_id, 301a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int render_frame_id, 302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ColorChooser* chooser, 303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int identifier) 304a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : render_process_id(render_process_id), 305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_id(render_frame_id), 306a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch chooser(chooser), 307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch identifier(identifier) { 308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 310a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochWebContentsImpl::ColorChooserInfo::~ColorChooserInfo() { 311a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 312a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl ------------------------------------------------------------- 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl( 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(NULL), 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_(this, browser_context), 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_delegate_view_(NULL), 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_(opener), 3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch created_with_opener_(!!opener), 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_(NULL), 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_tree_(new NavigatorImpl(&controller_, this), 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, this, this, this), 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_load_to_different_document_(false), 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_(0), 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_(false), 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) load_state_(net::LOAD_STATE_IDLE, base::string16()), 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_(0.0), 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_(this), 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_frames_in_progress_(0), 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_(0), 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_(0), 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_(false), 3405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_(false), 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capturer_count_(0), 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_(true), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_(false), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_(false), 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_(NULL), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_(false), 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_active_time_(base::TimeTicks::Now()), 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_(false), 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)), 351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch totalPinchGestureAmount_(0), 352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_(0), 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_message_source_(NULL), 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fullscreen_widget_routing_id_(MSG_ROUTING_NONE), 355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_subframe_(false), 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) touch_emulation_enabled_(false), 357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch last_dialog_suppressed_(false) { 358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) 359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().at(i).Run(this); 3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_.SetFrameRemoveListener( 3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&WebContentsImpl::OnFrameRemoved, 3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this))); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_ = true; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Delete all RFH pending shutdown, which will lead the corresponding RVH to 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // shutdown and be deleted as well. 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_.ForEach( 371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&RenderFrameHostManager::ClearRFHsPendingShutdown)); 372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 373ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearAllPowerSaveBlockers(); 374ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<RenderWidgetHostImpl*>::iterator iter = 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->DetachDelegate(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.clear(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear out any JavaScript state. 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dialog_manager_) 383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dialog_manager_->WebContentsDestroyed(this); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_.get()) 386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify any observer that have a reference on this WebContents. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DESTROYED, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Destroy all frame tree nodes except for the root; this notifies observers. 397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frame_tree_.ResetForMainFrameSwap(); 398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetRenderManager()->ResetProxyHosts(); 399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Manually call the observer methods for the root frame tree node. 401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostManager* root = GetRenderManager(); 402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (root->pending_frame_host()) { 4038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) observers_, 405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameDeleted(root->pending_frame_host())); 4068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) observers_, 409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameDeleted(root->current_frame_host())); 4108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (root->pending_render_view_host()) { 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) observers_, 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewDeleted(root->pending_render_view_host())); 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) observers_, 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewDeleted(root->current_host())); 4208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsDestroyed()); 424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) observers_, 427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ResetWebContents()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDelegate(NULL); 43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STLDeleteContainerPairSecondPointers(destruction_observers_.begin(), 43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.end()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener( 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) { 4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener"); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.browser_context, params.opener_suppressed ? NULL : opener); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.guest_instance_id) { 443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::DictionaryValue> extra_params; 444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.guest_extra_params) 445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extra_params.reset(params.guest_extra_params->DeepCopy()); 446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This makes |new_contents| act as a guest. 447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserPluginGuest::Create(params.guest_instance_id, 449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.site_instance, 450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents, 451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extra_params.Pass(), 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) opener ? opener->GetBrowserPluginGuest() : NULL); 453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We are instantiating a WebContents for browser plugin. Set its subframe 454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // bit to true. 455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->is_subframe_ = true; 456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManagerForTesting() { 462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return OnMessageReceived(render_view_host, NULL, message); 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHost* render_frame_host, 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const IPC::Message& message) { 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(render_view_host || render_frame_host); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetWebUI() && 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<WebContentsObserver>::Iterator it(observers_); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver* observer; 481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (render_frame_host) { 482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (observer->OnMessageReceived(message, render_frame_host)) 484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (observer->OnMessageReceived(message)) 488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Message handlers should be aware of which 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RenderViewHost/RenderFrameHost sent the message, which is temporarily 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // stored in render_(view|frame)_message_source_. 494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (render_frame_host) { 495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (RenderViewDevToolsAgentHost::DispatchIPCMessage( 496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->GetRenderViewHost(), message)) 497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_message_source_ = render_frame_host; 499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (RenderViewDevToolsAgentHost::DispatchIPCMessage( 501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_host, message)) 502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_message_source_ = render_view_host; 504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(WebContentsImpl, message) 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_PepperPluginHung, OnPepperPluginHung) 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_PluginCrashed, OnPluginCrashed) 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DomOperationResponse, 511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnDomOperationResponse) 5126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeBrandColor, 5136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnBrandColorChanged) 514a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishDocumentLoad, 515a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnDocumentLoadedInFrame) 516a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishLoad, OnDidFinishLoad) 517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartLoading, OnDidStartLoading) 518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading) 519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeLoadProgress, 520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnDidChangeLoadProgress) 521a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_OpenColorChooser, OnOpenColorChooser) 522a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_EndColorChooser, OnEndColorChooser) 523a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_SetSelectedColorInColorChooser, 524a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnSetSelectedColorInColorChooser) 525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPlayingNotification, 526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnMediaPlayingNotification) 527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_MediaPausedNotification, 528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnMediaPausedNotification) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidLoadResourceFromMemoryCache) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent, 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidDisplayInsecureContent) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidRunInsecureContent) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRegisterProtocolHandler) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRequestPpapiBrokerPermission) 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_Attach, 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ImageHostMsg_DidDownloadImage, OnDidDownloadImage) 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL) 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFirstVisuallyNonEmptyPaint, 550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnFirstVisuallyNonEmptyPaint) 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_ShowValidationMessage, 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnShowValidationMessage) 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_HideValidationMessage, 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHideValidationMessage) 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_MoveValidationMessage, 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnMoveValidationMessage) 557a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_ANDROID) 558a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply, 559a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnFindMatchRectsReply) 560a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_OpenDateTimeDialog, 561a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnOpenDateTimeDialog) 562a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_message_source_ = NULL; 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_message_source_ = NULL; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser( 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params) { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RunFileChooser(this, params); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const { 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetBrowserContext(); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const { 59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 596ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst GURL& WebContentsImpl::GetVisibleURL() const { 59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 59990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetLastCommittedURL() const { 60390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 60590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 60690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cbentzel): remove this debugging code? 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate == delegate_) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Detach(this); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Attach(this); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the visible RVH reflects the new delegate's preferences. 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { 628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostImpl* host = GetRenderManager()->current_host(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host ? host->GetProcess() : NULL; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetMainFrame() { 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame_tree_.root()->current_frame_host(); 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetFocusedFrame() { 637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!frame_tree_.GetFocusedFrame()) 638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return NULL; 639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return frame_tree_.GetFocusedFrame()->current_frame_host(); 640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ForEachFrame( 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame) { 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&ForEachFrameInternal, on_frame)); 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SendToAllFrames(IPC::Message* message) { 6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ForEachFrame(base::Bind(&SendToAllFramesInternal, message)); 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete message; 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const { 653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const { 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->GetRoutingID(); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetFullscreenWidgetRoutingID() const { 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fullscreen_widget_routing_id_; 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const { 668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->GetRenderWidgetHostView(); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetFullscreenRenderWidgetHostView() 672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const { 673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHost* const widget_host = 674d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostImpl::FromID(GetRenderProcessHost()->GetID(), 675d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetFullscreenWidgetRoutingID()); 676d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return widget_host ? widget_host->GetView() : NULL; 677d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 678d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_.get(); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIImpl* web_ui = new WebUIImpl(this); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()-> 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateWebUIControllerForURL(web_ui, url); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller) { 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui->AddMessageHandler(new GenericHandler()); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->SetController(controller); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete web_ui; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const { 698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->web_ui() ? GetRenderManager()->web_ui() 699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : GetRenderManager()->pending_web_ui(); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const { 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->web_ui(); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUserAgentOverride() == override) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.user_agent_override = override; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the new override string to the renderer. 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->SyncRendererPrefs(); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload the page if a load is currently in progress to avoid having 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different parts of the page loaded using different user agents. 7194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent()) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ReloadIgnoringCache(true); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserAgentOverrideSet(override)); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.user_agent_override; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::SetParentNativeViewAccessible( 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible accessible_parent) { 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_ = accessible_parent; 73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (GetRenderViewHost()) 73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent); 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetTitle() const { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transient entries take precedence. They are used for interstitial pages 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that are shown on top of existing pages. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetTransientEntry(); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_languages = 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext()); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebUI* our_web_ui = GetRenderManager()->pending_web_ui() ? 751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_web_ui() : GetRenderManager()->web_ui(); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (our_web_ui) { 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't override the title in view source mode. 754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry = controller_.GetVisibleEntry(); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(entry && entry->IsViewSourceMode())) { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the Web UI the chance to override our title. 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title = our_web_ui->GetOverriddenTitle(); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title.empty()) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the title for the last committed entry rather than a pending 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation entry. For example, when the user types in a URL, we want to 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep the old page's title until the new load has committed and we get a new 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title. 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetLastCommittedEntry(); 768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We make an exception for initial navigations. 770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (controller_.IsInitialNavigation()) { 771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We only want to use the title from the visible entry in one of two cases: 772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1. There's already a committed entry for an initial navigation, in which 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // case we are doing a history navigation in a new tab (e.g., Ctrl+Back). 774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2. The pending entry has been explicitly assigned a title to display. 775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If there's no last committed entry and no assigned title, we should fall 777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // back to |page_title_when_no_navigation_entry_| rather than showing the 778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // URL. 779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (entry || 780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (controller_.GetVisibleEntry() && 781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !controller_.GetVisibleEntry()->GetTitle().empty())) { 782f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) entry = controller_.GetVisibleEntry(); 783f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 784f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| is finally used 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if no title cannot be retrieved. 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_title_when_no_navigation_entry_; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() { 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetMaxPageIDForSiteInstance(GetSiteInstance()); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance( 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end()) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = -1; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return max_page_ids_[site_instance->GetId()]; 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) { 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance( 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, int32 page_id) { 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetMaxPageIDForSiteInstance(site_instance) < page_id) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = page_id; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContents* web_contents) { 8181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebContentsImpl* contents = static_cast<WebContentsImpl*>(web_contents); 8191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) max_page_ids_ = contents->max_page_ids_; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const { 823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetSiteInstance(); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const { 827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHost* dest_rvh = GetRenderManager()->pending_render_view_host() ? 828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_render_view_host() : 829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->current_host(); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest_rvh->GetSiteInstance(); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const { 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_loading_; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebContentsImpl::IsLoadingToDifferentDocument() const { 838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return is_loading_ && is_load_to_different_document_; 839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const { 842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return waiting_for_response_ && is_load_to_different_document_; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const { 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_; 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetLoadStateHost() const { 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_host_; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_size_; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const { 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_position_; 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::set<GURL> WebContentsImpl::GetSitesInTab() const { 8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::set<GURL> sites; 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&CollectSites, 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(GetBrowserContext()), 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(&sites))); 8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return sites; 8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const { 870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return canonical_encoding_; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const { 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return displayed_insecure_content_; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::IncrementCapturerCount(const gfx::Size& capture_size) { 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!is_being_destroyed_); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++capturer_count_; 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: This provides a hint to upstream code to size the views optimally 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for quality (e.g., to avoid scaling). 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!capture_size.IsEmpty() && preferred_size_for_capture_.IsEmpty()) { 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_size_for_capture_ = capture_size; 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(preferred_size_); 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DecrementCapturerCount() { 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --capturer_count_; 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_LE(0, capturer_count_); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_being_destroyed_) 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (capturer_count_ == 0) { 9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size old_size = preferred_size_for_capture_; 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_size_for_capture_ = gfx::Size(); 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(old_size); 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsHidden()) { 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Executing delayed WasHidden()."; 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WasHidden(); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 912ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint WebContentsImpl::GetCapturerCount() const { 913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return capturer_count_; 914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED || 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status, 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == crashed_status_) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ = status; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_ = error_code; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const { 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crashed_status_; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const { 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_being_destroyed_; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged(unsigned changed_flags) { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->NavigationStateChanged(this, changed_flags); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastActiveTime() const { 9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return last_active_time_; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() { 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.SetActive(true); 951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 952f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> widgets = GetRenderWidgetHostViewsInTree(); 953f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (std::set<RenderWidgetHostView*>::iterator iter = widgets.begin(); 954cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter != widgets.end(); 955cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter++) { 956f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (*iter) { 957f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->Show(); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->SetActive(true); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 961cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_active_time_ = base::TimeTicks::Now(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resize rect might have changed while this was inactive -- send the new 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one to make sure it's up to date. 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->ResizeRectChanged(GetRootWindowResizerRect()); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown()); 9754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = true; 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() { 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there are entities capturing screenshots or video (e.g., mirroring), 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // don't activate the "disable rendering" optimization. 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capturer_count_ == 0) { 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |GetRenderViewHost()| can be NULL if the user middle clicks a link to 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // open a tab in the background, then closes the tab before selecting it. 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is because closing the tab calls WebContentsImpl::Destroy(), which 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removes the |GetRenderViewHost()|; then when we actually destroy the 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window, OnWindowPosChanged() notices and calls WasHidden() (which 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls us). 989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> widgets = GetRenderWidgetHostViewsInTree(); 990f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (std::set<RenderWidgetHostView*>::iterator iter = widgets.begin(); 991cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter != widgets.end(); 992cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iter++) { 993f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (*iter) 994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*iter)->Hide(); 995cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasHidden()); 9994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = false; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() { 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Should we fire even for interstitial pages? 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WillNotifyDisconnection() && 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !ShowingInterstitialPage() && 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !static_cast<RenderViewHostImpl*>( 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost())->SuddenTerminationAllowed(); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::DispatchBeforeUnload(bool for_cross_site_transition) { 1012c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<RenderFrameHostImpl*>(GetMainFrame())->DispatchBeforeUnload( 1013c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for_cross_site_transition); 1014c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1015c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() { 1017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->Stop(); 10183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped()); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() { 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use our current SiteInstance since the cloned entry will use it anyway. 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We pass our own opener so that the cloned page can access it if it was 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before. 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams create_params(GetBrowserContext(), GetSiteInstance()); 1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) create_params.initial_size = GetContainerBounds().size(); 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* tc = CreateWithOpener(create_params, opener_); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tc->GetController().CopyStateFrom(controller_); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCloneToNewWebContents(this, tc)); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tc; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type, 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != pending_widget_views_.end(); ++i) { 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host->GetView() == i->second) { 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(i); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebContents* WebContentsImpl::GetWebContents() { 10561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return this; 10571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 10581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::Init(const WebContents::CreateParams& params) { 1060f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is set before initializing the render manager since 1061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // RenderFrameHostManager::Init calls back into us via its delegate to ask if 1062f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it should be hidden. 10638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) should_normally_be_visible_ = !params.initially_hidden; 10648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1065f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->Init( 1066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.browser_context, params.site_instance, params.routing_id, 1067868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.main_frame_routing_id); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsViewDelegate* delegate = 1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetContentClient()->browser()->GetWebContentsViewDelegate(this); 1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (browser_plugin_guest_) { 1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<WebContentsView> platform_view(CreateWebContentsView( 1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsViewGuest* rv = new WebContentsViewGuest( 1077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, browser_plugin_guest_.get(), platform_view.Pass(), 1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_view_host_delegate_view_); 1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_view_host_delegate_view_ = rv; 1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_.reset(rv); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Regular WebContentsView. 1083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_.reset(CreateWebContentsView( 1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(render_view_host_delegate_view_); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(view_.get()); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size initial_size = params.initial_size; 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateView(initial_size, params.context); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for whether our opener gets destroyed. 109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (opener_) 109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(opener_); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllBrowserContextsAndSources()); 1099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) geolocation_dispatcher_host_.reset(new GeolocationDispatcherHost(this)); 1101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) midi_dispatcher_host_.reset(new MidiDispatcherHost(this)); 1102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) screen_orientation_dispatcher_host_.reset( 1104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new ScreenOrientationDispatcherHost(this)); 1105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_chooser_.reset(new DateTimeChooserAndroid()); 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { 111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(web_contents); 111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the opener if it has been closed. 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents == opener_) { 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_ = NULL; 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear a pending contents that has been closed before being shown. 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (PendingContents::iterator iter = pending_contents_.begin(); 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != pending_contents_.end(); 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second != web_contents) 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_contents_.erase(iter); 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 113190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) { 113290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!ContainsKey(destruction_observers_, web_contents)) { 113390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_[web_contents] = 113490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new DestructionObserver(this, web_contents); 113590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 113690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 113790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 113890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) { 113990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObservers::iterator iter = 114090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.find(web_contents); 114190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (iter != destruction_observers_.end()) { 114290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete destruction_observers_[web_contents]; 114390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.erase(iter); 114490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 114590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 114690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::set<RenderWidgetHostView*> 1156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)WebContentsImpl::GetRenderWidgetHostViewsInTree() { 1157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::set<RenderWidgetHostView*> set; 1158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (ShowingInterstitialPage()) { 1159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) set.insert(GetRenderWidgetHostView()); 1160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 1161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ForEachFrame( 1162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&AddRenderWidgetHostViewToSet, base::Unretained(&set))); 1163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return set; 1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() { 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ActivateContents(this); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() { 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DeactivateContents(this); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() { 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostCapture(); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted( 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host) { 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_being_destroyed_) { 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |created_widgets_| might have been destroyed. 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<RenderWidgetHostImpl*>::iterator iter = 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.find(render_widget_host); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != created_widgets_.end()) 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.erase(iter); 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host && 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) { 1196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate_ && delegate_->EmbedsFullscreenWidget()) 1197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, false); 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDestroyFullscreenWidget( 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_)); 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_ = MSG_ROUTING_NONE; 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent( 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ && 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleKeyboardEvent(this, event); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool WebContentsImpl::HandleWheelEvent( 1219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseWheelEvent& event) { 1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_MACOSX) 1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On platforms other than Mac, control+mousewheel changes zoom. On Mac, this 1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // isn't done for two reasons: 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -the OS already has a gesture to do this through pinch-zoom 1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -if a user starts an inertial scroll, let's go, and presses control 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (i.e. control+tab) then the OS's buffered scroll events will come in 1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with control key set which isn't what the user wants 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_ && 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.wheelTicksY && 12290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch (event.modifiers & blink::WebInputEvent::ControlKey) && 12300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Avoid adjusting the zoom in response to two-finger-scrolling touchpad 12310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // gestures, which are regrettably easy to trigger accidentally. 12320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch !event.hasPreciseScrollingDeltas) { 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->ContentsZoomChange(event.wheelTicksY > 0); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::PreHandleGestureEvent( 12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebGestureEvent& event) { 12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return delegate_ && delegate_->PreHandleGestureEvent(this, event); 12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool WebContentsImpl::HandleGestureEvent( 1246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const blink::WebGestureEvent& event) { 1247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Some platforms (eg. Mac) send GesturePinch events for trackpad pinch-zoom. 1248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Use them to implement browser zoom, as for HandleWheelEvent above. 1249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (event.type == blink::WebInputEvent::GesturePinchUpdate && 125046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) event.sourceDevice == blink::WebGestureDeviceTouchpad) { 1251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The scale difference necessary to trigger a zoom action. Derived from 1252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // experimentation to find a value that feels reasonable. 1253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const float kZoomStepValue = 0.6f; 1254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Find the (absolute) thresholds on either side of the current zoom factor, 1256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // then convert those to actual numbers to trigger a zoom in or out. 1257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This logic deliberately makes the range around the starting zoom value 1258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // for the gesture twice as large as the other ranges (i.e., the notches are 1259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // at ..., -3*step, -2*step, -step, step, 2*step, 3*step, ... but not at 0) 1260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // so that it's easier to get back to your starting point than it is to 1261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // overshoot. 1262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float nextStep = (abs(currentPinchZoomStepDelta_) + 1) * kZoomStepValue; 1263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float backStep = abs(currentPinchZoomStepDelta_) * kZoomStepValue; 1264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float zoomInThreshold = (currentPinchZoomStepDelta_ >= 0) ? nextStep 1265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : -backStep; 1266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch float zoomOutThreshold = (currentPinchZoomStepDelta_ <= 0) ? -nextStep 1267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : backStep; 1268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 12695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu totalPinchGestureAmount_ += (event.data.pinchUpdate.scale - 1.0); 1270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (totalPinchGestureAmount_ > zoomInThreshold) { 1271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_++; 12720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (delegate_) 12730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->ContentsZoomChange(true); 1274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else if (totalPinchGestureAmount_ < zoomOutThreshold) { 1275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch currentPinchZoomStepDelta_--; 12760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (delegate_) 12770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->ContentsZoomChange(false); 1278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return true; 1280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 1283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { 1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return accessible_parent_; 1288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() { 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseDown(); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() { 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseUp(); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() { 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandlePointerActivate(); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() { 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureBegin(); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() { 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureEnd(); 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) { 1317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This method is being called to enter or leave renderer-initiated fullscreen 1318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // mode. Either way, make sure any existing fullscreen widget is shut down 1319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // first. 1320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostView* const widget_view = GetFullscreenRenderWidgetHostView(); 1321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (widget_view) 1322d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostImpl::From(widget_view->GetRenderWidgetHost())->Shutdown(); 1323d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen); 132623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 132723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 132823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) observers_, 132923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DidToggleFullscreenModeForTab(IsFullscreenForCurrentTab())); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const { 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false; 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture, 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(false); 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() { 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostMouseLock(); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow( 1351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int render_process_id, 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int main_frame_route_id, 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_CreateWindow_Params& params, 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespace* session_storage_namespace) { 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We usually create the new window in the same BrowsingInstance (group of 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script-related windows), by passing in the current SiteInstance. However, 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the opener is being suppressed (in a non-guest), we create a new 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SiteInstance in its own BrowsingInstance. 1360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_guest = BrowserPluginGuest::IsGuest(this); 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the opener is to be suppressed, the new window can be in any process. 1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Since routing ids are process specific, we must not have one passed in 1364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // as argument here. 1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE); 1366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SiteInstance> site_instance = 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.opener_suppressed && !is_guest ? 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) : 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSiteInstance(); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A message to create a new window can only come from the active process for 1373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this WebContentsImpl instance. If any other process sends the request, 1374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // it is invalid and the process must be terminated. 1375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (GetRenderProcessHost()->GetID() != render_process_id) { 1376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessHandle process_handle = 1377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost::FromID(render_process_id)->GetHandle(); 1378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process_handle != base::kNullProcessHandle) { 1379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RecordAction( 13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWindow")); 1381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::KillProcess(process_handle, content::RESULT_CODE_KILLED, false); 1382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must assign the SessionStorageNamespace before calling Init(). 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/142685 1389ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& partition_id = 1390ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetContentClient()->browser()-> 1391ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetStoragePartitionIdForSite(GetBrowserContext(), 1392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch site_instance->GetSiteURL()); 1393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StoragePartition* partition = BrowserContext::GetStoragePartition( 1394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetBrowserContext(), site_instance.get()); 1395bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DOMStorageContextWrapper* dom_storage_context = 1396bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext()); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespaceImpl* session_storage_namespace_impl = 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); 14003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 14013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (delegate_ && 14023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !delegate_->ShouldCreateWebContents(this, 14033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) route_id, 14043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.window_container_type, 14053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.frame_name, 14063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.target_url, 14073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) partition_id, 14083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) session_storage_namespace)) { 14095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (route_id != MSG_ROUTING_NONE && 14105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !RenderViewHost::FromID(render_process_id, route_id)) { 14115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the embedder didn't create a WebContents for this route, we need to 14125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // delete the RenderView that had already been created. 14135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_Close(route_id)); 14145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id); 14163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView( 14173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) main_frame_route_id); 14183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 14193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 14203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 14213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Create the new web contents. This will automatically create the new 14223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // WebContentsView. In the future, we may want to create the view separately. 1423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateParams create_params(GetBrowserContext(), site_instance.get()); 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = route_id; 1425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) create_params.main_frame_routing_id = main_frame_route_id; 1426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.opener = this; 1427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.opener_suppressed = params.opener_suppressed; 1428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.disposition == NEW_BACKGROUND_TAB) 1429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.initially_hidden = true; 1430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_guest) { 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.context = view_->GetNativeView(); 1433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) create_params.initial_size = GetContainerBounds().size(); 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) create_params.guest_instance_id = 1436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetBrowserContext()->GetGuestManager()->GetNextInstanceID(); 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebContentsImpl* new_contents = static_cast<WebContentsImpl*>( 1439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebContents::Create(create_params)); 1440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->GetController().SetSessionStorageNamespace( 1441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) partition_id, 1442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) session_storage_namespace); 1443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_contents->RenderViewCreated(new_contents->GetRenderViewHost()); 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Save the window for later if we're not suppressing the opener (since it 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will be shown immediately). 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.opener_suppressed) { 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_guest) { 1449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsView* new_view = new_contents->view_.get(); 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(brettw): It seems bogus that we have to call this function on the 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // newly created object and give it one of its own member variables. 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created window associated with the route so we can show it 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(MSG_ROUTING_NONE, route_id); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_[route_id] = new_contents; 145990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(new_contents); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebContentsCreated( 1464effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this, params.opener_render_frame_id, params.frame_name, 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.target_url, new_contents); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.opener_suppressed) { 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the opener is suppressed, the original renderer cannot access the 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window. As a result, we need to show and navigate the window here. 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_blocked = false; 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect initial_pos; 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->AddNewContents( 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new_contents, params.disposition, initial_pos, 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.user_gesture, &was_blocked); 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_blocked) { 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams open_params(params.target_url, 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(), 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* is_renderer_initiated */); 14847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch open_params.user_gesture = params.user_gesture; 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->OpenURL(open_params); 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id, 1491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id, 1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type) { 1493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateNewWidget(render_process_id, route_id, false, popup_type); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int render_process_id, 1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id) { 1498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateNewWidget(render_process_id, route_id, true, blink::WebPopupTypeNone); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id, 1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id, 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type) { 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* process = GetRenderProcessHost(); 1506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A message to create a new widget can only come from the active process for 1507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this WebContentsImpl instance. If any other process sends the request, 1508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // it is invalid and the process must be terminated. 1509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process->GetID() != render_process_id) { 1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessHandle process_handle = 1511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost::FromID(render_process_id)->GetHandle(); 1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process_handle != base::kNullProcessHandle) { 1513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RecordAction( 15145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWidget")); 1515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::KillProcess(process_handle, content::RESULT_CODE_KILLED, false); 1516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* widget_host = 15213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new RenderWidgetHostImpl(this, process, route_id, IsHidden()); 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.insert(widget_host); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* widget_view = 1525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderWidgetHostViewBase*>( 1526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->CreateViewForPopupWidget(widget_host)); 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!widget_view) 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_fullscreen) { 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Popups should not get activated. 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_view->SetPopupType(popup_type); 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created widget associated with the route so we can show it later. 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_[route_id] = widget_view; 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allow it to survive the trip without being hosted. 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(widget_view->GetNativeView()); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id, 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents = GetCreatedWindow(route_id); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate = GetDelegate(); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) { 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNewContents( 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, contents, disposition, initial_pos, user_gesture, NULL); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, false, initial_pos); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) { 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, true, gfx::Rect()); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 1569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* widget_host_view = 1570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderWidgetHostViewBase*>(GetCreatedWidget(route_id)); 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host_view) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostView* view = NULL; 1575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 1576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (guest && guest->embedder_web_contents()) { 1577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view = guest->embedder_web_contents()->GetRenderWidgetHostView(); 1578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 1579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view = GetRenderWidgetHostView(); 1580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (is_fullscreen) { 15834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); 15844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fullscreen_widget_routing_id_ = route_id; 1585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate_ && delegate_->EmbedsFullscreenWidget()) { 1586d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView()); 1587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, true); 1588d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 1589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) widget_host_view->InitAsFullscreen(view); 1590d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 1592d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) observers_, 1593d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DidShowFullscreenWidget(route_id)); 1594d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!widget_host_view->HasFocus()) 1595d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->Focus(); 1596d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 1597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) widget_host_view->InitAsPopup(view, initial_pos); 1598d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host_impl = 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost()); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->Init(); 16034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Only allow privileged mouse lock for fullscreen render widget, which is 16044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // used to implement Pepper Flash fullscreen. 16054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly embedded (or purposefully ignored) we can release the retain we 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // took in CreateNewWidget(). 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRelease(widget_host_view->GetNativeView()); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) { 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingContents::iterator iter = pending_contents_.find(route_id); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certain systems can block the creation of new windows. If we didn't succeed 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in creating one, just return NULL. 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_contents_.end()) { 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = iter->second; 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_.erase(route_id); 162690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(new_contents); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't initialize the guest WebContents immediately. 1629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (BrowserPluginGuest::IsGuest(new_contents)) 1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new_contents; 1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_contents->GetRenderProcessHost()->HasConnection() || 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !new_contents->GetRenderViewHost()->GetView()) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): It seems bogus to reach into here and initialize the host. 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_widget_views_.end()) { 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* widget_host_view = iter->second; 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(route_id); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost(); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host->GetProcess()->HasConnection()) { 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view has gone away or the renderer crashed. Nothing to do. 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_host_view; 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission( 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaStreamRequest& request, 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MediaResponseCallback& callback) { 1663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (delegate_) { 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestMediaAccessPermission(this, request, callback); 1665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 1666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback.Run(MediaStreamDevices(), 1667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MEDIA_DEVICE_INVALID_STATE, 1668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MediaStreamUI>()); 1669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1672a3f7b4e666c476898878fa745f637129375cd889Ben MurdochSessionStorageNamespace* WebContentsImpl::GetSessionStorageNamespace( 1673a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SiteInstance* instance) { 1674a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return controller_.GetSessionStorageNamespace(instance); 1675a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 1676a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 167746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SessionStorageNamespaceMap WebContentsImpl::GetSessionStorageNamespaceMap() { 167846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return controller_.GetSessionStorageNamespaceMap(); 167946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 168046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FrameTree* WebContentsImpl::GetFrameTree() { 16824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return &frame_tree_; 16834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 16844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::AccessibilityEventReceived( 1686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<AXEventNotificationDetails>& details) { 1687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER( 1688a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebContentsObserver, observers_, AccessibilityEventReceived(details)); 1689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 16915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnShowValidationMessage( 16925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view, 16935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& main_text, 16945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sub_text) { 16955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 16965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->ShowValidationMessage( 16975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, anchor_in_root_view, main_text, sub_text); 16985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnHideValidationMessage() { 17015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 17025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->HideValidationMessage(this); 17035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMoveValidationMessage( 17065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view) { 17075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 17085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->MoveValidationMessage(this, anchor_in_root_view); 17095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 171190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) { 171290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (browser_plugin_embedder_) 17137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_plugin_embedder_->DidSendScreenRects(); 171490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 171590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1716f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WebContentsImpl::OnTouchEmulationEnabled(bool enabled) { 1717f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) touch_emulation_enabled_ = enabled; 1718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (view_) 1719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 1720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { 17235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size old_size = GetPreferredSize(); 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_ = pref_size; 17255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(old_size); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) { 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ResizeDueToAutoResize(this, new_size); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::OpenURL(const OpenURLParams& params) { 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = delegate_->OpenURLFromTab(this, params); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::Send(IPC::Message* message) { 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) { 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->Send(message); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToPendingEntry( 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 1752effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FrameTreeNode* node = frame_tree_.root(); 1753effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1754effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // If we are using --site-per-process, we should navigate in the FrameTreeNode 1755effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // specified in the pending entry. 1756effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NavigationEntryImpl* pending_entry = 1757effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()); 1758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) && 1759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pending_entry->frame_tree_node_id() != -1) { 1760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch node = frame_tree_.FindByID(pending_entry->frame_tree_node_id()); 1761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1763effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return node->navigator()->NavigateToPendingEntry( 1764effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch node->current_frame_host(), reload_type); 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::RenderFrameForInterstitialPageCreated( 17685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHost* render_frame_host) { 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 17705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameForInterstitialPageCreated(render_frame_host)); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::AttachInterstitialPage( 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterstitialPageImpl* interstitial_page) { 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(interstitial_page); 1776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->set_interstitial_page(interstitial_page); 177768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 177868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Cancel any visible dialogs so that they don't interfere with the 177968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // interstitial. 178068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (dialog_manager_) 178168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 178268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidAttachInterstitialPage()); 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DetachInterstitialPage() { 17885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (ShowingInterstitialPage()) 1789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->remove_interstitial_page(); 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDetachInterstitialPage()); 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetHistoryLengthAndPrune( 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SiteInstance* site_instance, 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int history_length, 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 minimum_page_id) { 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetHistoryLengthAndPrune doesn't work when there are pending cross-site 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigations. Callers should ensure that this is the case. 1800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_render_view_host()) { 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = GetRenderViewHostImpl(); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_instance && rvh->GetSiteInstance() != site_instance) { 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetHistoryLengthAndPrune(GetRoutingID(), 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_length, 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_page_id)); 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1818e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebContentsImpl::ReloadFocusedFrame(bool ignore_cache) { 1819c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1820c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1821c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1822c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1823c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_Reload( 1824c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), ignore_cache)); 1825c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1826c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1827c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Undo() { 1828c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1829c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1830c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1831c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1832c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Undo(focused_frame->GetRoutingID())); 1833c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Undo")); 1834c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1835c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1836c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Redo() { 1837c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1838c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1839c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1840c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Redo(focused_frame->GetRoutingID())); 1841c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Redo")); 1842c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1843c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1844c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Cut() { 1845c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1846c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1847c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1848c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Cut(focused_frame->GetRoutingID())); 1850c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Cut")); 1851c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1852c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1853c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Copy() { 1854c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1855c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1856c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1858c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Copy(focused_frame->GetRoutingID())); 1859c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Copy")); 1860c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1861c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1862c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::CopyToFindPboard() { 1863c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_MACOSX) 1864c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1865c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1866c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1867c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1868c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Windows/Linux don't have the concept of a find pasteboard. 1869c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send( 1870c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new InputMsg_CopyToFindPboard(focused_frame->GetRoutingID())); 1871c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("CopyToFindPboard")); 1872c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 1873c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1874c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1875c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Paste() { 1876c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1877c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1878c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1879c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1880c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Paste(focused_frame->GetRoutingID())); 1881c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Paste")); 1882c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1883c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1884c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::PasteAndMatchStyle() { 1885c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1886c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1887c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1888c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1889c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_PasteAndMatchStyle( 1890c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID())); 1891c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("PasteAndMatchStyle")); 1892c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1893c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1894c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Delete() { 1895c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1896c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1897c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1898c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1899c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Delete(focused_frame->GetRoutingID())); 1900c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("DeleteSelection")); 1901c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1902c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1903c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::SelectAll() { 1904c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1905c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1906c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1907c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1908c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_SelectAll(focused_frame->GetRoutingID())); 1909c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("SelectAll")); 1910c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1911c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1912c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Unselect() { 1913c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1914c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1915c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1916c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1917c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Unselect(focused_frame->GetRoutingID())); 1918c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RecordAction(base::UserMetricsAction("Unselect")); 1919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1920c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1921c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::Replace(const base::string16& word) { 1922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1923c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1924c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1925c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1926c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_Replace( 1927c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), word)); 1928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1929c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::ReplaceMisspelling(const base::string16& word) { 1931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1933c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1934c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1935c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new InputMsg_ReplaceMisspelling( 1936c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), word)); 1937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::NotifyContextMenuClosed( 1940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const CustomContextMenuContext& context) { 1941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1942c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1943c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1944c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1945c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_ContextMenuClosed( 1946c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), context)); 1947c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1949c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::ExecuteCustomContextMenuCommand( 1950c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int action, const CustomContextMenuContext& context) { 1951c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 1952c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 1953c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1954c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1955c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send(new FrameMsg_CustomContextMenuAction( 1956c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->GetRoutingID(), context, action)); 1957e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 1958e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeView WebContentsImpl::GetNativeView() { 1960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetNativeView(); 1961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1963010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeView WebContentsImpl::GetContentNativeView() { 1964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetContentNativeView(); 1965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1966010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1967010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::NativeWindow WebContentsImpl::GetTopLevelNativeWindow() { 1968010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetTopLevelNativeWindow(); 1969010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1970010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1971010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Rect WebContentsImpl::GetViewBounds() { 1972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetViewBounds(); 1973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Rect WebContentsImpl::GetContainerBounds() { 1976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gfx::Rect rv; 1977010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->GetContainerBounds(&rv); 1978010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return rv; 1979010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)DropData* WebContentsImpl::GetDropData() { 1982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetDropData(); 1983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1984010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::Focus() { 1986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->Focus(); 1987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetInitialFocus() { 1990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->SetInitialFocus(); 1991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::StoreFocus() { 1994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->StoreFocus(); 1995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1997010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::RestoreFocus() { 1998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->RestoreFocus(); 1999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 2000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::FocusThroughTabTraversal(bool reverse) { 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 2003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->interstitial_page()->FocusThroughTabTraversal(reverse); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->SetInitialFocus(reverse); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShowingInterstitialPage() const { 2010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->interstitial_page() != NULL; 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPage* WebContentsImpl::GetInterstitialPage() const { 2014f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->interstitial_page(); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsSavable() { 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit creates Document object when MIME type is application/xhtml+xml, 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we also support this MIME type. 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_ == "text/html" || 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/xml" || 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "application/xhtml+xml" || 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/plain" || 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/css" || 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IsSupportedJavascriptMimeType(contents_mime_type_.c_str()); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSavePage() { 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we can not save the page, try to download it. 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsSavable()) { 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordDownloadSource(INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML); 2032ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SaveFrame(GetURL(), Referrer()); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the save package and possibly prompt the user for the name to save 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page as. The user prompt is an asynchronous operation that runs on 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another thread. 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this); 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_->GetSaveInfo(); 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in automated testing to bypass prompting the user for file names. 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, the names and paths are hard coded rather than running them through 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file name sanitation and extension / mime checking. 20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::SavePage(const base::FilePath& main_file, 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& dir_path, 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePageType save_type) { 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the page from navigating. 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this, save_type, main_file, dir_path); 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return save_package_->Init(SavePackageDownloadCreatedCallback()); 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2058ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::SaveFrame(const GURL& url, 2059ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Referrer& referrer) { 2060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!GetURL().is_valid()) 2061ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2062ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_main_frame = (url == GetURL()); 2063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2064ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadManager* dlm = 2065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BrowserContext::GetDownloadManager(GetBrowserContext()); 2066ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!dlm) 2067ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2068ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int64 post_id = -1; 2069ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (is_main_frame) { 20704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const NavigationEntry* entry = controller_.GetLastCommittedEntry(); 2071ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (entry) 2072ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch post_id = entry->GetPostID(); 2073ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 2074ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<DownloadUrlParameters> params( 2075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadUrlParameters::FromWebContents(this, url)); 2076ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_referrer(referrer); 2077ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_post_id(post_id); 2078ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prefer_cache(true); 2079ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (post_id >= 0) 2080ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_method("POST"); 2081ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prompt(true); 2082ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch dlm->DownloadUrl(params.Pass()); 2083ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 2084ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML( 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file, 2087424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::Callback<void(int64)>& callback) { 2088424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MHTMLGenerationManager::GetInstance()->SaveMHTML(this, file, callback); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const { 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_; 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const { 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_disconnection_; 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() { 2105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canonical_encoding_.clear(); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &renderer_preferences_; 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() { 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(GetRenderViewHost()); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceEndedAt(int client_x, int client_y, 2118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int screen_x, int screen_y, blink::WebDragOperation operation) { 2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 2120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceEndedAt(client_x, client_y, 2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceEndedAt(client_x, client_y, 2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetResourceResponseStart( 21285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceRequestDetails& details) { 21295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_.ssl_manager()->DidStartResourceResponse(details); 21305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetResourceResponseStart(details)); 21335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 21355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotificationService::current()->Notify( 21365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTIFICATION_RESOURCE_RESPONSE_STARTED, 21375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Source<WebContents>(this), 21385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Details<const ResourceRequestDetails>(&details)); 21395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetRedirectForResourceRequest( 21425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host, 21435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceRedirectDetails& details) { 21445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_.ssl_manager()->DidReceiveResourceRedirect(details); 21455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 21475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 21485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 21495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetRedirectForResourceRequest(render_view_host, details)); 21505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 21525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotificationService::current()->Notify( 21535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, 21545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Source<WebContents>(this), 21555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Details<const ResourceRedirectDetails>(&details)); 21565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() { 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetRenderViewHost()) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->DragSourceSystemDragEnded(); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DragEnded(); 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->SystemDragEnded(); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() { 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) { 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_ = value; 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const { 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closed_by_user_gesture_; 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetZoomPercent(bool* enable_increment, 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* enable_decrement) const { 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = *enable_increment = false; 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the zoom percent from the factor. Round up to the nearest whole 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number. 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int percent = static_cast<int>( 2185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ZoomLevelToZoomFactor(HostZoomMap::GetZoomLevel(this)) * 100 + 0.5); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = percent > minimum_zoom_percent_; 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_increment = percent < maximum_zoom_percent_; 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return percent; 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() { 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = GetController().GetLastCommittedEntry(); 21964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!entry) 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate_->ViewSourceForTab(this, entry->GetURL()); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url, 220390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 220790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->ViewSourceForFrame(this, url, page_state); 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const { 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return minimum_zoom_percent_; 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const { 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return maximum_zoom_percent_; 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const { 22195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return capturer_count_ == 0 ? preferred_size_ : preferred_size_for_capture_; 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { 2223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetBrowserPluginGuest()) 2224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetBrowserPluginGuest()->LockMouse(allowed); 2225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost() ? 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false; 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const { 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_ != NULL; 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 223490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) { 2235a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!color_chooser_info_.get()) 2236a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch RenderFrameHost* rfh = RenderFrameHost::FromID( 2238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_process_id, 2239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_frame_id); 2240a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!rfh) 2241a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2242a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2243a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->Send(new FrameMsg_DidChooseColorResponse( 2244a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->GetRoutingID(), color_chooser_info_->identifier, color)); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 224790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidEndColorChooser() { 2248a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!color_chooser_info_.get()) 2249a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2250a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch RenderFrameHost* rfh = RenderFrameHost::FromID( 2251a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_process_id, 2252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->render_frame_id); 2253a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!rfh) 2254a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 2255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->Send(new FrameMsg_DidEndColorChooser( 2257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch rfh->GetRoutingID(), color_chooser_info_->identifier)); 2258a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_.reset(); 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int WebContentsImpl::DownloadImage(const GURL& url, 2262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_favicon, 2263d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uint32_t max_bitmap_size, 2264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ImageDownloadCallback& callback) { 2265e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int id = StartDownload(GetMainFrame(), url, is_favicon, max_bitmap_size); 2266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_[id] = callback; 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id; 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::IsSubframe() const { 22715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return is_subframe_; 22725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 22735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::Find(int request_id, 22755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& search_text, 22765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebFindOptions& options) { 22775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_Find(GetRoutingID(), request_id, search_text, options)); 22785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 22795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::StopFinding(StopFindAction action) { 22815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_StopFinding(GetRoutingID(), action)); 22825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 22835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::InsertCSS(const std::string& css) { 2285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetMainFrame()->Send(new FrameMsg_CSSInsertRequest( 2286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetMainFrame()->GetRoutingID(), css)); 2287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() { 22904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 2291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (entry && entry->GetURL() == GURL(url::kAboutBlankURL)) 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) { 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SetFocusToLocationBar(select_all); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoad( 2302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 2303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int parent_routing_id, 2304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& validated_url, 2305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_error_page, 2306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_iframe_srcdoc) { 2307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame(); 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the start of the provisional load. 231023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int render_frame_id = render_frame_host->GetRoutingID(); 231123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = render_frame_host->render_view_host(); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidStartProvisionalLoadForFrame( 231423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_frame_id, parent_routing_id, is_main_frame, 231523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) validated_url, is_error_page, is_iframe_srcdoc, 231623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_view_host)); 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_main_frame) { 2319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER( 2320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsObserver, 2321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 2322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_url, 23235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host)); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError( 23285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 23295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) { 23305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL validated_url(params.url); 233123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int render_frame_id = render_frame_host->GetRoutingID(); 2332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame(); 233323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = render_frame_host->render_view_host(); 23345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 23355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 23365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 233723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DidFailProvisionalLoad(render_frame_id, 23385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.frame_unique_name, 2339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch is_main_frame, 23405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validated_url, 23415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.error_code, 23425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.error_description, 234323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_view_host)); 23445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailLoadWithError( 23475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 23485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 23495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int error_code, 23505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& error_description) { 235123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int render_frame_id = render_frame_host->GetRoutingID(); 2352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame(); 235323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = render_frame_host->render_view_host(); 23545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 235523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DidFailLoad(render_frame_id, url, is_main_frame, error_code, 2356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch error_description, render_view_host)); 23575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::NotifyChangedNavigationState( 2360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InvalidateTypes changed_flags) { 2361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NotifyNavigationStateChanged(changed_flags); 2362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 23645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::AboutToNavigateRenderFrame( 23655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host) { 23665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers that we will navigate in this RenderView. 236723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = render_frame_host->render_view_host(); 23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 23695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 23705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 237123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) AboutToNavigateRenderView(render_view_host)); 23725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStartNavigationToPendingEntry( 23755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 23765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 23775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationController::ReloadType reload_type) { 23785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 23795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 23805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 23815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 23825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidStartNavigationToPendingEntry(url, reload_type)); 23835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderFrameHostImpl* render_frame_host, 2386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OpenURLParams& params) { 2387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int source_render_frame_id = render_frame_host->GetRoutingID(); 2388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebContents* new_contents = OpenURL(params); 2389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (new_contents) { 2391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Notify observers. 2392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidOpenRequestedURL(new_contents, 2394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url, 2395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.referrer, 2396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.disposition, 2397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.transition, 2398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) source_render_frame_id)); 2399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool WebContentsImpl::ShouldPreserveAbortedURLs() { 24030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!delegate_) 24040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 24050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return delegate_->ShouldPreserveAbortedURLs(this); 24060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 24070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidRedirectProvisionalLoad( 24095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 24105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& validated_target_url) { 24115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 24125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 24135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 24145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 24155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_target_url, 24165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host)); 24175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidCommitProvisionalLoad( 2420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 24215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& frame_unique_name, 24225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_main_frame, 24235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 2424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PageTransition transition_type) { 2425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int render_frame_id = render_frame_host->GetRoutingID(); 242623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = render_frame_host->render_view_host(); 24275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about the commit of the provisional load. 24285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 24295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 24305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 2431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidCommitProvisionalLoadForFrame(render_frame_id, 24325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_unique_name, 24335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_main_frame, 24345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, 24355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) transition_type, 24365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host)); 24375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2439e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebContentsImpl::DidNavigateMainFramePreCommit( 2440e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 2441e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ensure fullscreen mode is exited before committing the navigation to a 2442e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // different page. The next page will not start out assuming it is in 2443e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // fullscreen mode. 2444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (controller_.IsURLInPageNavigation(params.url, 2445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.was_within_same_page, 2446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NAVIGATION_TYPE_UNKNOWN)) { 2447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // No page change? Then, the renderer and browser can remain in fullscreen. 2448e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 2449e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 2450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (IsFullscreenForCurrentTab()) 2451e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch GetRenderViewHost()->ExitFullscreen(); 2452e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(!IsFullscreenForCurrentTab()); 2453e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 2454e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 24555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit( 24565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const LoadCommittedDetails& details, 24575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 24585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.is_navigation_to_different_page()) { 24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clear the status bubble. This is a workaround for a bug where WebKit 24605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // doesn't let us know that the cursor left an element during a 24615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // transition (this is also why the mouse cursor remains as a hand after 24625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clicking on a link); see bugs 1184641 and 980803. We don't want to 24635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clear the bubble when a user navigates to a named anchor in the same 24645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page. 24655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateTargetURL(details.entry->GetPageID(), GURL()); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!details.is_in_page) { 24695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Once the main frame is navigated, we're no longer considered to have 24705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // displayed insecure content. 24715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) displayed_insecure_content_ = false; 24725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 24735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetController().GetBrowserContext()); 24745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 24755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidNavigateMainFrame(details, params)); 24795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (delegate_) 24815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->DidNavigateMainFramePostCommit(this); 2482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit( 24865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 24875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const LoadCommittedDetails& details, 24885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 24895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Now that something has committed, we don't need to track whether the 24905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // initial page has been accessed. 24915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_ = false; 24925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 24935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we navigate off the page, close all JavaScript dialogs. 24945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (dialog_manager_ && !details.is_in_page) 24955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 24985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidNavigateAnyFrame(details, params)); 25005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SetMainFrameMimeType(const std::string& mime_type) { 25035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_mime_type_ = mime_type; 25045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 250558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 250646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool WebContentsImpl::CanOverscrollContent() const { 2507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Disable overscroll when touch emulation is on. See crbug.com/369938. 2508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (touch_emulation_enabled_) 2509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 2510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 25115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 25125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return delegate_->CanOverscrollContent(); 25135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 25145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void WebContentsImpl::OnBrandColorChanged(SkColor brand_color) { 25186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DidChangeBrandColor(brand_color)); 25206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 25216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache( 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& http_method, 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type) { 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatsCounter cache("WebKit.CacheHit"); 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Increment(); 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out a notification that we loaded a resource from our memory cache. 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_id = 0; 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CertStatus cert_status = 0; 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int security_bits = -1; 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_status = 0; 2536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SignedCertificateTimestampIDStatusList signed_certificate_timestamp_ids; 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeserializeSecurityInfo(security_info, &cert_id, &cert_status, 2538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &security_bits, &connection_status, 2539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &signed_certificate_timestamp_ids); 2540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(alcutter,eranm): Pass signed_certificate_timestamp_ids into details 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadFromMemoryCacheDetails details( 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method, 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type, resource_type); 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 254558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) controller_.ssl_manager()->DidLoadFromMemoryCache(details); 254658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 254758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 254858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DidLoadResourceFromMemoryCache(details)); 254958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 255058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) { 255158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context( 255258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) resource_type == ResourceType::MEDIA ? 255358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetBrowserContext()->GetMediaRequestContextForRenderProcess( 255458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetRenderProcessHost()->GetID()) : 255558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetBrowserContext()->GetRequestContextForRenderProcess( 255658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetRenderProcessHost()->GetID())); 255758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::PostTask( 255858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::IO, 255958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 256058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&NotifyCacheOnIO, request_context, url, http_method)); 256158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() { 25655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.DisplayedInsecureContent")); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent( 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_origin, const GURL& target_url) { 2573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << security_origin << " ran insecure content from " 2574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << target_url.possibly_invalid_spec(); 25755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.RanInsecureContent")); 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EndsWith(security_origin, kDotGoogleDotCom, false)) 25775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.RanInsecureContentGoogle")); 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ssl_manager()->DidRunInsecureContent(security_origin); 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame() { 25855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(render_frame_message_source_); 25865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!render_view_message_source_); 25875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* rfh = 25885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 25895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 259023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int render_frame_id = rfh->GetRoutingID(); 259123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = rfh->render_view_host(); 25925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 25935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 259423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DocumentLoadedInFrame(render_frame_id, render_view_host)); 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad( 2598effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& url) { 2599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!render_frame_message_source_) { 26005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("BadMessageTerminate_RVD2")); 26015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderProcessHost()->ReceivedBadMessage(); 26025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 26035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 26045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL validated_url(url); 2606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost* render_process_host = 2607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_message_source_->GetProcess(); 26085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_process_host->FilterURL(false, &validated_url); 2609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2610effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RenderFrameHostImpl* rfh = 2611effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 261223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int render_frame_id = rfh->GetRoutingID(); 261323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RenderViewHost* render_view_host = rfh->render_view_host(); 2614effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool is_main_frame = rfh->frame_tree_node()->IsMainFrame(); 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 261623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DidFinishLoad(render_frame_id, validated_url, 261723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_main_frame, render_view_host)); 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidStartLoading(bool to_different_document) { 2621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It is possible to get multiple calls to OnDidStartLoading that don't have 2626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // corresponding calls to OnDidStopLoading: 2627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - With "swappedout://" URLs, this happens when a RenderView gets swapped 2628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // out for a cross-process navigation, and it turns into a placeholder for 2629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // one being rendered in a different process. 2630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - Also, there might be more than one RenderFrameHost sharing the same 2631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // FrameTreeNode (and thus sharing its ID) each sending a start. 2632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - But in the future, once clamy@ moves navigation network requests to the 2633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // browser process, there's a good chance that callbacks about starting and 2634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // stopping will all be handled by the browser. When that happens, there 2635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // should no longer be a start/stop call imbalance. TODO(avi): When this 2636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // future arrives, update this code to not allow this case. 2637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_GE(loading_frames_in_progress_, 0); 2638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_progresses_.find(render_frame_id) == loading_progresses_.end()) { 2639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidStartLoading(rfh, to_different_document); 2641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++loading_frames_in_progress_; 2642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = kMinimumLoadingProgress; 2645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidStopLoading() { 2649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_progresses_.find(render_frame_id) != loading_progresses_.end()) { 2654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Load stopped while we were still tracking load. Make sure we update 2655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // progress based on this frame's completion. 2656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = 1.0; 2657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Then we clean-up our states. 2659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_total_progress_ == 1.0) 2660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 2661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(japhet): This should be a DCHECK, but the pdf plugin sometimes 2664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // calls DidStopLoading() without a matching DidStartLoading(). 2665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) --loading_frames_in_progress_; 2668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_frames_in_progress_ == 0) 2669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DidStopLoading(rfh); 2670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::OnDidChangeLoadProgress(double load_progress) { 2673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHostImpl* rfh = 2674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 render_frame_id = rfh->frame_tree_node()->frame_tree_node_id(); 2676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_[render_frame_id] = load_progress; 2678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We notify progress change immediately for the first and last updates. 2680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Also, since the message loop may be pretty busy when a page is loaded, it 2681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // might not execute a posted task in a timely manner so we make sure to 2682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // immediately send progress report if enough time has passed. 2683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta min_delay = 2684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kMinimumDelayBetweenLoadingUpdatesMS); 2685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (load_progress == 1.0 || loading_last_progress_update_.is_null() || 2686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks::Now() - loading_last_progress_update_ > min_delay) { 2687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If there is a pending task to send progress, it is now obsolete. 2688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.InvalidateWeakPtrs(); 2689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendLoadProgressChanged(); 2690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_total_progress_ == 1.0) 2691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 2692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (loading_weak_factory_.HasWeakPtrs()) 2696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 2699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 2700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&WebContentsImpl::SendLoadProgressChanged, 2701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.GetWeakPtr()), 2702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) min_delay); 2703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) { 2706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!delegate_ || delegate_->OnGoToEntryOffset(offset)) 2707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_.GoToOffset(offset); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent, 2711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int maximum_percent) { 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_ = minimum_percent; 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_ = maximum_percent; 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id, 27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 27234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (policy->CanReadFile(GetRenderProcessHost()->GetID(), path)) 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->EnumerateDirectory(this, request_id, path); 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol, 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 2736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (policy->IsPseudoScheme(protocol)) 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate_->RegisterProtocolHandler(this, protocol, url, user_gesture); 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id, 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindReply(this, request_id, number_of_matches, selection_rect, 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, final_update); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply( 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version, 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::RectF>& rects, 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::RectF& active_rect) { 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindMatchRectsReply(this, version, rects, active_rect); 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnOpenDateTimeDialog( 27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ViewHostMsg_DateTimeDialogValue_Params& value) { 27643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) date_time_chooser_->ShowDialog(ContentViewCore::FromWebContents(this), 27653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost(), 27663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.dialog_type, 2767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.dialog_value, 27683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.minimum, 27693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.maximum, 2770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.step, 2771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.suggestions); 27722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id, 2777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::FilePath& path, 2778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_hung) { 2779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1); 2780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PluginHungStatusChanged(plugin_child_id, path, is_hung)); 2783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPluginCrashed(const base::FilePath& plugin_path, 27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId plugin_pid) { 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginCrashed(plugin_path, plugin_pid)); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDomOperationResponse(const std::string& json_string, 2792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int automation_id) { 2793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DomOperationNotificationDetails details(json_string, automation_id); 2794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotificationService::current()->Notify( 2795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTIFICATION_DOM_OPERATION_RESPONSE, 2796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Source<WebContents>(this), 2797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Details<DomOperationNotificationDetails>(&details)); 2798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url, 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheAccessed(manifest_url, blocked_by_policy)); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2807a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser( 2808a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int color_chooser_id, 2809a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SkColor color, 2810a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::vector<ColorSuggestion>& suggestions) { 28110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ColorChooser* new_color_chooser = delegate_ ? 28120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delegate_->OpenColorChooser(this, color, suggestions) : 28130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NULL; 28145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!new_color_chooser) 281590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 2816a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_.get()) 2817a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 2818a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2819a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_.reset(new ColorChooserInfo( 2820a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_message_source_->GetProcess()->GetID(), 2821a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_frame_message_source_->GetRoutingID(), 2822a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new_color_chooser, 2823a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id)); 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) { 2827a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_ && 2828a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id == color_chooser_info_->identifier) 2829a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->End(); 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id, 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 2834a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (color_chooser_info_ && 2835a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_id == color_chooser_info_->identifier) 2836a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch color_chooser_info_->chooser->SetSelectedColor(color); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled. 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url, 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& args) { 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebUISend(this, source_url, name, args); 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission( 28493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int routing_id, 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path) { 28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_) { 28533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_->RequestPpapiBrokerPermission( 28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, url, plugin_path, 28592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult, 28603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch base::Unretained(this), routing_id))) { 28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 28623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WebContentsImpl::OnPpapiBrokerPermissionResult(int routing_id, 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result) { 28683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch Send(new ViewMsg_PpapiBrokerPermissionResult(routing_id, result)); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnBrowserPluginMessage(const IPC::Message& message) { 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin 28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // specific messages for this WebContents. This means that any message from 28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a BrowserPlugin prior to this will be ignored. 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above classes BrowserPluginEmbedder and 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginGuest. 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!browser_plugin_embedder_.get()); 28782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this)); 28792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_->OnMessageReceived(message); 28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::OnDidDownloadImage( 28832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 288490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int http_status_code, 28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& image_url, 2886d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<SkBitmap>& bitmaps, 2887d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<gfx::Size>& original_bitmap_sizes) { 28885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bitmaps.size() != original_bitmap_sizes.size()) 28895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 28905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageDownloadMap::iterator iter = image_download_map_.find(id); 2892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iter == image_download_map_.end()) { 28932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently WebContents notifies us of ANY downloads so that it is 28942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // possible to get here. 28952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 28962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!iter->second.is_null()) { 2898d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) iter->second.Run( 2899d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) id, http_status_code, image_url, bitmaps, original_bitmap_sizes); 29002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_.erase(id); 29022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnUpdateFaviconURL( 29052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<FaviconURL>& candidates) { 29062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DidUpdateFaviconURL(candidates)); 29082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, 29115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_video, 29125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_audio) { 29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Chrome OS does its own detection of audio and video. 2914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_CHROMEOS) 29155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<PowerSaveBlocker> blocker; 29165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (has_video) { 29175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocker = PowerSaveBlocker::Create( 29185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing video"); 2919ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID) 29205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<PowerSaveBlockerImpl*>(blocker.get()) 29215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->InitDisplaySleepBlocker(GetView()->GetNativeView()); 2922ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 29235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (has_audio) { 29245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocker = PowerSaveBlocker::Create( 29255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing audio"); 29265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 29285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (blocker) { 2929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) power_save_blockers_[render_frame_message_source_][player_cookie] = 29305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocker.release(); 2931ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 2932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // !defined(OS_CHROMEOS) 2933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 2934ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 29355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) { 29365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Chrome OS does its own detection of audio and video. 29375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_CHROMEOS) 2938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) delete power_save_blockers_[render_frame_message_source_][player_cookie]; 2939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) power_save_blockers_[render_frame_message_source_].erase(player_cookie); 29405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 29415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 29425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::OnFirstVisuallyNonEmptyPaint() { 2944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DidFirstVisuallyNonEmptyPaint()); 2946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2947ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidChangeVisibleSSLState() { 294946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (delegate_) 295046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delegate_->VisibleSSLStateChanged(this); 29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifyBeforeFormRepostWarningShow() { 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeforeFormRepostWarningShow()); 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 29591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::ActivateAndShowRepostFormWarningDialog() { 29601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Activate(); 29611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate_) 29621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate_->ShowRepostFormWarningDialog(this); 29631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 29641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 29655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool WebContentsImpl::HasAccessedInitialDocument() { 29665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return has_accessed_initial_document_; 29675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 29685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is 29704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// loading, or done loading. 29714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::SetIsLoading(RenderViewHost* render_view_host, 29724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool is_loading, 2973effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document, 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNotificationDetails* details) { 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading == is_loading_) 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading) { 2979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE, 2980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_.clear(); 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = 0; 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = 0; 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2986f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->SetIsLoading(is_loading); 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = is_loading; 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_ = is_loading; 2990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_load_to_different_document_ = to_different_document; 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 2993effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch delegate_->LoadingStateChanged(this, to_different_document); 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD); 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string url = (details ? details->url.possibly_invalid_spec() : "NULL"); 29974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (is_loading) { 2998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN1("browser", "WebContentsImpl Loading", this, 2999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "URL", url); 30004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 30014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DidStartLoading(render_view_host)); 30024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 3003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT_ASYNC_END1("browser", "WebContentsImpl Loading", this, 3004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "URL", url); 30054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 30064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DidStopLoading(render_view_host)); 30074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 30084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 30094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP; 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDetails det = NotificationService::NoDetails(); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details) 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) det = Details<LoadNotificationDetails>(details); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, Source<NavigationController>(&controller_), det); 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3018c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::SelectRange(const gfx::Point& start, 3019c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Point& end) { 3020c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderFrameHost* focused_frame = GetFocusedFrame(); 3021c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!focused_frame) 3022c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 3023c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3024c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch focused_frame->Send( 3025c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new InputMsg_SelectRange(focused_frame->GetRoutingID(), start, end)); 3026c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3027c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) { 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are creating a RVH for a restored controller, then we need to make 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the RenderView starts with a next_page_id_ larger than the number 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of restored entries. This must be called before the RenderView starts 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating (to avoid a race between the browser updating max_page_id and 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the renderer updating next_page_id_). Because of this, we only call this 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from CreateRenderView and allow that to notify the RenderView for us. 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_restored_page_id = controller_.GetMaxRestoredPageID(); 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_restored_page_id > 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(rvh->GetSiteInstance())) 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(), 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_restored_page_id); 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry, 3043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For file URLs without a title, use the pathname instead. In the case of a 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synthesized title, we don't want the update to count toward the "one set 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per page of the title to history." 3047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 final_title; 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool explicit_set; 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry && entry->GetURL().SchemeIsFile() && title.empty()) { 30505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final_title = base::UTF8ToUTF16(entry->GetURL().ExtractFileName()); 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = false; // Don't count synthetic titles toward the set limit. 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3053a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(title, base::TRIM_ALL, &final_title); 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = true; 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a page is created via window.open and never navigated, 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there will be no navigation entry. In this situation, 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| will be used for page title. 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_title == entry->GetTitle()) 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTitle(final_title); 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_title_when_no_navigation_entry_ == final_title) 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_title_when_no_navigation_entry_ = final_title; 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, set the title for the view. 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetPageTitle(final_title); 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 30764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TitleWasSet(entry, explicit_set)); 30774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 30784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<NavigationEntry*, bool> details = 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(entry, explicit_set); 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<NavigationEntry*, bool> >(&details)); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::SendLoadProgressChanged() { 3090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_last_progress_update_ = base::TimeTicks::Now(); 3091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double progress = 0.0; 3092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int frame_count = 0; 3093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (LoadingProgressMap::iterator it = loading_progresses_.begin(); 3095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != loading_progresses_.end(); 3096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++it) { 3097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress += it->second; 3098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++frame_count; 3099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 3100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (frame_count == 0) 3101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress /= frame_count; 3103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(progress <= 1.0); 3104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (progress <= loading_total_progress_) 3106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_ = progress; 3108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (delegate_) 3110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate_->LoadProgressChanged(this, progress); 3111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::ResetLoadProgressState() { 3114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_progresses_.clear(); 3115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_total_progress_ = 0.0; 3116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_weak_factory_.InvalidateWeakPtrs(); 3117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_last_progress_update_ = base::TimeTicks(); 3118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 31204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::NotifySwapped(RenderViewHost* old_host, 31214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHost* new_host) { 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After sending out a swap notification, we need to send a disconnect 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification so that clients that pick up a pointer to |this| can NULL the 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer. See Bug 1230284. 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 312658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHostChanged(old_host, new_host)); 312858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 312958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 31304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::pair<RenderViewHost*, RenderViewHost*> details = 31314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::make_pair(old_host, new_host); 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 31334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTIFICATION_RENDER_VIEW_HOST_CHANGED, 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 31354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Details<std::pair<RenderViewHost*, RenderViewHost*> >(&details)); 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that the associated embedder gets cleared after a RenderViewHost 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets swapped, so we don't reuse the same embedder next time a 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is attached to this WebContents. 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveBrowserPluginEmbedder(); 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 314358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(avi): Remove this entire function because this notification is already 314458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// covered by two observer functions. http://crbug.com/170921 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() { 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notify_disconnection_) 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = false; 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::NotifyNavigationEntryCommitted( 3157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const LoadCommittedDetails& load_details) { 3158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FOR_EACH_OBSERVER( 3159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContentsObserver, observers_, NavigationEntryCommitted(load_details)); 3160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderFrameHost* render_frame_host, 3163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const IPC::Message& message) { 3164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return OnMessageReceived(NULL, render_frame_host, message); 3165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst GURL& WebContentsImpl::GetMainFrameLastCommittedURL() const { 3168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetLastCommittedURL(); 3169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameCreated(RenderFrameHost* render_frame_host) { 3172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Note this is only for subframes, the notification for the main frame 3173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // happens in RenderViewCreated. 3174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 3176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameCreated(render_frame_host)); 3177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) { 3180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClearPowerSaveBlockers(render_frame_host); 3181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 3183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameDeleted(render_frame_host)); 3184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 31865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::WorkerCrashed(RenderFrameHost* render_frame_host) { 31875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 31885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->WorkerCrashed(this); 31895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 31905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ShowContextMenu(RenderFrameHost* render_frame_host, 31925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ContextMenuParams& params) { 3193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ContextMenuParams context_menu_params(params); 31945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Allow WebContentsDelegates to handle the context menu operation first. 3195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetBrowserPluginGuest()) { 3196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebContentsViewGuest* view_guest = 3197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<WebContentsViewGuest*>(GetView()); 3198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_menu_params = view_guest->ConvertContextMenuParams(params); 3199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 3200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (delegate_ && delegate_->HandleContextMenu(context_menu_params)) 32015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 32025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_host_delegate_view_->ShowContextMenu(render_frame_host, 3204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_menu_params); 32055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::RunJavaScriptMessage( 3208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host, 3209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 3210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& default_prompt, 3211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& frame_url, 3212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch JavaScriptMessageType javascript_message_type, 3213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg) { 3214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Suppress JavaScript dialogs when requested. Also suppress messages when 3215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // showing an interstitial as it's shown over the previous page and we don't 3216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // want the hidden page's dialogs to interfere with the interstitial. 3217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool suppress_this_message = 3218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderViewHostImpl*>(render_frame_host->GetRenderViewHost())-> 3219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IsSwappedOut() || 3220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ShowingInterstitialPage() || 3221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_ || 3222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->ShouldSuppressDialogs() || 3223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_->GetJavaScriptDialogManager(); 3224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!suppress_this_message) { 3226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string accept_lang = GetContentClient()->browser()-> 3227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetAcceptLangs(GetBrowserContext()); 3228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 3229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_->RunJavaScriptDialog( 3230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, 3231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_url.GetOrigin(), 3232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch accept_lang, 3233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch javascript_message_type, 3234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message, 3235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch default_prompt, 3236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&WebContentsImpl::OnDialogClosed, 3237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Unretained(this), 3238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetProcess()->GetID(), 3239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), 3240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reply_msg, 3241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch false), 3242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &suppress_this_message); 3243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (suppress_this_message) { 3246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If we are suppressing messages, just reply as if the user immediately 3247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // pressed "Cancel", passing true to |dialog_was_suppressed|. 3248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnDialogClosed(render_frame_host->GetProcess()->GetID(), 3249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), reply_msg, 32505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu true, false, base::string16()); 3251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // OnDialogClosed (two lines up) may have caused deletion of this object (see 3254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // http://crbug.com/288961 ). The only safe thing to do here is return. 3255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WebContentsImpl::RunBeforeUnloadConfirm( 3258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host, 3259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 3260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_reload, 3261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg) { 3262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHostImpl* rfhi = 3263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_host); 3264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderViewHostImpl* rvhi = 3265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderViewHostImpl*>(render_frame_host->GetRenderViewHost()); 3266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (delegate_) 3267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->WillRunBeforeUnloadConfirm(); 3268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool suppress_this_message = 3270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch rvhi->rvh_state() != RenderViewHostImpl::STATE_DEFAULT || 3271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_ || 3272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->ShouldSuppressDialogs() || 3273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !delegate_->GetJavaScriptDialogManager(); 3274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (suppress_this_message) { 3275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch rfhi->JavaScriptDialogClosed(reply_msg, true, base::string16(), true); 3276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 3277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_showing_before_unload_dialog_ = true; 3280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 3281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dialog_manager_->RunBeforeUnloadDialog( 3282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, message, is_reload, 3283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), 3284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetProcess()->GetID(), 3285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_frame_host->GetRoutingID(), reply_msg, 32865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu false)); 3287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 32895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() { 32905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return this; 32915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool WebContentsImpl::IsNeverVisible() { 32940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!delegate_) 32950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 32960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return delegate_->IsNeverVisible(this); 32970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 32980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_view_host_delegate_view_; 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs( 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context) const { 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_; 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetRootWindowResizerRect(); 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() { 3315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_) 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_.reset(); 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send notifications if we are just creating a swapped-out RVH for 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the opener chain. These won't be used for view-source or WebUI, so it's 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ok to return early. 33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(render_view_host)->IsSwappedOut()) 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 3327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 33282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<RenderViewHost>(render_view_host)); 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're creating views, we're still doing initial setup, so we always 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the pending Web UI rather than any possibly existing committed one. 3336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_web_ui()) 3337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_web_ui()->RenderViewCreated(render_view_host); 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetPendingEntry(); 3340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (entry && entry->IsViewSourceMode()) { 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put the renderer in view source mode. 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->Send( 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID())); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->RenderViewCreated(render_view_host); 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, observers_, RenderViewCreated(render_view_host)); 3350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We tell the observers now instead of when the main RenderFrameHostImpl is 3352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // constructed because otherwise it would be too early (i.e. IPCs sent to the 3353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // frame would be dropped because it's not created yet). 3354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* main_frame = render_view_host->GetMainFrame(); 3355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER( 3356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsObserver, observers_, RenderFrameCreated(main_frame)); 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify the world, since this came from a renderer in the 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 336658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notify_disconnection_ = true; 336758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 336858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NotificationService::current()->Notify( 336958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTIFICATION_WEB_CONTENTS_CONNECTED, 337058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Source<WebContents>(this), 337158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NotificationService::NoDetails()); 337258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_crashed = IsCrashed(); 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0); 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the focus to the tab (otherwise the focus will be on the top 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window). 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_crashed && !FocusLocationBarByDefault() && 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) { 33802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Focus(); 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady()); 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, 3387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TerminationStatus status, 3388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int error_code) { 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pending page's RenderViewHost is gone. 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure fullscreen mode is exited in the |delegate_| since a crashed 3395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // renderer may not have made a clean exit. 3396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsFullscreenForCurrentTab()) 3397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ToggleFullscreenMode(false); 3398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cancel any visible dialogs so they are not left dangling over the sad tab. 3400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dialog_manager_) 3401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 3402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(rvh, false, true, NULL); 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(status, error_code); 3406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Reset the loading progress. TODO(avi): What does it mean to have a 3408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // "renderer crash" when there is more than one renderer process serving a 3409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // webpage? Once this function is called at a more granular frame level, we 3410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // probably will need to more granularly reset the state here. 3411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetLoadProgressState(); 3412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loading_frames_in_progress_ = 0; 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 34167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RenderProcessGone(GetCrashedStatus())); 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh, 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 342590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that this state update comes from either the active RVH or one of 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the swapped out RVHs. We don't expect to hear from any other RVHs. 34285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(nasko): This should go through RenderFrameHost. 34295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(creis): We can't update state for cross-process subframes until we 34305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have FrameNavigationEntries. Once we do, this should be a DCHECK. 34315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rvh != GetRenderViewHost() && 34325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetRenderManager()->IsRVHOnSwappedOutList( 34335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderViewHostImpl*>(rvh))) 34345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must be prepared to handle state updates for any page, these occur 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the user is scrolling and entering form data, as well as when we're 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leaving a page, in which case our state may have already been moved to 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the next page. The navigation controller will look up the appropriate 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationEntry and update it when it is notified via the delegate. 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entry_index = controller_.GetEntryIndexWithPageID( 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_index < 0) 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 344890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (page_state == entry->GetPageState()) 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 345090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) entry->SetPageState(page_state); 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.NotifyEntryChanged(entry, entry_index); 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) { 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->UpdateTargetURL(this, page_id, url); 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) { 34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The UI may be in an event-tracking loop, such as between the 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse-down and mouse-up in text selection or a button click. 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer the close until after tracking is complete, so that we 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't free objects out from under the UI. 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(shess): This could get more fine-grained. For instance, 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing a tab in another window while selecting text in the 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current window's Omnibox should be just fine. 34682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_->IsEventTracking()) { 34692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CloseTabAfterEventTracking(); 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore this if it comes from a RenderViewHost that we aren't showing. 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->CloseContents(this); 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3479effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsImpl::SwappedOut(RenderFrameHost* rfh) { 3480e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (delegate_ && rfh->GetRenderViewHost() == GetRenderViewHost()) 3481e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch delegate_->SwappedOut(this); 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) { 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->IsPopupOrPanel(this)) 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->MoveContents(this, new_bounds); 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3489effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsImpl::DidStartLoading(RenderFrameHost* render_frame_host, 3490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document) { 3491effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(render_frame_host->GetRenderViewHost(), true, 3492effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch to_different_document, NULL); 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderFrameHost* render_frame_host) { 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoadNotificationDetails> details; 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use the last committed entry rather than the active one, in case a 3499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pending entry has been created. 3500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 35015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Navigator* navigator = frame_tree_.root()->navigator(); 3502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An entry may not exist for a stop when loading an initial blank page or 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if an iframe injected by script into a blank page finishes loading. 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 35065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta elapsed = 35075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks::Now() - navigator->GetCurrentLoadStart(); 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.reset(new LoadNotificationDetails( 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetVirtualURL(), 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType(), 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elapsed, 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &controller_, 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetCurrentEntryIndex())); 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3517effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetIsLoading(render_frame_host->GetRenderViewHost(), false, true, 3518effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch details.get()); 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() { 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the URL display. 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::DidAccessInitialDocument() { 35295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_accessed_initial_document_ = true; 35305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 35310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // We may have left a failed browser-initiated navigation in the address bar 35320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // to let the user edit it and try again. Clear it now that content might 35330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // show up underneath it. 35340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!IsLoading() && controller_.GetPendingEntry()) 35350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch controller_.DiscardPendingEntry(); 35360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Update the URL display. 3538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL); 3539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DidDisownOpener(RenderFrameHost* render_frame_host) { 3542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (opener_) { 3543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Clear our opener so that future cross-process navigations don't have an 3544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // opener assigned. 3545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RemoveDestructionObserver(opener_); 3546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) opener_ = NULL; 3547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Notify all swapped out RenderViewHosts for this tab. This is important 3550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // in case we go back to them, or if another window in those processes tries 3551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // to access window.opener. 3552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetRenderManager()->DidDisownOpener(render_frame_host->GetRenderViewHost()); 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompleted( 3556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host) { 35574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DocumentOnLoadCompletedInMainFrame()); 35594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 35604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 3564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NotificationService::NoDetails()); 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderFrameHost* render_frame_host, 3568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 page_id, 3569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::string16& title, 3570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::i18n::TextDirection title_direction) { 3571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewHost* rvh = render_frame_host->GetRenderViewHost(); 3572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If we have a title, that's a pretty good indication that we've started 3574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // getting useful data. 3575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetNotWaitingForResponse(); 3576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Try to find the navigation entry, which might not be the current one. 3578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For example, it might be from a pending RVH for the pending entry. 3579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NavigationEntryImpl* entry = controller_.GetEntryWithPageID( 3580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 3581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We can handle title updates when we don't have an entry in 3583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // UpdateTitleForEntry, but only if the update is from the current RVH. 3584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(avi): Change to make decisions based on the RenderFrameHost. 3585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!entry && rvh != GetRenderViewHost()) 3586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(evan): make use of title_direction. 3589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=27094 3590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!UpdateTitleForEntry(entry, title)) 3591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Broadcast notifications when the UI should be updated. 3594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (entry == controller_.GetEntryAtOffset(0)) 3595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); 3596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderFrameHost* render_frame_host, 3599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& encoding) { 3600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetEncoding(encoding); 3601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame( 3604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderViewHost* render_view_host) { 3605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DocumentAvailableInMainFrame()); 3607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the active RenderViewHost to run unload handlers and close, as long 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the request came from a RenderViewHost in the same BrowsingInstance. 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->ClosePage(); 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent( 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only deliver the message to the active RenderViewHost if the request 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // came from a RenderViewHost in the same BrowsingInstance or if this 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents is dedicated to a browser plugin guest. 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This check means that an embedder could theoretically receive a 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // postMessage from anyone (not just its own guests). However, this is 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probably not a risk for apps since other pages won't have references 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to App windows. 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params new_params(params); 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!params.message_port_ids.empty()) { 36358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MessagePortMessageFilter* message_port_message_filter = 36368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static_cast<RenderProcessHostImpl*>(GetRenderProcessHost()) 36378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ->message_port_message_filter(); 3638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) message_port_message_filter->UpdateMessagePortsWithNewRoutes( 3639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.message_port_ids, 3640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &new_params.new_routing_ids); 36418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 36428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a source_routing_id, translate it to the routing ID for 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the equivalent swapped out RVH in the target process. If we need 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to create a swapped out RVH for the source tab, we create its opener 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chain as well, since those will also be accessible to the target page. 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_params.source_routing_id != MSG_ROUTING_NONE) { 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to look up the WebContents for the source page. 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* source_contents = NULL; 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID(), params.source_routing_id); 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_rvh) { 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents = static_cast<WebContentsImpl*>( 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_rvh->GetDelegate()->GetAsWebContents()); 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_contents) { 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBrowserPluginGuest()) { 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create a swapped out RenderView for the embedder in the guest's 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // render process but we intentionally do not expose the embedder's 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener chain to it. 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateSwappedOutRenderView(GetSiteInstance()); 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateOpenerRenderViews(GetSiteInstance()); 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We couldn't find it, so don't pass a source frame. 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = MSG_ROUTING_NONE; 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level, 3681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message, 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 3683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& source_id) { 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AddMessageToConsole(this, level, message, line_no, 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_id); 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs() { 36914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We want to base the page config off of the actual URL, rather than the 36924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // virtual URL. 36934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(nasko): Investigate how to remove the GetActiveEntry usage here, 36944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // as it is deprecated and can be out of sync with GetRenderViewHost(). 369568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GURL url = controller_.GetActiveEntry() 369668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); 36971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetWebkitPrefs(url); 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView( 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 37035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderManager()->CreateRenderFrame(instance, MSG_ROUTING_NONE, 37045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true, true); 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() { 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh) // NULL in unittests. 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rdh->OnUserGesture(this); 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() { 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent()); 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh, 37223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_during_beforeunload, 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_during_unload) { 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't show hung renderer dialog for a swapped out RVH. 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore renderer unresponsive event if debugger is attached to the tab 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the event may be a result of the renderer sitting on a breakpoint. 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/65458 37332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (DevToolsAgentHost::IsDebuggerAttached(this)) 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (is_during_beforeunload || is_during_unload) { 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hang occurred while firing the beforeunload/unload handler. 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend the handler fired so tab closing continues as if it had. 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->set_sudden_termination_allowed(true); 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer()) 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab hangs in the beforeunload/unload handler there's really 37453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // nothing we can do to recover. If the hang is in the beforeunload handler, 37463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // pretend the beforeunload listeners have all fired and allow the delegate 37473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // to continue closing; the user will not have the option of cancelling the 37483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // close. Otherwise, pretend the unload listeners have all fired and close 37493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the tab. 37503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool close = true; 37510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (is_during_beforeunload && delegate_) { 37523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) delegate_->BeforeUnloadFired(this, true, &close); 37533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 37543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (close) 37553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Close(rvh); 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive()) 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererUnresponsive(this); 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) { 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererResponsive(this); 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged( 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::LoadStateWithParam& load_state, 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_position, 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_size) { 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = load_state; 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = upload_position; 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = upload_size; 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_ = net::IDNToUnicode(url.host(), 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext())); 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_state_.state == net::LOAD_STATE_READING_RESPONSE) 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsLoading()) { 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB); 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager( 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, const base::TimeTicks& proceed_time, 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 37927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 37937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadFired(proceed_time)); 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload); 3796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note: |this| might be deleted at this point. 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebContentsImpl::RenderProcessGoneFromRenderManager( 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING); 3802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderViewTerminated(render_view_host, crashed_status_, crashed_error_code_); 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() { 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this is a hack. See WebContentsView::SizeContents. 3807424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size = GetSizeForNewRenderView(); 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here during container initialization and normal window size will be set 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. In case of tab duplication this resizing to 0x0 prevents setting 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal size later so just ignore it. 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!size.IsEmpty()) 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SizeContents(size); 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::CancelModalDialogsForRenderManager() { 38174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We need to cancel modal dialogs when doing a process swap, since the load 38184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // deferrer would prevent us from swapping out. 38194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (dialog_manager_) 38204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 38214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::NotifySwappedFromRenderManager(RenderViewHost* old_host, 38244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHost* new_host) { 38254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NotifySwapped(old_host, new_host); 38262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the visible RVH reflects the new delegate's preferences. 38282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 3829f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) view_->SetOverscrollControllerEnabled(CanOverscrollContent()); 38302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) view_->RenderViewSwappedIn(new_host); 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager( 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_) 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recursively create RenderViews for anything else in the opener chain. 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_->CreateOpenerRenderViews(instance); 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opener_route_id = MSG_ROUTING_NONE; 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this tab has an opener, ensure it has a RenderView in the given 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance as well. 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_) 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id = opener_->CreateOpenerRenderViews(instance); 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any of the renderers (current, pending, or swapped out) for this 38522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents has the same SiteInstance, use it. 3853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->current_host()->GetSiteInstance() == instance) 3854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetRoutingID(); 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_render_view_host() && 3857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_render_view_host()->GetSiteInstance() == 3858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) instance) 3859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->pending_render_view_host()->GetRoutingID(); 38602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostImpl* rvh = GetRenderManager()->GetSwappedOutRenderViewHost( 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance); 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetRoutingID(); 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a swapped out RenderView in the given SiteInstance if none exists, 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setting its opener to the given route_id. Return the new view's route_id. 38685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderManager()->CreateRenderFrame(instance, opener_route_id, 38695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true, true); 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetController(); 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebUIImpl*>(CreateWebUI(url)); 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry* 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() { 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetLastCommittedEntry(); 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager( 38865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host, 38875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int opener_route_id, 3888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int proxy_routing_id, 3889cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool for_main_frame) { 38907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateRenderViewForRenderManager"); 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 3892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* rwh_view; 38935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary 38945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // until RenderWidgetHost is attached to RenderFrameHost. We need to special 38955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // case this because RWH is still a base class of RenderViewHost, and child 38965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // frame RWHVs are unique in that they do not have their own WebContents. 3897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!for_main_frame) { 38985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostViewChildFrame* rwh_view_child = 38995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new RenderWidgetHostViewChildFrame(render_view_host); 39005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwh_view = rwh_view_child; 39015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 39025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwh_view = view_->CreateViewForWidget(render_view_host); 39035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the RenderView has been created, we need to tell it its size. 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 3907424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) rwh_view->SetSize(GetSizeForNewRenderView()); 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we use the correct starting page_id in the new RenderView. 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDIfNecessary(render_view_host); 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 max_page_id = 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance()); 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<RenderViewHostImpl*>( 3915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_host)->CreateRenderView(base::string16(), 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id, 3917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) proxy_routing_id, 39180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch max_page_id, 39190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch created_with_opener_)) { 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a ViewMsg_Resize to be sent, needed to make plugins show up on 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // linux. See crbug.com/83941. 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) { 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost()) 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host->WasResized(); 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID) 3936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3937a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> 3938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebContentsImpl::GetJavaWebContents() { 3939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsAndroid* web_contents_android = 3942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<WebContentsAndroid*>(GetUserData(kWebContentsAndroidKey)); 3943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!web_contents_android) { 3944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_contents_android = new WebContentsAndroid(this); 3945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUserData(kWebContentsAndroidKey, web_contents_android); 3946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 3947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return web_contents_android->GetJavaObject(); 3948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 39503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() { 39513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return CreateRenderViewForRenderManager(GetRenderViewHost(), 39525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MSG_ROUTING_NONE, 3953cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MSG_ROUTING_NONE, 3954cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true); 39553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_MACOSX) 3958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetAllowOverlappingViews(bool overlapping) { 3960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->SetAllowOverlappingViews(overlapping); 3961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3963010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WebContentsImpl::GetAllowOverlappingViews() { 3964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return view_->GetAllowOverlappingViews(); 3965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3966010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3967010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::SetOverlayView(WebContents* overlay, 3968010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const gfx::Point& offset) { 3969010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->SetOverlayView(static_cast<WebContentsImpl*>(overlay)->GetView(), 3970010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) offset); 3971010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void WebContentsImpl::RemoveOverlayView() { 3974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) view_->RemoveOverlayView(); 3975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 39773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 39783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 39795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid WebContentsImpl::OnDialogClosed(int render_process_id, 39805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int render_frame_id, 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 3982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool dialog_was_suppressed, 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 3984a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& user_input) { 39855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RenderFrameHostImpl* rfh = RenderFrameHostImpl::FromID(render_process_id, 39865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu render_frame_id); 3987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch last_dialog_suppressed_ = dialog_was_suppressed; 3988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_showing_before_unload_dialog_ && !success) { 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a beforeunload dialog is canceled, we need to stop the throbber from 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spinning, since we forced it to start spinning in Navigate. 39925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (rfh) 39935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidStopLoading(rfh); 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 39957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 39967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 39977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadDialogCancelled()); 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3999c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = false; 40015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (rfh) { 40025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu rfh->JavaScriptDialogClosed(reply_msg, success, user_input, 40035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dialog_was_suppressed); 40045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 40055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Don't leak the sync IPC reply if the RFH or process is gone. 40065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete reply_msg; 40075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) { 4011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (encoding == last_reported_encoding_) 4012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 4013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) last_reported_encoding_ = encoding; 4014cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4015cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canonical_encoding_ = GetContentClient()->browser()-> 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCanonicalEncodingNameByAliasName(encoding); 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 4020010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderWidgetHostViewBase* rwh_view = view_->CreateViewForWidget(rvh); 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 4023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) rwh_view->SetSize(GetContainerBounds().size()); 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::IsHidden() { 40273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return capturer_count_ == 0 && !should_normally_be_visible_; 40283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 40293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4030f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManager() const { 4031f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return frame_tree_.root()->render_manager(); 4032f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 4033f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_guest_.get(); 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4042eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { 4043eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(!browser_plugin_guest_); 4044eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_plugin_guest_.reset(guest); 4045eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4046eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 40472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_embedder_.get(); 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4051ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearPowerSaveBlockers( 4052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderFrameHost* render_frame_host) { 4053010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) STLDeleteValues(&power_save_blockers_[render_frame_host]); 4054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) power_save_blockers_.erase(render_frame_host); 4055ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 4056ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4057ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearAllPowerSaveBlockers() { 4058ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin()); 4059ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch i != power_save_blockers_.end(); ++i) 4060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch STLDeleteValues(&power_save_blockers_[i->first]); 4061ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch power_save_blockers_.clear(); 4062ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 4063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::Size WebContentsImpl::GetSizeForNewRenderView() { 4065424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size; 4066424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (delegate_) 4067424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size = delegate_->GetSizeForNewRenderView(this); 4068424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (size.IsEmpty()) 4069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size = GetContainerBounds().size(); 4070424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return size; 4071424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 4072424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 40734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::OnFrameRemoved( 40744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHostImpl* render_view_host, 4075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int frame_routing_id) { 40764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 4077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameDetached(render_view_host, frame_routing_id)); 40784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 40794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 40805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) { 40815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!delegate_) 40825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 40835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size new_size = GetPreferredSize(); 40845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_size != old_size) 40855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->UpdatePreferredSize(this, new_size); 40865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 4089