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" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/switches.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_embedder.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest_manager.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/devtools/devtools_manager_impl.h" 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/browser/dom_storage/dom_storage_context_wrapper.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_stats.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mhtml_generation_manager.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_package.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_data_manager_impl.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/power_save_blocker_impl.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/interstitial_page_impl.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/navigation_entry_impl.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_guest.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h" 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/image_messages.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_view_host_delegate_view.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/color_chooser.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/compositor_util.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/javascript_dialog_manager.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 7758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/touch/touch_device.h" 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/base/touch/touch_enabled.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h" 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/date_time_chooser_android.h" 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h" 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gl/io_surface_support_mac.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h" 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cross-Site Navigations 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a WebContentsImpl is told to navigate to a different web site (as 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determined by SiteInstance), it will replace its current RenderViewHost with 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new RenderViewHost dedicated to the new SiteInstance. This works as 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follows: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Navigate determines whether the destination is cross-site, and if so, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it creates a pending_render_view_host_. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH is "suspended," so that no navigation messages are sent to 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its renderer until the onbeforeunload JavaScript handler has a chance to 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run in the current RVH. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH tells CrossSiteRequestManager (a thread-safe singleton) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that it has a pending cross-site request. ResourceDispatcherHost will 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// check for this when the response arrives. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The current RVH runs its onbeforeunload handler. If it returns false, we 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cancel all the pending logic. Otherwise we allow the pending RVH to send 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the navigation request to its renderer. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// main resource load on the pending RVH. It checks CrossSiteRequestManager 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to see that it is a cross-site request, and installs a 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CrossSiteResourceHandler. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - When RDH receives a response, the BufferedResourceHandler determines 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether it is a download. If so, it sends a message to the new renderer 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// causing it to cancel the request, and the download proceeds. For now, the 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH remains until the next DidNavigate event for this 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl. This isn't ideal, but it doesn't affect any functionality. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - After RDH receives a response and determines that it is safe and not a 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download, it pauses the response to first run the old page's onunload 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handler. It does this by asynchronously calling the OnCrossSiteResponse 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method of WebContentsImpl on the UI thread, which sends a SwapOut message 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the current RVH. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Once the onunload handler is finished, a SwapOut_ACK message is sent to 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the ResourceDispatcherHost, who unpauses the response. Data is then sent 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the pending RVH. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending renderer sends a FrameNavigate message that invokes the 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidNavigate method. This replaces the current RVH with the 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The previous renderer is kept swapped out in RenderViewHostManager in case 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the user goes back. The process only stays live if another tab is using 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it, but if so, the existing frame relationships will be maintained. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Amount of time we wait between when a key event is received and the renderer 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is queried for its state and pushed to the NavigationEntry. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kQueryStateDelay = 5000; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSyncWaitDelay = 40; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com"; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::LazyInstance<std::vector<WebContents::CreatedCallback> > 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER; 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int StartDownload(content::RenderViewHost* rvh, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_favicon, 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t preferred_image_size, 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t max_image_size) { 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int g_next_image_download_id = 0; 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rvh->Send(new ImageMsg_DownloadImage(rvh->GetRoutingID(), 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++g_next_image_download_id, 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_favicon, 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_image_size, 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch max_image_size)); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_next_image_download_id; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ViewMsg_Navigate_Type::Value GetNavigationType( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, const NavigationEntryImpl& entry, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (reload_type) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD_IGNORING_CACHE: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL: 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::NO_RELOAD: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; // Fall through to rest of function. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |RenderViewImpl::PopulateStateFromPendingNavigationParams| differentiates 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // between |RESTORE_WITH_POST| and |RESTORE|. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.restore_type() == 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetHasPostData()) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RESTORE_WITH_POST; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RESTORE; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::NORMAL; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeNavigateParams(const NavigationEntryImpl& entry, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NavigationControllerImpl& controller, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Params* params) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->page_id = entry.GetPageID(); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->should_clear_history_list = entry.should_clear_history_list(); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entry.should_clear_history_list()) { 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set the history list related parameters to the same values a 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // NavigationController would return before its first navigation. This will 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fully clear the RenderView's view of the session history. 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->pending_history_list_offset = -1; 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->current_history_list_offset = -1; 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->current_history_list_length = 0; 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->pending_history_list_offset = controller.GetIndexOfEntry(&entry); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->current_history_list_offset = 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller.GetLastCommittedEntryIndex(); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->current_history_list_length = controller.GetEntryCount(); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry.GetBaseURLForDataURL().is_empty()) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->base_url_for_data_url = entry.GetBaseURLForDataURL(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->history_url_for_data_url = entry.GetVirtualURL(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->referrer = entry.GetReferrer(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transition = entry.GetTransitionType(); 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params->page_state = entry.GetPageState(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->navigation_type = 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNavigationType(controller.GetBrowserContext(), entry, reload_type); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->request_time = base::Time::Now(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->extra_headers = entry.extra_headers(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transferred_request_child_id = 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.transferred_global_request_id().child_id; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transferred_request_request_id = 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.transferred_global_request_id().request_id; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->is_overriding_user_agent = entry.GetIsOverridingUserAgent(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Avoid downloading when in view-source mode. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->allow_download = !entry.IsViewSourceMode(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->is_post = entry.GetHasPostData(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(entry.GetBrowserInitiatedPostData()) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->browser_initiated_post_data.assign( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->front(), 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->front() + 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->size()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reload_type == NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL && 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetOriginalRequestURL().is_valid() && !entry.GetHasPostData()) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may have been redirected when navigating to the current URL. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the URL the user originally intended to visit, if it's valid and if a 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // POST wasn't involved; the latter case avoids issues with sending data to 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the wrong page. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->url = entry.GetOriginalRequestURL(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->url = entry.GetURL(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->can_load_local_resources = entry.GetCanLoadLocalResources(); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->frame_to_navigate = entry.GetFrameToNavigate(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNavigationHeaders(params->url, ¶ms->extra_headers); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContents::Create(const WebContents::CreateParams& params) { 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return WebContentsImpl::CreateWithOpener( 272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params, static_cast<WebContentsImpl*>(params.opener)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage( 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 277ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const SessionStorageNamespaceMap& session_storage_namespace_map) { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, NULL); 280ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 281ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (SessionStorageNamespaceMap::const_iterator it = 282ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session_storage_namespace_map.begin(); 283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch it != session_storage_namespace_map.end(); 284ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++it) { 285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch new_contents->GetController() 286ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch .SetSessionStorageNamespace(it->first, it->second.get()); 287ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContents::AddCreatedCallback(const CreatedCallback& callback) { 294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().push_back(callback); 295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContents::RemoveCreatedCallback(const CreatedCallback& callback) { 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) { 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (g_created_callbacks.Get().at(i).Equals(callback)) { 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i); 301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetDelegate()->GetAsWebContents(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebContentsImpl::DestructionObserver ---------------------------------------- 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsImpl::DestructionObserver : public WebContentsObserver { 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents) 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : WebContentsObserver(watched_contents), 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_(owner) { 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // WebContentsObserver: 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE { 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_->OnWebContentsDestroyed(static_cast<WebContentsImpl*>(web_contents)); 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebContentsImpl* owner_; 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionObserver); 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl ------------------------------------------------------------- 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl( 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(NULL), 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_(this, browser_context), 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_delegate_view_(NULL), 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_(opener), 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_(NULL), 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_manager_(this, this, this), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_(0), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_(false), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_(net::LOAD_STATE_IDLE, string16()), 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_(0), 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_(0), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_(false), 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capturer_count_(0), 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_(true), 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_(false), 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_(false), 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_(NULL), 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_(false), 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_(false), 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)), 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)), 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temporary_zoom_settings_(false), 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_(0), 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_source_(NULL), 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_(MSG_ROUTING_NONE) { 364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) 365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().at(i).Run(this); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_ = true; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 371ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearAllPowerSaveBlockers(); 372ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<RenderWidgetHostImpl*>::iterator iter = 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->DetachDelegate(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.clear(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear out any JavaScript state. 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dialog_manager_) 381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dialog_manager_->WebContentsDestroyed(this); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->End(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify any observer that have a reference on this WebContents. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DESTROYED, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this should be moved to the view. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we still have a window handle, destroy it. GetNativeView can return 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL if this contents was part of a window that closed. 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_->GetNativeView()) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host && host->GetView()) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(host->GetView())->WillWmDestroy(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImplDestroyed()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDelegate(NULL); 41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STLDeleteContainerPairSecondPointers(destruction_observers_.begin(), 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.end()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener( 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) { 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener"); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, opener); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::CreateGuest( 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int guest_instance_id, 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> extra_params) { 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl(browser_context, NULL); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This makes |new_contents| act as a guest. 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserPluginGuest::Create( 437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch guest_instance_id, new_contents, extra_params.Pass()); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents::CreateParams create_params(browser_context, site_instance); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(create_params); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We are instantiating a WebContents for browser plugin. Set its subframe bit 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to true. 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<RenderViewHostImpl*>( 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->GetRenderViewHost())->set_is_subframe(true); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new_contents->browser_plugin_guest_.get(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs(RenderViewHost* rvh, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::GetWebkitPrefs"); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPreferences prefs; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.javascript_enabled = 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableJavaScript); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.web_security_enabled = 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableWebSecurity); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.plugins_enabled = 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisablePlugins); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.java_enabled = 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableJava); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.remote_fonts_enabled = 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableRemoteFonts); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.xss_auditor_enabled = 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableXSSAuditor); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.application_cache_enabled = 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableApplicationCache); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.local_storage_enabled = 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableLocalStorage); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.databases_enabled = 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableDatabases); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.webaudio_enabled = 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableWebAudio); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.experimental_webgl_enabled = 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisable3DAPIs) && 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableExperimentalWebGL); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.flash_3d_enabled = 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableFlash3d); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.flash_stage3d_enabled = 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableFlashStage3d); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.flash_stage3d_baseline_enabled = 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuProcessHost::gpu_enabled() && 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !command_line.HasSwitch(switches::kDisableFlashStage3d); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.gl_multisampling_enabled = 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableGLMultisampling); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.privileged_webgl_extensions_enabled = 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnablePrivilegedWebGLExtensions); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.site_specific_quirks_enabled = 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableSiteSpecificQuirks); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.allow_file_access_from_file_urls = 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kAllowFileAccessFromFiles); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.accelerated_compositing_for_overflow_scroll_enabled = false; 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line.HasSwitch(switches::kEnableAcceleratedOverflowScroll)) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.accelerated_compositing_for_overflow_scroll_enabled = true; 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line.HasSwitch(switches::kDisableAcceleratedOverflowScroll)) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.accelerated_compositing_for_overflow_scroll_enabled = false; 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.accelerated_compositing_for_scrollable_frames_enabled = 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kEnableAcceleratedScrollableFrames); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.composited_scrolling_for_frames_enabled = 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kEnableCompositedScrollingForFrames); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.show_paint_rects = 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kShowPaintRects); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAcceleratedCompositing); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.force_compositing_mode = 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::IsForceCompositingModeEnabled() && 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableForceCompositingMode); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_2d_canvas_enabled = 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAccelerated2dCanvas); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.antialiased_2d_canvas_disabled = 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kDisable2dCanvasAntialiasing); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_filters_enabled = 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableAcceleratedFilters); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.accelerated_compositing_for_3d_transforms_enabled = 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.accelerated_compositing_for_animation_enabled = 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAcceleratedLayers); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.accelerated_compositing_for_plugins_enabled = 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAcceleratedPlugins); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.accelerated_compositing_for_video_enabled = 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAcceleratedVideo); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.fullscreen_enabled = 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableFullScreen); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.css_sticky_position_enabled = 5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.css_shaders_enabled = 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableCssShaders); 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs.lazy_layout_enabled = 5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures); 5457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) prefs.region_based_columns_enabled = 5467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) command_line.HasSwitch(switches::kEnableRegionBasedColumns); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.threaded_html_parser = 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !command_line.HasSwitch(switches::kDisableThreadedHTMLParser); 54990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) prefs.experimental_websocket_enabled = 55090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebSocket); 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (command_line.HasSwitch(cc::switches::kEnablePinchVirtualViewport)) { 552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs.pinch_virtual_viewport_enabled = true; 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs.pinch_overlay_scrollbar_thickness = 10; 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.user_gesture_required_for_media_playback = !command_line.HasSwitch( 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kDisableGestureRequirementForMediaPlayback); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) prefs.touch_enabled = ui::AreTouchEventsEnabled(); 562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) prefs.device_supports_touch = prefs.touch_enabled && 563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui::IsTouchDevicePresent(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.device_supports_mouse = false; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.touch_adjustment_enabled = 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !command_line.HasSwitch(switches::kDisableTouchAdjustment); 570a163e21641001dda3882a4a9036c2353dea0146frbyers@chromium.org prefs.compositor_touch_hit_testing = 571a163e21641001dda3882a4a9036c2353dea0146frbyers@chromium.org !command_line.HasSwitch(cc::switches::kDisableCompositorTouchHitTesting); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_CHROMEOS) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool default_enable_scroll_animator = true; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool default_enable_scroll_animator = false; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = default_enable_scroll_animator; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kEnableSmoothScrolling)) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = true; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kDisableSmoothScrolling)) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = false; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.visual_word_movement_enabled = 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableVisualWordMovement); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Certain GPU features might have been blacklisted. 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GpuDataManagerImpl::GetInstance()->UpdateRendererWebPrefs(&prefs); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID())) { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.loads_images_automatically = true; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.javascript_enabled = true; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.is_online = !net::NetworkChangeNotifier::IsOffline(); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if !defined(USE_AURA) 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force accelerated compositing and 2d canvas off for chrome: and about: 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // pages (unless it's specifically allowed). 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((url.SchemeIs(chrome::kChromeUIScheme) || 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (url.SchemeIs(chrome::kAboutScheme) && 60390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url.spec() != kAboutBlankURL)) && 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kAllowWebUICompositing)) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = false; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_2d_canvas_enabled = false; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.fixed_position_creates_stacking_context = !command_line.HasSwitch( 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableFixedPositionCreatesStackingContext); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.gesture_tap_highlight_enabled = !command_line.HasSwitch( 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kDisableGestureTapHighlight); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.gesture_tap_highlight_enabled = command_line.HasSwitch( 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableGestureTapHighlight); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.number_of_cpu_cores = base::SysInfo::NumberOfProcessors(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.viewport_enabled = command_line.HasSwitch(switches::kEnableViewport); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.deferred_image_decoding_enabled = 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kEnableDeferredImageDecoding) || 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::switches::IsImplSidePaintingEnabled(); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs.spatial_navigation_enabled = command_line.HasSwitch( 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switches::kEnableSpatialNavigation); 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->OverrideWebkitPrefs(rvh, url, &prefs); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable compositing in guests until we have compositing path implemented 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for guests. 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool guest_compositing_enabled = !command_line.HasSwitch( 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kDisableBrowserPluginCompositing); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rvh->GetProcess()->IsGuest() && !guest_compositing_enabled) { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.force_compositing_mode = false; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = false; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prefs; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostManager* WebContentsImpl::GetRenderManagerForTesting() { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &render_manager_; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetWebUI() && 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<WebContentsObserver>::Iterator it(observers_); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver* observer; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer->OnMessageReceived(message)) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message handlers should be aware of which RenderViewHost sent the 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message, which is temporarily stored in message_source_. 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_ = render_view_host; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool message_is_ok = true; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP_EX(WebContentsImpl, message, message_is_ok) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache, 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidLoadResourceFromMemoryCache) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidDisplayInsecureContent) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent, 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidRunInsecureContent) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentLoadedInFrame, 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDocumentLoadedInFrame) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFinishLoad, OnDidFinishLoad) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFailLoadWithError, 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidFailLoadWithError) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_JSOutOfMemory, OnJSOutOfMemory) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler, 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRegisterProtocolHandler) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply) 68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidProgrammaticallyScroll, 68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnDidProgrammaticallyScroll) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_CrashedPlugin, OnCrashedPlugin) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_OpenColorChooser, OnOpenColorChooser) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EndColorChooser, OnEndColorChooser) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SetSelectedColorInColorChooser, 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetSelectedColorInColorChooser) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_PepperPluginHung, OnPepperPluginHung) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission, 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRequestPpapiBrokerPermission) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_AllocateInstanceID, 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_Attach, 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ImageHostMsg_DidDownloadImage, OnDidDownloadImage) 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply, 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnFindMatchRectsReply) 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_OpenDateTimeDialog, 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnOpenDateTimeDialog) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 711b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_FrameAttached, OnFrameAttached) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_FrameDetached, OnFrameDetached) 713ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IPC_MESSAGE_HANDLER(ViewHostMsg_MediaNotification, OnMediaNotification) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP_EX() 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_ = NULL; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!message_is_ok) { 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("BadMessageTerminate_RVD")); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderProcessHost()->ReceivedBadMessage(); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser( 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params) { 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RunFileChooser(this, params); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetBrowserContext(); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const { 74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 751ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst GURL& WebContentsImpl::GetVisibleURL() const { 75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 75690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 75790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetLastCommittedURL() const { 75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cbentzel): remove this debugging code? 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate == delegate_) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Detach(this); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Attach(this); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the visible RVH reflects the new delegate's preferences. 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate->CanOverscrollContent()); 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* host = render_manager_.current_host(); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host ? host->GetProcess() : NULL; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host(); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::GetRenderViewHostAtPosition( 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int x, 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int y, 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(RenderViewHost*, int, int)>& callback) { 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginEmbedder* embedder = GetBrowserPluginEmbedder(); 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (embedder) 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) embedder->GetRenderViewHostAtPosition(x, y, callback); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(GetRenderViewHost(), x, y); 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContentsImpl::GetEmbedderWebContents() const { 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest) 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->embedder_web_contents(); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetEmbeddedInstanceID() const { 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->instance_id(); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const { 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->GetRoutingID(); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetFullscreenWidgetRoutingID() const { 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fullscreen_widget_routing_id_; 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.GetRenderWidgetHostView(); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostViewPort* WebContentsImpl::GetRenderWidgetHostViewPort() const { 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest && guest->embedder_web_contents()) { 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->embedder_web_contents()->GetRenderWidgetHostViewPort(); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const { 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_.get(); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIImpl* web_ui = new WebUIImpl(this); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()-> 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateWebUIControllerForURL(web_ui, url); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller) { 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui->AddMessageHandler(new GenericHandler()); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->SetController(controller); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete web_ui; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const { 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.web_ui() ? render_manager_.web_ui() 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : render_manager_.pending_web_ui(); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.web_ui(); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) { 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUserAgentOverride() == override) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.user_agent_override = override; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the new override string to the renderer. 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->SyncRendererPrefs(); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload the page if a load is currently in progress to avoid having 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different parts of the page loaded using different user agents. 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent()) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ReloadIgnoringCache(true); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserAgentOverrideSet(override)); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.user_agent_override; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::SetParentNativeViewAccessible( 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible accessible_parent) { 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_ = accessible_parent; 89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (GetRenderViewHost()) 89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent); 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& WebContentsImpl::GetTitle() const { 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transient entries take precedence. They are used for interstitial pages 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that are shown on top of existing pages. 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetTransientEntry(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_languages = 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext()); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUI* our_web_ui = render_manager_.pending_web_ui() ? 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_web_ui() : render_manager_.web_ui(); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (our_web_ui) { 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't override the title in view source mode. 914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry = controller_.GetVisibleEntry(); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(entry && entry->IsViewSourceMode())) { 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the Web UI the chance to override our title. 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title = our_web_ui->GetOverriddenTitle(); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title.empty()) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the title for the last committed entry rather than a pending 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation entry. For example, when the user types in a URL, we want to 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep the old page's title until the new load has committed and we get a new 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title. 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetLastCommittedEntry(); 928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // We make an exception for initial navigations, because we can have a 930868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // committed entry for an initial navigation when doing a history navigation 931868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // in a new tab, such as Ctrl+Back. 932868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (entry && controller_.IsInitialNavigation()) 933868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry = controller_.GetVisibleEntry(); 934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| is finally used 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if no title cannot be retrieved. 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_title_when_no_navigation_entry_; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetMaxPageIDForSiteInstance(GetSiteInstance()); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance( 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end()) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = -1; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return max_page_ids_[site_instance->GetId()]; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) { 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance( 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, int32 page_id) { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetMaxPageIDForSiteInstance(site_instance) < page_id) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = page_id; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContentsImpl* web_contents) { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_ = web_contents->max_page_ids_; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const { 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host()->GetSiteInstance(); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* dest_rvh = render_manager_.pending_render_view_host() ? 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_render_view_host() : 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.current_host(); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest_rvh->GetSiteInstance(); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const { 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_loading_; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return waiting_for_response_; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& WebContentsImpl::GetLoadStateHost() const { 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_host_; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_size_; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const { 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_position_; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::set<GURL> WebContentsImpl::GetSitesInTab() const { 10067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BrowserContext* browser_context = GetBrowserContext(); 10077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::set<GURL> sites; 10087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!frame_tree_root_.get()) 10097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return sites; 10107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Iterates over the FrameTreeNodes to find each unique site URL that is 10127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // currently committed. 10137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FrameTreeNode* node = NULL; 10147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::queue<FrameTreeNode*> queue; 10157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) queue.push(frame_tree_root_.get()); 10167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (!queue.empty()) { 10187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) node = queue.front(); 10197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) queue.pop(); 10207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) sites.insert(SiteInstance::GetSiteForURL(browser_context, 10217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) node->current_url())); 10227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (size_t i = 0; i < node->child_count(); ++i) 10247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) queue.push(node->child_at(i)); 10257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return sites; 10287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 10297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return encoding_; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const { 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return displayed_insecure_content_; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::IncrementCapturerCount() { 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!is_being_destroyed_); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++capturer_count_; 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DecrementCapturerCount() { 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --capturer_count_; 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_LE(0, capturer_count_); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_being_destroyed_) 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // While capturer_count_ was greater than zero, the WasHidden() calls to RWHV 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // were being prevented. If there are no more capturers, make the call now. 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capturer_count_ == 0 && !should_normally_be_visible_) { 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Executing delayed WasHidden()."; 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WasHidden(); 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint WebContentsImpl::GetCapturerCount() const { 1063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return capturer_count_; 1064ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const { 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED || 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status, 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == crashed_status_) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ = status; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_ = error_code; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const { 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crashed_status_; 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const { 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_being_destroyed_; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged(unsigned changed_flags) { 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->NavigationStateChanged(this, changed_flags); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastSelectedTime() const { 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_selected_time_; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() { 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.SetActive(true); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* rwhv = 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) { 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->WasShown(); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->SetActive(true); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_selected_time_ = base::TimeTicks::Now(); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown()); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resize rect might have changed while this was inactive -- send the new 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one to make sure it's up to date. 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->ResizeRectChanged(GetRootWindowResizerRect()); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = true; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED, 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Details<const bool>(&should_normally_be_visible_)); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() { 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there are entities capturing screenshots or video (e.g., mirroring), 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // don't activate the "disable rendering" optimization. 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capturer_count_ == 0) { 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |GetRenderViewHost()| can be NULL if the user middle clicks a link to 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // open a tab in the background, then closes the tab before selecting it. 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is because closing the tab calls WebContentsImpl::Destroy(), which 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removes the |GetRenderViewHost()|; then when we actually destroy the 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window, OnWindowPosChanged() notices and calls WasHidden() (which 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls us). 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* rwhv = 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->WasHidden(); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = false; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED, 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Details<const bool>(&should_normally_be_visible_)); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() { 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Should we fire even for interstitial pages? 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WillNotifyDisconnection() && 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !ShowingInterstitialPage() && 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !static_cast<RenderViewHostImpl*>( 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost())->SuddenTerminationAllowed(); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() { 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.Stop(); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, StopNavigation()); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() { 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use our current SiteInstance since the cloned entry will use it anyway. 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We pass our own opener so that the cloned page can access it if it was 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before. 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams create_params(GetBrowserContext(), GetSiteInstance()); 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.initial_size = view_->GetContainerSize(); 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* tc = CreateWithOpener(create_params, opener_); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tc->GetController().CopyStateFrom(controller_); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCloneToNewWebContents(this, tc)); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tc; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type, 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != pending_widget_views_.end(); ++i) { 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host->GetView() == i->second) { 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(i); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::Init(const WebContents::CreateParams& params) { 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_manager_.Init( 1201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.browser_context, params.site_instance, params.routing_id, 1202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.main_frame_routing_id); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_.reset(GetContentClient()->browser()-> 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OverrideCreateWebContentsView(this, &render_view_host_delegate_view_)); 1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(render_view_host_delegate_view_); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate = 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetContentClient()->browser()->GetWebContentsViewDelegate(this); 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_guest_) { 12137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<WebContentsViewPort> platform_view(CreateWebContentsView( 12147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch this, delegate, &render_view_host_delegate_view_)); 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsViewGuest* rv = new WebContentsViewGuest( 12177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch this, browser_plugin_guest_.get(), platform_view.Pass(), 12187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_host_delegate_view_); 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_host_delegate_view_ = rv; 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(rv); 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Regular WebContentsView. 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(CreateWebContentsView( 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(render_view_host_delegate_view_); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(view_.get()); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size initial_size = params.initial_size; 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateView(initial_size, params.context); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for whether our opener gets destroyed. 123490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (opener_) 123590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(opener_); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllBrowserContextsAndSources()); 12407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_bridge_dispatcher_host_manager_.reset( 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new JavaBridgeDispatcherHostManager(this)); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_chooser_.reset(new DateTimeChooserAndroid()); 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { 125190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(web_contents); 125290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the opener if it has been closed. 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents == opener_) { 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_ = NULL; 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear a pending contents that has been closed before being shown. 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (PendingContents::iterator iter = pending_contents_.begin(); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != pending_contents_.end(); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second != web_contents) 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_contents_.erase(iter); 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) { 127190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!ContainsKey(destruction_observers_, web_contents)) { 127290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_[web_contents] = 127390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new DestructionObserver(this, web_contents); 127490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 127590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 127690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 127790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) { 127890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObservers::iterator iter = 127990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.find(web_contents); 128090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (iter != destruction_observers_.end()) { 128190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete destruction_observers_[web_contents]; 128290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.erase(iter); 128390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() { 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ActivateContents(this); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() { 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DeactivateContents(this); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() { 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostCapture(); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted( 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host) { 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_being_destroyed_) { 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |created_widgets_| might have been destroyed. 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<RenderWidgetHostImpl*>::iterator iter = 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.find(render_widget_host); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != created_widgets_.end()) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.erase(iter); 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host && 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) { 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDestroyFullscreenWidget( 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_)); 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_ = MSG_ROUTING_NONE; 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent( 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ && 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 13397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (browser_plugin_embedder_ && 13407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_plugin_embedder_->HandleKeyboardEvent(event)) { 13417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 13427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 13437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleKeyboardEvent(this, event); 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::PreHandleWheelEvent( 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebMouseWheelEvent& event) { 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_MACOSX) 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On platforms other than Mac, control+mousewheel changes zoom. On Mac, this 1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // isn't done for two reasons: 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -the OS already has a gesture to do this through pinch-zoom 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -if a user starts an inertial scroll, let's go, and presses control 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (i.e. control+tab) then the OS's buffered scroll events will come in 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with control key set which isn't what the user wants 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_ && 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.wheelTicksY && 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (event.modifiers & WebKit::WebInputEvent::ControlKey)) { 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->ContentsZoomChange(event.wheelTicksY > 0); 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { 1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return accessible_parent_; 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() { 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseDown(); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() { 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseUp(); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() { 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandlePointerActivate(); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() { 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureBegin(); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() { 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureEnd(); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) { 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const { 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture, 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(false); 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() { 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostMouseLock(); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow( 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int main_frame_route_id, 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_CreateWindow_Params& params, 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespace* session_storage_namespace) { 1427a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (delegate_ && 1428a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch !delegate_->ShouldCreateWebContents(this, 1429a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch route_id, 1430a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.window_container_type, 1431a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.frame_name, 1432a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.target_url, 1433a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.referrer, 1434a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.disposition, 1435a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.features, 1436a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.user_gesture, 1437a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.opener_suppressed)) { 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id); 1439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView( 1440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) main_frame_route_id); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We usually create the new window in the same BrowsingInstance (group of 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script-related windows), by passing in the current SiteInstance. However, 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the opener is being suppressed (in a non-guest), we create a new 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SiteInstance in its own BrowsingInstance. 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_guest = GetRenderProcessHost()->IsGuest(); 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SiteInstance> site_instance = 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.opener_suppressed && !is_guest ? 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) : 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSiteInstance(); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the new web contents. This will automatically create the new 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContentsView. In the future, we may want to create the view separately. 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebContentsImpl(GetBrowserContext(), 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_suppressed ? NULL : this); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must assign the SessionStorageNamespace before calling Init(). 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/142685 1464ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& partition_id = 1465ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetContentClient()->browser()-> 1466ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetStoragePartitionIdForSite(GetBrowserContext(), 1467ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch site_instance->GetSiteURL()); 1468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StoragePartition* partition = BrowserContext::GetStoragePartition( 1469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetBrowserContext(), site_instance.get()); 1470bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DOMStorageContextWrapper* dom_storage_context = 1471bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<DOMStorageContextWrapper*>(partition->GetDOMStorageContext()); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespaceImpl* session_storage_namespace_impl = 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->GetController().SetSessionStorageNamespace( 1476ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch partition_id, 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace); 1478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateParams create_params(GetBrowserContext(), site_instance.get()); 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = route_id; 1480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) create_params.main_frame_routing_id = main_frame_route_id; 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_guest) { 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.context = view_->GetNativeView(); 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.initial_size = view_->GetContainerSize(); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This makes |new_contents| act as a guest. 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int instance_id = GetBrowserPluginGuestManager()->get_next_instance_id(); 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents_impl = 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<WebContentsImpl*>(new_contents); 1490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserPluginGuest::CreateWithOpener(instance_id, new_contents_impl, 1491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetBrowserPluginGuest(), !!new_contents_impl->opener()); 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(create_params); 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Save the window for later if we're not suppressing the opener (since it 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will be shown immediately). 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.opener_suppressed) { 1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_guest) { 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsViewPort* new_view = new_contents->view_.get(); 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(brettw): It seems bogus that we have to call this function on the 1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // newly created object and give it one of its own member variables. 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created window associated with the route so we can show it 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(MSG_ROUTING_NONE, route_id); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_[route_id] = new_contents; 150990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(new_contents); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebContentsCreated( 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, params.opener_frame_id, params.frame_name, 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.target_url, new_contents); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.opener_suppressed) { 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the opener is suppressed, the original renderer cannot access the 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window. As a result, we need to show and navigate the window here. 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_blocked = false; 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect initial_pos; 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->AddNewContents( 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new_contents, params.disposition, initial_pos, 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.user_gesture, &was_blocked); 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_blocked) { 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams open_params(params.target_url, 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(), 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* is_renderer_initiated */); 15347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch open_params.user_gesture = params.user_gesture; 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->OpenURL(open_params); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int route_id, 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPopupType popup_type) { 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNewWidget(route_id, false, popup_type); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int route_id) { 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNewWidget(route_id, true, WebKit::WebPopupTypeNone); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int route_id, 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPopupType popup_type) { 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* process = GetRenderProcessHost(); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* widget_host = 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RenderWidgetHostImpl(this, process, route_id); 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.insert(widget_host); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostViewPort* widget_view = RenderWidgetHostViewPort::FromRWHV( 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateViewForPopupWidget(widget_host)); 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!widget_view) 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_fullscreen) { 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Popups should not get activated. 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_view->SetPopupType(popup_type); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created widget associated with the route so we can show it later. 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_[route_id] = widget_view; 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allow it to survive the trip without being hosted. 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(widget_view->GetNativeView()); 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id, 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents = GetCreatedWindow(route_id); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate = GetDelegate(); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) { 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNewContents( 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, contents, disposition, initial_pos, user_gesture, NULL); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, false, initial_pos); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) { 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, true, gfx::Rect()); 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_ = route_id; 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidShowFullscreenWidget(route_id)); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RenderWidgetShowing(); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* widget_host_view = 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetCreatedWidget(route_id)); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host_view) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_fullscreen) 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_host_view->InitAsFullscreen(GetRenderWidgetHostViewPort()); 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_host_view->InitAsPopup(GetRenderWidgetHostViewPort(), initial_pos); 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host_impl = 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost()); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->Init(); 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only allow privileged mouse lock for fullscreen render widget, which is 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used to implement Pepper Flash fullscreen. 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly embedded (or purposefully ignored) we can release the retain we 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // took in CreateNewWidget(). 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRelease(widget_host_view->GetNativeView()); 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) { 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingContents::iterator iter = pending_contents_.find(route_id); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certain systems can block the creation of new windows. If we didn't succeed 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in creating one, just return NULL. 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_contents_.end()) { 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = iter->second; 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_.erase(route_id); 164590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(new_contents); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't initialize the guest WebContents immediately. 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (new_contents->GetRenderProcessHost()->IsGuest()) 1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new_contents; 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_contents->GetRenderProcessHost()->HasConnection() || 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !new_contents->GetRenderViewHost()->GetView()) 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): It seems bogus to reach into here and initialize the host. 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_widget_views_.end()) { 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* widget_host_view = iter->second; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(route_id); 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost(); 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host->GetProcess()->HasConnection()) { 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view has gone away or the renderer crashed. Nothing to do. 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_host_view; 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebContentsImpl::ShowContextMenu(const ContextMenuParams& params) { 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow WebContentsDelegates to handle the context menu operation first. 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->HandleContextMenu(params)) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_host_delegate_view_->ShowContextMenu(params); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission( 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaStreamRequest& request, 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MediaResponseCallback& callback) { 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestMediaAccessPermission(this, request, callback); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(MediaStreamDevices(), scoped_ptr<MediaStreamUI>()); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1696a3f7b4e666c476898878fa745f637129375cd889Ben MurdochSessionStorageNamespace* WebContentsImpl::GetSessionStorageNamespace( 1697a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SiteInstance* instance) { 1698a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return controller_.GetSessionStorageNamespace(instance); 1699a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 1700a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 170190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) { 170290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (browser_plugin_embedder_) 17037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_plugin_embedder_->DidSendScreenRects(); 170490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 170590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_ = pref_size; 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->UpdatePreferredSize(this, pref_size); 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) { 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ResizeDueToAutoResize(this, new_size); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::OpenURL(const OpenURLParams& params) { 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = delegate_->OpenURLFromTab(this, params); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::Send(IPC::Message* message) { 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) { 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->Send(message); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToPendingEntry( 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NavigateToEntry( 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()), 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reload_type); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewForInterstitialPageCreated( 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewForInterstitialPageCreated(render_view_host)); 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::AttachInterstitialPage( 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterstitialPageImpl* interstitial_page) { 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(interstitial_page); 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_manager_.set_interstitial_page(interstitial_page); 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidAttachInterstitialPage()); 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DetachInterstitialPage() { 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetInterstitialPage()) 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_manager_.remove_interstitial_page(); 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDetachInterstitialPage()); 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToEntry( 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NavigationEntryImpl& entry, 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 17657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::NavigateToEntry"); 17667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The renderer will reject IPC messages with URLs longer than 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this limit, so don't attempt to navigate with a longer URL. 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetURL().spec().size() > kMaxURLChars) 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* dest_render_view_host = 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(render_manager_.Navigate(entry)); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dest_render_view_host) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Unable to create the desired render view host. 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For security, we should never send non-Web-UI URLs to a Web UI renderer. 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double check that here. 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int enabled_bindings = dest_render_view_host->GetEnabledBindings(); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool data_urls_allowed = delegate_ && delegate_->CanLoadDataURLsInWebUI(); 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_allowed_in_web_ui_renderer = 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUIControllerFactoryRegistry::GetInstance()->IsURLAcceptableForWebUI( 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetBrowserContext(), entry.GetURL(), data_urls_allowed); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((enabled_bindings & BINDINGS_POLICY_WEB_UI) && 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !is_allowed_in_web_ui_renderer) { 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log the URL to help us diagnose any future failures of this CHECK. 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->SetActiveURL(entry.GetURL()); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(0); 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers that we will navigate in this RV. 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AboutToNavigateRenderView(dest_render_view_host)); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for page load time metrics. 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_load_start_ = base::TimeTicks::Now(); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate in the desired RenderViewHost. 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Params navigate_params; 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeNavigateParams(entry, controller_, delegate_, reload_type, 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &navigate_params); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_render_view_host->Navigate(navigate_params); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetPageID() == -1) { 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HACK!! This code suppresses javascript: URLs from being added to 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session history, which is what we want to do for javascript: URLs that 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // do not generate content. What we really need is a message from the 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer telling us that a new page was not created. The same message 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could be used for mailto: URLs and the like. 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetURL().SchemeIs(chrome::kJavaScriptScheme)) 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToPendingEntry(entry.GetURL(), reload_type)); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DidNavigateToPendingEntry(this); 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetHistoryLengthAndPrune( 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SiteInstance* site_instance, 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int history_length, 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 minimum_page_id) { 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetHistoryLengthAndPrune doesn't work when there are pending cross-site 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigations. Callers should ensure that this is the case. 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.pending_render_view_host()) { 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = GetRenderViewHostImpl(); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_instance && rvh->GetSiteInstance() != site_instance) { 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetHistoryLengthAndPrune(GetRoutingID(), 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_length, 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_page_id)); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::FocusThroughTabTraversal(bool reverse) { 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.interstitial_page()->FocusThroughTabTraversal(reverse); 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->SetInitialFocus(reverse); 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShowingInterstitialPage() const { 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.interstitial_page() != NULL; 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPage* WebContentsImpl::GetInterstitialPage() const { 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.interstitial_page(); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsSavable() { 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit creates Document object when MIME type is application/xhtml+xml, 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we also support this MIME type. 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_ == "text/html" || 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/xml" || 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "application/xhtml+xml" || 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/plain" || 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/css" || 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IsSupportedJavascriptMimeType(contents_mime_type_.c_str()); 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSavePage() { 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we can not save the page, try to download it. 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsSavable()) { 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordDownloadSource(INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML); 1881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SaveFrame(GetURL(), Referrer()); 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the save package and possibly prompt the user for the name to save 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page as. The user prompt is an asynchronous operation that runs on 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another thread. 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_->GetSaveInfo(); 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in automated testing to bypass prompting the user for file names. 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, the names and paths are hard coded rather than running them through 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file name sanitation and extension / mime checking. 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::SavePage(const base::FilePath& main_file, 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& dir_path, 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePageType save_type) { 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the page from navigating. 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this, save_type, main_file, dir_path); 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return save_package_->Init(SavePackageDownloadCreatedCallback()); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::SaveFrame(const GURL& url, 1908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Referrer& referrer) { 1909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!GetURL().is_valid()) 1910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 1911ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_main_frame = (url == GetURL()); 1912ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadManager* dlm = 1914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BrowserContext::GetDownloadManager(GetBrowserContext()); 1915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!dlm) 1916ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 1917ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int64 post_id = -1; 1918ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (is_main_frame) { 1919ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const NavigationEntry* entry = controller_.GetActiveEntry(); 1920ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (entry) 1921ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch post_id = entry->GetPostID(); 1922ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1923ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<DownloadUrlParameters> params( 1924ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DownloadUrlParameters::FromWebContents(this, url)); 1925ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_referrer(referrer); 1926ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_post_id(post_id); 1927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prefer_cache(true); 1928ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (post_id >= 0) 1929ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_method("POST"); 1930ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->set_prompt(true); 1931ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch dlm->DownloadUrl(params.Pass()); 1932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML( 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file, 19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(const base::FilePath&, int64)>& callback) { 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MHTMLGenerationManager::GetInstance()->GenerateMHTML(this, file, callback); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsActiveEntry(int32 page_id) { 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* active_entry = 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl::FromNavigationEntry(controller_.GetActiveEntry()); 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (active_entry != NULL && 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_entry->site_instance() == GetSiteInstance() && 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_entry->GetPageID() == page_id); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const { 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_; 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const { 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_disconnection_; 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() { 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_.clear(); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &renderer_preferences_; 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() { 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(GetRenderViewHost()); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceEndedAt(int client_x, int client_y, 1975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int screen_x, int screen_y, WebKit::WebDragOperation operation) { 1976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 1977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceEndedAt(client_x, client_y, 1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 1980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceEndedAt(client_x, client_y, 1981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 1982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceMovedTo(int client_x, int client_y, 1985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int screen_x, int screen_y) { 1986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 1987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceMovedTo(client_x, client_y, 1988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y); 1989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceMovedTo(client_x, client_y, 1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y); 1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() { 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetRenderViewHost()) 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->DragSourceSystemDragEnded(); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DragEnded(); 1999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 2000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->SystemDragEnded(); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() { 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) { 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_ = value; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const { 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closed_by_user_gesture_; 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double WebContentsImpl::GetZoomLevel() const { 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMapImpl* zoom_map = static_cast<HostZoomMapImpl*>( 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMap::GetForBrowserContext(GetBrowserContext())); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!zoom_map) 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double zoom_level; 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (temporary_zoom_settings_) { 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = zoom_map->GetTemporaryZoomLevel( 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderProcessHost()->GetID(), GetRenderViewHost()->GetRoutingID()); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* active_entry = GetController().GetActiveEntry(); 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since zoom map is updated using rewritten URL, use rewritten URL 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to get the zoom level. 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = active_entry ? active_entry->GetURL() : GURL::EmptyGURL(); 20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom_level = zoom_map->GetZoomLevelForHostAndScheme(url.scheme(), 20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::GetHostOrSpecFromURL(url)); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zoom_level; 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetZoomPercent(bool* enable_increment, 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* enable_decrement) const { 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = *enable_increment = false; 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the zoom percent from the factor. Round up to the nearest whole 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number. 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int percent = static_cast<int>( 204358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ZoomLevelToZoomFactor(GetZoomLevel()) * 100 + 0.5); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = percent > minimum_zoom_percent_; 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_increment = percent < maximum_zoom_percent_; 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return percent; 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() { 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* active_entry = GetController().GetActiveEntry(); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!active_entry) 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ViewSourceForTab(this, active_entry->GetURL()); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url, 206190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->ViewSourceForFrame(this, url, page_state); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const { 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return minimum_zoom_percent_; 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const { 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return maximum_zoom_percent_; 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const { 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return preferred_size_; 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost() ? 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false; 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const { 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_ != NULL; 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 208990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) { 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_DidChooseColorResponse( 209190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetRoutingID(), color_chooser_identifier_, color)); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 209490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidEndColorChooser() { 209590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Send(new ViewMsg_DidEndColorChooser(GetRoutingID(), 209690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_)); 209790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_.reset(); 209890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_ = 0; 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int WebContentsImpl::DownloadImage(const GURL& url, 2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_favicon, 2103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t preferred_image_size, 2104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t max_image_size, 2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ImageDownloadCallback& callback) { 21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 2107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int id = StartDownload( 2108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host, url, is_favicon, preferred_image_size, max_image_size); 2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_[id] = callback; 21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id; 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() { 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 211590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (entry && entry->GetURL() == GURL(kAboutBlankURL)) 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this); 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) { 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SetFocusToLocationBar(select_all); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoadForFrame( 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 parent_frame_id, 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_error_page = (url.spec() == kUnreachableWebDataURL); 213290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_url(url); 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (is_main_frame) { 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidChangeLoadProgress(0); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // If there is no browser-initiated pending entry for this navigation and it 21424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // is not for the error URL, create a pending entry using the current 21434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // SiteInstance, and ensure the address bar updates accordingly. We don't 21444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // know the referrer or extra headers at this point, but the referrer will 21454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // be set properly upon commit. 21464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NavigationEntry* pending_entry = controller_.GetPendingEntry(); 21474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool has_browser_initiated_pending_entry = pending_entry && 21484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch !NavigationEntryImpl::FromNavigationEntry(pending_entry)-> 21494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch is_renderer_initiated(); 21504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!has_browser_initiated_pending_entry && !is_error_page) { 21514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 21524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch controller_.CreateNavigationEntry(validated_url, 21534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch content::Referrer(), 21544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch content::PAGE_TRANSITION_LINK, 21554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch true /* is_renderer_initiated */, 21564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string(), 21574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch GetBrowserContext())); 21584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch entry->set_site_instance( 21594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch static_cast<SiteInstanceImpl*>(GetSiteInstance())); 21604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch controller_.SetPendingEntry(entry); 21614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL); 21624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 2163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the start of the provisional load. 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStartProvisionalLoadForFrame(frame_id, parent_frame_id, 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_main_frame, validated_url, is_error_page, 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_iframe_srcdoc, render_view_host)); 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_main_frame) { 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_url, 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidRedirectProvisionalLoad( 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_url, 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& target_url) { 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Remove this method and have the pre-rendering code listen to 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ResourceDispatcherHost's RESOURCE_RECEIVED_REDIRECT notification 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instead. See http://crbug.com/78512. 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_source_url(source_url); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_target_url(target_url); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_source_url); 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_target_url); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry; 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_id == -1) { 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetPendingEntry(); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetEntryWithPageID(render_view_host->GetSiteInstance(), 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry || entry->GetURL() != validated_source_url) 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_target_url, 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError( 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_DidFailProvisionalLoadWithError_Params& params) { 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Failed Provisional Load: " << params.url.possibly_invalid_spec() 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", error_code: " << params.error_code 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", error_description: " << params.error_description 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", is_main_frame: " << params.is_main_frame 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", showing_repost_interstitial: " << 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.showing_repost_interstitial 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", frame_id: " << params.frame_id; 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_url(params.url); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (net::ERR_ABORTED == params.error_code) { 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EVIL HACK ALERT! Ignore failed loads when we're showing interstitials. 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This means that the interstitial won't be torn down properly, which is 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bad. But if we have an interstitial, go back to another tab type, and 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then load the same interstitial again, we could end up getting the first 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interstitial's "failed" message (as a result of the cancel) when we're on 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the second one. 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't tell this apart, so we think we're tearing down the current page 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which will cause a crash later one. There is also some code in 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHostManager::RendererAbortedProvisionalLoad that is commented 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // out because of this problem. 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=2855 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because this will not tear down the interstitial properly, if "back" is 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back to another tab type, the interstitial will still be somewhat alive 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the previous tab type. If you navigate somewhere that activates the 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tab with the interstitial again, you'll see a flash before the new load 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // commits of the interstitial page. 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Discarding message during interstitial."; 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.RendererAbortedProvisionalLoad(render_view_host); 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2251f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // Do not usually clear the pending entry if one exists, so that the user's 2252f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // typed URL is not lost when a navigation fails or is aborted. However, in 2253f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // cases that we don't show the pending entry (e.g., renderer-initiated 2254f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // navigations in an existing tab), we don't keep it around. That prevents 2255f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // spoofs on in-page navigations that don't go through 2256f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // DidStartProvisionalLoadForFrame. 2257f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // In general, we allow the view to clear the pending entry and typed URL if 2258f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // the user requests (e.g., hitting Escape with focus in the address bar). 2259f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) // Note: don't touch the transient entry, since an interstitial may exist. 2260f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) if (controller_.GetPendingEntry() != controller_.GetVisibleEntry()) 2261f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) controller_.DiscardPendingEntry(); 2262f7530a7a2b0c81a081d469940714dcf4d3f2505eTorne (Richard Coles) 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailProvisionalLoad(params.frame_id, 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.is_main_frame, 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) validated_url, 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.error_code, 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.error_description, 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache( 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& http_method, 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type) { 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatsCounter cache("WebKit.CacheHit"); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Increment(); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out a notification that we loaded a resource from our memory cache. 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_id = 0; 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CertStatus cert_status = 0; 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int security_bits = -1; 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_status = 0; 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeserializeSecurityInfo(security_info, &cert_id, &cert_status, 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &security_bits, &connection_status); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadFromMemoryCacheDetails details( 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method, 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type, resource_type); 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_FROM_MEMORY_CACHE, 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<NavigationController>(&controller_), 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<LoadFromMemoryCacheDetails>(&details)); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() { 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.DisplayedInsecureContent")); 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent( 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_origin, const GURL& target_url) { 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << security_origin << " ran insecure content from " 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << target_url.possibly_invalid_spec(); 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.RanInsecureContent")); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EndsWith(security_origin, kDotGoogleDotCom, false)) 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.RanInsecureContentGoogle")); 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ssl_manager()->DidRunInsecureContent(security_origin); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame(int64 frame_id) { 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentLoadedInFrame(frame_id, message_source_)); 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad( 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame) { 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL validated_url(url); 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderProcessHost* render_process_host = message_source_->GetProcess(); 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishLoad(frame_id, validated_url, is_main_frame, 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_)); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFailLoadWithError( 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& error_description) { 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL validated_url(url); 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderProcessHost* render_process_host = message_source_->GetProcess(); 23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailLoad(frame_id, validated_url, is_main_frame, 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_code, error_description, 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_)); 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) { 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_ || delegate_->OnGoToEntryOffset(offset)) { 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetEntryAtOffset(offset)); 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we don't call NavigationController::GotToOffset() as we don't 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want to create a pending navigation entry (it might end up lingering 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/51680). 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTransitionType( 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransitionFromInt( 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType() | 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_FORWARD_BACK)); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToEntry(*entry, NavigationControllerImpl::NO_RELOAD); 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the entry is being restored and doesn't have a SiteInstance yet, fill 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it in now that we know. This allows us to find the entry when it commits. 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry->site_instance() && 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->restore_type() != NavigationEntryImpl::RESTORE_NONE) { 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->set_site_instance( 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SiteInstanceImpl*>(GetPendingSiteInstance())); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent, 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maximum_percent, 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remember) { 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_ = minimum_percent; 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_ = maximum_percent; 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temporary_zoom_settings_ = !remember; 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id, 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy->CanReadDirectory(GetRenderProcessHost()->GetID(), path)) 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->EnumerateDirectory(this, request_id, path); 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnJSOutOfMemory() { 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->JSOutOfMemory(this); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol, 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 2409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (policy->IsPseudoScheme(protocol)) 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RegisterProtocolHandler(this, protocol, url, title, user_gesture); 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id, 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindReply(this, request_id, number_of_matches, selection_rect, 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, final_update); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnDidProgrammaticallyScroll( 242790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Vector2d& scroll_point) { 242890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (delegate_) 242990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->DidProgrammaticallyScroll(this, scroll_point); 243090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 243190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply( 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version, 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::RectF>& rects, 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::RectF& active_rect) { 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindMatchRectsReply(this, version, rects, active_rect); 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnOpenDateTimeDialog( 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ViewHostMsg_DateTimeDialogValue_Params& value) { 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_chooser_->ShowDialog( 2444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentViewCore::FromWebContents(this), GetRenderViewHost(), 2445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) value.dialog_type, value.year, value.month, value.day, value.hour, 2446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value.minute, value.second, value.week, value.minimum, value.maximum); 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnCrashedPlugin(const base::FilePath& plugin_path, 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId plugin_pid) { 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginCrashed(plugin_path, plugin_pid)); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url, 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheAccessed(manifest_url, blocked_by_policy)); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser(int color_chooser_id, 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 246690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ColorChooser* new_color_chooser = delegate_->OpenColorChooser(this, color); 246790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (color_chooser_ == new_color_chooser) 246890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 246990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_.reset(new_color_chooser); 247090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_ = color_chooser_id; 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) { 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_ && 247590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_id == color_chooser_identifier_) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->End(); 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id, 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_ && 248290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_id == color_chooser_identifier_) 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->SetSelectedColor(color); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id, 24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hung) { 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginHungStatusChanged(plugin_child_id, path, is_hung)); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled. 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url, 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& args) { 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebUISend(this, source_url, name, args); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission( 25053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int routing_id, 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path) { 25082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_) { 25093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_->RequestPpapiBrokerPermission( 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, url, plugin_path, 25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult, 25163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch base::Unretained(this), routing_id))) { 25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 25183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch OnPpapiBrokerPermissionResult(routing_id, false); 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WebContentsImpl::OnPpapiBrokerPermissionResult(int routing_id, 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result) { 25243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch Send(new ViewMsg_PpapiBrokerPermissionResult(routing_id, result)); 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnBrowserPluginMessage(const IPC::Message& message) { 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin 25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // specific messages for this WebContents. This means that any message from 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a BrowserPlugin prior to this will be ignored. 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above classes BrowserPluginEmbedder and 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginGuest. 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!browser_plugin_embedder_.get()); 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this)); 25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_->OnMessageReceived(message); 25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::OnDidDownloadImage( 25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 254090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int http_status_code, 25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& image_url, 25422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int requested_size, 25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<SkBitmap>& bitmaps) { 2544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageDownloadMap::iterator iter = image_download_map_.find(id); 2545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iter == image_download_map_.end()) { 25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently WebContents notifies us of ANY downloads so that it is 25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // possible to get here. 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 25492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!iter->second.is_null()) { 255190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) iter->second.Run(id, http_status_code, image_url, requested_size, bitmaps); 25522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_.erase(id); 25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnUpdateFaviconURL( 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 page_id, 25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<FaviconURL>& candidates) { 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidUpdateFaviconURL(page_id, candidates)); 25612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2563b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)FrameTreeNode* WebContentsImpl::FindFrameTreeNodeByID(int64 frame_id) { 2564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(nasko): Remove this check once we move to creating the root node 2565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // through RenderFrameHost creation. 2566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!frame_tree_root_.get()) 2567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 2568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2569b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* node = NULL; 2570b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::queue<FrameTreeNode*> queue; 2571b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) queue.push(frame_tree_root_.get()); 2572b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2573b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) while (!queue.empty()) { 2574b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) node = queue.front(); 2575b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) queue.pop(); 2576b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (node->frame_id() == frame_id) 2577b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return node; 2578b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2579b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (size_t i = 0; i < node->child_count(); ++i) 2580b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) queue.push(node->child_at(i)); 2581b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2582b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2583b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return NULL; 2584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2585b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2586b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void WebContentsImpl::OnFrameAttached( 2587b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int64 parent_frame_id, 2588b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int64 frame_id, 2589b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& frame_name) { 2590b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* parent = FindFrameTreeNodeByID(parent_frame_id); 2591b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!parent) 2592b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 2593b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* node = new FrameTreeNode(frame_id, frame_name); 2595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) parent->AddChild(node); 2596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2597b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2598b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void WebContentsImpl::OnFrameDetached(int64 parent_frame_id, int64 frame_id) { 25992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FrameDetached(message_source_, frame_id)); 2601b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2602b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* parent = FindFrameTreeNodeByID(parent_frame_id); 2603b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!parent) 2604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 2605b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2606b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) parent->RemoveChild(frame_id); 26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2609ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::OnMediaNotification(int64 player_cookie, 2610ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool has_video, 2611ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool has_audio, 2612ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_playing) { 2613ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Chrome OS does its own detection of audio and video. 2614ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_CHROMEOS) 2615ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (is_playing) { 2616ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<PowerSaveBlocker> blocker; 2617ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (has_video) { 2618ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch blocker = PowerSaveBlocker::Create( 2619ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, 2620ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "Playing video"); 2621ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID) 2622ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static_cast<PowerSaveBlockerImpl*>(blocker.get())-> 26234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch InitDisplaySleepBlocker(GetView()->GetNativeView()); 2624ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 2625ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else if (has_audio) { 2626ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch blocker = PowerSaveBlocker::Create( 2627ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, 2628ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "Playing audio"); 2629ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 2630ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (blocker) 2632ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch power_save_blockers_[message_source_][player_cookie] = blocker.release(); 2633ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else { 2634ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delete power_save_blockers_[message_source_][player_cookie]; 2635ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch power_save_blockers_[message_source_].erase(player_cookie); 2636ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 2637ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // !defined(OS_CHROMEOS) 2638ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 2639ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2640ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidChangeVisibleSSLState() { 26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidChangeVisibleSSLState()); 26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifyBeforeFormRepostWarningShow() { 26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeforeFormRepostWarningShow()); 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loading, or done loading and calls the base implementation. 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsLoading(bool is_loading, 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNotificationDetails* details) { 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading == is_loading_) 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading) { 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE, string16()); 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_.clear(); 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = 0; 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = 0; 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.SetIsLoading(is_loading); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = is_loading; 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_ = is_loading; 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LoadingStateChanged(this); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD); 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_loading) 26752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0("browser", "WebContentsImpl Loading", this); 26762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 26772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_END0("browser", "WebContentsImpl Loading", this); 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP; 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDetails det = NotificationService::NoDetails(); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details) 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) det = Details<LoadNotificationDetails>(details); 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, Source<NavigationController>(&controller_), det); 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit( 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadCommittedDetails& details, 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.is_navigation_to_different_page()) { 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the status bubble. This is a workaround for a bug where WebKit 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // doesn't let us know that the cursor left an element during a 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transition (this is also why the mouse cursor remains as a hand after 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clicking on a link); see bugs 1184641 and 980803. We don't want to 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clear the bubble when a user navigates to a named anchor in the same 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTargetURL(details.entry->GetPageID(), GURL()); 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!details.is_in_page) { 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once the main frame is navigated, we're no longer considered to have 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // displayed insecure content. 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = false; 2703a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 2704a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetController().GetBrowserContext()); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateMainFrame(details, params)); 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit( 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadCommittedDetails& details, 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 2716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If we navigate off the page, close all JavaScript dialogs. 2717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (dialog_manager_ && !details.is_in_page) 2718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dialog_manager_->CancelActiveAndPendingDialogs(this); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateAnyFrame(details, params)); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool WebContentsImpl::ShouldAssignSiteForURL(const GURL& url) { 27267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // about:blank should not "use up" a new SiteInstance. The SiteInstance can 27277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // still be used for a normal web site. 27287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (url == GURL(kAboutBlankURL)) 27297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 27307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 27317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The embedder will then have the opportunity to determine if the URL 27327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // should "use up" the SiteInstance. 27337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GetContentClient()->browser()->ShouldAssignSiteForURL(url); 2734eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) { 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are creating a RVH for a restored controller, then we need to make 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the RenderView starts with a next_page_id_ larger than the number 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of restored entries. This must be called before the RenderView starts 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating (to avoid a race between the browser updating max_page_id and 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the renderer updating next_page_id_). Because of this, we only call this 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from CreateRenderView and allow that to notify the RenderView for us. 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_restored_page_id = controller_.GetMaxRestoredPageID(); 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_restored_page_id > 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(rvh->GetSiteInstance())) 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(), 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_restored_page_id); 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry, 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) { 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For file URLs without a title, use the pathname instead. In the case of a 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synthesized title, we don't want the update to count toward the "one set 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per page of the title to history." 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 final_title; 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool explicit_set; 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry && entry->GetURL().SchemeIsFile() && title.empty()) { 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_title = UTF8ToUTF16(entry->GetURL().ExtractFileName()); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = false; // Don't count synthetic titles toward the set limit. 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimWhitespace(title, TRIM_ALL, &final_title); 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = true; 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a page is created via window.open and never navigated, 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there will be no navigation entry. In this situation, 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| will be used for page title. 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_title == entry->GetTitle()) 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTitle(final_title); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_title_when_no_navigation_entry_ == final_title) 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_title_when_no_navigation_entry_ = final_title; 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, set the title for the view. 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetPageTitle(final_title); 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<NavigationEntry*, bool> details = 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(entry, explicit_set); 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<NavigationEntry*, bool> >(&details)); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifySwapped(RenderViewHost* old_render_view_host) { 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After sending out a swap notification, we need to send a disconnect 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification so that clients that pick up a pointer to |this| can NULL the 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer. See Bug 1230284. 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_SWAPPED, 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 28022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Details<RenderViewHost>(old_render_view_host)); 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that the associated embedder gets cleared after a RenderViewHost 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets swapped, so we don't reuse the same embedder next time a 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is attached to this WebContents. 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveBrowserPluginEmbedder(); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyConnected() { 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_CONNECTED, 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() { 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notify_disconnection_) 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = false; 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::NotifyNavigationEntryCommitted( 2830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const LoadCommittedDetails& load_details) { 2831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FOR_EACH_OBSERVER( 2832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContentsObserver, observers_, NavigationEntryCommitted(load_details)); 2833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_view_host_delegate_view_; 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegate::RendererManagement* 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::GetRendererManagementDelegate() { 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &render_manager_; 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs( 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context) const { 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_; 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() { 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetRootWindowResizerRect(); 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() { 2860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_) 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_.reset(); 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send notifications if we are just creating a swapped-out RVH for 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the opener chain. These won't be used for view-source or WebUI, so it's 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ok to return early. 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(render_view_host)->is_swapped_out()) 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 28722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<RenderViewHost>(render_view_host)); 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're creating views, we're still doing initial setup, so we always 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the pending Web UI rather than any possibly existing committed one. 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.pending_web_ui()) 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_web_ui()->RenderViewCreated(render_view_host); 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2884eee4ebda36ebfcb751dd752751c071ef22e33b33Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 2885eee4ebda36ebfcb751dd752751c071ef22e33b33Torne (Richard Coles) if (entry && entry->IsViewSourceMode()) { 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put the renderer in view source mode. 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->Send( 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID())); 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->RenderViewCreated(render_view_host); 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, observers_, RenderViewCreated(render_view_host)); 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify the world, since this came from a renderer in the 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyConnected(); 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_crashed = IsCrashed(); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the focus to the tab (otherwise the focus will be on the top 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window). 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_crashed && !FocusLocationBarByDefault() && 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) { 29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Focus(); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady()); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, 2919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TerminationStatus status, 2920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int error_code) { 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pending page's RenderViewHost is gone. 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2926ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearPowerSaveBlockers(rvh); 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(false, NULL); 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(status, error_code); 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetView()->OnTabCrashed(GetCrashedStatus(), crashed_error_code_); 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 29347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RenderProcessGone(GetCrashedStatus())); 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { 2938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearPowerSaveBlockers(rvh); 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.RenderViewDeleted(rvh); 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigate( 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 2946b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // If we don't have a frame tree root yet, this is the first navigation in 2947b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // using the current RenderViewHost, so we need to create it with the proper 2948b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // frame id. 2949b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!frame_tree_root_.get()) { 2950b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(PageTransitionIsMainFrame(params.transition)); 2951b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) frame_tree_root_.reset(new FrameTreeNode(params.frame_id, std::string())); 2952b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2953b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PageTransitionIsMainFrame(params.transition)) { 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When overscroll navigation gesture is enabled, a screenshot of the page 29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in its current state is taken so that it can be used during the 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // nav-gesture. It is necessary to take the screenshot here, before calling 29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RenderViewHostManager::DidNavigateMainFrame, because that can change 29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents::GetRenderViewHost to return the new host, instead of the one 29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that may have just been swapped out. 29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_ && delegate_->CanOverscrollContent()) 29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_.TakeScreenshot(); 29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.DidNavigateMainFrame(rvh); 29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2967b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // We expect to have a valid frame tree root node at all times when 2968b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // navigating. 2969b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(frame_tree_root_.get()); 2970b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the site of the SiteInstance if it doesn't have one yet, unless 2972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // assigning a site is not necessary for this URL. In that case, the 2973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // SiteInstance can still be considered unused until a navigation to a real 2974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // page. 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<SiteInstanceImpl*>(GetSiteInstance())->HasSite() && 2976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShouldAssignSiteForURL(params.url)) { 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SiteInstanceImpl*>(GetSiteInstance())->SetSite(params.url); 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to update MIME type here because it's referred to in 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateNavigationCommands() called by RendererDidNavigate() to 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // determine whether or not to enable the encoding menu. 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's updated only for the main frame. For a subframe, 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderView::UpdateURL does not set params.contents_mime_type. 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (see http://code.google.com/p/chromium/issues/detail?id=2929 ) 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jungshik): Add a test for the encoding menu to avoid 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // regressing it again. 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PageTransitionIsMainFrame(params.transition)) 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ = params.contents_mime_type; 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadCommittedDetails details; 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_navigate = controller_.RendererDidNavigate(params, &details); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // For now, keep track of each frame's URL in its FrameTreeNode. This lets 29957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // us estimate our process count for implementing OOP iframes. 29967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(creis): Remove this when we track which pages commit in each frame. 29977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FrameTreeNode* node = FindFrameTreeNodeByID(params.frame_id); 29987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (node) 29997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) node->set_current_url(params.url); 30007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send notification about committed provisional loads. This notification is 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different from the NAV_ENTRY_COMMITTED notification which doesn't include 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the actual URL navigated to and isn't sent for AUTO_SUBFRAME navigations. 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.type != NAVIGATION_TYPE_NAV_IGNORE) { 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For AUTO_SUBFRAME navigations, an event for the main frame is generated 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that is not recorded in the navigation history. For the purpose of 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tracking navigation events, we treat this event as a sub frame navigation 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event. 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame = did_navigate ? details.is_main_frame : false; 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransition transition_type = params.transition; 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether or not a page transition was triggered by going backward or 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // forward in the history is only stored in the navigation controller's 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry list. 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (did_navigate && 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (controller_.GetActiveEntry()->GetTransitionType() & 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_FORWARD_BACK)) { 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type = PageTransitionFromInt( 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition | PAGE_TRANSITION_FORWARD_BACK); 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the commit of the provisional load. 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCommitProvisionalLoadForFrame(params.frame_id, 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_main_frame, params.url, transition_type, rvh)); 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!did_navigate) 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // No navigation happened. 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the appropriate notification (best) or you can add it to 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary, please). 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run post-commit tasks. 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.is_main_frame) { 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateMainFramePostCommit(details, params); 30372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) { 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DidNavigateMainFramePostCommit(this); 30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 30402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateAnyFramePostCommit(rvh, details, params); 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh, 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 304790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that this state update comes from either the active RVH or one of 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the swapped out RVHs. We don't expect to hear from any other RVHs. 3050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(rvh == GetRenderViewHost() || render_manager_.IsOnSwappedOutList(rvh)); 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must be prepared to handle state updates for any page, these occur 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the user is scrolling and entering form data, as well as when we're 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leaving a page, in which case our state may have already been moved to 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the next page. The navigation controller will look up the appropriate 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationEntry and update it when it is notified via the delegate. 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entry_index = controller_.GetEntryIndexWithPageID( 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_index < 0) 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 306490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (page_state == entry->GetPageState()) 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 306690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) entry->SetPageState(page_state); 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.NotifyEntryChanged(entry, entry_index); 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderViewHost* rvh, 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::TextDirection title_direction) { 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a title, that's a pretty good indication that we've started 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getting useful data. 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to find the navigation entry, which might not be the current one. 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For example, it might be from a pending RVH for the pending entry. 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* entry = controller_.GetEntryWithPageID( 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can handle title updates when we don't have an entry in 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateTitleForEntry, but only if the update is from the current RVH. 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry && rvh != GetRenderViewHost()) 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evan): make use of title_direction. 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=27094 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!UpdateTitleForEntry(entry, title)) 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Broadcast notifications when the UI should be updated. 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry == controller_.GetEntryAtOffset(0)) 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderViewHost* render_view_host, 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& encoding) { 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) { 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->UpdateTargetURL(this, page_id, url); 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) { 31092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The UI may be in an event-tracking loop, such as between the 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse-down and mouse-up in text selection or a button click. 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer the close until after tracking is complete, so that we 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't free objects out from under the UI. 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(shess): This could get more fine-grained. For instance, 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing a tab in another window while selecting text in the 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current window's Omnibox should be just fine. 31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_->IsEventTracking()) { 31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CloseTabAfterEventTracking(); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore this if it comes from a RenderViewHost that we aren't showing. 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->CloseContents(this); 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SwappedOut(RenderViewHost* rvh) { 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SwappedOut(this); 31317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 31327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Allow the navigation to proceed. 31337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_manager_.SwappedOut(rvh); 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) { 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->IsPopupOrPanel(this)) 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->MoveContents(this, new_bounds); 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStartLoading(RenderViewHost* render_view_host) { 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(true, NULL); 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStartLoading(render_view_host)); 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderViewHost* render_view_host) { 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoadNotificationDetails> details; 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use the last committed entry rather than the active one, in case a 3153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pending entry has been created. 3154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 3155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An entry may not exist for a stop when loading an initial blank page or 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if an iframe injected by script into a blank page finishes loading. 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta elapsed = base::TimeTicks::Now() - current_load_start_; 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.reset(new LoadNotificationDetails( 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetVirtualURL(), 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType(), 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elapsed, 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &controller_, 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetCurrentEntryIndex())); 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(false, details.get()); 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStopLoading(render_view_host)); 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() { 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the URL display. 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidChangeLoadProgress(double progress) { 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LoadProgressChanged(this, progress); 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) { 3191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (opener_) { 3192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clear our opener so that future cross-process navigations don't have an 3193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // opener assigned. 319490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(opener_); 3195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) opener_ = NULL; 3196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Notify all swapped out RenderViewHosts for this tab. This is important 31992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in case we go back to them, or if another window in those processes tries 32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to access window.opener. 32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_manager_.DidDisownOpener(rvh); 32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::DidAccessInitialDocument() { 3205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Update the URL display. 3206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL); 3207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame( 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentAvailableInMainFrame()); 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompletedInMainFrame( 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id) { 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<int>(&page_id)); 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderViewHost* rvh, 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 32282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 source_frame_id, 3229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool should_replace_current_entry, 32307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool user_gesture) { 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this came from a swapped out RenderViewHost, we only allow the request 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if we are still in the same BrowsingInstance. 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() && 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) { 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate to RequestTransferURL because this is just the generic 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case where |old_request_id| is empty. 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestTransferURL(url, referrer, disposition, source_frame_id, 3241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GlobalRequestID(), 3242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch should_replace_current_entry, user_gesture); 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestTransferURL( 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 source_frame_id, 32502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GlobalRequestID& old_request_id, 3251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool should_replace_current_entry, 32527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool user_gesture) { 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = NULL; 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransition transition_type = PAGE_TRANSITION_LINK; 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.web_ui()) { 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're a Web UI, it will provide a page transition type for us (this 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is so the new tab page can specify AUTO_BOOKMARK for automatically 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generated suggestions). 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note also that we hide the referrer for Web UI pages. We don't really 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want web sites to see a referrer of "chrome://blah" (and some 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome: URLs might have search terms or other stuff we don't want to 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send to the site), so we send no referrer. 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams params(url, Referrer(), source_frame_id, disposition, 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.web_ui()->GetLinkTransitionType(), 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* is_renderer_initiated */); 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_global_request_id = old_request_id; 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents = OpenURL(params); 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type = render_manager_.web_ui()->GetLinkTransitionType(); 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams params(url, referrer, source_frame_id, disposition, 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, true /* is_renderer_initiated */); 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_global_request_id = old_request_id; 3274ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params.should_replace_current_entry = should_replace_current_entry; 32757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params.user_gesture = user_gesture; 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents = OpenURL(params); 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_contents) { 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidOpenRequestedURL(new_contents, 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition, 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type, 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_frame_id)); 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the active RenderViewHost to run unload handlers and close, as long 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the request came from a RenderViewHost in the same BrowsingInstance. 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->ClosePage(); 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent( 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only deliver the message to the active RenderViewHost if the request 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // came from a RenderViewHost in the same BrowsingInstance or if this 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents is dedicated to a browser plugin guest. 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This check means that an embedder could theoretically receive a 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // postMessage from anyone (not just its own guests). However, this is 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probably not a risk for apps since other pages won't have references 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to App windows. 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params new_params(params); 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a source_routing_id, translate it to the routing ID for 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the equivalent swapped out RVH in the target process. If we need 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to create a swapped out RVH for the source tab, we create its opener 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chain as well, since those will also be accessible to the target page. 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_params.source_routing_id != MSG_ROUTING_NONE) { 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to look up the WebContents for the source page. 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* source_contents = NULL; 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID(), params.source_routing_id); 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_rvh) { 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents = static_cast<WebContentsImpl*>( 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_rvh->GetDelegate()->GetAsWebContents()); 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_contents) { 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBrowserPluginGuest()) { 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create a swapped out RenderView for the embedder in the guest's 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // render process but we intentionally do not expose the embedder's 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener chain to it. 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateSwappedOutRenderView(GetSiteInstance()); 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateOpenerRenderViews(GetSiteInstance()); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We couldn't find it, so don't pass a source frame. 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = MSG_ROUTING_NONE; 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunJavaScriptMessage( 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& default_prompt, 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JavaScriptMessageType javascript_message_type, 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_suppress_message) { 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress JavaScript dialogs when requested. Also suppress messages when 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showing an interstitial as it's shown over the previous page and we don't 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want the hidden page's dialogs to interfere with the interstitial. 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suppress_this_message = 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() || 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowingInterstitialPage() || 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_ || 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ShouldSuppressDialogs() || 33692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !delegate_->GetJavaScriptDialogManager(); 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!suppress_this_message) { 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_lang = GetContentClient()->browser()-> 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAcceptLangs(GetBrowserContext()); 33742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 33752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_->RunJavaScriptDialog( 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url.GetOrigin(), 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accept_lang, 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) javascript_message_type, 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_prompt, 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnDialogClosed, 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh, 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_msg), 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &suppress_this_message); 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_this_message) { 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are suppressing messages, just reply as if the user immediately 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pressed "Cancel". 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDialogClosed(rvh, reply_msg, false, string16()); 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_suppress_message = suppress_this_message; 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunBeforeUnloadConfirm(RenderViewHost* rvh, 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_reload, 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg) { 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WillRunBeforeUnloadConfirm(); 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suppress_this_message = 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->is_swapped_out() || 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_ || 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ShouldSuppressDialogs() || 34102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !delegate_->GetJavaScriptDialogManager(); 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_this_message) { 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The reply must be sent to the RVH that sent the request. 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->JavaScriptDialogClosed(reply_msg, true, string16()); 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = true; 34182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 34192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_->RunBeforeUnloadDialog( 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, message, is_reload, 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), rvh, 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_msg)); 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level, 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& source_id) { 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AddMessageToConsole(this, level, message, line_no, 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_id); 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs() { 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want to base the page config off of the real URL, rather than the 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display URL. 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = controller_.GetActiveEntry() 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetWebkitPrefs(GetRenderViewHost(), url); 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView( 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.CreateRenderView(instance, MSG_ROUTING_NONE, true); 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() { 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh) // NULL in unittests. 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rdh->OnUserGesture(this); 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() { 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent()); 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh, 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_during_unload) { 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't show hung renderer dialog for a swapped out RVH. 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore renderer unresponsive event if debugger is attached to the tab 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the event may be a result of the renderer sitting on a breakpoint. 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/65458 34732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (DevToolsAgentHost::IsDebuggerAttached(this)) 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_during_unload) { 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hang occurred while firing the beforeunload/unload handler. 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend the handler fired so tab closing continues as if it had. 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->set_sudden_termination_allowed(true); 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!render_manager_.ShouldCloseTabOnUnresponsiveRenderer()) 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab hangs in the beforeunload/unload handler there's really 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nothing we can do to recover. Pretend the unload listeners have 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all fired and close the tab. If the hang is in the beforeunload handler 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then the user will not have the option of cancelling the close. 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(rvh); 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive()) 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererUnresponsive(this); 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) { 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererResponsive(this); 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged( 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::LoadStateWithParam& load_state, 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_position, 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_size) { 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = load_state; 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = upload_position; 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = upload_size; 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_ = net::IDNToUnicode(url.host(), 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext())); 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_state_.state == net::LOAD_STATE_READING_RESPONSE) 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsLoading()) { 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB); 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WorkerCrashed() { 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WorkerCrashed(this); 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager( 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, const base::TimeTicks& proceed_time, 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 35307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 35317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadFired(proceed_time)); 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload); 3534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note: |this| might be deleted at this point. 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebContentsImpl::RenderProcessGoneFromRenderManager( 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING); 3540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderViewTerminated(render_view_host, crashed_status_, crashed_error_code_); 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() { 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this is a hack. See WebContentsView::SizeContents. 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = view_->GetContainerSize(); 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here during container initialization and normal window size will be set 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. In case of tab duplication this resizing to 0x0 prevents setting 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal size later so just ignore it. 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!size.IsEmpty()) 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SizeContents(size); 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifySwappedFromRenderManager(RenderViewHost* rvh) { 35552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifySwapped(rvh); 35562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the visible RVH reflects the new delegate's preferences. 35582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 35592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 35602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->RenderViewSwappedIn(render_manager_.current_host()); 3562b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3563b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* root = NULL; 3564b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RenderViewHostImpl* new_rvh = static_cast<RenderViewHostImpl*>( 3565b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_manager_.current_host()); 3566b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3567b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // We are doing a cross-site navigation and swapping processes. Since frame 3568b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // ids are unique to a process, we need to recreate the frame tree with the 3569b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // proper main frame id. 3570b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Note that it is possible for this method to be called before the new RVH 3571b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // has committed a navigation (if RenderViewHostManager short-circuits the 3572b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // CommitPending call because the current RVH is dead). In that case, we 3573b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // haven't heard a valid frame id to use to initialize the root node, so clear 3574b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // out the root node and the first subsequent navigation message will set it 3575b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // correctly. 3576b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (new_rvh->main_frame_id() != -1) 3577b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root = new FrameTreeNode(new_rvh->main_frame_id(), std::string()); 3578b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3579b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) frame_tree_root_.reset(root); 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager( 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_) 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recursively create RenderViews for anything else in the opener chain. 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_->CreateOpenerRenderViews(instance); 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opener_route_id = MSG_ROUTING_NONE; 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this tab has an opener, ensure it has a RenderView in the given 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance as well. 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_) 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id = opener_->CreateOpenerRenderViews(instance); 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any of the renderers (current, pending, or swapped out) for this 36002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents has the same SiteInstance, use it. 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.current_host()->GetSiteInstance() == instance) 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host()->GetRoutingID(); 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_manager_.pending_render_view_host() && 36052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_manager_.pending_render_view_host()->GetSiteInstance() == instance) 36062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_manager_.pending_render_view_host()->GetRoutingID(); 36072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = render_manager_.GetSwappedOutRenderViewHost( 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance); 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetRoutingID(); 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a swapped out RenderView in the given SiteInstance if none exists, 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setting its opener to the given route_id. Return the new view's route_id. 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.CreateRenderView(instance, opener_route_id, true); 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetController(); 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebUIImpl*>(CreateWebUI(url)); 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry* 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() { 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetLastCommittedEntry(); 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager( 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, int opener_route_id) { 36337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateRenderViewForRenderManager"); 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(render_view_host); 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the RenderView has been created, we need to tell it its size. 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwh_view->SetSize(view_->GetContainerSize()); 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we use the correct starting page_id in the new RenderView. 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDIfNecessary(render_view_host); 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 max_page_id = 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance()); 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<RenderViewHostImpl*>( 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)->CreateRenderView(string16(), 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id, 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_id)) { 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_OPENBSD) 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a ViewMsg_Resize to be sent, needed to make plugins show up on 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // linux. See crbug.com/83941. 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) { 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost()) 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host->WasResized(); 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665bfb105516e12ad16ce5cefd7511e89e46ccd443eJonathan Dixon#if defined(OS_ANDROID) 3666bfb105516e12ad16ce5cefd7511e89e46ccd443eJonathan Dixonbool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() { 3667bfb105516e12ad16ce5cefd7511e89e46ccd443eJonathan Dixon return CreateRenderViewForRenderManager(GetRenderViewHost(), 3668bfb105516e12ad16ce5cefd7511e89e46ccd443eJonathan Dixon MSG_ROUTING_NONE); 3669bfb105516e12ad16ce5cefd7511e89e46ccd443eJonathan Dixon} 3670bfb105516e12ad16ce5cefd7511e89e46ccd443eJonathan Dixon#endif 3671bfb105516e12ad16ce5cefd7511e89e46ccd443eJonathan Dixon 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDialogClosed(RenderViewHost* rvh, 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& user_input) { 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_showing_before_unload_dialog_ && !success) { 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a beforeunload dialog is canceled, we need to stop the throbber from 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spinning, since we forced it to start spinning in Navigate. 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStopLoading(rvh); 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 36817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 36827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 36837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadDialogCancelled()); 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = false; 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>( 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh)->JavaScriptDialogClosed(reply_msg, success, user_input); 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) { 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_ = GetContentClient()->browser()-> 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCanonicalEncodingNameByAliasName(encoding); 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 36962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(rvh); 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwh_view->SetSize(GetView()->GetContainerSize()); 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_guest_.get(); 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { 3711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(!browser_plugin_guest_); 3712eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_plugin_guest_.reset(guest); 3713eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_embedder_.get(); 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuestManager* 37202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl::GetBrowserPluginGuestManager() const { 37212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<BrowserPluginGuestManager*>( 37222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetBrowserContext()->GetUserData( 37232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin::kBrowserPluginGuestManagerKeyName)); 37242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 37252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3726ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearPowerSaveBlockers( 3727ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RenderViewHost* render_view_host) { 3728ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch STLDeleteValues(&power_save_blockers_[render_view_host]); 3729ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch power_save_blockers_.erase(render_view_host); 3730ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3731ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3732ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebContentsImpl::ClearAllPowerSaveBlockers() { 3733ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin()); 3734ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch i != power_save_blockers_.end(); ++i) 3735ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch STLDeleteValues(&power_save_blockers_[i->first]); 3736ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch power_save_blockers_.clear(); 3737ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3738ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3740