web_contents_impl.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest_manager.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/devtools/render_view_devtools_agent_host.h" 26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/dom_storage/dom_storage_context_wrapper.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_stats.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mhtml_generation_manager.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_package.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/cross_process_frame_connector.h" 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h" 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/navigator_impl.h" 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h" 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/render_widget_host_view_child_frame.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_message_filter.h" 408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/browser/message_port_service.h" 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/power_save_blocker_impl.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_guest.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h" 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/frame_messages.h" 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/image_messages.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_view_host_delegate_view.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h" 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/ax_event_notification_details.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/color_chooser.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/javascript_dialog_manager.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 8158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/result_codes.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_utils.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_cache.h" 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/http/http_transaction_factory.h" 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_request_context.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h" 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/date_time_chooser_android.h" 991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h" 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/web_contents/web_contents_android.h" 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/common/java_bridge_messages.h" 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h" 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gl/io_surface_support_mac.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) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com"; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID) 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kWebContentsAndroidKey[] = "web_contents_android"; 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // OS_ANDROID 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::LazyInstance<std::vector<WebContentsImpl::CreatedCallback> > 171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER; 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int StartDownload(content::RenderViewHost* rvh, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_favicon, 176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uint32_t max_bitmap_size) { 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int g_next_image_download_id = 0; 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rvh->Send(new ImageMsg_DownloadImage(rvh->GetRoutingID(), 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++g_next_image_download_id, 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_favicon, 182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) max_bitmap_size)); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_next_image_download_id; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void NotifyCacheOnIO( 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context, 18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& url, 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& http_method) { 19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) request_context->GetURLRequestContext()->http_transaction_factory()-> 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetCache()->OnExternalCacheHit(url, http_method); 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Helper function for retrieving all the sites in a frame tree. 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CollectSites(BrowserContext* context, 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::set<GURL>* sites, 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FrameTreeNode* node) { 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sites->insert(SiteInstance::GetSiteForURL(context, node->current_url())); 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ForEachFrameInternal( 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame, 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTreeNode* node) { 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) on_frame.Run(node->current_frame_host()); 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ForEachPendingFrameInternal( 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame, 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameTreeNode* node) { 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* pending_frame_host = 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) node->render_manager()->pending_frame_host(); 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (pending_frame_host) 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) on_frame.Run(pending_frame_host); 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SendToAllFramesInternal(IPC::Message* message, RenderFrameHost* rfh) { 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Message* message_copy = new IPC::Message(*message); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_copy->set_routing_id(rfh->GetRoutingID()); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rfh->Send(message_copy); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RunRenderFrameDeleted( 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ObserverList<WebContentsObserver>* observer_list, 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* render_frame_host) { 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *observer_list, 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameDeleted(render_frame_host)); 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContents::Create(const WebContents::CreateParams& params) { 236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return WebContentsImpl::CreateWithOpener( 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params, static_cast<WebContentsImpl*>(params.opener)); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage( 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const SessionStorageNamespaceMap& session_storage_namespace_map) { 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, NULL); 245ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 246ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (SessionStorageNamespaceMap::const_iterator it = 247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session_storage_namespace_map.begin(); 248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch it != session_storage_namespace_map.end(); 249ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++it) { 250ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new_contents->GetController() 251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch .SetSessionStorageNamespace(it->first, it->second.get()); 252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::AddCreatedCallback(const CreatedCallback& callback) { 259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().push_back(callback); 260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::RemoveCreatedCallback(const CreatedCallback& callback) { 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) { 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (g_created_callbacks.Get().at(i).Equals(callback)) { 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i); 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetDelegate()->GetAsWebContents(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContents::FromRenderFrameHost(RenderFrameHost* rfh) { 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* rfh_impl = static_cast<RenderFrameHostImpl*>(rfh); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!rfh_impl) 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return rfh_impl->delegate()->GetAsWebContents(); 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebContentsImpl::DestructionObserver ---------------------------------------- 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsImpl::DestructionObserver : public WebContentsObserver { 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents) 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : WebContentsObserver(watched_contents), 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_(owner) { 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // WebContentsObserver: 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE { 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_->OnWebContentsDestroyed(static_cast<WebContentsImpl*>(web_contents)); 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebContentsImpl* owner_; 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionObserver); 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl ------------------------------------------------------------- 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl( 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(NULL), 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_(this, browser_context), 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_delegate_view_(NULL), 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_(opener), 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_(NULL), 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_tree_(new NavigatorImpl(&controller_, this), 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, this, this, this), 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_(0), 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_(false), 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) load_state_(net::LOAD_STATE_IDLE, base::string16()), 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_(0), 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_(0), 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_(false), 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capturer_count_(0), 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_(true), 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_(false), 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_(false), 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_(NULL), 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_(false), 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_active_time_(base::TimeTicks::Now()), 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_(false), 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)), 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temporary_zoom_settings_(false), 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_(0), 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_message_source_(NULL), 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fullscreen_widget_routing_id_(MSG_ROUTING_NONE), 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_subframe_(false) { 339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) 340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().at(i).Run(this); 3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_.SetFrameRemoveListener( 3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&WebContentsImpl::OnFrameRemoved, 3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this))); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_ = true; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Delete all RFH pending shutdown, which will lead the corresponding RVH to 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // shutdown and be deleted as well. 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_.ForEach( 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&RenderFrameHostManager::ClearRFHsPendingShutdown)); 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 354ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearAllPowerSaveBlockers(); 355ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<RenderWidgetHostImpl*>::iterator iter = 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->DetachDelegate(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.clear(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear out any JavaScript state. 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dialog_manager_) 364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dialog_manager_->WebContentsDestroyed(this); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->End(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify any observer that have a reference on this WebContents. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DESTROYED, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Callback<void(RenderFrameHost*)> run_render_frame_deleted_callback = 378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&RunRenderFrameDeleted, base::Unretained(&observers_)); 379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&ForEachPendingFrameInternal, 380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) run_render_frame_deleted_callback)); 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHost* pending_rvh = GetRenderManager()->pending_render_view_host(); 3838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (pending_rvh) { 3848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) observers_, 3868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderViewDeleted(pending_rvh)); 3878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 3888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ForEachFrame(run_render_frame_deleted_callback); 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) observers_, 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewDeleted(GetRenderManager()->current_host())); 3948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImplDestroyed()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDelegate(NULL); 40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STLDeleteContainerPairSecondPointers(destruction_observers_.begin(), 40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.end()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener( 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) { 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener"); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, opener); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::CreateGuest( 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int guest_instance_id, 421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> extra_params) { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl(browser_context, NULL); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This makes |new_contents| act as a guest. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserPluginGuest::Create( 4270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) guest_instance_id, site_instance, new_contents, extra_params.Pass()); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents::CreateParams create_params(browser_context, site_instance); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(create_params); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We are instantiating a WebContents for browser plugin. Set its subframe bit 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to true. 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_contents->is_subframe_ = true; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new_contents->browser_plugin_guest_.get(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManagerForTesting() { 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return OnMessageReceived(render_view_host, NULL, message); 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHost* render_frame_host, 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const IPC::Message& message) { 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(render_view_host || render_frame_host); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetWebUI() && 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<WebContentsObserver>::Iterator it(observers_); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver* observer; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer->OnMessageReceived(message)) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Message handlers should be aware of which 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RenderViewHost/RenderFrameHost sent the message, which is temporarily 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // stored in render_(view|frame)_message_source_. 466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (render_frame_host) { 467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (RenderViewDevToolsAgentHost::DispatchIPCMessage( 468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->GetRenderViewHost(), message)) 469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_message_source_ = render_frame_host; 471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (RenderViewDevToolsAgentHost::DispatchIPCMessage( 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_host, message)) 474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_message_source_ = render_view_host; 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool message_is_ok = true; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP_EX(WebContentsImpl, message, message_is_ok) 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_PepperPluginHung, OnPepperPluginHung) 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_PluginCrashed, OnPluginCrashed) 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DomOperationResponse, 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnDomOperationResponse) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidLoadResourceFromMemoryCache) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidDisplayInsecureContent) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent, 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidRunInsecureContent) 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishDocumentLoad, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDocumentLoadedInFrame) 493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishLoad, OnDidFinishLoad) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRegisterProtocolHandler) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_OpenColorChooser, OnOpenColorChooser) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EndColorChooser, OnEndColorChooser) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SetSelectedColorInColorChooser, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetSelectedColorInColorChooser) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRequestPpapiBrokerPermission) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_AllocateInstanceID, 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_Attach, 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ImageHostMsg_DidDownloadImage, OnDidDownloadImage) 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply, 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnFindMatchRectsReply) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_OpenDateTimeDialog, 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnOpenDateTimeDialog) 5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IPC_MESSAGE_HANDLER_DELAY_REPLY(JavaBridgeHostMsg_GetChannelHandle, 5201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnJavaBridgeGetChannelHandle) 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayingNotification, 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnMediaPlayingNotification) 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPausedNotification, 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnMediaPausedNotification) 526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFirstVisuallyNonEmptyPaint, 527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnFirstVisuallyNonEmptyPaint) 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_ShowValidationMessage, 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnShowValidationMessage) 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_HideValidationMessage, 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHideValidationMessage) 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_MoveValidationMessage, 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnMoveValidationMessage) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP_EX() 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_message_source_ = NULL; 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_message_source_ = NULL; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!message_is_ok) { 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("BadMessageTerminate_RVD")); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderProcessHost()->ReceivedBadMessage(); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser( 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RunFileChooser(this, params); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const { 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetBrowserContext(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const { 56790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst GURL& WebContentsImpl::GetVisibleURL() const { 57390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 57590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 57690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 57790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetLastCommittedURL() const { 57990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 58090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 58190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 58290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 58390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cbentzel): remove this debugging code? 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate == delegate_) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Detach(this); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Attach(this); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the visible RVH reflects the new delegate's preferences. 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate->CanOverscrollContent()); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { 604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostImpl* host = GetRenderManager()->current_host(); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host ? host->GetProcess() : NULL; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetMainFrame() { 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame_tree_.root()->current_frame_host(); 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)RenderFrameHost* WebContentsImpl::GetFocusedFrame() { 613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!frame_tree_.GetFocusedFrame()) 614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return NULL; 615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return frame_tree_.GetFocusedFrame()->current_frame_host(); 616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ForEachFrame( 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Callback<void(RenderFrameHost*)>& on_frame) { 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&ForEachFrameInternal, on_frame)); 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SendToAllFrames(IPC::Message* message) { 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ForEachFrame(base::Bind(&SendToAllFramesInternal, message)); 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete message; 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const { 629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host(); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContentsImpl::GetEmbedderWebContents() const { 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest) 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->embedder_web_contents(); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetEmbeddedInstanceID() const { 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest) 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->instance_id(); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->GetRoutingID(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetFullscreenWidgetRoutingID() const { 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fullscreen_widget_routing_id_; 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const { 658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->GetRenderWidgetHostView(); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostViewPort* WebContentsImpl::GetRenderWidgetHostViewPort() const { 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest && guest->embedder_web_contents()) { 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->embedder_web_contents()->GetRenderWidgetHostViewPort(); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetFullscreenRenderWidgetHostView() 670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const { 671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHost* const widget_host = 672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostImpl::FromID(GetRenderProcessHost()->GetID(), 673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetFullscreenWidgetRoutingID()); 674d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return widget_host ? widget_host->GetView() : NULL; 675d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 676d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_.get(); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIImpl* web_ui = new WebUIImpl(this); 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()-> 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateWebUIControllerForURL(web_ui, url); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller) { 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui->AddMessageHandler(new GenericHandler()); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->SetController(controller); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete web_ui; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const { 696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->web_ui() ? GetRenderManager()->web_ui() 697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : GetRenderManager()->pending_web_ui(); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const { 701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->web_ui(); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUserAgentOverride() == override) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.user_agent_override = override; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the new override string to the renderer. 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->SyncRendererPrefs(); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload the page if a load is currently in progress to avoid having 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different parts of the page loaded using different user agents. 7174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent()) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ReloadIgnoringCache(true); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserAgentOverrideSet(override)); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const { 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.user_agent_override; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::SetParentNativeViewAccessible( 731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible accessible_parent) { 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_ = accessible_parent; 73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (GetRenderViewHost()) 73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent); 735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetTitle() const { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transient entries take precedence. They are used for interstitial pages 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that are shown on top of existing pages. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetTransientEntry(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_languages = 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext()); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebUI* our_web_ui = GetRenderManager()->pending_web_ui() ? 749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_web_ui() : GetRenderManager()->web_ui(); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (our_web_ui) { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't override the title in view source mode. 752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry = controller_.GetVisibleEntry(); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(entry && entry->IsViewSourceMode())) { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the Web UI the chance to override our title. 755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title = our_web_ui->GetOverriddenTitle(); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title.empty()) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the title for the last committed entry rather than a pending 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation entry. For example, when the user types in a URL, we want to 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep the old page's title until the new load has committed and we get a new 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title. 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetLastCommittedEntry(); 766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We make an exception for initial navigations. 768f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (controller_.IsInitialNavigation()) { 769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We only want to use the title from the visible entry in one of two cases: 770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1. There's already a committed entry for an initial navigation, in which 771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // case we are doing a history navigation in a new tab (e.g., Ctrl+Back). 772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2. The pending entry has been explicitly assigned a title to display. 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If there's no last committed entry and no assigned title, we should fall 775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // back to |page_title_when_no_navigation_entry_| rather than showing the 776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // URL. 777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (entry || 778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (controller_.GetVisibleEntry() && 779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !controller_.GetVisibleEntry()->GetTitle().empty())) { 780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) entry = controller_.GetVisibleEntry(); 781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 782f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| is finally used 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if no title cannot be retrieved. 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_title_when_no_navigation_entry_; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetMaxPageIDForSiteInstance(GetSiteInstance()); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance( 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end()) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = -1; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return max_page_ids_[site_instance->GetId()]; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) { 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance( 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, int32 page_id) { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetMaxPageIDForSiteInstance(site_instance) < page_id) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = page_id; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContents* web_contents) { 8161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebContentsImpl* contents = static_cast<WebContentsImpl*>(web_contents); 8171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) max_page_ids_ = contents->max_page_ids_; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const { 821f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetSiteInstance(); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const { 825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHost* dest_rvh = GetRenderManager()->pending_render_view_host() ? 826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_render_view_host() : 827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->current_host(); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest_rvh->GetSiteInstance(); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_loading_; 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const { 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return waiting_for_response_; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const { 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const base::string16& WebContentsImpl::GetLoadStateHost() const { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_host_; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const { 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_size_; 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_position_; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::set<GURL> WebContentsImpl::GetSitesInTab() const { 8567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::set<GURL> sites; 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.ForEach(base::Bind(&CollectSites, 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(GetBrowserContext()), 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(&sites))); 8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return sites; 8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const { 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return encoding_; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const { 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return displayed_insecure_content_; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::IncrementCapturerCount(const gfx::Size& capture_size) { 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!is_being_destroyed_); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++capturer_count_; 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: This provides a hint to upstream code to size the views optimally 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for quality (e.g., to avoid scaling). 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!capture_size.IsEmpty() && preferred_size_for_capture_.IsEmpty()) { 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_size_for_capture_ = capture_size; 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(preferred_size_); 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DecrementCapturerCount() { 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --capturer_count_; 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_LE(0, capturer_count_); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_being_destroyed_) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (capturer_count_ == 0) { 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size old_size = preferred_size_for_capture_; 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) preferred_size_for_capture_ = gfx::Size(); 8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(old_size); 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsHidden()) { 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Executing delayed WasHidden()."; 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WasHidden(); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint WebContentsImpl::GetCapturerCount() const { 907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return capturer_count_; 908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const { 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED || 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == crashed_status_) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ = status; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_ = error_code; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const { 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crashed_status_; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_being_destroyed_; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged(unsigned changed_flags) { 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->NavigationStateChanged(this, changed_flags); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastActiveTime() const { 9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return last_active_time_; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.SetActive(true); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* rwhv = 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) { 94868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) rwhv->Show(); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->SetActive(true); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) last_active_time_ = base::TimeTicks::Now(); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resize rect might have changed while this was inactive -- send the new 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one to make sure it's up to date. 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->ResizeRectChanged(GetRootWindowResizerRect()); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown()); 9654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = true; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() { 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there are entities capturing screenshots or video (e.g., mirroring), 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // don't activate the "disable rendering" optimization. 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capturer_count_ == 0) { 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |GetRenderViewHost()| can be NULL if the user middle clicks a link to 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // open a tab in the background, then closes the tab before selecting it. 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is because closing the tab calls WebContentsImpl::Destroy(), which 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removes the |GetRenderViewHost()|; then when we actually destroy the 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window, OnWindowPosChanged() notices and calls WasHidden() (which 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls us). 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* rwhv = 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 98268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) rwhv->Hide(); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasHidden()); 9864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = false; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() { 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Should we fire even for interstitial pages? 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WillNotifyDisconnection() && 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !ShowingInterstitialPage() && 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !static_cast<RenderViewHostImpl*>( 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost())->SuddenTerminationAllowed(); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() { 999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->Stop(); 10003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped()); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() { 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use our current SiteInstance since the cloned entry will use it anyway. 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We pass our own opener so that the cloned page can access it if it was 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before. 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams create_params(GetBrowserContext(), GetSiteInstance()); 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.initial_size = view_->GetContainerSize(); 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* tc = CreateWithOpener(create_params, opener_); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tc->GetController().CopyStateFrom(controller_); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCloneToNewWebContents(this, tc)); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tc; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type, 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != pending_widget_views_.end(); ++i) { 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host->GetView() == i->second) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(i); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebContents* WebContentsImpl::GetWebContents() { 10381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return this; 10391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 10401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::Init(const WebContents::CreateParams& params) { 1042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is set before initializing the render manager since 1043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // RenderFrameHostManager::Init calls back into us via its delegate to ask if 1044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it should be hidden. 10458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) should_normally_be_visible_ = !params.initially_hidden; 10468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->Init( 1048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.browser_context, params.site_instance, params.routing_id, 1049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.main_frame_routing_id); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_.reset(GetContentClient()->browser()-> 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OverrideCreateWebContentsView(this, &render_view_host_delegate_view_)); 1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(render_view_host_delegate_view_); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate = 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetContentClient()->browser()->GetWebContentsViewDelegate(this); 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_guest_) { 10607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<WebContentsViewPort> platform_view(CreateWebContentsView( 10617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch this, delegate, &render_view_host_delegate_view_)); 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsViewGuest* rv = new WebContentsViewGuest( 10647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch this, browser_plugin_guest_.get(), platform_view.Pass(), 10657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_host_delegate_view_); 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_host_delegate_view_ = rv; 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(rv); 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Regular WebContentsView. 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(CreateWebContentsView( 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(render_view_host_delegate_view_); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(view_.get()); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size initial_size = params.initial_size; 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateView(initial_size, params.context); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for whether our opener gets destroyed. 108190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (opener_) 108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(opener_); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllBrowserContextsAndSources()); 10877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_bridge_dispatcher_host_manager_.reset( 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new JavaBridgeDispatcherHostManager(this)); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_chooser_.reset(new DateTimeChooserAndroid()); 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { 109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(web_contents); 109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the opener if it has been closed. 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents == opener_) { 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_ = NULL; 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear a pending contents that has been closed before being shown. 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (PendingContents::iterator iter = pending_contents_.begin(); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != pending_contents_.end(); 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second != web_contents) 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_contents_.erase(iter); 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) { 111590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!ContainsKey(destruction_observers_, web_contents)) { 111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_[web_contents] = 111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new DestructionObserver(this, web_contents); 111890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 111990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 112090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) { 112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObservers::iterator iter = 112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.find(web_contents); 112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (iter != destruction_observers_.end()) { 112590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete destruction_observers_[web_contents]; 112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.erase(iter); 112790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 112890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() { 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ActivateContents(this); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() { 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DeactivateContents(this); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() { 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostCapture(); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted( 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host) { 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_being_destroyed_) { 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |created_widgets_| might have been destroyed. 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<RenderWidgetHostImpl*>::iterator iter = 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.find(render_widget_host); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != created_widgets_.end()) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.erase(iter); 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host && 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) { 1167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate_ && delegate_->EmbedsFullscreenWidget()) 1168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, false); 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDestroyFullscreenWidget( 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_)); 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_ = MSG_ROUTING_NONE; 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent( 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ && 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 11857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (browser_plugin_embedder_ && 11867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_plugin_embedder_->HandleKeyboardEvent(event)) { 11877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 11887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 11897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleKeyboardEvent(this, event); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool WebContentsImpl::HandleWheelEvent( 1195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseWheelEvent& event) { 1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_MACOSX) 1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On platforms other than Mac, control+mousewheel changes zoom. On Mac, this 1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // isn't done for two reasons: 1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -the OS already has a gesture to do this through pinch-zoom 1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -if a user starts an inertial scroll, let's go, and presses control 1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (i.e. control+tab) then the OS's buffered scroll events will come in 1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with control key set which isn't what the user wants 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_ && 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.wheelTicksY && 1205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (event.modifiers & blink::WebInputEvent::ControlKey)) { 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->ContentsZoomChange(event.wheelTicksY > 0); 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::PreHandleGestureEvent( 12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebGestureEvent& event) { 12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return delegate_ && delegate_->PreHandleGestureEvent(this, event); 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { 1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return accessible_parent_; 1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() { 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseDown(); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() { 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseUp(); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() { 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandlePointerActivate(); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureBegin(); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() { 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureEnd(); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) { 1250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This method is being called to enter or leave renderer-initiated fullscreen 1251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // mode. Either way, make sure any existing fullscreen widget is shut down 1252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // first. 1253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostView* const widget_view = GetFullscreenRenderWidgetHostView(); 1254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (widget_view) 1255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RenderWidgetHostImpl::From(widget_view->GetRenderWidgetHost())->Shutdown(); 1256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const { 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture, 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(false); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() { 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostMouseLock(); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow( 1280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int render_process_id, 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int main_frame_route_id, 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_CreateWindow_Params& params, 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespace* session_storage_namespace) { 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We usually create the new window in the same BrowsingInstance (group of 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script-related windows), by passing in the current SiteInstance. However, 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the opener is being suppressed (in a non-guest), we create a new 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SiteInstance in its own BrowsingInstance. 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_guest = GetRenderProcessHost()->IsGuest(); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the opener is to be suppressed, the new window can be in any process. 1292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Since routing ids are process specific, we must not have one passed in 1293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // as argument here. 1294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!params.opener_suppressed || route_id == MSG_ROUTING_NONE); 1295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SiteInstance> site_instance = 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.opener_suppressed && !is_guest ? 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) : 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSiteInstance(); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A message to create a new window can only come from the active process for 1302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this WebContentsImpl instance. If any other process sends the request, 1303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // it is invalid and the process must be terminated. 1304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (GetRenderProcessHost()->GetID() != render_process_id) { 1305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessHandle process_handle = 1306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost::FromID(render_process_id)->GetHandle(); 1307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process_handle != base::kNullProcessHandle) { 1308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RecordAction( 13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWindow")); 1310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::KillProcess(process_handle, content::RESULT_CODE_KILLED, false); 1311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must assign the SessionStorageNamespace before calling Init(). 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/142685 1318ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& partition_id = 1319ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetContentClient()->browser()-> 1320ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetStoragePartitionIdForSite(GetBrowserContext(), 1321ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch site_instance->GetSiteURL()); 1322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StoragePartition* partition = BrowserContext::GetStoragePartition( 1323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetBrowserContext(), site_instance.get()); 1324bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DOMStorageContextWrapper* dom_storage_context = 1325bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext()); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespaceImpl* session_storage_namespace_impl = 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); 13293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 13303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (delegate_ && 13313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !delegate_->ShouldCreateWebContents(this, 13323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) route_id, 13333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.window_container_type, 13343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.frame_name, 13353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.target_url, 13363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) partition_id, 13373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) session_storage_namespace)) { 13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (route_id != MSG_ROUTING_NONE && 13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !RenderViewHost::FromID(render_process_id, route_id)) { 13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the embedder didn't create a WebContents for this route, we need to 13415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // delete the RenderView that had already been created. 13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_Close(route_id)); 13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id); 13453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView( 13463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) main_frame_route_id); 13473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 13483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 13493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 13503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Create the new web contents. This will automatically create the new 13513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // WebContentsView. In the future, we may want to create the view separately. 13523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebContentsImpl* new_contents = 13533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new WebContentsImpl(GetBrowserContext(), 13543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.opener_suppressed ? NULL : this); 13553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->GetController().SetSessionStorageNamespace( 1357ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch partition_id, 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace); 1359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateParams create_params(GetBrowserContext(), site_instance.get()); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = route_id; 1361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) create_params.main_frame_routing_id = main_frame_route_id; 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_guest) { 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.context = view_->GetNativeView(); 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.initial_size = view_->GetContainerSize(); 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This makes |new_contents| act as a guest. 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int instance_id = GetBrowserPluginGuestManager()->get_next_instance_id(); 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents_impl = 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<WebContentsImpl*>(new_contents); 1371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserPluginGuest::CreateWithOpener(instance_id, 1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new_contents_impl->opener() != NULL, 1373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new_contents_impl, 1374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetBrowserPluginGuest()); 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (params.disposition == NEW_BACKGROUND_TAB) 13773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) create_params.initially_hidden = true; 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(create_params); 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Save the window for later if we're not suppressing the opener (since it 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will be shown immediately). 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.opener_suppressed) { 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_guest) { 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsViewPort* new_view = new_contents->view_.get(); 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(brettw): It seems bogus that we have to call this function on the 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // newly created object and give it one of its own member variables. 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created window associated with the route so we can show it 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(MSG_ROUTING_NONE, route_id); 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_[route_id] = new_contents; 139490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(new_contents); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebContentsCreated( 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, params.opener_frame_id, params.frame_name, 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.target_url, new_contents); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.opener_suppressed) { 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the opener is suppressed, the original renderer cannot access the 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window. As a result, we need to show and navigate the window here. 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_blocked = false; 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect initial_pos; 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->AddNewContents( 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new_contents, params.disposition, initial_pos, 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.user_gesture, &was_blocked); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_blocked) { 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams open_params(params.target_url, 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(), 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* is_renderer_initiated */); 14197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch open_params.user_gesture = params.user_gesture; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->OpenURL(open_params); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id, 1426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id, 1427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type) { 1428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateNewWidget(render_process_id, route_id, false, popup_type); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int render_process_id, 1432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id) { 1433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CreateNewWidget(render_process_id, route_id, true, blink::WebPopupTypeNone); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int render_process_id, 1437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int route_id, 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 1439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type) { 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* process = GetRenderProcessHost(); 1441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // A message to create a new widget can only come from the active process for 1442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this WebContentsImpl instance. If any other process sends the request, 1443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // it is invalid and the process must be terminated. 1444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process->GetID() != render_process_id) { 1445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessHandle process_handle = 1446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost::FromID(render_process_id)->GetHandle(); 1447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (process_handle != base::kNullProcessHandle) { 1448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RecordAction( 14495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("Terminate_ProcessMismatch_CreateNewWidget")); 1450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::KillProcess(process_handle, content::RESULT_CODE_KILLED, false); 1451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* widget_host = 14563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new RenderWidgetHostImpl(this, process, route_id, IsHidden()); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.insert(widget_host); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostViewPort* widget_view = RenderWidgetHostViewPort::FromRWHV( 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateViewForPopupWidget(widget_host)); 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!widget_view) 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_fullscreen) { 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Popups should not get activated. 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_view->SetPopupType(popup_type); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created widget associated with the route so we can show it later. 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_[route_id] = widget_view; 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allow it to survive the trip without being hosted. 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(widget_view->GetNativeView()); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id, 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents = GetCreatedWindow(route_id); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate = GetDelegate(); 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) { 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNewContents( 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, contents, disposition, initial_pos, user_gesture, NULL); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, false, initial_pos); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) { 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, true, gfx::Rect()); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* widget_host_view = 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetCreatedWidget(route_id)); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host_view) 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1507d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (is_fullscreen) { 15084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); 15094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fullscreen_widget_routing_id_ = route_id; 1510d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate_ && delegate_->EmbedsFullscreenWidget()) { 1511d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView()); 1512d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, true); 1513d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 1514d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->InitAsFullscreen(GetRenderWidgetHostViewPort()); 1515d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1516d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 1517d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) observers_, 1518d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DidShowFullscreenWidget(route_id)); 1519d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!widget_host_view->HasFocus()) 1520d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) widget_host_view->Focus(); 1521d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_host_view->InitAsPopup(GetRenderWidgetHostViewPort(), initial_pos); 1523d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host_impl = 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost()); 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->Init(); 15284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Only allow privileged mouse lock for fullscreen render widget, which is 15294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // used to implement Pepper Flash fullscreen. 15304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly embedded (or purposefully ignored) we can release the retain we 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // took in CreateNewWidget(). 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRelease(widget_host_view->GetNativeView()); 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingContents::iterator iter = pending_contents_.find(route_id); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certain systems can block the creation of new windows. If we didn't succeed 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in creating one, just return NULL. 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_contents_.end()) { 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = iter->second; 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_.erase(route_id); 155190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(new_contents); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't initialize the guest WebContents immediately. 1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (new_contents->GetRenderProcessHost()->IsGuest()) 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new_contents; 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_contents->GetRenderProcessHost()->HasConnection() || 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !new_contents->GetRenderViewHost()->GetView()) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): It seems bogus to reach into here and initialize the host. 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_widget_views_.end()) { 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* widget_host_view = iter->second; 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(route_id); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost(); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host->GetProcess()->HasConnection()) { 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view has gone away or the renderer crashed. Nothing to do. 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_host_view; 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission( 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaStreamRequest& request, 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MediaResponseCallback& callback) { 1588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (delegate_) { 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestMediaAccessPermission(this, request, callback); 1590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 1591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback.Run(MediaStreamDevices(), 1592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MEDIA_DEVICE_INVALID_STATE, 1593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MediaStreamUI>()); 1594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1597a3f7b4e666c476898878fa745f637129375cd889Ben MurdochSessionStorageNamespace* WebContentsImpl::GetSessionStorageNamespace( 1598a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SiteInstance* instance) { 1599a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return controller_.GetSessionStorageNamespace(instance); 1600a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 1601a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 16024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FrameTree* WebContentsImpl::GetFrameTree() { 16034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return &frame_tree_; 16044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 16054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::AccessibilityEventReceived( 1607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<AXEventNotificationDetails>& details) { 1608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER( 1609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebContentsObserver, observers_, AccessibilityEventReceived(details)); 1610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 16125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnShowValidationMessage( 16135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view, 16145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& main_text, 16155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sub_text) { 16165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 16175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->ShowValidationMessage( 16185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, anchor_in_root_view, main_text, sub_text); 16195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnHideValidationMessage() { 16225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 16235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->HideValidationMessage(this); 16245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMoveValidationMessage( 16275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view) { 16285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 16295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->MoveValidationMessage(this, anchor_in_root_view); 16305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 163290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) { 163390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (browser_plugin_embedder_) 16347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_plugin_embedder_->DidSendScreenRects(); 163590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 163690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { 16385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size old_size = GetPreferredSize(); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_ = pref_size; 16405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnPreferredSizeChanged(old_size); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) { 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ResizeDueToAutoResize(this, new_size); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::OpenURL(const OpenURLParams& params) { 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = delegate_->OpenURLFromTab(this, params); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::Send(IPC::Message* message) { 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) { 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->Send(message); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToPendingEntry( 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame_tree_.root()->navigator()->NavigateToPendingEntry( 16685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_.GetMainFrame(), reload_type); 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::RenderFrameForInterstitialPageCreated( 16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHost* render_frame_host) { 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameForInterstitialPageCreated(render_frame_host)); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::AttachInterstitialPage( 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterstitialPageImpl* interstitial_page) { 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(interstitial_page); 1680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->set_interstitial_page(interstitial_page); 168168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 168268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Cancel any visible dialogs so that they don't interfere with the 168368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // interstitial. 168468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (dialog_manager_) 168568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 168668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidAttachInterstitialPage()); 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DetachInterstitialPage() { 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetInterstitialPage()) 1693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->remove_interstitial_page(); 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDetachInterstitialPage()); 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetHistoryLengthAndPrune( 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SiteInstance* site_instance, 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int history_length, 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 minimum_page_id) { 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetHistoryLengthAndPrune doesn't work when there are pending cross-site 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigations. Callers should ensure that this is the case. 1704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_render_view_host()) { 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = GetRenderViewHostImpl(); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_instance && rvh->GetSiteInstance() != site_instance) { 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetHistoryLengthAndPrune(GetRoutingID(), 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_length, 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_page_id)); 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::FocusThroughTabTraversal(bool reverse) { 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 1724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->interstitial_page()->FocusThroughTabTraversal(reverse); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->SetInitialFocus(reverse); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShowingInterstitialPage() const { 1731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->interstitial_page() != NULL; 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPage* WebContentsImpl::GetInterstitialPage() const { 1735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->interstitial_page(); 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsSavable() { 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit creates Document object when MIME type is application/xhtml+xml, 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we also support this MIME type. 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_ == "text/html" || 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/xml" || 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "application/xhtml+xml" || 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/plain" || 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/css" || 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IsSupportedJavascriptMimeType(contents_mime_type_.c_str()); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSavePage() { 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we can not save the page, try to download it. 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsSavable()) { 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordDownloadSource(INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML); 1753ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SaveFrame(GetURL(), Referrer()); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the save package and possibly prompt the user for the name to save 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page as. The user prompt is an asynchronous operation that runs on 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another thread. 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_->GetSaveInfo(); 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in automated testing to bypass prompting the user for file names. 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, the names and paths are hard coded rather than running them through 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file name sanitation and extension / mime checking. 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::SavePage(const base::FilePath& main_file, 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& dir_path, 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePageType save_type) { 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the page from navigating. 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this, save_type, main_file, dir_path); 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return save_package_->Init(SavePackageDownloadCreatedCallback()); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1779ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::SaveFrame(const GURL& url, 1780ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Referrer& referrer) { 1781ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!GetURL().is_valid()) 1782ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 1783ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_main_frame = (url == GetURL()); 1784ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1785ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadManager* dlm = 1786ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BrowserContext::GetDownloadManager(GetBrowserContext()); 1787ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!dlm) 1788ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 1789ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int64 post_id = -1; 1790ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (is_main_frame) { 17914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const NavigationEntry* entry = controller_.GetLastCommittedEntry(); 1792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (entry) 1793ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch post_id = entry->GetPostID(); 1794ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1795ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<DownloadUrlParameters> params( 1796ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadUrlParameters::FromWebContents(this, url)); 1797ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_referrer(referrer); 1798ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_post_id(post_id); 1799ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prefer_cache(true); 1800ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (post_id >= 0) 1801ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_method("POST"); 1802ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prompt(true); 1803ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch dlm->DownloadUrl(params.Pass()); 1804ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1805ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML( 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file, 1808424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::Callback<void(int64)>& callback) { 1809424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MHTMLGenerationManager::GetInstance()->SaveMHTML(this, file, callback); 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(nasko): Rename this method to IsVisibleEntry. 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsActiveEntry(int32 page_id) { 18144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntryImpl* visible_entry = 18154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntryImpl::FromNavigationEntry(controller_.GetVisibleEntry()); 18164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return (visible_entry != NULL && 18174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) visible_entry->site_instance() == GetSiteInstance() && 18184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) visible_entry->GetPageID() == page_id); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const { 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_; 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const { 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_disconnection_; 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() { 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_.clear(); 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &renderer_preferences_; 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() { 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(GetRenderViewHost()); 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceEndedAt(int client_x, int client_y, 1848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int screen_x, int screen_y, blink::WebDragOperation operation) { 1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceEndedAt(client_x, client_y, 1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 1853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceEndedAt(client_x, client_y, 1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceMovedTo(int client_x, int client_y, 1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int screen_x, int screen_y) { 1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceMovedTo(client_x, client_y, 1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y); 1862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceMovedTo(client_x, client_y, 1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y); 1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetResourceResponseStart( 18685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceRequestDetails& details) { 18695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_.ssl_manager()->DidStartResourceResponse(details); 18705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 18725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetResourceResponseStart(details)); 18735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 18755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotificationService::current()->Notify( 18765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTIFICATION_RESOURCE_RESPONSE_STARTED, 18775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Source<WebContents>(this), 18785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Details<const ResourceRequestDetails>(&details)); 18795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 18805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidGetRedirectForResourceRequest( 18825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host, 18835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceRedirectDetails& details) { 18845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller_.ssl_manager()->DidReceiveResourceRedirect(details); 18855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 18875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 18885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 18895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetRedirectForResourceRequest(render_view_host, details)); 18905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 18925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NotificationService::current()->Notify( 18935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, 18945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Source<WebContents>(this), 18955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Details<const ResourceRedirectDetails>(&details)); 18965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 18975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() { 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetRenderViewHost()) 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->DragSourceSystemDragEnded(); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DragEnded(); 1903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 1904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->SystemDragEnded(); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() { 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) { 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_ = value; 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const { 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closed_by_user_gesture_; 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double WebContentsImpl::GetZoomLevel() const { 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMapImpl* zoom_map = static_cast<HostZoomMapImpl*>( 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMap::GetForBrowserContext(GetBrowserContext())); 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!zoom_map) 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double zoom_level; 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (temporary_zoom_settings_) { 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = zoom_map->GetTemporaryZoomLevel( 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderProcessHost()->GetID(), GetRenderViewHost()->GetRoutingID()); 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 19314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = GetController().GetLastCommittedEntry(); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since zoom map is updated using rewritten URL, use rewritten URL 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to get the zoom level. 19344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) url = entry ? entry->GetURL() : GURL::EmptyGURL(); 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom_level = zoom_map->GetZoomLevelForHostAndScheme(url.scheme(), 19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::GetHostOrSpecFromURL(url)); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zoom_level; 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetZoomPercent(bool* enable_increment, 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* enable_decrement) const { 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = *enable_increment = false; 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the zoom percent from the factor. Round up to the nearest whole 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number. 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int percent = static_cast<int>( 194758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ZoomLevelToZoomFactor(GetZoomLevel()) * 100 + 0.5); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = percent > minimum_zoom_percent_; 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_increment = percent < maximum_zoom_percent_; 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return percent; 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() { 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = GetController().GetLastCommittedEntry(); 19584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!entry) 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate_->ViewSourceForTab(this, entry->GetURL()); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url, 196590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 196990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->ViewSourceForFrame(this, url, page_state); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const { 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return minimum_zoom_percent_; 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const { 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return maximum_zoom_percent_; 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const { 19815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return capturer_count_ == 0 ? preferred_size_ : preferred_size_for_capture_; 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost() ? 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false; 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const { 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_ != NULL; 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 199390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) { 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_DidChooseColorResponse( 199590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetRoutingID(), color_chooser_identifier_, color)); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 199890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidEndColorChooser() { 199990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Send(new ViewMsg_DidEndColorChooser(GetRoutingID(), 200090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_)); 200190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_.reset(); 200290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_ = 0; 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int WebContentsImpl::DownloadImage(const GURL& url, 2006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_favicon, 2007d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uint32_t max_bitmap_size, 2008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ImageDownloadCallback& callback) { 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 2010d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int id = StartDownload(host, url, is_favicon, max_bitmap_size); 2011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_[id] = callback; 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id; 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::IsSubframe() const { 20165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return is_subframe_; 20175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 20185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SetZoomLevel(double level) { 20205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_SetZoomLevel(GetRoutingID(), level)); 20215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserPluginEmbedder* embedder = GetBrowserPluginEmbedder(); 20225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (embedder) 20235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) embedder->SetZoomLevel(level); 20245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 20255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::Find(int request_id, 20275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& search_text, 20285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebFindOptions& options) { 20295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_Find(GetRoutingID(), request_id, search_text, options)); 20305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 20315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::StopFinding(StopFindAction action) { 20335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new ViewMsg_StopFinding(GetRoutingID(), action)); 20345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 20355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() { 20374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 203890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (entry && entry->GetURL() == GURL(kAboutBlankURL)) 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) { 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SetFocusToLocationBar(select_all); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoad( 2049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 2050a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int parent_routing_id, 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 2052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& validated_url, 2053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_error_page, 2054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_iframe_srcdoc) { 2055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_main_frame) 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidChangeLoadProgress(0); 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2058a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // --site-per-process mode has a short-term hack allowing cross-process 2059a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // subframe pages to commit thinking they are top-level. Correct it here to 2060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // avoid confusing the observers. 2061a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) && 2062a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host != GetMainFrame()) { 2063a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_main_frame = false; 2064a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2065a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the start of the provisional load. 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidStartProvisionalLoadForFrame( 2069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->GetRoutingID(), parent_routing_id, 2070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_main_frame, validated_url, is_error_page, 2071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_iframe_srcdoc, 2072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->render_view_host())); 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_main_frame) { 2075a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER( 2076a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsObserver, 2077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 2078a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_url, 20795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host)); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError( 20845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 20855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) { 20865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL validated_url(params.url); 20875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 20885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 20895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 2090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidFailProvisionalLoad(render_frame_host->GetRoutingID(), 20915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.frame_unique_name, 20925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.is_main_frame, 20935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validated_url, 20945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.error_code, 20955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.error_description, 20965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host->render_view_host())); 20975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 20985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidFailLoadWithError( 21005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 21015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 21025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_main_frame, 21035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int error_code, 21045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& error_description) { 21055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidFailLoad(render_frame_host->GetRoutingID(), 2107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, is_main_frame, 21085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error_code, error_description, 21095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host->render_view_host())); 21105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::NotifyChangedNavigationState( 2113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InvalidateTypes changed_flags) { 2114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NotifyNavigationStateChanged(changed_flags); 2115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 21175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::AboutToNavigateRenderFrame( 21185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host) { 21195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers that we will navigate in this RenderView. 21205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 21215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 21225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 21235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AboutToNavigateRenderView(render_frame_host->render_view_host())); 21245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStartNavigationToPendingEntry( 21275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 21285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 21295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationController::ReloadType reload_type) { 21305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 21315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 21325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 21335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 21345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidStartNavigationToPendingEntry(url, reload_type)); 21355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderFrameHostImpl* render_frame_host, 2138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OpenURLParams& params) { 2139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int source_render_frame_id = render_frame_host->GetRoutingID(); 2140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebContents* new_contents = OpenURL(params); 2141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (new_contents) { 2143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Notify observers. 2144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidOpenRequestedURL(new_contents, 2146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url, 2147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.referrer, 2148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.disposition, 2149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.transition, 2150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) source_render_frame_id)); 2151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidRedirectProvisionalLoad( 21555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 21565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& validated_target_url) { 21575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 21585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 21595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 21605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 21615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_target_url, 21625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_frame_host)); 21635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidCommitProvisionalLoad( 2166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 21675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& frame_unique_name, 21685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_main_frame, 21695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 2170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PageTransition transition_type) { 21715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host = render_frame_host->render_view_host(); 2172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int render_frame_id = render_frame_host->GetRoutingID(); 21735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about the commit of the provisional load. 21745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER( 21755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsObserver, 21765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 2177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidCommitProvisionalLoadForFrame(render_frame_id, 21785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_unique_name, 21795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_main_frame, 21805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, 21815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) transition_type, 21825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host)); 21835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit( 21865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const LoadCommittedDetails& details, 21875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 21885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.is_navigation_to_different_page()) { 21895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clear the status bubble. This is a workaround for a bug where WebKit 21905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // doesn't let us know that the cursor left an element during a 21915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // transition (this is also why the mouse cursor remains as a hand after 21925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clicking on a link); see bugs 1184641 and 980803. We don't want to 21935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // clear the bubble when a user navigates to a named anchor in the same 21945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page. 21955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateTargetURL(details.entry->GetPageID(), GURL()); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!details.is_in_page) { 21995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Once the main frame is navigated, we're no longer considered to have 22005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // displayed insecure content. 22015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) displayed_insecure_content_ = false; 22025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 22035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetController().GetBrowserContext()); 22045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 22055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidNavigateMainFrame(details, params)); 22095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) { 22115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->DidNavigateMainFramePostCommit(this); 22125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 22135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit( 22175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* render_frame_host, 22185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const LoadCommittedDetails& details, 22195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 22205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we navigate off the page, close all JavaScript dialogs. 22215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (dialog_manager_ && !details.is_in_page) 22225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify observers about navigation. 22255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidNavigateAnyFrame(details, params)); 22275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::SetMainFrameMimeType(const std::string& mime_type) { 22305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_mime_type_ = mime_type; 22315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 223258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebContentsImpl::CanOverscrollContent() { 22345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 22355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return delegate_->CanOverscrollContent(); 22365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache( 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& http_method, 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type) { 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatsCounter cache("WebKit.CacheHit"); 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Increment(); 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out a notification that we loaded a resource from our memory cache. 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_id = 0; 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CertStatus cert_status = 0; 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int security_bits = -1; 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_status = 0; 2254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SignedCertificateTimestampIDStatusList signed_certificate_timestamp_ids; 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeserializeSecurityInfo(security_info, &cert_id, &cert_status, 2256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &security_bits, &connection_status, 2257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &signed_certificate_timestamp_ids); 2258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(alcutter,eranm): Pass signed_certificate_timestamp_ids into details 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadFromMemoryCacheDetails details( 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method, 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type, resource_type); 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 226358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) controller_.ssl_manager()->DidLoadFromMemoryCache(details); 226458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 226558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 226658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DidLoadResourceFromMemoryCache(details)); 226758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 226858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) { 226958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context( 227058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) resource_type == ResourceType::MEDIA ? 227158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetBrowserContext()->GetMediaRequestContextForRenderProcess( 227258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetRenderProcessHost()->GetID()) : 227358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetBrowserContext()->GetRequestContextForRenderProcess( 227458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetRenderProcessHost()->GetID())); 227558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::PostTask( 227658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::IO, 227758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 227858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&NotifyCacheOnIO, request_context, url, http_method)); 227958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() { 22835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.DisplayedInsecureContent")); 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent( 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_origin, const GURL& target_url) { 2291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << security_origin << " ran insecure content from " 2292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << target_url.possibly_invalid_spec(); 22935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.RanInsecureContent")); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EndsWith(security_origin, kDotGoogleDotCom, false)) 22955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("SSL.RanInsecureContentGoogle")); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ssl_manager()->DidRunInsecureContent(security_origin); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame() { 23035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(render_frame_message_source_); 23045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!render_view_message_source_); 23055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* rfh = 23065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 23075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 23095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observers_, 2310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DocumentLoadedInFrame(rfh->GetRoutingID(), 2311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rfh->render_view_host())); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad( 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame) { 2317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!render_frame_message_source_) { 23185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("BadMessageTerminate_RVD2")); 23195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRenderProcessHost()->ReceivedBadMessage(); 23205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 23215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 23225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHostImpl* rfh = 2324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<RenderFrameHostImpl*>(render_frame_message_source_); 2325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // --site-per-process mode has a short-term hack allowing cross-process 23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // subframe pages to commit thinking they are top-level. Correct it here to 23285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // avoid confusing the observers. 23295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) && 2330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rfh != GetMainFrame()) { 23315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_main_frame = false; 2332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 23335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL validated_url(url); 2335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderProcessHost* render_process_host = 2336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_message_source_->GetProcess(); 23375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_process_host->FilterURL(false, &validated_url); 2338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DidFinishLoad(rfh->GetRoutingID(), validated_url, 2341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_main_frame, rfh->render_view_host())); 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) { 2345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!delegate_ || delegate_->OnGoToEntryOffset(offset)) 2346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controller_.GoToOffset(offset); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent, 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maximum_percent, 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remember) { 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_ = minimum_percent; 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_ = maximum_percent; 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temporary_zoom_settings_ = !remember; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id, 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 23644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (policy->CanReadFile(GetRenderProcessHost()->GetID(), path)) 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->EnumerateDirectory(this, request_id, path); 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol, 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 2377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (policy->IsPseudoScheme(protocol)) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RegisterProtocolHandler(this, protocol, url, title, user_gesture); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id, 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindReply(this, request_id, number_of_matches, selection_rect, 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, final_update); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply( 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version, 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::RectF>& rects, 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::RectF& active_rect) { 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindMatchRectsReply(this, version, rects, active_rect); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnOpenDateTimeDialog( 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ViewHostMsg_DateTimeDialogValue_Params& value) { 24053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) date_time_chooser_->ShowDialog(ContentViewCore::FromWebContents(this), 24063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetRenderViewHost(), 24073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.dialog_type, 2408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.dialog_value, 24093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.minimum, 24103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value.maximum, 2411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.step, 2412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value.suggestions); 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::OnJavaBridgeGetChannelHandle(IPC::Message* reply_msg) { 24161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) java_bridge_dispatcher_host_manager_->OnGetChannelHandle( 2417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_message_source_, reply_msg); 24181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 24191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id, 2423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::FilePath& path, 2424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_hung) { 2425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1); 2426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PluginHungStatusChanged(plugin_child_id, path, is_hung)); 2429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnPluginCrashed(const base::FilePath& plugin_path, 24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId plugin_pid) { 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginCrashed(plugin_path, plugin_pid)); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsImpl::OnDomOperationResponse(const std::string& json_string, 2438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int automation_id) { 2439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DomOperationNotificationDetails details(json_string, automation_id); 2440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NotificationService::current()->Notify( 2441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTIFICATION_DOM_OPERATION_RESPONSE, 2442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Source<WebContents>(this), 2443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Details<DomOperationNotificationDetails>(&details)); 2444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url, 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheAccessed(manifest_url, blocked_by_policy)); 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser( 2454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int color_chooser_id, 2455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkColor color, 2456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<ColorSuggestion>& suggestions) { 2457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ColorChooser* new_color_chooser = 2458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate_->OpenColorChooser(this, color, suggestions); 24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!new_color_chooser) 246090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 24615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (color_chooser_) 24625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) color_chooser_->End(); 246390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_.reset(new_color_chooser); 246490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_ = color_chooser_id; 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) { 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_ && 246990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_id == color_chooser_identifier_) 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->End(); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id, 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_ && 247690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_id == color_chooser_identifier_) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->SetSelectedColor(color); 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled. 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url, 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& args) { 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebUISend(this, source_url, name, args); 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission( 24903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int routing_id, 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 24922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path) { 24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_) { 24943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 24952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_->RequestPpapiBrokerPermission( 24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, url, plugin_path, 25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult, 25013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch base::Unretained(this), routing_id))) { 25022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 25033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 25042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WebContentsImpl::OnPpapiBrokerPermissionResult(int routing_id, 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result) { 25093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch Send(new ViewMsg_PpapiBrokerPermissionResult(routing_id, result)); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnBrowserPluginMessage(const IPC::Message& message) { 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // specific messages for this WebContents. This means that any message from 25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a BrowserPlugin prior to this will be ignored. 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above classes BrowserPluginEmbedder and 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginGuest. 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!browser_plugin_embedder_.get()); 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this)); 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_->OnMessageReceived(message); 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::OnDidDownloadImage( 25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 252590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int http_status_code, 25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& image_url, 2527d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<SkBitmap>& bitmaps, 2528d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<gfx::Size>& original_bitmap_sizes) { 25295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bitmaps.size() != original_bitmap_sizes.size()) 25305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 25315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageDownloadMap::iterator iter = image_download_map_.find(id); 2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iter == image_download_map_.end()) { 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently WebContents notifies us of ANY downloads so that it is 25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // possible to get here. 25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!iter->second.is_null()) { 2539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) iter->second.Run( 2540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) id, http_status_code, image_url, bitmaps, original_bitmap_sizes); 25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_.erase(id); 25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnUpdateFaviconURL( 25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 page_id, 25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<FaviconURL>& candidates) { 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidUpdateFaviconURL(page_id, candidates)); 25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, 25535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_video, 25545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_audio) { 25555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Chrome OS does its own detection of audio and video. 2556ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_CHROMEOS) 25575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<PowerSaveBlocker> blocker; 25585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (has_video) { 25595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocker = PowerSaveBlocker::Create( 25605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing video"); 2561ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID) 25625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<PowerSaveBlockerImpl*>(blocker.get()) 25635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->InitDisplaySleepBlocker(GetView()->GetNativeView()); 2564ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 25655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (has_audio) { 25665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocker = PowerSaveBlocker::Create( 25675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing audio"); 25685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2569ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 25705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (blocker) { 25715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) power_save_blockers_[render_view_message_source_][player_cookie] = 25725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocker.release(); 2573ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 2574ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // !defined(OS_CHROMEOS) 2575ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 2576ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 25775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) { 25785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Chrome OS does its own detection of audio and video. 25795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_CHROMEOS) 25805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete power_save_blockers_[render_view_message_source_][player_cookie]; 25815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) power_save_blockers_[render_view_message_source_].erase(player_cookie); 25825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 25835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsImpl::OnFirstVisuallyNonEmptyPaint(int32 page_id) { 2586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 2587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DidFirstVisuallyNonEmptyPaint(page_id)); 2588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2589ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidChangeVisibleSSLState() { 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidChangeVisibleSSLState()); 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifyBeforeFormRepostWarningShow() { 25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeforeFormRepostWarningShow()); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 26011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WebContentsImpl::ActivateAndShowRepostFormWarningDialog() { 26021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Activate(); 26031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delegate_) 26041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate_->ShowRepostFormWarningDialog(this); 26051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 26061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is 26084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// loading, or done loading. 26094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::SetIsLoading(RenderViewHost* render_view_host, 26104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool is_loading, 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNotificationDetails* details) { 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading == is_loading_) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading) { 2616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE, 2617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_.clear(); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = 0; 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = 0; 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->SetIsLoading(is_loading); 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = is_loading; 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_ = is_loading; 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LoadingStateChanged(this); 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD); 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string url = (details ? details->url.possibly_invalid_spec() : "NULL"); 26334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (is_loading) { 2634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN1("browser", "WebContentsImpl Loading", this, 2635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "URL", url); 26364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DidStartLoading(render_view_host)); 26384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 2639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT_ASYNC_END1("browser", "WebContentsImpl Loading", this, 2640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "URL", url); 26414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DidStopLoading(render_view_host)); 26434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 26444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 26454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP; 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDetails det = NotificationService::NoDetails(); 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details) 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) det = Details<LoadNotificationDetails>(details); 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, Source<NavigationController>(&controller_), det); 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) { 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are creating a RVH for a restored controller, then we need to make 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the RenderView starts with a next_page_id_ larger than the number 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of restored entries. This must be called before the RenderView starts 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating (to avoid a race between the browser updating max_page_id and 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the renderer updating next_page_id_). Because of this, we only call this 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from CreateRenderView and allow that to notify the RenderView for us. 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_restored_page_id = controller_.GetMaxRestoredPageID(); 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_restored_page_id > 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(rvh->GetSiteInstance())) 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(), 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_restored_page_id); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry, 2669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For file URLs without a title, use the pathname instead. In the case of a 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synthesized title, we don't want the update to count toward the "one set 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per page of the title to history." 2673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 final_title; 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool explicit_set; 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry && entry->GetURL().SchemeIsFile() && title.empty()) { 26765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final_title = base::UTF8ToUTF16(entry->GetURL().ExtractFileName()); 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = false; // Don't count synthetic titles toward the set limit. 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(title, base::TRIM_ALL, &final_title); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = true; 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a page is created via window.open and never navigated, 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there will be no navigation entry. In this situation, 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| will be used for page title. 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_title == entry->GetTitle()) 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTitle(final_title); 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_title_when_no_navigation_entry_ == final_title) 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_title_when_no_navigation_entry_ = final_title; 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, set the title for the view. 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetPageTitle(final_title); 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 27024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TitleWasSet(entry, explicit_set)); 27034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 27044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<NavigationEntry*, bool> details = 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(entry, explicit_set); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<NavigationEntry*, bool> >(&details)); 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::NotifySwapped(RenderViewHost* old_host, 27164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHost* new_host) { 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After sending out a swap notification, we need to send a disconnect 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification so that clients that pick up a pointer to |this| can NULL the 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer. See Bug 1230284. 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 272158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 27224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHostChanged(old_host, new_host)); 272358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 272458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 27254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::pair<RenderViewHost*, RenderViewHost*> details = 27264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::make_pair(old_host, new_host); 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 27284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTIFICATION_RENDER_VIEW_HOST_CHANGED, 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 27304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Details<std::pair<RenderViewHost*, RenderViewHost*> >(&details)); 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that the associated embedder gets cleared after a RenderViewHost 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets swapped, so we don't reuse the same embedder next time a 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is attached to this WebContents. 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveBrowserPluginEmbedder(); 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 273858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(avi): Remove this entire function because this notification is already 273958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// covered by two observer functions. http://crbug.com/170921 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() { 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notify_disconnection_) 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = false; 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::NotifyNavigationEntryCommitted( 2752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const LoadCommittedDetails& load_details) { 2753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FOR_EACH_OBSERVER( 2754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContentsObserver, observers_, NavigationEntryCommitted(load_details)); 2755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderFrameHost* render_frame_host, 2758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const IPC::Message& message) { 2759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return OnMessageReceived(NULL, render_frame_host, message); 2760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameCreated(RenderFrameHost* render_frame_host) { 2763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Note this is only for subframes, the notification for the main frame 2764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // happens in RenderViewCreated. 2765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 2766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 2767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameCreated(render_frame_host)); 2768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) { 2771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 2772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_, 2773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameDeleted(render_frame_host)); 2774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 27765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::WorkerCrashed(RenderFrameHost* render_frame_host) { 27775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_) 27785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->WorkerCrashed(this); 27795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 27805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::ShowContextMenu(RenderFrameHost* render_frame_host, 27825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ContextMenuParams& params) { 27835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Allow WebContentsDelegates to handle the context menu operation first. 27845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegate_ && delegate_->HandleContextMenu(params)) 27855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 27865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_delegate_view_->ShowContextMenu(render_frame_host, params); 27885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 27895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() { 27915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return this; 27925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 27935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_view_host_delegate_view_; 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs( 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context) const { 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_; 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetRootWindowResizerRect(); 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() { 2810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_) 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_.reset(); 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send notifications if we are just creating a swapped-out RVH for 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the opener chain. These won't be used for view-source or WebUI, so it's 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ok to return early. 28185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(render_view_host)->IsSwappedOut()) 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<RenderViewHost>(render_view_host)); 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're creating views, we're still doing initial setup, so we always 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the pending Web UI rather than any possibly existing committed one. 2831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_web_ui()) 2832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_web_ui()->RenderViewCreated(render_view_host); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigationEntry* entry = controller_.GetPendingEntry(); 2835424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (entry && entry->IsViewSourceMode()) { 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put the renderer in view source mode. 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->Send( 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID())); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->RenderViewCreated(render_view_host); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, observers_, RenderViewCreated(render_view_host)); 2845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We tell the observers now instead of when the main RenderFrameHostImpl is 2847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // constructed because otherwise it would be too early (i.e. IPCs sent to the 2848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // frame would be dropped because it's not created yet). 2849a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* main_frame = render_view_host->GetMainFrame(); 2850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER( 2851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsObserver, observers_, RenderFrameCreated(main_frame)); 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify the world, since this came from a renderer in the 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notify_disconnection_ = true; 286258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 286358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NotificationService::current()->Notify( 286458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTIFICATION_WEB_CONTENTS_CONNECTED, 286558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Source<WebContents>(this), 286658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NotificationService::NoDetails()); 286758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_crashed = IsCrashed(); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0); 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the focus to the tab (otherwise the focus will be on the top 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window). 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_crashed && !FocusLocationBarByDefault() && 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) { 28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Focus(); 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady()); 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, 2882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TerminationStatus status, 2883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int error_code) { 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pending page's RenderViewHost is gone. 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure fullscreen mode is exited in the |delegate_| since a crashed 2890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // renderer may not have made a clean exit. 2891a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsFullscreenForCurrentTab()) 2892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ToggleFullscreenMode(false); 2893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2894a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cancel any visible dialogs so they are not left dangling over the sad tab. 2895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (dialog_manager_) 2896a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 2897a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2898ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearPowerSaveBlockers(rvh); 28994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetIsLoading(rvh, false, NULL); 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(status, error_code); 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetView()->OnTabCrashed(GetCrashedStatus(), crashed_error_code_); 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 29067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RenderProcessGone(GetCrashedStatus())); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { 2910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearPowerSaveBlockers(rvh); 2911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->RenderViewDeleted(rvh); 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh, 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 291790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that this state update comes from either the active RVH or one of 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the swapped out RVHs. We don't expect to hear from any other RVHs. 29205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(nasko): This should go through RenderFrameHost. 29215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(creis): We can't update state for cross-process subframes until we 29225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have FrameNavigationEntries. Once we do, this should be a DCHECK. 29235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rvh != GetRenderViewHost() && 29245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetRenderManager()->IsRVHOnSwappedOutList( 29255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderViewHostImpl*>(rvh))) 29265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must be prepared to handle state updates for any page, these occur 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the user is scrolling and entering form data, as well as when we're 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leaving a page, in which case our state may have already been moved to 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the next page. The navigation controller will look up the appropriate 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationEntry and update it when it is notified via the delegate. 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entry_index = controller_.GetEntryIndexWithPageID( 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_index < 0) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 294090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (page_state == entry->GetPageState()) 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 294290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) entry->SetPageState(page_state); 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.NotifyEntryChanged(entry, entry_index); 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderViewHost* rvh, 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 2948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::TextDirection title_direction) { 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a title, that's a pretty good indication that we've started 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getting useful data. 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to find the navigation entry, which might not be the current one. 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For example, it might be from a pending RVH for the pending entry. 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* entry = controller_.GetEntryWithPageID( 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can handle title updates when we don't have an entry in 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateTitleForEntry, but only if the update is from the current RVH. 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry && rvh != GetRenderViewHost()) 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evan): make use of title_direction. 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=27094 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!UpdateTitleForEntry(entry, title)) 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Broadcast notifications when the UI should be updated. 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry == controller_.GetEntryAtOffset(0)) 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderViewHost* render_view_host, 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& encoding) { 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) { 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->UpdateTargetURL(this, page_id, url); 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) { 29852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The UI may be in an event-tracking loop, such as between the 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse-down and mouse-up in text selection or a button click. 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer the close until after tracking is complete, so that we 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't free objects out from under the UI. 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(shess): This could get more fine-grained. For instance, 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing a tab in another window while selecting text in the 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current window's Omnibox should be just fine. 29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_->IsEventTracking()) { 29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CloseTabAfterEventTracking(); 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore this if it comes from a RenderViewHost that we aren't showing. 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->CloseContents(this); 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SwappedOut(RenderViewHost* rvh) { 3005a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (rvh == GetRenderViewHost()) { 3006a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Exit fullscreen mode before the current RVH is swapped out. For numerous 3007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // cases, there is no guarantee the renderer would/could initiate an exit. 3008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Example: http://crbug.com/347232 3009a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsFullscreenForCurrentTab()) { 3010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (rvh) 3011a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rvh->ExitFullscreen(); 3012a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!IsFullscreenForCurrentTab()); 3013a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3014a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (delegate_) 3016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delegate_->SwappedOut(this); 3017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 30187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Allow the navigation to proceed. 3020f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->SwappedOut(rvh); 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) { 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->IsPopupOrPanel(this)) 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->MoveContents(this, new_bounds); 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStartLoading(RenderFrameHost* render_frame_host) { 30295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetIsLoading(render_frame_host->GetRenderViewHost(), true, NULL); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderFrameHost* render_frame_host) { 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoadNotificationDetails> details; 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use the last committed entry rather than the active one, in case a 3036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pending entry has been created. 3037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 30385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Navigator* navigator = frame_tree_.root()->navigator(); 3039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An entry may not exist for a stop when loading an initial blank page or 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if an iframe injected by script into a blank page finishes loading. 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 30435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta elapsed = 30445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks::Now() - navigator->GetCurrentLoadStart(); 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.reset(new LoadNotificationDetails( 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetVirtualURL(), 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType(), 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elapsed, 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &controller_, 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetCurrentEntryIndex())); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetIsLoading(render_frame_host->GetRenderViewHost(), false, details.get()); 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() { 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the URL display. 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidChangeLoadProgress(double progress) { 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LoadProgressChanged(this, progress); 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) { 3070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (opener_) { 3071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clear our opener so that future cross-process navigations don't have an 3072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // opener assigned. 307390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(opener_); 3074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) opener_ = NULL; 3075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 30762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Notify all swapped out RenderViewHosts for this tab. This is important 30782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in case we go back to them, or if another window in those processes tries 30792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to access window.opener. 3080f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->DidDisownOpener(rvh); 30812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::DidAccessInitialDocument() { 3084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Update the URL display. 3085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL); 3086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame( 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentAvailableInMainFrame()); 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompletedInMainFrame( 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id) { 30974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 30984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DocumentOnLoadCompletedInMainFrame(page_id)); 30994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(avi): Remove. http://crbug.com/170921 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<int>(&page_id)); 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the active RenderViewHost to run unload handlers and close, as long 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the request came from a RenderViewHost in the same BrowsingInstance. 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->ClosePage(); 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent( 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only deliver the message to the active RenderViewHost if the request 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // came from a RenderViewHost in the same BrowsingInstance or if this 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents is dedicated to a browser plugin guest. 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This check means that an embedder could theoretically receive a 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // postMessage from anyone (not just its own guests). However, this is 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probably not a risk for apps since other pages won't have references 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to App windows. 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params new_params(params); 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!params.message_port_ids.empty()) { 31348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MessagePortMessageFilter* message_port_message_filter = 31358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static_cast<RenderProcessHostImpl*>(GetRenderProcessHost()) 31368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ->message_port_message_filter(); 31378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<int> new_routing_ids(params.message_port_ids.size()); 31388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (size_t i = 0; i < params.message_port_ids.size(); ++i) { 31398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) new_routing_ids[i] = message_port_message_filter->GetNextRoutingID(); 31408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MessagePortService::GetInstance()->UpdateMessagePort( 31418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.message_port_ids[i], 31428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) message_port_message_filter, 31438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) new_routing_ids[i]); 31448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 31458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) new_params.new_routing_ids = new_routing_ids; 31468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 31478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a source_routing_id, translate it to the routing ID for 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the equivalent swapped out RVH in the target process. If we need 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to create a swapped out RVH for the source tab, we create its opener 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chain as well, since those will also be accessible to the target page. 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_params.source_routing_id != MSG_ROUTING_NONE) { 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to look up the WebContents for the source page. 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* source_contents = NULL; 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID(), params.source_routing_id); 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_rvh) { 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents = static_cast<WebContentsImpl*>( 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_rvh->GetDelegate()->GetAsWebContents()); 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_contents) { 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBrowserPluginGuest()) { 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create a swapped out RenderView for the embedder in the guest's 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // render process but we intentionally do not expose the embedder's 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener chain to it. 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateSwappedOutRenderView(GetSiteInstance()); 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateOpenerRenderViews(GetSiteInstance()); 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We couldn't find it, so don't pass a source frame. 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = MSG_ROUTING_NONE; 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunJavaScriptMessage( 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 3187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message, 3188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& default_prompt, 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JavaScriptMessageType javascript_message_type, 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_suppress_message) { 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress JavaScript dialogs when requested. Also suppress messages when 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showing an interstitial as it's shown over the previous page and we don't 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want the hidden page's dialogs to interfere with the interstitial. 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suppress_this_message = 31975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderViewHostImpl*>(rvh)->IsSwappedOut() || 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowingInterstitialPage() || 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_ || 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ShouldSuppressDialogs() || 32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !delegate_->GetJavaScriptDialogManager(); 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!suppress_this_message) { 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_lang = GetContentClient()->browser()-> 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAcceptLangs(GetBrowserContext()); 32062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 32072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_->RunJavaScriptDialog( 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url.GetOrigin(), 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accept_lang, 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) javascript_message_type, 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_prompt, 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnDialogClosed, 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh, 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_msg), 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &suppress_this_message); 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *did_suppress_message = suppress_this_message; 322258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_this_message) { 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are suppressing messages, just reply as if the user immediately 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pressed "Cancel". 3226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnDialogClosed(rvh, reply_msg, false, base::string16()); 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // OnDialogClosed (two lines up) may have caused deletion of this object (see 323058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/288961 ). The only safe thing to do here is return. 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunBeforeUnloadConfirm(RenderViewHost* rvh, 3234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message, 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_reload, 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg) { 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WillRunBeforeUnloadConfirm(); 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suppress_this_message = 32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rvhi->rvh_state() != RenderViewHostImpl::STATE_DEFAULT || 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_ || 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ShouldSuppressDialogs() || 32452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !delegate_->GetJavaScriptDialogManager(); 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_this_message) { 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The reply must be sent to the RVH that sent the request. 3248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rvhi->JavaScriptDialogClosed(reply_msg, true, base::string16()); 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = true; 32532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 32542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_->RunBeforeUnloadDialog( 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, message, is_reload, 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), rvh, 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_msg)); 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level, 3261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message, 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 3263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& source_id) { 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AddMessageToConsole(this, level, message, line_no, 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_id); 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs() { 32714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We want to base the page config off of the actual URL, rather than the 32724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // virtual URL. 32734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(nasko): Investigate how to remove the GetActiveEntry usage here, 32744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // as it is deprecated and can be out of sync with GetRenderViewHost(). 327568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GURL url = controller_.GetActiveEntry() 327668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); 32771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetWebkitPrefs(url); 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView( 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 32835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderManager()->CreateRenderFrame(instance, MSG_ROUTING_NONE, 32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true, true); 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() { 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh) // NULL in unittests. 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rdh->OnUserGesture(this); 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() { 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent()); 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh, 33023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_during_beforeunload, 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_during_unload) { 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't show hung renderer dialog for a swapped out RVH. 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore renderer unresponsive event if debugger is attached to the tab 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the event may be a result of the renderer sitting on a breakpoint. 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/65458 33132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (DevToolsAgentHost::IsDebuggerAttached(this)) 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (is_during_beforeunload || is_during_unload) { 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hang occurred while firing the beforeunload/unload handler. 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend the handler fired so tab closing continues as if it had. 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->set_sudden_termination_allowed(true); 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer()) 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab hangs in the beforeunload/unload handler there's really 33253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // nothing we can do to recover. If the hang is in the beforeunload handler, 33263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // pretend the beforeunload listeners have all fired and allow the delegate 33273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // to continue closing; the user will not have the option of cancelling the 33283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // close. Otherwise, pretend the unload listeners have all fired and close 33293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the tab. 33303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool close = true; 33313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (is_during_beforeunload) { 33323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) delegate_->BeforeUnloadFired(this, true, &close); 33333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 33343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (close) 33353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Close(rvh); 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive()) 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererUnresponsive(this); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) { 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererResponsive(this); 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged( 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::LoadStateWithParam& load_state, 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_position, 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_size) { 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = load_state; 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = upload_position; 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = upload_size; 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_ = net::IDNToUnicode(url.host(), 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext())); 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_state_.state == net::LOAD_STATE_READING_RESPONSE) 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsLoading()) { 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB); 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager( 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, const base::TimeTicks& proceed_time, 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 33727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 33737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadFired(proceed_time)); 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload); 3376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note: |this| might be deleted at this point. 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebContentsImpl::RenderProcessGoneFromRenderManager( 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING); 3382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderViewTerminated(render_view_host, crashed_status_, crashed_error_code_); 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() { 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this is a hack. See WebContentsView::SizeContents. 3387424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size = GetSizeForNewRenderView(); 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here during container initialization and normal window size will be set 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. In case of tab duplication this resizing to 0x0 prevents setting 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal size later so just ignore it. 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!size.IsEmpty()) 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SizeContents(size); 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::CancelModalDialogsForRenderManager() { 33974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We need to cancel modal dialogs when doing a process swap, since the load 33984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // deferrer would prevent us from swapping out. 33994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (dialog_manager_) 34004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 34014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 34024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 34034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::NotifySwappedFromRenderManager(RenderViewHost* old_host, 34044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHost* new_host) { 34054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NotifySwapped(old_host, new_host); 34062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the visible RVH reflects the new delegate's preferences. 34082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 34092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 34102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) view_->RenderViewSwappedIn(new_host); 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager( 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_) 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recursively create RenderViews for anything else in the opener chain. 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_->CreateOpenerRenderViews(instance); 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opener_route_id = MSG_ROUTING_NONE; 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this tab has an opener, ensure it has a RenderView in the given 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance as well. 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_) 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id = opener_->CreateOpenerRenderViews(instance); 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any of the renderers (current, pending, or swapped out) for this 34322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents has the same SiteInstance, use it. 3433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->current_host()->GetSiteInstance() == instance) 3434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->current_host()->GetRoutingID(); 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (GetRenderManager()->pending_render_view_host() && 3437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetRenderManager()->pending_render_view_host()->GetSiteInstance() == 3438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) instance) 3439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetRenderManager()->pending_render_view_host()->GetRoutingID(); 34402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostImpl* rvh = GetRenderManager()->GetSwappedOutRenderViewHost( 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance); 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetRoutingID(); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a swapped out RenderView in the given SiteInstance if none exists, 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setting its opener to the given route_id. Return the new view's route_id. 34485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetRenderManager()->CreateRenderFrame(instance, opener_route_id, 34495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true, true); 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetController(); 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebUIImpl*>(CreateWebUI(url)); 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry* 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() { 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetLastCommittedEntry(); 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager( 34665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host, 34675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int opener_route_id, 34685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CrossProcessFrameConnector* frame_connector) { 34697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateRenderViewForRenderManager"); 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 34715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostView* rwh_view; 34725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(kenrb): RenderWidgetHostViewChildFrame special casing is temporary 34735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // until RenderWidgetHost is attached to RenderFrameHost. We need to special 34745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // case this because RWH is still a base class of RenderViewHost, and child 34755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // frame RWHVs are unique in that they do not have their own WebContents. 34765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (frame_connector) { 34775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostViewChildFrame* rwh_view_child = 34785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new RenderWidgetHostViewChildFrame(render_view_host); 34795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_connector->set_view(rwh_view_child); 34805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwh_view = rwh_view_child; 34815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 34825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwh_view = view_->CreateViewForWidget(render_view_host); 34835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the RenderView has been created, we need to tell it its size. 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 3487424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) rwh_view->SetSize(GetSizeForNewRenderView()); 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we use the correct starting page_id in the new RenderView. 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDIfNecessary(render_view_host); 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 max_page_id = 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance()); 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<RenderViewHostImpl*>( 3495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_host)->CreateRenderView(base::string16(), 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id, 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_id)) { 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 350168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a ViewMsg_Resize to be sent, needed to make plugins show up on 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // linux. See crbug.com/83941. 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) { 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost()) 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host->WasResized(); 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID) 3514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> 3515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebContentsImpl::GetJavaWebContents() { 3516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 3517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContentsAndroid* web_contents_android = 3519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<WebContentsAndroid*>(GetUserData(kWebContentsAndroidKey)); 3520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!web_contents_android) { 3521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_contents_android = new WebContentsAndroid(this); 3522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUserData(kWebContentsAndroidKey, web_contents_android); 3523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 3524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return web_contents_android->GetJavaObject(); 3525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 35273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() { 35283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return CreateRenderViewForRenderManager(GetRenderViewHost(), 35295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MSG_ROUTING_NONE, 35305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL); 35313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 35323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 35333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDialogClosed(RenderViewHost* rvh, 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 3537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& user_input) { 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_showing_before_unload_dialog_ && !success) { 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a beforeunload dialog is canceled, we need to stop the throbber from 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spinning, since we forced it to start spinning in Navigate. 35415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidStopLoading(rvh->GetMainFrame()); 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 35437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 35447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 35457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadDialogCancelled()); 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = false; 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>( 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh)->JavaScriptDialogClosed(reply_msg, success, user_input); 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) { 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_ = GetContentClient()->browser()-> 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCanonicalEncodingNameByAliasName(encoding); 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 35582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(rvh); 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwh_view->SetSize(GetView()->GetContainerSize()); 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool WebContentsImpl::IsHidden() { 35653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return capturer_count_ == 0 && !should_normally_be_visible_; 35663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 35673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RenderFrameHostManager* WebContentsImpl::GetRenderManager() const { 3569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return frame_tree_.root()->render_manager(); 3570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_guest_.get(); 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { 3581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(!browser_plugin_guest_); 3582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_plugin_guest_.reset(guest); 3583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_embedder_.get(); 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuestManager* 35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl::GetBrowserPluginGuestManager() const { 35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<BrowserPluginGuestManager*>( 35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetBrowserContext()->GetUserData( 35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin::kBrowserPluginGuestManagerKeyName)); 35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3596ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearPowerSaveBlockers( 3597ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RenderViewHost* render_view_host) { 3598ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch STLDeleteValues(&power_save_blockers_[render_view_host]); 3599ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch power_save_blockers_.erase(render_view_host); 3600ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3601ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3602ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearAllPowerSaveBlockers() { 3603ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin()); 3604ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch i != power_save_blockers_.end(); ++i) 3605ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch STLDeleteValues(&power_save_blockers_[i->first]); 3606ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch power_save_blockers_.clear(); 3607ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3608ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3609424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)gfx::Size WebContentsImpl::GetSizeForNewRenderView() const { 3610424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Size size; 3611424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (delegate_) 3612424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size = delegate_->GetSizeForNewRenderView(this); 3613424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (size.IsEmpty()) 3614424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size = view_->GetContainerSize(); 3615424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return size; 3616424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 3617424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 36184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsImpl::OnFrameRemoved( 36194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderViewHostImpl* render_view_host, 3620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int frame_routing_id) { 36214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameDetached(render_view_host, frame_routing_id)); 36234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 36244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) { 36265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!delegate_) 36275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 36285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size new_size = GetPreferredSize(); 36295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_size != old_size) 36305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->UpdatePreferredSize(this, new_size); 36315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 36325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3634