web_contents_impl.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/stats_counters.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/switches.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_embedder.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest_manager.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/devtools/devtools_manager_impl.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/dom_storage_context_impl.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_stats.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mhtml_generation_manager.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_package.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_data_manager_impl.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/interstitial_page_impl.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/navigation_entry_impl.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_guest.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/generic_handler.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h" 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/image_messages.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_view_host_delegate_view.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/color_chooser.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/compositor_util.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/javascript_dialog_manager.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_restriction.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/touch/touch_device.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h" 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/date_time_chooser_android.h" 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h" 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gl/io_surface_support_mac.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h" 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cross-Site Navigations 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a WebContentsImpl is told to navigate to a different web site (as 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determined by SiteInstance), it will replace its current RenderViewHost with 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new RenderViewHost dedicated to the new SiteInstance. This works as 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follows: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Navigate determines whether the destination is cross-site, and if so, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it creates a pending_render_view_host_. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH is "suspended," so that no navigation messages are sent to 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its renderer until the onbeforeunload JavaScript handler has a chance to 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run in the current RVH. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH tells CrossSiteRequestManager (a thread-safe singleton) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that it has a pending cross-site request. ResourceDispatcherHost will 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// check for this when the response arrives. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The current RVH runs its onbeforeunload handler. If it returns false, we 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cancel all the pending logic. Otherwise we allow the pending RVH to send 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the navigation request to its renderer. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// main resource load on the pending RVH. It checks CrossSiteRequestManager 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to see that it is a cross-site request, and installs a 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CrossSiteResourceHandler. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - When RDH receives a response, the BufferedResourceHandler determines 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether it is a download. If so, it sends a message to the new renderer 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// causing it to cancel the request, and the download proceeds. For now, the 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH remains until the next DidNavigate event for this 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl. This isn't ideal, but it doesn't affect any functionality. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - After RDH receives a response and determines that it is safe and not a 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download, it pauses the response to first run the old page's onunload 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handler. It does this by asynchronously calling the OnCrossSiteResponse 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method of WebContentsImpl on the UI thread, which sends a SwapOut message 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the current RVH. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Once the onunload handler is finished, a SwapOut_ACK message is sent to 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the ResourceDispatcherHost, who unpauses the response. Data is then sent 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the pending RVH. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending renderer sends a FrameNavigate message that invokes the 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidNavigate method. This replaces the current RVH with the 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The previous renderer is kept swapped out in RenderViewHostManager in case 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the user goes back. The process only stays live if another tab is using 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it, but if so, the existing frame relationships will be maintained. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Amount of time we wait between when a key event is received and the renderer 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is queried for its state and pushed to the NavigationEntry. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kQueryStateDelay = 5000; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSyncWaitDelay = 40; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com"; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::LazyInstance<std::vector<WebContents::CreatedCallback> > 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)g_created_callbacks = LAZY_INSTANCE_INITIALIZER; 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int StartDownload(content::RenderViewHost* rvh, 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_favicon, 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t preferred_image_size, 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t max_image_size) { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int g_next_image_download_id = 0; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rvh->Send(new ImageMsg_DownloadImage(rvh->GetRoutingID(), 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++g_next_image_download_id, 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_favicon, 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_image_size, 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch max_image_size)); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_next_image_download_id; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ViewMsg_Navigate_Type::Value GetNavigationType( 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, const NavigationEntryImpl& entry, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (reload_type) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD_IGNORING_CACHE: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::NO_RELOAD: 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; // Fall through to rest of function. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |RenderViewImpl::PopulateStateFromPendingNavigationParams| differentiates 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // between |RESTORE_WITH_POST| and |RESTORE|. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.restore_type() == 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetHasPostData()) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RESTORE_WITH_POST; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RESTORE; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::NORMAL; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeNavigateParams(const NavigationEntryImpl& entry, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NavigationControllerImpl& controller, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Params* params) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->page_id = entry.GetPageID(); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->should_clear_history_list = entry.should_clear_history_list(); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entry.should_clear_history_list()) { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set the history list related parameters to the same values a 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // NavigationController would return before its first navigation. This will 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fully clear the RenderView's view of the session history. 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->pending_history_list_offset = -1; 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->current_history_list_offset = -1; 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->current_history_list_length = 0; 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->pending_history_list_offset = controller.GetIndexOfEntry(&entry); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->current_history_list_offset = 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller.GetLastCommittedEntryIndex(); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->current_history_list_length = controller.GetEntryCount(); 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry.GetBaseURLForDataURL().is_empty()) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->base_url_for_data_url = entry.GetBaseURLForDataURL(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->history_url_for_data_url = entry.GetVirtualURL(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->referrer = entry.GetReferrer(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transition = entry.GetTransitionType(); 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params->page_state = entry.GetPageState(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->navigation_type = 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNavigationType(controller.GetBrowserContext(), entry, reload_type); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->request_time = base::Time::Now(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->extra_headers = entry.extra_headers(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transferred_request_child_id = 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.transferred_global_request_id().child_id; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transferred_request_request_id = 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.transferred_global_request_id().request_id; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->is_overriding_user_agent = entry.GetIsOverridingUserAgent(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Avoid downloading when in view-source mode. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->allow_download = !entry.IsViewSourceMode(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->is_post = entry.GetHasPostData(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(entry.GetBrowserInitiatedPostData()) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->browser_initiated_post_data.assign( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->front(), 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->front() + 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->size()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reload_type == NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL && 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetOriginalRequestURL().is_valid() && !entry.GetHasPostData()) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may have been redirected when navigating to the current URL. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the URL the user originally intended to visit, if it's valid and if a 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // POST wasn't involved; the latter case avoids issues with sending data to 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the wrong page. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->url = entry.GetOriginalRequestURL(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->url = entry.GetURL(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->can_load_local_resources = entry.GetCanLoadLocalResources(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->frame_to_navigate = entry.GetFrameToNavigate(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNavigationHeaders(params->url, ¶ms->extra_headers); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContents::Create(const WebContents::CreateParams& params) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return WebContentsImpl::CreateWithOpener(params, NULL); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage( 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SessionStorageNamespaceMap& session_storage_namespace_map) { 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, NULL); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (SessionStorageNamespaceMap::const_iterator it = 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace_map.begin(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != session_storage_namespace_map.end(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new_contents->GetController() 283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .SetSessionStorageNamespace(it->first, it->second.get()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContents::AddCreatedCallback(const CreatedCallback& callback) { 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().push_back(callback); 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContents::RemoveCreatedCallback(const CreatedCallback& callback) { 295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); ++i) { 296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (g_created_callbacks.Get().at(i).Equals(callback)) { 297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().erase(g_created_callbacks.Get().begin() + i); 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetDelegate()->GetAsWebContents(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebContentsImpl::DestructionObserver ---------------------------------------- 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsImpl::DestructionObserver : public WebContentsObserver { 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents) 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : WebContentsObserver(watched_contents), 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_(owner) { 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // WebContentsObserver: 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE { 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) owner_->OnWebContentsDestroyed(static_cast<WebContentsImpl*>(web_contents)); 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebContentsImpl* owner_; 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionObserver); 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl ------------------------------------------------------------- 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl( 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(NULL), 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_(this, browser_context), 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_delegate_view_(NULL), 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_(opener), 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_(NULL), 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_manager_(this, this, this), 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_(0), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_(false), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_(net::LOAD_STATE_IDLE, string16()), 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_(0), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_(0), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_(false), 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capturer_count_(0), 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_(true), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_(false), 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_(false), 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_(NULL), 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_(false), 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_(false), 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)), 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)), 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temporary_zoom_settings_(false), 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_restrictions_(0), 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_(0), 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_source_(NULL), 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_(MSG_ROUTING_NONE) { 362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) 363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_created_callbacks.Get().at(i).Run(this); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_ = true; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<RenderWidgetHostImpl*>::iterator iter = 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->DetachDelegate(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.clear(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear out any JavaScript state. 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dialog_manager_) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_->ResetJavaScriptState(this); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->End(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify any observer that have a reference on this WebContents. 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DESTROYED, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this should be moved to the view. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we still have a window handle, destroy it. GetNativeView can return 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL if this contents was part of a window that closed. 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_->GetNativeView()) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host && host->GetView()) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(host->GetView())->WillWmDestroy(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImplDestroyed()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDelegate(NULL); 40690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 40790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STLDeleteContainerPairSecondPointers(destruction_observers_.begin(), 40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.end()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener( 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents::CreateParams& params, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) { 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener"); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl( 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.browser_context, opener); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(params); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::CreateGuest( 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int guest_instance_id, 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> extra_params) { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl(browser_context, NULL); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This makes |new_contents| act as a guest. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserPluginGuest::Create( 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch guest_instance_id, new_contents, extra_params.Pass()); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents::CreateParams create_params(browser_context, site_instance); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(create_params); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We are instantiating a WebContents for browser plugin. Set its subframe bit 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to true. 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<RenderViewHostImpl*>( 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->GetRenderViewHost())->set_is_subframe(true); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new_contents->browser_plugin_guest_.get(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs(RenderViewHost* rvh, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::GetWebkitPrefs"); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPreferences prefs; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.javascript_enabled = 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableJavaScript); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.web_security_enabled = 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableWebSecurity); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.plugins_enabled = 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisablePlugins); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.java_enabled = 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableJava); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.remote_fonts_enabled = 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableRemoteFonts); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.xss_auditor_enabled = 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableXSSAuditor); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.application_cache_enabled = 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableApplicationCache); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.local_storage_enabled = 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableLocalStorage); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.databases_enabled = 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableDatabases); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.webaudio_enabled = 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableWebAudio); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.experimental_webgl_enabled = 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisable3DAPIs) && 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebGL); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableExperimentalWebGL); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 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 = 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebKitFeatures); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.css_shaders_enabled = 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableCssShaders); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.css_grid_layout_enabled = 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebKitFeatures); 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs.lazy_layout_enabled = 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebKitFeatures); 5477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) prefs.region_based_columns_enabled = 5487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) command_line.HasSwitch(switches::kEnableRegionBasedColumns); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.threaded_html_parser = 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !command_line.HasSwitch(switches::kDisableThreadedHTMLParser); 55190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) prefs.experimental_websocket_enabled = 55290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebSocket); 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (command_line.HasSwitch(cc::switches::kEnablePinchVirtualViewport)) { 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs.pinch_virtual_viewport_enabled = true; 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch prefs.pinch_overlay_scrollbar_thickness = 10; 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.user_gesture_required_for_media_playback = !command_line.HasSwitch( 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kDisableGestureRequirementForMediaPlayback); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool touch_device_present = false; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_device_present = ui::IsTouchDevicePresent(); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string touch_enabled_switch = 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kTouchEvents) ? 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.GetSwitchValueASCII(switches::kTouchEvents) : 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kTouchEventsAuto; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (touch_enabled_switch.empty() || 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_enabled_switch == switches::kTouchEventsEnabled) { 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.touch_enabled = true; 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (touch_enabled_switch == switches::kTouchEventsAuto) { 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.touch_enabled = touch_device_present; 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (touch_enabled_switch != switches::kTouchEventsDisabled) { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Invalid --touch-events option: " << touch_enabled_switch; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.device_supports_touch = prefs.touch_enabled && touch_device_present; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.device_supports_mouse = false; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.touch_adjustment_enabled = 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !command_line.HasSwitch(switches::kDisableTouchAdjustment); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_CHROMEOS) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool default_enable_scroll_animator = true; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool default_enable_scroll_animator = false; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = default_enable_scroll_animator; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kEnableSmoothScrolling)) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = true; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kDisableSmoothScrolling)) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = false; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.visual_word_movement_enabled = 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableVisualWordMovement); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Certain GPU features might have been blacklisted. 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GpuDataManagerImpl::GetInstance()->UpdateRendererWebPrefs(&prefs); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID())) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.loads_images_automatically = true; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.javascript_enabled = true; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.is_online = !net::NetworkChangeNotifier::IsOffline(); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if !defined(USE_AURA) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force accelerated compositing and 2d canvas off for chrome: and about: 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // pages (unless it's specifically allowed). 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((url.SchemeIs(chrome::kChromeUIScheme) || 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (url.SchemeIs(chrome::kAboutScheme) && 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url.spec() != kAboutBlankURL)) && 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kAllowWebUICompositing)) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = false; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_2d_canvas_enabled = false; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.fixed_position_creates_stacking_context = !command_line.HasSwitch( 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableFixedPositionCreatesStackingContext); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.gesture_tap_highlight_enabled = !command_line.HasSwitch( 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kDisableGestureTapHighlight); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.gesture_tap_highlight_enabled = command_line.HasSwitch( 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableGestureTapHighlight); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.number_of_cpu_cores = base::SysInfo::NumberOfProcessors(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs.viewport_enabled = command_line.HasSwitch(switches::kEnableViewport); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.deferred_image_decoding_enabled = 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kEnableDeferredImageDecoding) || 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::switches::IsImplSidePaintingEnabled(); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs.spatial_navigation_enabled = command_line.HasSwitch( 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switches::kEnableSpatialNavigation); 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->OverrideWebkitPrefs(rvh, url, &prefs); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable compositing in guests until we have compositing path implemented 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for guests. 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool guest_compositing_enabled = !command_line.HasSwitch( 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kDisableBrowserPluginCompositing); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rvh->GetProcess()->IsGuest() && !guest_compositing_enabled) { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.force_compositing_mode = false; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = false; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prefs; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostManager* WebContentsImpl::GetRenderManagerForTesting() { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &render_manager_; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetWebUI() && 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) { 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<WebContentsObserver>::Iterator it(observers_); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver* observer; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer->OnMessageReceived(message)) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message handlers should be aware of which RenderViewHost sent the 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message, which is temporarily stored in message_source_. 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_ = render_view_host; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool message_is_ok = true; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP_EX(WebContentsImpl, message, message_is_ok) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache, 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidLoadResourceFromMemoryCache) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent, 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidDisplayInsecureContent) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent, 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidRunInsecureContent) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentLoadedInFrame, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDocumentLoadedInFrame) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFinishLoad, OnDidFinishLoad) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFailLoadWithError, 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidFailLoadWithError) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateContentRestrictions, 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUpdateContentRestrictions) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SaveURLAs, OnSaveURL) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_JSOutOfMemory, OnJSOutOfMemory) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler, 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRegisterProtocolHandler) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply) 70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidProgrammaticallyScroll, 70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnDidProgrammaticallyScroll) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_CrashedPlugin, OnCrashedPlugin) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_OpenColorChooser, OnOpenColorChooser) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EndColorChooser, OnEndColorChooser) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SetSelectedColorInColorChooser, 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetSelectedColorInColorChooser) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_PepperPluginHung, OnPepperPluginHung) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission, 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRequestPpapiBrokerPermission) 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_AllocateInstanceID, 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_Attach, 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnBrowserPluginMessage(message)) 720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ImageHostMsg_DidDownloadImage, OnDidDownloadImage) 721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFaviconURL, OnUpdateFaviconURL) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply, 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnFindMatchRectsReply) 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_OpenDateTimeDialog, 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnOpenDateTimeDialog) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 728b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_FrameAttached, OnFrameAttached) 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_FrameDetached, OnFrameDetached) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP_EX() 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_ = NULL; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!message_is_ok) { 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("BadMessageTerminate_RVD")); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderProcessHost()->ReceivedBadMessage(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser( 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RunFileChooser(this, params); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() { 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const { 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetBrowserContext(); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const { 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetActiveURL() const { 76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntry* entry = controller_.GetVisibleEntry(); 77090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 77290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL& WebContentsImpl::GetLastCommittedURL() const { 77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We may not have a navigation entry yet. 77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cbentzel): remove this debugging code? 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate == delegate_) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Detach(this); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) { 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Attach(this); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure the visible RVH reflects the new delegate's preferences. 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate->CanOverscrollContent()); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* host = render_manager_.current_host(); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host ? host->GetProcess() : NULL; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const { 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host(); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::GetRenderViewHostAtPosition( 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int x, 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int y, 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(RenderViewHost*, int, int)>& callback) { 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginEmbedder* embedder = GetBrowserPluginEmbedder(); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (embedder) 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) embedder->GetRenderViewHostAtPosition(x, y, callback); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(GetRenderViewHost(), x, y); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* WebContentsImpl::GetEmbedderWebContents() const { 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest) 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->embedder_web_contents(); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetEmbeddedInstanceID() const { 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->instance_id(); 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->GetRoutingID(); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebContentsImpl::GetFullscreenWidgetRoutingID() const { 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fullscreen_widget_routing_id_; 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.GetRenderWidgetHostView(); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostViewPort* WebContentsImpl::GetRenderWidgetHostViewPort() const { 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginGuest* guest = GetBrowserPluginGuest(); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guest && guest->embedder_web_contents()) { 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest->embedder_web_contents()->GetRenderWidgetHostViewPort(); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const { 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_.get(); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIImpl* web_ui = new WebUIImpl(this); 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()-> 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateWebUIControllerForURL(web_ui, url); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller) { 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui->AddMessageHandler(new GenericHandler()); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->SetController(controller); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete web_ui; 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const { 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.web_ui() ? render_manager_.web_ui() 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : render_manager_.pending_web_ui(); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const { 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.web_ui(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) { 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUserAgentOverride() == override) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.user_agent_override = override; 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the new override string to the renderer. 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->SyncRendererPrefs(); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload the page if a load is currently in progress to avoid having 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different parts of the page loaded using different user agents. 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent()) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ReloadIgnoringCache(true); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserAgentOverrideSet(override)); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.user_agent_override; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::SetParentNativeViewAccessible( 909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible accessible_parent) { 910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) accessible_parent_ = accessible_parent; 91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (GetRenderViewHost()) 91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent); 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& WebContentsImpl::GetTitle() const { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transient entries take precedence. They are used for interstitial pages 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that are shown on top of existing pages. 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetTransientEntry(); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_languages = 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext()); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUI* our_web_ui = render_manager_.pending_web_ui() ? 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_web_ui() : render_manager_.web_ui(); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (our_web_ui) { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't override the title in view source mode. 930868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry = controller_.GetVisibleEntry(); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(entry && entry->IsViewSourceMode())) { 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the Web UI the chance to override our title. 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title = our_web_ui->GetOverriddenTitle(); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title.empty()) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the title for the last committed entry rather than a pending 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation entry. For example, when the user types in a URL, we want to 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep the old page's title until the new load has committed and we get a new 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title. 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetLastCommittedEntry(); 944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // We make an exception for initial navigations, because we can have a 946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // committed entry for an initial navigation when doing a history navigation 947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // in a new tab, such as Ctrl+Back. 948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (entry && controller_.IsInitialNavigation()) 949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry = controller_.GetVisibleEntry(); 950868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| is finally used 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if no title cannot be retrieved. 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_title_when_no_navigation_entry_; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() { 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetMaxPageIDForSiteInstance(GetSiteInstance()); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance( 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end()) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = -1; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return max_page_ids_[site_instance->GetId()]; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) { 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance( 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, int32 page_id) { 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetMaxPageIDForSiteInstance(site_instance) < page_id) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = page_id; 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContentsImpl* web_contents) { 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_ = web_contents->max_page_ids_; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const { 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host()->GetSiteInstance(); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const { 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* dest_rvh = render_manager_.pending_render_view_host() ? 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_render_view_host() : 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.current_host(); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest_rvh->GetSiteInstance(); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_loading_; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const { 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return waiting_for_response_; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const { 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& WebContentsImpl::GetLoadStateHost() const { 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_host_; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const { 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_size_; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const { 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_position_; 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::set<GURL> WebContentsImpl::GetSitesInTab() const { 10227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BrowserContext* browser_context = GetBrowserContext(); 10237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::set<GURL> sites; 10247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!frame_tree_root_.get()) 10257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return sites; 10267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Iterates over the FrameTreeNodes to find each unique site URL that is 10287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // currently committed. 10297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FrameTreeNode* node = NULL; 10307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::queue<FrameTreeNode*> queue; 10317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) queue.push(frame_tree_root_.get()); 10327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (!queue.empty()) { 10347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) node = queue.front(); 10357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) queue.pop(); 10367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) sites.insert(SiteInstance::GetSiteForURL(browser_context, 10377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) node->current_url())); 10387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (size_t i = 0; i < node->child_count(); ++i) 10407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) queue.push(node->child_at(i)); 10417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return sites; 10447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 10457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return encoding_; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return displayed_insecure_content_; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::IncrementCapturerCount() { 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!is_being_destroyed_); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++capturer_count_; 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DecrementCapturerCount() { 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --capturer_count_; 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "There are now " << capturer_count_ 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " capturing(s) of WebContentsImpl@" << this; 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_LE(0, capturer_count_); 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_being_destroyed_) 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // While capturer_count_ was greater than zero, the WasHidden() calls to RWHV 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // were being prevented. If there are no more capturers, make the call now. 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capturer_count_ == 0 && !should_normally_be_visible_) { 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Executing delayed WasHidden()."; 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WasHidden(); 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED || 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status, 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == crashed_status_) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ = status; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_ = error_code; 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crashed_status_; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const { 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_being_destroyed_; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged(unsigned changed_flags) { 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->NavigationStateChanged(this, changed_flags); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastSelectedTime() const { 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_selected_time_; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.SetActive(true); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* rwhv = 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) { 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->WasShown(); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->SetActive(true); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_selected_time_ = base::TimeTicks::Now(); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown()); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resize rect might have changed while this was inactive -- send the new 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one to make sure it's up to date. 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->ResizeRectChanged(GetRootWindowResizerRect()); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = true; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED, 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Details<const bool>(&should_normally_be_visible_)); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() { 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there are entities capturing screenshots or video (e.g., mirroring), 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // don't activate the "disable rendering" optimization. 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (capturer_count_ == 0) { 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |GetRenderViewHost()| can be NULL if the user middle clicks a link to 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // open a tab in the background, then closes the tab before selecting it. 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is because closing the tab calls WebContentsImpl::Destroy(), which 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removes the |GetRenderViewHost()|; then when we actually destroy the 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window, OnWindowPosChanged() notices and calls WasHidden() (which 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls us). 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* rwhv = 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->WasHidden(); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_normally_be_visible_ = false; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED, 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Details<const bool>(&should_normally_be_visible_)); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() { 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Should we fire even for interstitial pages? 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WillNotifyDisconnection() && 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !ShowingInterstitialPage() && 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !static_cast<RenderViewHostImpl*>( 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost())->SuddenTerminationAllowed(); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() { 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.Stop(); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, StopNavigation()); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() { 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use our current SiteInstance since the cloned entry will use it anyway. 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We pass our own opener so that the cloned page can access it if it was 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before. 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateParams create_params(GetBrowserContext(), GetSiteInstance()); 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.initial_size = view_->GetContainerSize(); 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* tc = CreateWithOpener(create_params, opener_); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tc->GetController().CopyStateFrom(controller_); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCloneToNewWebContents(this, tc)); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tc; 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type, 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != pending_widget_views_.end(); ++i) { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host->GetView() == i->second) { 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(i); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::Init(const WebContents::CreateParams& params) { 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_manager_.Init( 1213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.browser_context, params.site_instance, params.routing_id, 1214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.main_frame_routing_id); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_.reset(GetContentClient()->browser()-> 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OverrideCreateWebContentsView(this, &render_view_host_delegate_view_)); 1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(render_view_host_delegate_view_); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate = 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetContentClient()->browser()->GetWebContentsViewDelegate(this); 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_guest_) { 12257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // |render_view_host_delegate_view_| is a WebContentsView* and its 12267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // lifetime is managed by its associated WebContentsImpl. 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsViewPort* platform_view = CreateWebContentsView( 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_); 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsViewGuest* rv = new WebContentsViewGuest( 12317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) this, browser_plugin_guest_.get(), platform_view, 12327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_host_delegate_view_); 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_host_delegate_view_ = rv; 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(rv); 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Regular WebContentsView. 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(CreateWebContentsView( 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(render_view_host_delegate_view_); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(view_.get()); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size initial_size = params.initial_size; 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateView(initial_size, params.context); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for whether our opener gets destroyed. 124890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (opener_) 124990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(opener_); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllBrowserContextsAndSources()); 12547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_bridge_dispatcher_host_manager_.reset( 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new JavaBridgeDispatcherHostManager(this)); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_chooser_.reset(new DateTimeChooserAndroid()); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { 126590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(web_contents); 126690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the opener if it has been closed. 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents == opener_) { 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_ = NULL; 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear a pending contents that has been closed before being shown. 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (PendingContents::iterator iter = pending_contents_.begin(); 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != pending_contents_.end(); 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->second != web_contents) 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_contents_.erase(iter); 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) { 128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!ContainsKey(destruction_observers_, web_contents)) { 128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_[web_contents] = 128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new DestructionObserver(this, web_contents); 128890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 129190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) { 129290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DestructionObservers::iterator iter = 129390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.find(web_contents); 129490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (iter != destruction_observers_.end()) { 129590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete destruction_observers_[web_contents]; 129690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) destruction_observers_.erase(iter); 129790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 129890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 129990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() { 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ActivateContents(this); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() { 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DeactivateContents(this); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() { 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostCapture(); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted( 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host) { 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_being_destroyed_) { 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |created_widgets_| might have been destroyed. 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<RenderWidgetHostImpl*>::iterator iter = 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.find(render_widget_host); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != created_widgets_.end()) 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.erase(iter); 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host && 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) { 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidDestroyFullscreenWidget( 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_)); 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_ = MSG_ROUTING_NONE; 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent( 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ && 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 13537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (browser_plugin_embedder_ && 13547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_plugin_embedder_->HandleKeyboardEvent(event)) { 13557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 13567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 13577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleKeyboardEvent(this, event); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsImpl::PreHandleWheelEvent( 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebMouseWheelEvent& event) { 1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_MACOSX) 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On platforms other than Mac, control+mousewheel changes zoom. On Mac, this 1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // isn't done for two reasons: 1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -the OS already has a gesture to do this through pinch-zoom 1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // -if a user starts an inertial scroll, let's go, and presses control 1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (i.e. control+tab) then the OS's buffered scroll events will come in 1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // with control key set which isn't what the user wants 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_ && 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.wheelTicksY && 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (event.modifiers & WebKit::WebInputEvent::ControlKey)) { 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->ContentsZoomChange(event.wheelTicksY > 0); 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return accessible_parent_; 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() { 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseDown(); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() { 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseUp(); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() { 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandlePointerActivate(); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() { 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureBegin(); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() { 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureEnd(); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) { 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen); 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const { 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture, 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(false); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() { 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostMouseLock(); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow( 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 1438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int main_frame_route_id, 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_CreateWindow_Params& params, 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespace* session_storage_namespace) { 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && !delegate_->ShouldCreateWebContents( 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, route_id, params.window_container_type, params.frame_name, 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.target_url)) { 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id); 1445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView( 1446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) main_frame_route_id); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We usually create the new window in the same BrowsingInstance (group of 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script-related windows), by passing in the current SiteInstance. However, 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the opener is being suppressed (in a non-guest), we create a new 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SiteInstance in its own BrowsingInstance. 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_guest = GetRenderProcessHost()->IsGuest(); 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SiteInstance> site_instance = 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.opener_suppressed && !is_guest ? 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) : 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSiteInstance(); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the new web contents. This will automatically create the new 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContentsView. In the future, we may want to create the view separately. 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebContentsImpl(GetBrowserContext(), 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_suppressed ? NULL : this); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must assign the SessionStorageNamespace before calling Init(). 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/142685 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& partition_id = 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()-> 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStoragePartitionIdForSite(GetBrowserContext(), 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetSiteURL()); 1474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StoragePartition* partition = BrowserContext::GetStoragePartition( 1475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetBrowserContext(), site_instance.get()); 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOMStorageContextImpl* dom_storage_context = 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<DOMStorageContextImpl*>(partition->GetDOMStorageContext()); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespaceImpl* session_storage_namespace_impl = 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->GetController().SetSessionStorageNamespace( 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partition_id, 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace); 1484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateParams create_params(GetBrowserContext(), site_instance.get()); 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = route_id; 1486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) create_params.main_frame_routing_id = main_frame_route_id; 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_guest) { 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.context = view_->GetNativeView(); 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.initial_size = view_->GetContainerSize(); 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This makes |new_contents| act as a guest. 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int instance_id = GetBrowserPluginGuestManager()->get_next_instance_id(); 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* new_contents_impl = 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<WebContentsImpl*>(new_contents); 1496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserPluginGuest::CreateWithOpener(instance_id, new_contents_impl, 1497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetBrowserPluginGuest(), !!new_contents_impl->opener()); 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_contents->Init(create_params); 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Save the window for later if we're not suppressing the opener (since it 1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will be shown immediately). 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.opener_suppressed) { 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_guest) { 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsViewPort* new_view = new_contents->view_.get(); 1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(brettw): It seems bogus that we have to call this function on the 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // newly created object and give it one of its own member variables. 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created window associated with the route so we can show it 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(MSG_ROUTING_NONE, route_id); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_[route_id] = new_contents; 151590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddDestructionObserver(new_contents); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebContentsCreated( 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, params.opener_frame_id, params.frame_name, 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.target_url, new_contents); 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.opener_suppressed) { 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the opener is suppressed, the original renderer cannot access the 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window. As a result, we need to show and navigate the window here. 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_blocked = false; 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect initial_pos; 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->AddNewContents( 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new_contents, params.disposition, initial_pos, 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.user_gesture, &was_blocked); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_blocked) { 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams open_params(params.target_url, 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(), 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* is_renderer_initiated */); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->OpenURL(open_params); 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int route_id, 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPopupType popup_type) { 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNewWidget(route_id, false, popup_type); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int route_id) { 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNewWidget(route_id, true, WebKit::WebPopupTypeNone); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int route_id, 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPopupType popup_type) { 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* process = GetRenderProcessHost(); 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* widget_host = 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RenderWidgetHostImpl(this, process, route_id); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.insert(widget_host); 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostViewPort* widget_view = RenderWidgetHostViewPort::FromRWHV( 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CreateViewForPopupWidget(widget_host)); 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!widget_view) 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_fullscreen) { 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Popups should not get activated. 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_view->SetPopupType(popup_type); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created widget associated with the route so we can show it later. 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_[route_id] = widget_view; 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allow it to survive the trip without being hosted. 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(widget_view->GetNativeView()); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id, 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents = GetCreatedWindow(route_id); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate = GetDelegate(); 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) { 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNewContents( 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, contents, disposition, initial_pos, user_gesture, NULL); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, false, initial_pos); 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) { 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, true, gfx::Rect()); 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_); 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_widget_routing_id_ = route_id; 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_, 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidShowFullscreenWidget(route_id)); 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RenderWidgetShowing(); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* widget_host_view = 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetCreatedWidget(route_id)); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host_view) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_fullscreen) 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_host_view->InitAsFullscreen(GetRenderWidgetHostViewPort()); 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget_host_view->InitAsPopup(GetRenderWidgetHostViewPort(), initial_pos); 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host_impl = 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost()); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->Init(); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only allow privileged mouse lock for fullscreen render widget, which is 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used to implement Pepper Flash fullscreen. 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen); 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly embedded (or purposefully ignored) we can release the retain we 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // took in CreateNewWidget(). 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRelease(widget_host_view->GetNativeView()); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) { 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingContents::iterator iter = pending_contents_.find(route_id); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certain systems can block the creation of new windows. If we didn't succeed 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in creating one, just return NULL. 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_contents_.end()) { 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = iter->second; 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_.erase(route_id); 165090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(new_contents); 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't initialize the guest WebContents immediately. 1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (new_contents->GetRenderProcessHost()->IsGuest()) 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new_contents; 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_contents->GetRenderProcessHost()->HasConnection() || 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !new_contents->GetRenderViewHost()->GetView()) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): It seems bogus to reach into here and initialize the host. 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_widget_views_.end()) { 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* widget_host_view = iter->second; 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(route_id); 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost(); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host->GetProcess()->HasConnection()) { 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view has gone away or the renderer crashed. Nothing to do. 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_host_view; 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebContentsImpl::ShowContextMenu(const ContextMenuParams& params) { 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow WebContentsDelegates to handle the context menu operation first. 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->HandleContextMenu(params)) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_host_delegate_view_->ShowContextMenu(params); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission( 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MediaStreamRequest& request, 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MediaResponseCallback& callback) { 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestMediaAccessPermission(this, request, callback); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(MediaStreamDevices(), scoped_ptr<MediaStreamUI>()); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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); 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveURL(GetURL(), Referrer(), true); 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) 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML( 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file, 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(const base::FilePath&, int64)>& callback) { 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MHTMLGenerationManager::GetInstance()->GenerateMHTML(this, file, callback); 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsActiveEntry(int32 page_id) { 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* active_entry = 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl::FromNavigationEntry(controller_.GetActiveEntry()); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (active_entry != NULL && 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_entry->site_instance() == GetSiteInstance() && 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_entry->GetPageID() == page_id); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const { 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const { 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_disconnection_; 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() { 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_.clear(); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &renderer_preferences_; 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() { 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(GetRenderViewHost()); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceEndedAt(int client_x, int client_y, 1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int screen_x, int screen_y, WebKit::WebDragOperation operation) { 1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceEndedAt(client_x, client_y, 1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceEndedAt(client_x, client_y, 1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y, operation); 1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::DragSourceMovedTo(int client_x, int client_y, 1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int screen_x, int screen_y) { 1959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->DragSourceMovedTo(client_x, client_y, 1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y); 1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetRenderViewHost()) 1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRenderViewHostImpl()->DragSourceMovedTo(client_x, client_y, 1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_x, screen_y); 1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() { 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetRenderViewHost()) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->DragSourceSystemDragEnded(); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DragEnded(); 1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_.get()) 1973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_embedder_->SystemDragEnded(); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() { 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) { 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_ = value; 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const { 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closed_by_user_gesture_; 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double WebContentsImpl::GetZoomLevel() const { 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMapImpl* zoom_map = static_cast<HostZoomMapImpl*>( 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMap::GetForBrowserContext(GetBrowserContext())); 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!zoom_map) 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double zoom_level; 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (temporary_zoom_settings_) { 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = zoom_map->GetTemporaryZoomLevel( 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderProcessHost()->GetID(), GetRenderViewHost()->GetRoutingID()); 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* active_entry = GetController().GetActiveEntry(); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since zoom map is updated using rewritten URL, use rewritten URL 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to get the zoom level. 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = active_entry ? active_entry->GetURL() : GURL::EmptyGURL(); 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) zoom_level = zoom_map->GetZoomLevelForHostAndScheme(url.scheme(), 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::GetHostOrSpecFromURL(url)); 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zoom_level; 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetZoomPercent(bool* enable_increment, 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* enable_decrement) const { 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = *enable_increment = false; 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the zoom percent from the factor. Round up to the nearest whole 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number. 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int percent = static_cast<int>( 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebView::zoomLevelToZoomFactor(GetZoomLevel()) * 100 + 0.5); 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = percent > minimum_zoom_percent_; 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_increment = percent < maximum_zoom_percent_; 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return percent; 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() { 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* active_entry = GetController().GetActiveEntry(); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!active_entry) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ViewSourceForTab(this, active_entry->GetURL()); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url, 203490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->ViewSourceForFrame(this, url, page_state); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const { 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return minimum_zoom_percent_; 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const { 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return maximum_zoom_percent_; 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const { 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return preferred_size_; 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetContentRestrictions() const { 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_restrictions_; 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost() ? 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false; 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const { 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_ != NULL; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) { 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_DidChooseColorResponse( 206890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetRoutingID(), color_chooser_identifier_, color)); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::DidEndColorChooser() { 207290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Send(new ViewMsg_DidEndColorChooser(GetRoutingID(), 207390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_)); 207490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_.reset(); 207590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_ = 0; 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int WebContentsImpl::DownloadImage(const GURL& url, 2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_favicon, 2080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t preferred_image_size, 2081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t max_image_size, 2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ImageDownloadCallback& callback) { 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 2084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int id = StartDownload( 2085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host, url, is_favicon, preferred_image_size, max_image_size); 2086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_[id] = callback; 20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id; 20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() { 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 209290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (entry && entry->GetURL() == GURL(kAboutBlankURL)) 20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this); 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) { 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SetFocusToLocationBar(select_all); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoadForFrame( 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 parent_frame_id, 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_error_page = (url.spec() == kUnreachableWebDataURL); 210990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_url(url); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_main_frame) 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidChangeLoadProgress(0); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Create a pending entry for this provisional load (if none exists) using the 2119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // current SiteInstance, and ensure the address bar updates accordingly. 2120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // We don't know the referrer or extra headers at this point, but the referrer 2121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // will be set properly upon commit. 2122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_main_frame && !controller_.GetPendingEntry()) { 2123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 2124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) controller_.CreateNavigationEntry(validated_url, 2125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::Referrer(), 2126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::PAGE_TRANSITION_LINK, 2127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) true /* is_renderer_initiated */, 2128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string(), GetBrowserContext())); 2129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry->set_site_instance( 2130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<SiteInstanceImpl*>(GetSiteInstance())); 2131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) controller_.SetPendingEntry(entry); 2132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL); 2133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the start of the provisional load. 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStartProvisionalLoadForFrame(frame_id, parent_frame_id, 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_main_frame, validated_url, is_error_page, 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_iframe_srcdoc, render_view_host)); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_main_frame) { 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_url, 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidRedirectProvisionalLoad( 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_url, 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& target_url) { 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Remove this method and have the pre-rendering code listen to 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ResourceDispatcherHost's RESOURCE_RECEIVED_REDIRECT notification 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instead. See http://crbug.com/78512. 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_source_url(source_url); 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_target_url(target_url); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_source_url); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_target_url); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry; 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_id == -1) { 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetPendingEntry(); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetEntryWithPageID(render_view_host->GetSiteInstance(), 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry || entry->GetURL() != validated_source_url) 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_target_url, 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError( 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_DidFailProvisionalLoadWithError_Params& params) { 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Failed Provisional Load: " << params.url.possibly_invalid_spec() 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", error_code: " << params.error_code 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", error_description: " << params.error_description 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", is_main_frame: " << params.is_main_frame 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", showing_repost_interstitial: " << 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.showing_repost_interstitial 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", frame_id: " << params.frame_id; 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_url(params.url); 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (net::ERR_ABORTED == params.error_code) { 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EVIL HACK ALERT! Ignore failed loads when we're showing interstitials. 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This means that the interstitial won't be torn down properly, which is 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bad. But if we have an interstitial, go back to another tab type, and 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then load the same interstitial again, we could end up getting the first 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interstitial's "failed" message (as a result of the cancel) when we're on 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the second one. 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't tell this apart, so we think we're tearing down the current page 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which will cause a crash later one. There is also some code in 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHostManager::RendererAbortedProvisionalLoad that is commented 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // out because of this problem. 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=2855 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because this will not tear down the interstitial properly, if "back" is 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back to another tab type, the interstitial will still be somewhat alive 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the previous tab type. If you navigate somewhere that activates the 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tab with the interstitial again, you'll see a flash before the new load 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // commits of the interstitial page. 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Discarding message during interstitial."; 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not clear the pending entry if one exists, so that the user's typed 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL is not lost when a navigation fails or is aborted. We'll allow 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the view to clear the pending entry and typed URL if the user requests. 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.RendererAbortedProvisionalLoad(render_view_host); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailProvisionalLoad(params.frame_id, 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.is_main_frame, 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) validated_url, 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.error_code, 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.error_description, 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache( 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& http_method, 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type) { 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatsCounter cache("WebKit.CacheHit"); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Increment(); 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out a notification that we loaded a resource from our memory cache. 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_id = 0; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CertStatus cert_status = 0; 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int security_bits = -1; 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_status = 0; 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeserializeSecurityInfo(security_info, &cert_id, &cert_status, 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &security_bits, &connection_status); 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadFromMemoryCacheDetails details( 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method, 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type, resource_type); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_FROM_MEMORY_CACHE, 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<NavigationController>(&controller_), 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<LoadFromMemoryCacheDetails>(&details)); 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() { 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.DisplayedInsecureContent")); 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent( 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_origin, const GURL& target_url) { 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << security_origin << " ran insecure content from " 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << target_url.possibly_invalid_spec(); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.RanInsecureContent")); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EndsWith(security_origin, kDotGoogleDotCom, false)) 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.RanInsecureContentGoogle")); 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ssl_manager()->DidRunInsecureContent(security_origin); 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLManager::NotifySSLInternalStateChanged( 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController().GetBrowserContext()); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame(int64 frame_id) { 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentLoadedInFrame(frame_id, message_source_)); 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad( 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame) { 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL validated_url(url); 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderProcessHost* render_process_host = message_source_->GetProcess(); 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishLoad(frame_id, validated_url, is_main_frame, 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_)); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFailLoadWithError( 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& error_description) { 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL validated_url(url); 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderProcessHost* render_process_host = message_source_->GetProcess(); 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailLoad(frame_id, validated_url, is_main_frame, 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_code, error_description, 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_)); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateContentRestrictions(int restrictions) { 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_restrictions_ = restrictions; 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ContentRestrictionsChanged(this); 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) { 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_ || delegate_->OnGoToEntryOffset(offset)) { 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetEntryAtOffset(offset)); 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry) 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we don't call NavigationController::GotToOffset() as we don't 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want to create a pending navigation entry (it might end up lingering 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/51680). 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTransitionType( 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransitionFromInt( 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType() | 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_FORWARD_BACK)); 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToEntry(*entry, NavigationControllerImpl::NO_RELOAD); 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the entry is being restored and doesn't have a SiteInstance yet, fill 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it in now that we know. This allows us to find the entry when it commits. 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry->site_instance() && 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->restore_type() != NavigationEntryImpl::RESTORE_NONE) { 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->set_site_instance( 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SiteInstanceImpl*>(GetPendingSiteInstance())); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent, 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maximum_percent, 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remember) { 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_ = minimum_percent; 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_ = maximum_percent; 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temporary_zoom_settings_ = !remember; 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSaveURL(const GURL& url, 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer) { 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordDownloadSource(INITIATED_BY_PEPPER_SAVE); 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the URL to save matches the URL of the main frame. Since this 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message originates from Pepper plugins, it may not be the case if the 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin is an embedded element. 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL main_frame_url = GetURL(); 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_frame_url.is_valid()) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame = (url == main_frame_url); 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveURL(url, referrer, is_main_frame); 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id, 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy->CanReadDirectory(GetRenderProcessHost()->GetID(), path)) 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->EnumerateDirectory(this, request_id, path); 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnJSOutOfMemory() { 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->JSOutOfMemory(this); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol, 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 2390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (policy->IsPseudoScheme(protocol)) 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RegisterProtocolHandler(this, protocol, url, title, user_gesture); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id, 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindReply(this, request_id, number_of_matches, selection_rect, 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, final_update); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 240790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebContentsImpl::OnDidProgrammaticallyScroll( 240890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Vector2d& scroll_point) { 240990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (delegate_) 241090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->DidProgrammaticallyScroll(this, scroll_point); 241190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 241290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply( 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version, 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::RectF>& rects, 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::RectF& active_rect) { 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindMatchRectsReply(this, version, rects, active_rect); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnOpenDateTimeDialog( 24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ViewHostMsg_DateTimeDialogValue_Params& value) { 24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_chooser_->ShowDialog( 2425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentViewCore::FromWebContents(this), GetRenderViewHost(), 2426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) value.dialog_type, value.year, value.month, value.day, value.hour, 2427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value.minute, value.second, value.week, value.minimum, value.maximum); 24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnCrashedPlugin(const base::FilePath& plugin_path, 24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId plugin_pid) { 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginCrashed(plugin_path, plugin_pid)); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url, 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheAccessed(manifest_url, blocked_by_policy)); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser(int color_chooser_id, 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 244790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ColorChooser* new_color_chooser = delegate_->OpenColorChooser(this, color); 244890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (color_chooser_ == new_color_chooser) 244990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 245090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_.reset(new_color_chooser); 245190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_identifier_ = color_chooser_id; 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) { 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_ && 245690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_id == color_chooser_identifier_) 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->End(); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id, 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_ && 246390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) color_chooser_id == color_chooser_identifier_) 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->SetSelectedColor(color); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id, 24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hung) { 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginHungStatusChanged(plugin_child_id, path, is_hung)); 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled. 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url, 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& args) { 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebUISend(this, source_url, name, args); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission( 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 24882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path) { 24892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_) { 24902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnPpapiBrokerPermissionResult(request_id, false); 24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!delegate_->RequestPpapiBrokerPermission( 24952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, url, plugin_path, 24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult, 24972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), request_id))) { 24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnPpapiBrokerPermissionResult(request_id, false); 25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnPpapiBrokerPermissionResult(int request_id, 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result) { 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = GetRenderViewHostImpl(); 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->Send(new ViewMsg_PpapiBrokerPermissionResult(rvh->GetRoutingID(), 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result)); 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnBrowserPluginMessage(const IPC::Message& message) { 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin 25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // specific messages for this WebContents. This means that any message from 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a BrowserPlugin prior to this will be ignored. 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above classes BrowserPluginEmbedder and 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginGuest. 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!browser_plugin_embedder_.get()); 25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_.reset(BrowserPluginEmbedder::Create(this)); 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_embedder_->OnMessageReceived(message); 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::OnDidDownloadImage( 25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id, 252490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int http_status_code, 25252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& image_url, 25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int requested_size, 25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<SkBitmap>& bitmaps) { 2528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageDownloadMap::iterator iter = image_download_map_.find(id); 2529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (iter == image_download_map_.end()) { 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Currently WebContents notifies us of ANY downloads so that it is 25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // possible to get here. 25322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!iter->second.is_null()) { 253590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) iter->second.Run(id, http_status_code, image_url, requested_size, bitmaps); 25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_download_map_.erase(id); 25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::OnUpdateFaviconURL( 25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 page_id, 25422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<FaviconURL>& candidates) { 25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidUpdateFaviconURL(page_id, candidates)); 25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2547b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)FrameTreeNode* WebContentsImpl::FindFrameTreeNodeByID(int64 frame_id) { 2548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(nasko): Remove this check once we move to creating the root node 2549868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // through RenderFrameHost creation. 2550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!frame_tree_root_.get()) 2551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 2552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2553b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* node = NULL; 2554b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::queue<FrameTreeNode*> queue; 2555b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) queue.push(frame_tree_root_.get()); 2556b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2557b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) while (!queue.empty()) { 2558b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) node = queue.front(); 2559b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) queue.pop(); 2560b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (node->frame_id() == frame_id) 2561b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return node; 2562b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2563b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (size_t i = 0; i < node->child_count(); ++i) 2564b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) queue.push(node->child_at(i)); 2565b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2566b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2567b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return NULL; 2568b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2569b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2570b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void WebContentsImpl::OnFrameAttached( 2571b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int64 parent_frame_id, 2572b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int64 frame_id, 2573b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& frame_name) { 2574b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* parent = FindFrameTreeNodeByID(parent_frame_id); 2575b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!parent) 2576b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 2577b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2578b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* node = new FrameTreeNode(frame_id, frame_name); 2579b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) parent->AddChild(node); 2580b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2581b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2582b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void WebContentsImpl::OnFrameDetached(int64 parent_frame_id, int64 frame_id) { 25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FrameDetached(message_source_, frame_id)); 2585b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2586b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* parent = FindFrameTreeNodeByID(parent_frame_id); 2587b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!parent) 2588b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 2589b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2590b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) parent->RemoveChild(frame_id); 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidChangeVisibleSSLState() { 25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidChangeVisibleSSLState()); 25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifyBeforeFormRepostWarningShow() { 25992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BeforeFormRepostWarningShow()); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loading, or done loading and calls the base implementation. 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsLoading(bool is_loading, 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNotificationDetails* details) { 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading == is_loading_) 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading) { 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE, string16()); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_.clear(); 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = 0; 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = 0; 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.SetIsLoading(is_loading); 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = is_loading; 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_ = is_loading; 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LoadingStateChanged(this); 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD); 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_loading) 26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0("browser", "WebContentsImpl Loading", this); 26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_END0("browser", "WebContentsImpl Loading", this); 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP; 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDetails det = NotificationService::NoDetails(); 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details) 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) det = Details<LoadNotificationDetails>(details); 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, Source<NavigationController>(&controller_), det); 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit( 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadCommittedDetails& details, 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.is_navigation_to_different_page()) { 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the status bubble. This is a workaround for a bug where WebKit 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // doesn't let us know that the cursor left an element during a 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transition (this is also why the mouse cursor remains as a hand after 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clicking on a link); see bugs 1184641 and 980803. We don't want to 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clear the bubble when a user navigates to a named anchor in the same 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTargetURL(details.entry->GetPageID(), GURL()); 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!details.is_in_page) { 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once the main frame is navigated, we're no longer considered to have 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // displayed insecure content. 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = false; 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateMainFrame(details, params)); 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit( 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadCommittedDetails& details, 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we navigate off the page, reset JavaScript state. This does nothing 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to prevent a malicious script from spamming messages, since the script 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could just reload the page to stop blocking. 26692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dialog_manager_ && !details.is_in_page) { 26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_->ResetJavaScriptState(this); 26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_ = NULL; 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateAnyFrame(details, params)); 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool WebContentsImpl::ShouldAssignSiteForURL(const GURL& url) { 2680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Neither about:blank nor the chrome-native: scheme should "use up" a new 2681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // SiteInstance. In both cases, the SiteInstance can still be used for a 2682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // normal web site. 2683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return !url.SchemeIs(chrome::kChromeNativeScheme) && 2684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch url != GURL(kAboutBlankURL); 2685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2686eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) { 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are creating a RVH for a restored controller, then we need to make 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the RenderView starts with a next_page_id_ larger than the number 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of restored entries. This must be called before the RenderView starts 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating (to avoid a race between the browser updating max_page_id and 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the renderer updating next_page_id_). Because of this, we only call this 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from CreateRenderView and allow that to notify the RenderView for us. 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_restored_page_id = controller_.GetMaxRestoredPageID(); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_restored_page_id > 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(rvh->GetSiteInstance())) 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(), 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_restored_page_id); 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry, 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) { 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For file URLs without a title, use the pathname instead. In the case of a 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synthesized title, we don't want the update to count toward the "one set 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per page of the title to history." 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 final_title; 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool explicit_set; 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry && entry->GetURL().SchemeIsFile() && title.empty()) { 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_title = UTF8ToUTF16(entry->GetURL().ExtractFileName()); 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = false; // Don't count synthetic titles toward the set limit. 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimWhitespace(title, TRIM_ALL, &final_title); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = true; 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a page is created via window.open and never navigated, 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there will be no navigation entry. In this situation, 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| will be used for page title. 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_title == entry->GetTitle()) 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTitle(final_title); 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_title_when_no_navigation_entry_ == final_title) 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_title_when_no_navigation_entry_ = final_title; 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, set the title for the view. 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetPageTitle(final_title); 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<NavigationEntry*, bool> details = 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(entry, explicit_set); 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<NavigationEntry*, bool> >(&details)); 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifySwapped(RenderViewHost* old_render_view_host) { 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After sending out a swap notification, we need to send a disconnect 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification so that clients that pick up a pointer to |this| can NULL the 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer. See Bug 1230284. 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_SWAPPED, 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 27532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Details<RenderViewHost>(old_render_view_host)); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that the associated embedder gets cleared after a RenderViewHost 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets swapped, so we don't reuse the same embedder next time a 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is attached to this WebContents. 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveBrowserPluginEmbedder(); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyConnected() { 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_CONNECTED, 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() { 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notify_disconnection_) 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = false; 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::NotifyNavigationEntryCommitted( 2781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const LoadCommittedDetails& load_details) { 2782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FOR_EACH_OBSERVER( 2783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContentsObserver, observers_, NavigationEntryCommitted(load_details)); 2784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_view_host_delegate_view_; 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegate::RendererManagement* 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::GetRendererManagementDelegate() { 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &render_manager_; 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs( 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context) const { 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_; 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() { 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetRootWindowResizerRect(); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() { 2811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_plugin_embedder_) 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_.reset(); 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send notifications if we are just creating a swapped-out RVH for 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the opener chain. These won't be used for view-source or WebUI, so it's 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ok to return early. 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(render_view_host)->is_swapped_out()) 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<RenderViewHost>(render_view_host)); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry) 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're creating views, we're still doing initial setup, so we always 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the pending Web UI rather than any possibly existing committed one. 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.pending_web_ui()) 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_web_ui()->RenderViewCreated(render_view_host); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry->IsViewSourceMode()) { 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put the renderer in view source mode. 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->Send( 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID())); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->RenderViewCreated(render_view_host); 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, observers_, RenderViewCreated(render_view_host)); 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify the world, since this came from a renderer in the 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyConnected(); 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_crashed = IsCrashed(); 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0); 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the focus to the tab (otherwise the focus will be on the top 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window). 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_crashed && !FocusLocationBarByDefault() && 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) { 28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Focus(); 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady()); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsImpl::RenderViewTerminated(RenderViewHost* rvh, 2872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TerminationStatus status, 2873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int error_code) { 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pending page's RenderViewHost is gone. 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(false, NULL); 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(status, error_code); 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetView()->OnTabCrashed(GetCrashedStatus(), crashed_error_code_); 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewGone(GetCrashedStatus())); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.RenderViewDeleted(rvh); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigate( 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 2897b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // If we don't have a frame tree root yet, this is the first navigation in 2898b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // using the current RenderViewHost, so we need to create it with the proper 2899b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // frame id. 2900b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!frame_tree_root_.get()) { 2901b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(PageTransitionIsMainFrame(params.transition)); 2902b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) frame_tree_root_.reset(new FrameTreeNode(params.frame_id, std::string())); 2903b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2904b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 29052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PageTransitionIsMainFrame(params.transition)) { 29062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When overscroll navigation gesture is enabled, a screenshot of the page 29072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in its current state is taken so that it can be used during the 29082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // nav-gesture. It is necessary to take the screenshot here, before calling 29092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RenderViewHostManager::DidNavigateMainFrame, because that can change 29102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents::GetRenderViewHost to return the new host, instead of the one 29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that may have just been swapped out. 29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_ && delegate_->CanOverscrollContent()) 29132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_.TakeScreenshot(); 29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.DidNavigateMainFrame(rvh); 29162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2918b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // We expect to have a valid frame tree root node at all times when 2919b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // navigating. 2920b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(frame_tree_root_.get()); 2921b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the site of the SiteInstance if it doesn't have one yet, unless 2923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // assigning a site is not necessary for this URL. In that case, the 2924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // SiteInstance can still be considered unused until a navigation to a real 2925eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // page. 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<SiteInstanceImpl*>(GetSiteInstance())->HasSite() && 2927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShouldAssignSiteForURL(params.url)) { 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SiteInstanceImpl*>(GetSiteInstance())->SetSite(params.url); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to update MIME type here because it's referred to in 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateNavigationCommands() called by RendererDidNavigate() to 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // determine whether or not to enable the encoding menu. 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's updated only for the main frame. For a subframe, 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderView::UpdateURL does not set params.contents_mime_type. 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (see http://code.google.com/p/chromium/issues/detail?id=2929 ) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jungshik): Add a test for the encoding menu to avoid 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // regressing it again. 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PageTransitionIsMainFrame(params.transition)) 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ = params.contents_mime_type; 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadCommittedDetails details; 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_navigate = controller_.RendererDidNavigate(params, &details); 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // For now, keep track of each frame's URL in its FrameTreeNode. This lets 29467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // us estimate our process count for implementing OOP iframes. 29477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(creis): Remove this when we track which pages commit in each frame. 29487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FrameTreeNode* node = FindFrameTreeNodeByID(params.frame_id); 29497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (node) 29507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) node->set_current_url(params.url); 29517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send notification about committed provisional loads. This notification is 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different from the NAV_ENTRY_COMMITTED notification which doesn't include 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the actual URL navigated to and isn't sent for AUTO_SUBFRAME navigations. 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.type != NAVIGATION_TYPE_NAV_IGNORE) { 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For AUTO_SUBFRAME navigations, an event for the main frame is generated 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that is not recorded in the navigation history. For the purpose of 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tracking navigation events, we treat this event as a sub frame navigation 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event. 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame = did_navigate ? details.is_main_frame : false; 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransition transition_type = params.transition; 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether or not a page transition was triggered by going backward or 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // forward in the history is only stored in the navigation controller's 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry list. 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (did_navigate && 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (controller_.GetActiveEntry()->GetTransitionType() & 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_FORWARD_BACK)) { 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type = PageTransitionFromInt( 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition | PAGE_TRANSITION_FORWARD_BACK); 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the commit of the provisional load. 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCommitProvisionalLoadForFrame(params.frame_id, 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_main_frame, params.url, transition_type, rvh)); 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!did_navigate) 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // No navigation happened. 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the appropriate notification (best) or you can add it to 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary, please). 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run post-commit tasks. 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.is_main_frame) { 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateMainFramePostCommit(details, params); 29882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) { 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DidNavigateMainFramePostCommit(this); 29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 29912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateAnyFramePostCommit(rvh, details, params); 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh, 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 299890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const PageState& page_state) { 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that this state update comes from either the active RVH or one of 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the swapped out RVHs. We don't expect to hear from any other RVHs. 3001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(rvh == GetRenderViewHost() || render_manager_.IsOnSwappedOutList(rvh)); 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must be prepared to handle state updates for any page, these occur 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the user is scrolling and entering form data, as well as when we're 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leaving a page, in which case our state may have already been moved to 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the next page. The navigation controller will look up the appropriate 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationEntry and update it when it is notified via the delegate. 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entry_index = controller_.GetEntryIndexWithPageID( 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_index < 0) 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 301590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (page_state == entry->GetPageState()) 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 301790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) entry->SetPageState(page_state); 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.NotifyEntryChanged(entry, entry_index); 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderViewHost* rvh, 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::TextDirection title_direction) { 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a title, that's a pretty good indication that we've started 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getting useful data. 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to find the navigation entry, which might not be the current one. 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For example, it might be from a pending RVH for the pending entry. 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* entry = controller_.GetEntryWithPageID( 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can handle title updates when we don't have an entry in 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateTitleForEntry, but only if the update is from the current RVH. 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry && rvh != GetRenderViewHost()) 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evan): make use of title_direction. 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=27094 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!UpdateTitleForEntry(entry, title)) 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Broadcast notifications when the UI should be updated. 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry == controller_.GetEntryAtOffset(0)) 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderViewHost* render_view_host, 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& encoding) { 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) { 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->UpdateTargetURL(this, page_id, url); 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) { 30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The UI may be in an event-tracking loop, such as between the 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse-down and mouse-up in text selection or a button click. 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer the close until after tracking is complete, so that we 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't free objects out from under the UI. 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(shess): This could get more fine-grained. For instance, 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing a tab in another window while selecting text in the 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current window's Omnibox should be just fine. 30682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_->IsEventTracking()) { 30692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->CloseTabAfterEventTracking(); 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore this if it comes from a RenderViewHost that we aren't showing. 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->CloseContents(this); 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SwappedOut(RenderViewHost* rvh) { 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SwappedOut(this); 30827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Allow the navigation to proceed. 30847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_manager_.SwappedOut(rvh); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) { 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->IsPopupOrPanel(this)) 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->MoveContents(this, new_bounds); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStartLoading(RenderViewHost* render_view_host) { 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(true, NULL); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && content_restrictions_) 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUpdateContentRestrictions(0); 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStartLoading(render_view_host)); 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderViewHost* render_view_host) { 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoadNotificationDetails> details; 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use the last committed entry rather than the active one, in case a 3107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // pending entry has been created. 3108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationEntry* entry = controller_.GetLastCommittedEntry(); 3109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An entry may not exist for a stop when loading an initial blank page or 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if an iframe injected by script into a blank page finishes loading. 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta elapsed = base::TimeTicks::Now() - current_load_start_; 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.reset(new LoadNotificationDetails( 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetVirtualURL(), 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType(), 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elapsed, 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &controller_, 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetCurrentEntryIndex())); 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(false, details.get()); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStopLoading(render_view_host)); 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() { 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the URL display. 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidChangeLoadProgress(double progress) { 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LoadProgressChanged(this, progress); 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) { 3145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (opener_) { 3146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clear our opener so that future cross-process navigations don't have an 3147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // opener assigned. 314890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveDestructionObserver(opener_); 3149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) opener_ = NULL; 3150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Notify all swapped out RenderViewHosts for this tab. This is important 31532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in case we go back to them, or if another window in those processes tries 31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to access window.opener. 31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_manager_.DidDisownOpener(rvh); 31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebContentsImpl::DidAccessInitialDocument() { 3159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Update the URL display. 3160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NotifyNavigationStateChanged(content::INVALIDATE_TYPE_URL); 3161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame( 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentAvailableInMainFrame()); 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompletedInMainFrame( 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id) { 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<int>(&page_id)); 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderViewHost* rvh, 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 source_frame_id, 31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_cross_site_redirect) { 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this came from a swapped out RenderViewHost, we only allow the request 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if we are still in the same BrowsingInstance. 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() && 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) { 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate to RequestTransferURL because this is just the generic 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case where |old_request_id| is empty. 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestTransferURL(url, referrer, disposition, source_frame_id, 31942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GlobalRequestID(), is_cross_site_redirect); 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestTransferURL( 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 source_frame_id, 32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GlobalRequestID& old_request_id, 32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_cross_site_redirect) { 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = NULL; 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransition transition_type = PAGE_TRANSITION_LINK; 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.web_ui()) { 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're a Web UI, it will provide a page transition type for us (this 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is so the new tab page can specify AUTO_BOOKMARK for automatically 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generated suggestions). 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note also that we hide the referrer for Web UI pages. We don't really 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want web sites to see a referrer of "chrome://blah" (and some 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome: URLs might have search terms or other stuff we don't want to 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send to the site), so we send no referrer. 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams params(url, Referrer(), source_frame_id, disposition, 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.web_ui()->GetLinkTransitionType(), 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* is_renderer_initiated */); 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_global_request_id = old_request_id; 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents = OpenURL(params); 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type = render_manager_.web_ui()->GetLinkTransitionType(); 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams params(url, referrer, source_frame_id, disposition, 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, true /* is_renderer_initiated */); 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_global_request_id = old_request_id; 32252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.is_cross_site_redirect = is_cross_site_redirect; 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents = OpenURL(params); 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_contents) { 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidOpenRequestedURL(new_contents, 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition, 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type, 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_frame_id)); 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the active RenderViewHost to run unload handlers and close, as long 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the request came from a RenderViewHost in the same BrowsingInstance. 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->ClosePage(); 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent( 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only deliver the message to the active RenderViewHost if the request 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // came from a RenderViewHost in the same BrowsingInstance or if this 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents is dedicated to a browser plugin guest. 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This check means that an embedder could theoretically receive a 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // postMessage from anyone (not just its own guests). However, this is 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probably not a risk for apps since other pages won't have references 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to App windows. 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params new_params(params); 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a source_routing_id, translate it to the routing ID for 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the equivalent swapped out RVH in the target process. If we need 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to create a swapped out RVH for the source tab, we create its opener 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chain as well, since those will also be accessible to the target page. 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_params.source_routing_id != MSG_ROUTING_NONE) { 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to look up the WebContents for the source page. 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* source_contents = NULL; 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID(), params.source_routing_id); 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_rvh) { 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents = static_cast<WebContentsImpl*>( 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_rvh->GetDelegate()->GetAsWebContents()); 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_contents) { 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBrowserPluginGuest()) { 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create a swapped out RenderView for the embedder in the guest's 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // render process but we intentionally do not expose the embedder's 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener chain to it. 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateSwappedOutRenderView(GetSiteInstance()); 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateOpenerRenderViews(GetSiteInstance()); 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We couldn't find it, so don't pass a source frame. 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = MSG_ROUTING_NONE; 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunJavaScriptMessage( 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& default_prompt, 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JavaScriptMessageType javascript_message_type, 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_suppress_message) { 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress JavaScript dialogs when requested. Also suppress messages when 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showing an interstitial as it's shown over the previous page and we don't 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want the hidden page's dialogs to interfere with the interstitial. 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suppress_this_message = 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() || 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowingInterstitialPage() || 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_ || 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ShouldSuppressDialogs() || 33192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !delegate_->GetJavaScriptDialogManager(); 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!suppress_this_message) { 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_lang = GetContentClient()->browser()-> 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAcceptLangs(GetBrowserContext()); 33242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 33252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_->RunJavaScriptDialog( 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url.GetOrigin(), 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accept_lang, 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) javascript_message_type, 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_prompt, 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnDialogClosed, 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh, 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_msg), 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &suppress_this_message); 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_this_message) { 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are suppressing messages, just reply as if the user immediately 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pressed "Cancel". 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDialogClosed(rvh, reply_msg, false, string16()); 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_suppress_message = suppress_this_message; 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunBeforeUnloadConfirm(RenderViewHost* rvh, 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_reload, 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg) { 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WillRunBeforeUnloadConfirm(); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suppress_this_message = 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->is_swapped_out() || 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_ || 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ShouldSuppressDialogs() || 33602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !delegate_->GetJavaScriptDialogManager(); 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_this_message) { 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The reply must be sent to the RVH that sent the request. 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->JavaScriptDialogClosed(reply_msg, true, string16()); 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = true; 33682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_ = delegate_->GetJavaScriptDialogManager(); 33692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_->RunBeforeUnloadDialog( 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, message, is_reload, 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), rvh, 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_msg)); 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level, 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& source_id) { 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AddMessageToConsole(this, level, message, line_no, 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_id); 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs() { 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want to base the page config off of the real URL, rather than the 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display URL. 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = controller_.GetActiveEntry() 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetWebkitPrefs(GetRenderViewHost(), url); 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView( 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.CreateRenderView(instance, MSG_ROUTING_NONE, true); 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() { 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh) // NULL in unittests. 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rdh->OnUserGesture(this); 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() { 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent()); 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh, 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_during_unload) { 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't show hung renderer dialog for a swapped out RVH. 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore renderer unresponsive event if debugger is attached to the tab 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the event may be a result of the renderer sitting on a breakpoint. 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/65458 34232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (DevToolsAgentHost::IsDebuggerAttached(this)) 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_during_unload) { 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hang occurred while firing the beforeunload/unload handler. 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend the handler fired so tab closing continues as if it had. 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->set_sudden_termination_allowed(true); 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!render_manager_.ShouldCloseTabOnUnresponsiveRenderer()) 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab hangs in the beforeunload/unload handler there's really 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nothing we can do to recover. Pretend the unload listeners have 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all fired and close the tab. If the hang is in the beforeunload handler 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then the user will not have the option of cancelling the close. 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(rvh); 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive()) 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererUnresponsive(this); 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) { 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererResponsive(this); 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged( 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::LoadStateWithParam& load_state, 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_position, 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_size) { 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = load_state; 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = upload_position; 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = upload_size; 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_ = net::IDNToUnicode(url.host(), 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext())); 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_state_.state == net::LOAD_STATE_READING_RESPONSE) 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsLoading()) { 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB); 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WorkerCrashed() { 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WorkerCrashed(this); 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager( 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, const base::TimeTicks& proceed_time, 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 34807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 34817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadFired(proceed_time)); 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload); 3484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note: |this| might be deleted at this point. 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewGoneFromRenderManager( 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING); 3490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderViewTerminated(render_view_host, crashed_status_, crashed_error_code_); 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() { 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this is a hack. See WebContentsView::SizeContents. 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = view_->GetContainerSize(); 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here during container initialization and normal window size will be set 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. In case of tab duplication this resizing to 0x0 prevents setting 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal size later so just ignore it. 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!size.IsEmpty()) 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SizeContents(size); 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsImpl::NotifySwappedFromRenderManager(RenderViewHost* rvh) { 35052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifySwapped(rvh); 35062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the visible RVH reflects the new delegate's preferences. 35082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 35092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->SetOverscrollControllerEnabled(delegate_->CanOverscrollContent()); 35102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->RenderViewSwappedIn(render_manager_.current_host()); 3512b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3513b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FrameTreeNode* root = NULL; 3514b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RenderViewHostImpl* new_rvh = static_cast<RenderViewHostImpl*>( 3515b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) render_manager_.current_host()); 3516b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3517b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // We are doing a cross-site navigation and swapping processes. Since frame 3518b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // ids are unique to a process, we need to recreate the frame tree with the 3519b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // proper main frame id. 3520b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Note that it is possible for this method to be called before the new RVH 3521b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // has committed a navigation (if RenderViewHostManager short-circuits the 3522b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // CommitPending call because the current RVH is dead). In that case, we 3523b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // haven't heard a valid frame id to use to initialize the root node, so clear 3524b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // out the root node and the first subsequent navigation message will set it 3525b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // correctly. 3526b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (new_rvh->main_frame_id() != -1) 3527b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) root = new FrameTreeNode(new_rvh->main_frame_id(), std::string()); 3528b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3529b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) frame_tree_root_.reset(root); 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager( 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_) 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recursively create RenderViews for anything else in the opener chain. 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_->CreateOpenerRenderViews(instance); 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opener_route_id = MSG_ROUTING_NONE; 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this tab has an opener, ensure it has a RenderView in the given 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance as well. 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_) 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id = opener_->CreateOpenerRenderViews(instance); 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If any of the renderers (current, pending, or swapped out) for this 35502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebContents has the same SiteInstance, use it. 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.current_host()->GetSiteInstance() == instance) 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host()->GetRoutingID(); 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_manager_.pending_render_view_host() && 35552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_manager_.pending_render_view_host()->GetSiteInstance() == instance) 35562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_manager_.pending_render_view_host()->GetRoutingID(); 35572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = render_manager_.GetSwappedOutRenderViewHost( 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance); 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetRoutingID(); 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a swapped out RenderView in the given SiteInstance if none exists, 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setting its opener to the given route_id. Return the new view's route_id. 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.CreateRenderView(instance, opener_route_id, true); 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetController(); 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebUIImpl*>(CreateWebUI(url)); 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry* 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() { 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetLastCommittedEntry(); 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager( 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, int opener_route_id) { 35837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TRACE_EVENT0("browser", "WebContentsImpl::CreateRenderViewForRenderManager"); 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(render_view_host); 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the RenderView has been created, we need to tell it its size. 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwh_view->SetSize(view_->GetContainerSize()); 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we use the correct starting page_id in the new RenderView. 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDIfNecessary(render_view_host); 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 max_page_id = 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance()); 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<RenderViewHostImpl*>( 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)->CreateRenderView(string16(), 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id, 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_id)) { 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_OPENBSD) 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a ViewMsg_Resize to be sent, needed to make plugins show up on 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // linux. See crbug.com/83941. 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) { 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost()) 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host->WasResized(); 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDialogClosed(RenderViewHost* rvh, 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& user_input) { 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_showing_before_unload_dialog_ && !success) { 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a beforeunload dialog is canceled, we need to stop the throbber from 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spinning, since we forced it to start spinning in Navigate. 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStopLoading(rvh); 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 36247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 36257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 36267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeforeUnloadDialogCancelled()); 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = false; 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>( 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh)->JavaScriptDialogClosed(reply_msg, success, user_input); 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) { 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_ = GetContentClient()->browser()-> 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCanonicalEncodingNameByAliasName(encoding); 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SaveURL(const GURL& url, 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame) { 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* dlm = 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext::GetDownloadManager(GetBrowserContext()); 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dlm) 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 post_id = -1; 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_main_frame) { 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NavigationEntry* entry = controller_.GetActiveEntry(); 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) post_id = entry->GetPostID(); 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadUrlParameters> params( 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadUrlParameters::FromWebContents(this, url)); 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_referrer(referrer); 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_post_id(post_id); 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_prefer_cache(true); 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (post_id >= 0) 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_method("POST"); 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_prompt(true); 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dlm->DownloadUrl(params.Pass()); 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 36632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(rvh); 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwh_view->SetSize(GetView()->GetContainerSize()); 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() const { 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_guest_.get(); 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebContentsImpl::SetBrowserPluginGuest(BrowserPluginGuest* guest) { 3678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(!browser_plugin_guest_); 3679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_plugin_guest_.reset(guest); 3680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 36822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_embedder_.get(); 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPluginGuestManager* 36872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl::GetBrowserPluginGuestManager() const { 36882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<BrowserPluginGuestManager*>( 36892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetBrowserContext()->GetUserData( 36902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin::kBrowserPluginGuestManagerKeyName)); 36912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 36922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3694