web_contents_impl.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/stats_counters.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_number_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/switches.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_embedder.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/debugger/devtools_manager_impl.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/dom_storage_context_impl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_stats.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mhtml_generation_manager.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/save_package.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_data_manager_impl.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/intents/web_intents_dispatcher_impl.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/resource_dispatcher_host_impl.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/interstitial_page_impl.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/navigation_entry_impl.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/browser_plugin_messages.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/intents_messages.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_view_host_delegate_view.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/color_chooser.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_agent_host_registry.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_url_parameters.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/javascript_dialogs.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_from_memory_cache_details.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/load_notification_details.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_controller_factory.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_restriction.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mime_util.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/touch/touch_device_win.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/web_intent_data.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/web_intent_service_data.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/webpreferences.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/surface/io_surface_support_mac.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) && defined(USE_X11) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/touch/touch_factory.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined (USE_AURA) && defined(USE_X11) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cross-Site Navigations 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a WebContentsImpl is told to navigate to a different web site (as 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determined by SiteInstance), it will replace its current RenderViewHost with 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new RenderViewHost dedicated to the new SiteInstance. This works as 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follows: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Navigate determines whether the destination is cross-site, and if so, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it creates a pending_render_view_host_. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH is "suspended," so that no navigation messages are sent to 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its renderer until the onbeforeunload JavaScript handler has a chance to 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run in the current RVH. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending RVH tells CrossSiteRequestManager (a thread-safe singleton) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that it has a pending cross-site request. ResourceDispatcherHost will 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// check for this when the response arrives. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The current RVH runs its onbeforeunload handler. If it returns false, we 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cancel all the pending logic. Otherwise we allow the pending RVH to send 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the navigation request to its renderer. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// main resource load on the pending RVH. It checks CrossSiteRequestManager 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to see that it is a cross-site request, and installs a 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CrossSiteResourceHandler. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - When RDH receives a response, the BufferedResourceHandler determines 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether it is a download. If so, it sends a message to the new renderer 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// causing it to cancel the request, and the download proceeds. For now, the 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH remains until the next DidNavigate event for this 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl. This isn't ideal, but it doesn't affect any functionality. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - After RDH receives a response and determines that it is safe and not a 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download, it pauses the response to first run the old page's onunload 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handler. It does this by asynchronously calling the OnCrossSiteResponse 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// method of WebContentsImpl on the UI thread, which sends a SwapOut message 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the current RVH. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Once the onunload handler is finished, a SwapOut_ACK message is sent to 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the ResourceDispatcherHost, who unpauses the response. Data is then sent 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the pending RVH. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The pending renderer sends a FrameNavigate message that invokes the 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidNavigate method. This replaces the current RVH with the 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending RVH. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The previous renderer is kept swapped out in RenderViewHostManager in case 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the user goes back. The process only stays live if another tab is using 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it, but if so, the existing frame relationships will be maintained. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit_glue::WebPreferences; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Amount of time we wait between when a key event is received and the renderer 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is queried for its state and pushed to the NavigationEntry. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kQueryStateDelay = 5000; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSyncWaitDelay = 40; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDotGoogleDotCom[] = ".google.com"; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL CALLBACK InvalidateWindow(HWND hwnd, LPARAM lparam) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: erase is required to properly paint some widgets borders. This can 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be seen with textfields. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(hwnd, NULL, TRUE); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TRUE; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ViewMsg_Navigate_Type::Value GetNavigationType( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, const NavigationEntryImpl& entry, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (reload_type) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD_IGNORING_CACHE: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NavigationControllerImpl::NO_RELOAD: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; // Fall through to rest of function. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |RenderViewImpl::PopulateStateFromPendingNavigationParams| differentiates 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // between |RESTORE_WITH_POST| and |RESTORE|. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.restore_type() == 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetHasPostData()) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RESTORE_WITH_POST; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::RESTORE; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ViewMsg_Navigate_Type::NORMAL; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeNavigateParams(const NavigationEntryImpl& entry, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NavigationControllerImpl& controller, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Params* params) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->page_id = entry.GetPageID(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->pending_history_list_offset = controller.GetIndexOfEntry(&entry); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->current_history_list_offset = controller.GetLastCommittedEntryIndex(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->current_history_list_length = controller.GetEntryCount(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry.GetBaseURLForDataURL().is_empty()) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->base_url_for_data_url = entry.GetBaseURLForDataURL(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->history_url_for_data_url = entry.GetVirtualURL(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->referrer = entry.GetReferrer(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transition = entry.GetTransitionType(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->state = entry.GetContentState(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->navigation_type = 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNavigationType(controller.GetBrowserContext(), entry, reload_type); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->request_time = base::Time::Now(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->extra_headers = entry.extra_headers(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transferred_request_child_id = 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.transferred_global_request_id().child_id; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->transferred_request_request_id = 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.transferred_global_request_id().request_id; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->is_overriding_user_agent = entry.GetIsOverridingUserAgent(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Avoid downloading when in view-source mode. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->allow_download = !entry.IsViewSourceMode(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->is_post = entry.GetHasPostData(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(entry.GetBrowserInitiatedPostData()) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->browser_initiated_post_data.assign( 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->front(), 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->front() + 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetBrowserInitiatedPostData()->size()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reload_type == NavigationControllerImpl::RELOAD_ORIGINAL_REQUEST_URL && 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetOriginalRequestURL().is_valid() && !entry.GetHasPostData()) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may have been redirected when navigating to the current URL. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the URL the user originally intended to visit, if it's valid and if a 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // POST wasn't involved; the latter case avoids issues with sending data to 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the wrong page. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->url = entry.GetOriginalRequestURL(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->url = entry.GetURL(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->can_load_local_resources = entry.GetCanLoadLocalResources(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNavigationHeaders(params->url, ¶ms->extra_headers); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetSwitchValueAsInt( 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& switch_string, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int min_value) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string string_value = command_line.GetSwitchValueASCII(switch_string); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int int_value; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::StringToInt(string_value, &int_value)) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::max(min_value, int_value); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return min_value; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::Create( 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContents* base_web_contents) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebContentsImpl::Create( 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, site_instance, routing_id, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebContentsImpl*>(base_web_contents)); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::CreateWithSessionStorage( 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContents* base_web_contents, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SessionStorageNamespaceMap& session_storage_namespace_map) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl(browser_context, NULL); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (SessionStorageNamespaceMap::const_iterator it = 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace_map.begin(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != session_storage_namespace_map.end(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->GetController().SetSessionStorageNamespace(it->first, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->second); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->Init(browser_context, site_instance, routing_id, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebContentsImpl*>(base_web_contents)); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetDelegate()->GetAsWebContents(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl ------------------------------------------------------------- 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::WebContentsImpl( 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(NULL), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALLOW_THIS_IN_INITIALIZER_LIST(controller_(this, browser_context)), 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_delegate_view_(NULL), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_(opener), 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALLOW_THIS_IN_INITIALIZER_LIST(render_manager_(this, this, this)), 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_(0), 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_(false), 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_(net::LOAD_STATE_IDLE, string16()), 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_(0), 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_(0), 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_(false), 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capturing_contents_(false), 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_(false), 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_(false), 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_creator_(NULL), 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_box_active_(CreateEvent(NULL, TRUE, FALSE, NULL)), 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_(false), 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_web_ui_type_(WebUI::kNoWebUI), 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_(false), 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_(static_cast<int>(kMinimumZoomFactor * 100)), 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_(static_cast<int>(kMaximumZoomFactor * 100)), 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temporary_zoom_settings_(false), 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_restrictions_(0), 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_(NULL) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::~WebContentsImpl() { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_being_destroyed_ = true; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<RenderWidgetHostImpl*>::iterator iter = 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.begin(); iter != created_widgets_.end(); ++iter) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->DetachDelegate(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.clear(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear out any JavaScript state. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dialog_creator_) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_creator_->ResetJavaScriptState(this); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->End(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify any observer that have a reference on this WebContents. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DESTROYED, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this should be moved to the view. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we still have a window handle, destroy it. GetNativeView can return 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL if this contents was part of a window that closed. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetNativeView()) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host && host->GetView()) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(host->GetView())->WillWmDestroy(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnCloseStarted isn't called in unit tests. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!close_start_time_.is_null()) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks unload_start_time = close_start_time_; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!before_unload_end_time_.is_null()) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unload_start_time = before_unload_end_time_; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("Tab.Close", now - close_start_time_); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("Tab.Close.UnloadTime", now - unload_start_time); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImplDestroyed()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDelegate(NULL); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::Create( 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContentsImpl* base_web_contents) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateWithOpener(browser_context, site_instance, routing_id, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base_web_contents, NULL); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateWithOpener( 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContentsImpl* base_web_contents, 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* opener) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = new WebContentsImpl(browser_context, opener); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->Init(browser_context, site_instance, routing_id, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebContentsImpl*>(base_web_contents)); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::CreateGuest( 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int guest_instance_id, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BrowserPluginHostMsg_CreateGuest_Params& params) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = WebContentsImpl::Create( 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MSG_ROUTING_NONE, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); // base WebContents 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents_impl = 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebContentsImpl*>(new_contents); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This makes |new_contents| act as a guest. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above class BrowserPluginGuest. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents_impl->browser_plugin_guest_.reset( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserPluginGuest::Create( 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guest_instance_id, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents_impl, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents_impl->GetRenderViewHost(), 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs(RenderViewHost* rvh, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPreferences prefs; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.developer_extras_enabled = true; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.javascript_enabled = 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableJavaScript); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.web_security_enabled = 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableWebSecurity); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.plugins_enabled = 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisablePlugins); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.java_enabled = 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableJava); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.uses_page_cache = 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableFastback); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.remote_fonts_enabled = 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableRemoteFonts); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.xss_auditor_enabled = 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableXSSAuditor); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.application_cache_enabled = 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableApplicationCache); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.local_storage_enabled = 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableLocalStorage); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.databases_enabled = 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableDatabases); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.webaudio_enabled = 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableWebAudio); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.webaudio_enabled = 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableWebAudio); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.experimental_webgl_enabled = 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisable3DAPIs) && 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebGL); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableExperimentalWebGL); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.flash_3d_enabled = 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableFlash3d); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.flash_stage3d_enabled = 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableFlashStage3d); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.gl_multisampling_enabled = 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableGLMultisampling); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.privileged_webgl_extensions_enabled = 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnablePrivilegedWebGLExtensions); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.site_specific_quirks_enabled = 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableSiteSpecificQuirks); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.allow_file_access_from_file_urls = 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kAllowFileAccessFromFiles); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.show_composited_layer_borders = 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kShowCompositedLayerBorders); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.show_composited_layer_tree = 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kShowCompositedLayerTree); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.show_fps_counter = 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kShowFPSCounter); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_for_overflow_scroll_enabled = 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch( 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableAcceleratedCompositingForOverflowScroll); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.show_paint_rects = 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kShowPaintRects); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.render_vsync_enabled = 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableGpuVsync); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAcceleratedCompositing); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.force_compositing_mode = 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kForceCompositingMode) && 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableForceCompositingMode); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.fixed_position_compositing_enabled = 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableCompositingForFixedPosition); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_2d_canvas_enabled = 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAccelerated2dCanvas); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.deferred_2d_canvas_enabled = 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableDeferred2dCanvas); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_painting_enabled = 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableAcceleratedPainting); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_filters_enabled = 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuProcessHost::gpu_enabled() && 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableAcceleratedFilters); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_layers_enabled = 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_animation_enabled = 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAcceleratedLayers); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_plugins_enabled = 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAcceleratedPlugins); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_video_enabled = 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableAcceleratedVideo); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.fullscreen_enabled = 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kDisableFullScreen); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.css_sticky_position_enabled = 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebKitFeatures); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.css_regions_enabled = 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebKitFeatures); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.css_shaders_enabled = 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableCssShaders); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.css_variables_enabled = 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableExperimentalWebKitFeatures); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) && defined(USE_X11) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.device_supports_touch |= 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchFactory::GetInstance()->IsTouchDevicePresent(); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.device_supports_touch = ui::IsTouchDevicePresent(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.device_supports_mouse = false; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool default_enable_scroll_animator = true; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On CrOS, the launcher always passes in the --enable flag. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool default_enable_scroll_animator = false; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = default_enable_scroll_animator; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kEnableSmoothScrolling)) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = true; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kDisableSmoothScrolling)) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.enable_scroll_animator = false; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.visual_word_movement_enabled = 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableVisualWordMovement); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Certain GPU features might have been blacklisted. 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuDataManagerImpl* gpu_data_manager = GpuDataManagerImpl::GetInstance(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(gpu_data_manager); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 blacklist_type = gpu_data_manager->GetBlacklistedFeatures(); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blacklist_type & GPU_FEATURE_TYPE_ACCELERATED_COMPOSITING) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = false; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blacklist_type & GPU_FEATURE_TYPE_WEBGL) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.experimental_webgl_enabled = false; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blacklist_type & GPU_FEATURE_TYPE_FLASH3D) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.flash_3d_enabled = false; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blacklist_type & GPU_FEATURE_TYPE_FLASH_STAGE3D) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.flash_stage3d_enabled = false; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blacklist_type & GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_2d_canvas_enabled = false; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blacklist_type & GPU_FEATURE_TYPE_MULTISAMPLING) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.gl_multisampling_enabled = false; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blacklist_type & GPU_FEATURE_TYPE_3D_CSS) { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_layers_enabled = false; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_animation_enabled = false; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blacklist_type & GPU_FEATURE_TYPE_ACCELERATED_VIDEO) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_video_enabled = false; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accelerated video and animation are slower than regular when using a 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // software 3d rasterizer. 3D CSS may also be too slow to be worthwhile. 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gpu_data_manager->ShouldUseSoftwareRendering()) { 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_video_enabled = false; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_animation_enabled = false; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_layers_enabled = false; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_plugins_enabled = false; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID())) { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.loads_images_automatically = true; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.javascript_enabled = true; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.is_online = !net::NetworkChangeNotifier::IsOffline(); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force accelerated compositing and 2d canvas off for chrome:, about: and 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome-devtools: pages (unless it's specifically allowed). 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((url.SchemeIs(chrome::kChromeDevToolsScheme) || 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.SchemeIs(chrome::kChromeUIScheme) || 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (url.SchemeIs(chrome::kAboutScheme) && 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.spec() != chrome::kAboutBlankURL)) && 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line.HasSwitch(switches::kAllowWebUICompositing)) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = false; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_2d_canvas_enabled = false; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kDefaultTileWidth)) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.default_tile_width = 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSwitchValueAsInt(command_line, switches::kDefaultTileWidth, 1); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kDefaultTileHeight)) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.default_tile_height = 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSwitchValueAsInt(command_line, switches::kDefaultTileHeight, 1); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kMaxUntiledLayerWidth)) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.max_untiled_layer_width = 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSwitchValueAsInt(command_line, switches::kMaxUntiledLayerWidth, 1); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kMaxUntiledLayerHeight)) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.max_untiled_layer_height = 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSwitchValueAsInt(command_line, switches::kMaxUntiledLayerHeight, 1); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(scottmg): Probably Native is wrong: http://crbug.com/133312 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gfx::Screen::GetNativeScreen()->IsDIPEnabled()) { 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only apply when using DIP coordinate system as this setting interferes 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with fixed layout mode. 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.apply_default_device_scale_factor_in_compositor = true; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.fixed_position_creates_stacking_context = !command_line.HasSwitch( 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableFixedPositionCreatesStackingContext); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.gesture_tap_highlight_enabled = command_line.HasSwitch( 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableGestureTapHighlight); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.number_of_cpu_cores = base::SysInfo::NumberOfProcessors(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.apply_page_scale_factor_in_compositor = 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(cc::switches::kEnablePinchInCompositor); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.deferred_image_decoding_enabled = 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableDeferredImageDecoding); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->OverrideWebkitPrefs(rvh, url, &prefs); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable compositing in guests until we have compositing path implemented 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for guests. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh->GetProcess()->IsGuest()) { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.force_compositing_mode = false; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs.accelerated_compositing_enabled = false; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prefs; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostManager* WebContentsImpl::GetRenderManagerForTesting() { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &render_manager_; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::OnMessageReceived(RenderViewHost* render_view_host, 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetWebUI() && 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebUIImpl*>(GetWebUI())->OnMessageReceived(message)) { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<WebContentsObserver>::Iterator it(observers_); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver* observer; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer->OnMessageReceived(message)) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message handlers should be aware of which RenderViewHost sent the 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message, which is temporarily stored in message_source_. 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_ = render_view_host; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool message_is_ok = true; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP_EX(WebContentsImpl, message, message_is_ok) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IntentsHostMsg_RegisterIntentService, 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRegisterIntentService) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IntentsHostMsg_WebIntentDispatch, 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWebIntentDispatch) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache, 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidLoadResourceFromMemoryCache) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisplayInsecureContent, 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidDisplayInsecureContent) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidRunInsecureContent, 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidRunInsecureContent) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentLoadedInFrame, 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDocumentLoadedInFrame) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFinishLoad, OnDidFinishLoad) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFailLoadWithError, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidFailLoadWithError) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateContentRestrictions, 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUpdateContentRestrictions) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SaveURLAs, OnSaveURL) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_JSOutOfMemory, OnJSOutOfMemory) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler, 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRegisterProtocolHandler) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnFindReply) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_FindMatchRects_Reply, 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnFindMatchRectsReply) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_CrashedPlugin, OnCrashedPlugin) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_OpenColorChooser, OnOpenColorChooser) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_EndColorChooser, OnEndColorChooser) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_SetSelectedColorInColorChooser, 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetSelectedColorInColorChooser) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_PepperPluginHung, OnPepperPluginHung) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_WebUISend, OnWebUISend) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission, 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRequestPpapiBrokerPermission) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_CreateGuest, 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnBrowserPluginCreateGuest) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP_EX() 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_ = NULL; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!message_is_ok) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("BadMessageTerminate_RVD")); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderProcessHost()->ReceivedBadMessage(); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunFileChooser( 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params) { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RunFileChooser(this, params); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetController() { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NavigationControllerImpl& WebContentsImpl::GetController() const { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext* WebContentsImpl::GetBrowserContext() const { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetBrowserContext(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& WebContentsImpl::GetURL() const { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may not have a navigation entry yet 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry ? entry->GetVirtualURL() : GURL::EmptyGURL(); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegate* WebContentsImpl::GetDelegate() { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cbentzel): remove this debugging code? 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate == delegate_) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Detach(this); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Attach(this); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* host = render_manager_.current_host(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host ? host->GetProcess() : NULL; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* WebContentsImpl::GetRenderViewHost() const { 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host(); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetRoutingID() const { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->GetRoutingID(); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetRenderWidgetHostView() const { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.GetRenderWidgetHostView(); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsView* WebContentsImpl::GetView() const { 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_.get(); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIControllerFactory* factory = 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetWebUIControllerFactory(); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!factory) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIImpl* web_ui = new WebUIImpl(this); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIController* controller = 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory->CreateWebUIControllerForURL(web_ui, url); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller) { 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->SetController(controller); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui; 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete web_ui; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUI() const { 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.web_ui() ? render_manager_.web_ui() 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : render_manager_.pending_web_ui(); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetCommittedWebUI() const { 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.web_ui(); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetUserAgentOverride(const std::string& override) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUserAgentOverride() == override) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.user_agent_override = override; 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the new override string to the renderer. 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* host = GetRenderViewHost(); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->SyncRendererPrefs(); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload the page if a load is currently in progress to avoid having 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different parts of the page loaded using different user agents. 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent()) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ReloadIgnoringCache(true); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserAgentOverrideSet(override)); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetUserAgentOverride() const { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.user_agent_override; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& WebContentsImpl::GetTitle() const { 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transient entries take precedence. They are used for interstitial pages 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that are shown on top of existing pages. 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetTransientEntry(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_languages = 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext()); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUI* our_web_ui = render_manager_.pending_web_ui() ? 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_web_ui() : render_manager_.web_ui(); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (our_web_ui) { 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't override the title in view source mode. 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetActiveEntry(); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(entry && entry->IsViewSourceMode())) { 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the Web UI the chance to override our title. 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title = our_web_ui->GetOverriddenTitle(); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title.empty()) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the title for the last committed entry rather than a pending 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation entry. For example, when the user types in a URL, we want to 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // keep the old page's title until the new load has committed and we get a new 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title. 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetLastCommittedEntry(); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry->GetTitleForDisplay(accept_languages); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| is finally used 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if no title cannot be retrieved. 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_title_when_no_navigation_entry_; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageID() { 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetMaxPageIDForSiteInstance(GetSiteInstance()); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 WebContentsImpl::GetMaxPageIDForSiteInstance( 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_page_ids_.find(site_instance->GetId()) == max_page_ids_.end()) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = -1; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return max_page_ids_[site_instance->GetId()]; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageID(int32 page_id) { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(GetSiteInstance(), page_id); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDForSiteInstance( 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, int32 page_id) { 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetMaxPageIDForSiteInstance(site_instance) < page_id) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_[site_instance->GetId()] = page_id; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CopyMaxPageIDsFrom(WebContentsImpl* web_contents) { 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_ids_ = web_contents->max_page_ids_; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetSiteInstance() const { 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host()->GetSiteInstance(); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* WebContentsImpl::GetPendingSiteInstance() const { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* dest_rvh = render_manager_.pending_render_view_host() ? 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_render_view_host() : 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.current_host(); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest_rvh->GetSiteInstance(); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsLoading() const { 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_loading_; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsWaitingForResponse() const { 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return waiting_for_response_; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const net::LoadStateWithParam& WebContentsImpl::GetLoadState() const { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const string16& WebContentsImpl::GetLoadStateHost() const { 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return load_state_host_; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadSize() const { 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_size_; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 WebContentsImpl::GetUploadPosition() const { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upload_position_; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetEncoding() const { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return encoding_; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::DisplayedInsecureContent() const { 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return displayed_insecure_content_; 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetCapturingContents(bool cap) { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capturing_contents_ = cap; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsCrashed() const { 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (crashed_status_ == base::TERMINATION_STATUS_PROCESS_CRASHED || 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_ABNORMAL_TERMINATION || 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ == base::TERMINATION_STATUS_PROCESS_WAS_KILLED); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsCrashed(base::TerminationStatus status, 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == crashed_status_) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_status_ = status; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crashed_error_code_ = error_code; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TAB); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TerminationStatus WebContentsImpl::GetCrashedStatus() const { 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crashed_status_; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsBeingDestroyed() const { 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_being_destroyed_; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyNavigationStateChanged(unsigned changed_flags) { 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->NavigationStateChanged(this, changed_flags); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetLastSelectedTime() const { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_selected_time_; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasShown() { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.SetActive(true); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* rwhv = 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) { 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->WasShown(); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->SetActive(true); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_selected_time_ = base::TimeTicks::Now(); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, WasShown()); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resize rect might have changed while this was inactive -- send the new 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one to make sure it's up to date. 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->ResizeRectChanged(GetRootWindowResizerRect()); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = true; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED, 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<bool>(&is_visible)); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WasHidden() { 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!capturing_contents_) { 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |GetRenderViewHost()| can be NULL if the user middle clicks a link to 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // open a tab in then background, then closes the tab before selecting it. 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is because closing the tab calls WebContentsImpl::Destroy(), which 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removes the |GetRenderViewHost()|; then when we actually destroy the 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window, OnWindowPosChanged() notices and calls WasHidden() (which 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls us). 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* rwhv = 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetRenderWidgetHostView()); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->WasHidden(); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = false; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_VISIBILITY_CHANGED, 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<bool>(&is_visible)); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NeedToFireBeforeUnload() { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Should we fire even for interstitial pages? 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WillNotifyDisconnection() && 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !ShowingInterstitialPage() && 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !static_cast<RenderViewHostImpl*>( 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost())->SuddenTerminationAllowed(); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Stop() { 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.Stop(); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, StopNavigation()); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::Clone() { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use our current SiteInstance since the cloned entry will use it anyway. 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We pass |this| for the |base_web_contents| to size the view correctly, and 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // our own opener so that the cloned page can access it if it was before. 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* tc = CreateWithOpener(GetBrowserContext(), 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSiteInstance(), MSG_ROUTING_NONE, 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, opener_); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tc->GetController().CopyStateFrom(controller_); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCloneToNewWebContents(this, tc)); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tc; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsImpl::GetContentNativeView() const { 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_->GetContentNativeView(); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsImpl::GetNativeView() const { 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_->GetNativeView(); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GetContainerBounds(gfx::Rect* out) const { 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->GetContainerBounds(out); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Focus() { 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->Focus(); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Observe(int type, 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_WEB_CONTENTS_DESTROYED: 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWebContentsDestroyed(Source<WebContents>(source).ptr()); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != pending_widget_views_.end(); ++i) { 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host->GetView() == i->second) { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(i); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Init(BrowserContext* browser_context, 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebContents* base_web_contents) { 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.Init(browser_context, site_instance, routing_id); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_.reset(GetContentClient()->browser()-> 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OverrideCreateWebContentsView(this, &render_view_host_delegate_view_)); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_.get()) { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(render_view_host_delegate_view_); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate = 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetWebContentsViewDelegate( 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_.reset(CreateWebContentsView( 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, delegate, &render_view_host_delegate_view_)); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(render_view_host_delegate_view_); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(view_.get()); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have the initial size of the view be based on the size of the view of 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the passed in WebContents. 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->CreateView(base_web_contents ? 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base_web_contents->GetView()->GetContainerSize() : gfx::Size()); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for whether our opener gets destroyed. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_) { 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(opener_)); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::AllBrowserContextsAndSources()); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_JAVA_BRIDGE) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_bridge_dispatcher_host_manager_.reset( 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new JavaBridgeDispatcherHostManager(this)); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebContentsDestroyed(WebContents* web_contents) { 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the opener if it has been closed. 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents == opener_) { 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(opener_)); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_ = NULL; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Activate() { 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ActivateContents(this); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Deactivate() { 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DeactivateContents(this); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostCapture() { 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostCapture(); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderWidgetDeleted( 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host) { 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_being_destroyed_) { 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |created_widgets_| might have been destroyed. 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<RenderWidgetHostImpl*>::iterator iter = 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.find(render_widget_host); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != created_widgets_.end()) 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.erase(iter); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::PreHandleKeyboardEvent( 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NativeWebKeyboardEvent& event, 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) { 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ && 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PreHandleKeyboardEvent(this, event, is_keyboard_shortcut); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleKeyboardEvent(this, event); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseDown() { 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseDown(); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleMouseUp() { 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleMouseUp(); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandlePointerActivate() { 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandlePointerActivate(); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureBegin() { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureBegin(); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::HandleGestureEnd() { 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->HandleGestureEnd(); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ToggleFullscreenMode(bool enter_fullscreen) { 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ToggleFullscreenModeForTab(this, enter_fullscreen); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsFullscreenForCurrentTab() const { 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_ ? delegate_->IsFullscreenForTabOrPending(this) : false; 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestToLockMouse(bool user_gesture, 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_unlocked_by_target) { 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GotResponseToLockMouseRequest(false); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LostMouseLock() { 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LostMouseLock(); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWindow( 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id, 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_CreateWindow_Params& params, 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespace* session_storage_namespace) { 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && !delegate_->ShouldCreateWebContents( 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, route_id, params.window_container_type, params.frame_name, 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.target_url)) { 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We usually create the new window in the same BrowsingInstance (group of 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script-related windows), by passing in the current SiteInstance. However, 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the opener is being suppressed, we create a new SiteInstance in its own 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingInstance. 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SiteInstance> site_instance = 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_suppressed ? 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) : 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSiteInstance(); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the new web contents. This will automatically create the new 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContentsView. In the future, we may want to create the view separately. 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebContentsImpl(GetBrowserContext(), 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_suppressed ? NULL : this); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must assign the SessionStorageNamespace before calling Init(). 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/142685 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& partition_id = 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()-> 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetStoragePartitionIdForSite(GetBrowserContext(), 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetSiteURL()); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoragePartition* partition = 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext::GetStoragePartition(GetBrowserContext(), 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOMStorageContextImpl* dom_storage_context = 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<DOMStorageContextImpl*>(partition->GetDOMStorageContext()); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionStorageNamespaceImpl* session_storage_namespace_impl = 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->GetController().SetSessionStorageNamespace( 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partition_id, 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->Init(GetBrowserContext(), site_instance, route_id, this); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->set_opener_web_ui_type(GetWebUITypeForCurrentState()); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params.opener_suppressed) { 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsView* new_view = new_contents->GetView(); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): It seems bogus that we have to call this function on the 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // newly created object and give it one of its own member variables. 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created window associated with the route so we can show it 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(MSG_ROUTING_NONE, route_id); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_[route_id] = new_contents; 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebContentsCreated( 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, params.opener_frame_id, params.target_url, new_contents); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.opener_suppressed) { 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the opener is suppressed, the original renderer cannot access the 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window. As a result, we need to show and navigate the window here. 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_blocked = false; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect initial_pos; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->AddNewContents( 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new_contents, params.disposition, initial_pos, 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.user_gesture, &was_blocked); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!was_blocked) { 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams open_params(params.target_url, 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(), 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* is_renderer_initiated */); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents->OpenURL(open_params); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int route_id, 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPopupType popup_type) { 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNewWidget(route_id, false, popup_type); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewFullscreenWidget(int route_id) { 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNewWidget(route_id, true, WebKit::WebPopupTypeNone); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateNewWidget(int route_id, 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPopupType popup_type) { 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* process = GetRenderProcessHost(); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* widget_host = 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RenderWidgetHostImpl(this, process, route_id); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_widgets_.insert(widget_host); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* widget_view = 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::CreateViewForWidget(widget_host); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_fullscreen) { 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Popups should not get activated. 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_view->SetPopupType(popup_type); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the created widget associated with the route so we can show it later. 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_[route_id] = widget_view; 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allow it to survive the trip without being hosted. 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(widget_view->GetNativeView()); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWindow(int route_id, 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents = GetCreatedWindow(route_id); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contents) { 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsDelegate* delegate = GetDelegate(); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate) { 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->AddNewContents( 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, contents, disposition, initial_pos, user_gesture, NULL); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, false, initial_pos); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedFullscreenWidget(int route_id) { 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowCreatedWidget(route_id, true, gfx::Rect()); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowCreatedWidget(int route_id, 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen, 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos) { 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RenderWidgetShowing(); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort* widget_host_view = 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewPort::FromRWHV(GetCreatedWidget(route_id)); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host_view) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_fullscreen) { 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_host_view->InitAsFullscreen(GetRenderWidgetHostView()); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_host_view->InitAsPopup(GetRenderWidgetHostView(), initial_pos); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl* render_widget_host_impl = 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostImpl::From(widget_host_view->GetRenderWidgetHost()); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->Init(); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only allow privileged mouse lock for fullscreen render widget, which is 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used to implement Pepper Flash fullscreen. 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen); 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly embedded (or purposefully ignored) we can release the retain we 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // took in CreateNewWidget(). 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRelease(widget_host_view->GetNativeView()); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl* WebContentsImpl::GetCreatedWindow(int route_id) { 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingContents::iterator iter = pending_contents_.find(route_id); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certain systems can block the creation of new windows. If we didn't succeed 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in creating one, just return NULL. 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_contents_.end()) { 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* new_contents = iter->second; 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_contents_.erase(route_id); 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_contents->GetRenderProcessHost()->HasConnection() || 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !new_contents->GetRenderViewHost()->GetView()) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): It seems bogus to reach into here and initialize the host. 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == pending_widget_views_.end()) { 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* widget_host_view = iter->second; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_widget_views_.erase(route_id); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHost* widget_host = widget_host_view->GetRenderWidgetHost(); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_host->GetProcess()->HasConnection()) { 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view has gone away or the renderer crashed. Nothing to do. 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_host_view; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ShowContextMenu( 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ContextMenuParams& params, 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMenuSourceType type) { 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow WebContentsDelegates to handle the context menu operation first. 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->HandleContextMenu(params)) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host_delegate_view_->ShowContextMenu(params, type); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMediaAccessPermission( 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MediaStreamRequest* request, 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MediaResponseCallback& callback) { 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RequestMediaAccessPermission(this, request, callback); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(MediaStreamDevices()); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::AttachLayer(WebKit::WebLayer* layer) { 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->AttachLayer(this, layer); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveLayer(WebKit::WebLayer* layer) { 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RemoveLayer(this, layer); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_ = pref_size; 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->UpdatePreferredSize(this, pref_size); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) { 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ResizeDueToAutoResize(this, new_size); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::OpenURL(const OpenURLParams& params) { 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = delegate_->OpenURLFromTab(this, params); 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidOpenURL(params.url, params.referrer, 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.disposition, params.transition)); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_contents; 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::Send(IPC::Message* message) { 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHost()) { 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost()->Send(message); 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToPendingEntry( 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NavigateToEntry( 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *NavigationEntryImpl::FromNavigationEntry(controller_.GetPendingEntry()), 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reload_type); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewForInterstitialPageCreated( 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewForInterstitialPageCreated(render_view_host)); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::NavigateToEntry( 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NavigationEntryImpl& entry, 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationController::ReloadType reload_type) { 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The renderer will reject IPC messages with URLs longer than 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this limit, so don't attempt to navigate with a longer URL. 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetURL().spec().size() > kMaxURLChars) 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* dest_render_view_host = 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(render_manager_.Navigate(entry)); 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dest_render_view_host) 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Unable to create the desired render view host. 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For security, we should never send non-Web-UI URLs to a Web UI renderer. 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double check that here. 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int enabled_bindings = dest_render_view_host->GetEnabledBindings(); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIControllerFactory* factory = 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetWebUIControllerFactory(); 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool data_urls_allowed = delegate_ && delegate_->CanLoadDataURLsInWebUI(); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_allowed_in_web_ui_renderer = 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory && 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) factory->IsURLAcceptableForWebUI(GetBrowserContext(), entry.GetURL(), 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_urls_allowed); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((enabled_bindings & BINDINGS_POLICY_WEB_UI) && 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !is_allowed_in_web_ui_renderer) { 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log the URL to help us diagnose any future failures of this CHECK. 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->SetActiveURL(entry.GetURL()); 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(0); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell DevTools agent that it is attached prior to the navigation. 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManagerImpl::GetInstance()->OnNavigatingToPendingEntry( 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost(), 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_render_view_host, 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.GetURL()); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers that we will navigate in this RV. 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AboutToNavigateRenderView(dest_render_view_host)); 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for page load time metrics. 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_load_start_ = base::TimeTicks::Now(); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate in the desired RenderViewHost. 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Params navigate_params; 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeNavigateParams(entry, controller_, delegate_, reload_type, 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &navigate_params); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_render_view_host->Navigate(navigate_params); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetPageID() == -1) { 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HACK!! This code suppresses javascript: URLs from being added to 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session history, which is what we want to do for javascript: URLs that 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // do not generate content. What we really need is a message from the 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer telling us that a new page was not created. The same message 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could be used for mailto: URLs and the like. 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.GetURL().SchemeIs(chrome::kJavaScriptScheme)) 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToPendingEntry(entry.GetURL(), reload_type)); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DidNavigateToPendingEntry(this); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetHistoryLengthAndPrune( 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SiteInstance* site_instance, 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int history_length, 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 minimum_page_id) { 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetHistoryLengthAndPrune doesn't work when there are pending cross-site 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigations. Callers should ensure that this is the case. 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.pending_render_view_host()) { 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = GetRenderViewHostImpl(); 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_instance && rvh->GetSiteInstance() != site_instance) { 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetHistoryLengthAndPrune(GetRoutingID(), 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_length, 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_page_id)); 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::FocusThroughTabTraversal(bool reverse) { 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.interstitial_page()->FocusThroughTabTraversal(reverse); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->SetInitialFocus(reverse); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShowingInterstitialPage() const { 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.interstitial_page() != NULL; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPage* WebContentsImpl::GetInterstitialPage() const { 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.interstitial_page(); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsSavable() { 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit creates Document object when MIME type is application/xhtml+xml, 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we also support this MIME type. 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_ == "text/html" || 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/xml" || 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "application/xhtml+xml" || 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/plain" || 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ == "text/css" || 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IsSupportedJavascriptMimeType(contents_mime_type_.c_str()); 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSavePage() { 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we can not save the page, try to download it. 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsSavable()) { 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordDownloadSource(INITIATED_BY_SAVE_PACKAGE_ON_NON_HTML); 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveURL(GetURL(), Referrer(), true); 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the save package and possibly prompt the user for the name to save 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page as. The user prompt is an asynchronous operation that runs on 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another thread. 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this); 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_->GetSaveInfo(); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used in automated testing to bypass prompting the user for file names. 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, the names and paths are hard coded rather than running them through 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file name sanitation and extension / mime checking. 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::SavePage(const FilePath& main_file, 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& dir_path, 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SavePageType save_type) { 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the page from navigating. 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_package_ = new SavePackage(this, save_type, main_file, dir_path); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return save_package_->Init(SavePackageDownloadCreatedCallback()); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::GenerateMHTML( 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& file, 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(const FilePath&, int64)>& callback) { 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MHTMLGenerationManager::GetInstance()->GenerateMHTML(this, file, callback); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::IsActiveEntry(int32 page_id) { 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* active_entry = 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl::FromNavigationEntry(controller_.GetActiveEntry()); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (active_entry != NULL && 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_entry->site_instance() == GetSiteInstance() && 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_entry->GetPageID() == page_id); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& WebContentsImpl::GetContentsMimeType() const { 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_mime_type_; 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::WillNotifyDisconnection() const { 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_disconnection_; 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ResetOverrideEncoding() { 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_.clear(); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &renderer_preferences_; 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetNewTabStartTime(const base::TimeTicks& time) { 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_tab_start_time_ = time; 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeTicks WebContentsImpl::GetNewTabStartTime() const { 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_tab_start_time_; 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close() { 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(GetRenderViewHost()); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnCloseStarted() { 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (close_start_time_.is_null()) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_start_time_ = base::TimeTicks::Now(); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::ShouldAcceptDragAndDrop() const { 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ChromeOS panels (pop-ups) do not take drag-n-drop. 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crosbug.com/2413 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->IsPopupOrPanel(this)) 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SystemDragEnded() { 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetRenderViewHost()) 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->DragSourceSystemDragEnded(); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DragEnded(); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UserGestureDone() { 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUserGesture(); 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetClosedByUserGesture(bool value) { 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_by_user_gesture_ = value; 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GetClosedByUserGesture() const { 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closed_by_user_gesture_; 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double WebContentsImpl::GetZoomLevel() const { 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMapImpl* zoom_map = static_cast<HostZoomMapImpl*>( 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomMap::GetForBrowserContext(GetBrowserContext())); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!zoom_map) 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double zoom_level; 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (temporary_zoom_settings_) { 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = zoom_map->GetTemporaryZoomLevel( 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderProcessHost()->GetID(), GetRenderViewHost()->GetRoutingID()); 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* active_entry = GetController().GetActiveEntry(); 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since zoom map is updated using rewritten URL, use rewritten URL 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to get the zoom level. 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = active_entry ? active_entry->GetURL() : GURL::EmptyGURL(); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = zoom_map->GetZoomLevel(net::GetHostOrSpecFromURL(url)); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zoom_level; 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetZoomPercent(bool* enable_increment, 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* enable_decrement) const { 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = *enable_increment = false; 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the zoom percent from the factor. Round up to the nearest whole 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number. 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int percent = static_cast<int>( 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebView::zoomLevelToZoomFactor(GetZoomLevel()) * 100 + 0.5); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_decrement = percent > minimum_zoom_percent_; 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *enable_increment = percent < maximum_zoom_percent_; 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return percent; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewSource() { 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* active_entry = GetController().GetActiveEntry(); 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!active_entry) 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ViewSourceForTab(this, active_entry->GetURL()); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::ViewFrameSource(const GURL& url, 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& content_state) { 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ViewSourceForFrame(this, url, content_state); 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMinimumZoomPercent() const { 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return minimum_zoom_percent_; 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetMaximumZoomPercent() const { 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return maximum_zoom_percent_; 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsImpl::GetPreferredSize() const { 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return preferred_size_; 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::GetContentRestrictions() const { 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_restrictions_; 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI::TypeID WebContentsImpl::GetWebUITypeForCurrentState() { 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIControllerFactory* factory = 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetWebUIControllerFactory(); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!factory) 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebUI::kNoWebUI; 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return factory->GetWebUIType(GetBrowserContext(), GetURL()); 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUI* WebContentsImpl::GetWebUIForCurrentState() { 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When there is a pending navigation entry, we want to use the pending WebUI 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that goes along with it to control the basic flags. For example, we want to 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // show the pending URL in the URL bar, so we want the display_url flag to 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be from the pending entry. 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The confusion comes because there are multiple possibilities for the 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initial load in a tab as a side effect of the way the RenderViewHostManager 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // works. 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - For the very first tab the load looks "normal". The new tab Web UI is 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the pending one, and we want it to apply here. 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - For subsequent new tabs, they'll get a new SiteInstance which will then 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get switched to the one previously associated with the new tab pages. 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This switching will cause the manager to commit the RVH/WebUI. So we'll 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have a committed Web UI in this case. 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This condition handles all of these cases: 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - First load in first tab: no committed nav entry + pending nav entry + 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pending dom ui: 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // -> Use pending Web UI if any. 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - First load in second tab: no committed nav entry + pending nav entry + 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no pending Web UI: 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // -> Use the committed Web UI if any. 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Second navigation in any tab: committed nav entry + pending nav entry: 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // -> Use pending Web UI if any. 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Normal state with no load: committed nav entry + no pending nav entry: 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // -> Use committed Web UI. 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller_.GetPendingEntry() && 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (controller_.GetLastCommittedEntry() || 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_web_ui())) 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.pending_web_ui(); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.web_ui(); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRenderViewHost() ? 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHostImpl()->GotResponseToLockMouseRequest(allowed) : false; 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::HasOpener() const { 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_ != NULL; 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidChooseColorInColorChooser(int color_chooser_id, 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_DidChooseColorResponse( 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRoutingID(), color_chooser_id, color)); 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidEndColorChooser(int color_chooser_id) { 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_DidEndColorChooser(GetRoutingID(), color_chooser_id)); 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DidEndColorChooser(); 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_ = NULL; 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::FocusLocationBarByDefault() { 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUI* web_ui = GetWebUIForCurrentState(); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_ui) 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui->ShouldFocusLocationBarByDefault(); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (entry && entry->GetURL() == GURL(chrome::kAboutBlankURL)); 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetFocusToLocationBar(bool select_all) { 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SetFocusToLocationBar(select_all); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterIntentService( 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const webkit_glue::WebIntentServiceData& data, 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RegisterIntentHandler(this, data, user_gesture); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebIntentDispatch( 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const webkit_glue::WebIntentData& intent, 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int intent_id) { 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIntentsDispatcherImpl* intents_dispatcher = 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebIntentsDispatcherImpl(this, intent, intent_id); 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebIntentDispatch(this, intents_dispatcher); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStartProvisionalLoadForFrame( 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 parent_frame_id, 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& opener_url, 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_error_page = (url.spec() == kUnreachableWebDataURL); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_url(url); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_opener_url(opener_url); 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, true, &validated_opener_url); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the start of the provisional load. 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStartProvisionalLoadForFrame(frame_id, parent_frame_id, 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_main_frame, validated_url, is_error_page, 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_main_frame) { 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_url, 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) validated_opener_url, 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidRedirectProvisionalLoad( 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& opener_url, 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_url, 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& target_url) { 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Remove this method and have the pre-rendering code listen to 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ResourceDispatcherHost's RESOURCE_RECEIVED_REDIRECT notification 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instead. See http://crbug.com/78512. 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_source_url(source_url); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_target_url(target_url); 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_opener_url(opener_url); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_source_url); 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_target_url); 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, true, &validated_opener_url); 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry; 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_id == -1) { 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetPendingEntry(); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry = controller_.GetEntryWithPageID(render_view_host->GetSiteInstance(), 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry || entry->GetURL() != validated_source_url) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the provisional change in the main frame URL. 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProvisionalChangeToMainFrameUrl(validated_target_url, 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) validated_opener_url, 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidFailProvisionalLoadWithError( 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_DidFailProvisionalLoadWithError_Params& params) { 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Failed Provisional Load: " << params.url.possibly_invalid_spec() 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", error_code: " << params.error_code 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", error_description: " << params.error_description 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", is_main_frame: " << params.is_main_frame 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", showing_repost_interstitial: " << 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.showing_repost_interstitial 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", frame_id: " << params.frame_id; 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL validated_url(params.url); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHost* render_process_host = 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->GetProcess(); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost::FilterURL(render_process_host, false, &validated_url); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (net::ERR_ABORTED == params.error_code) { 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EVIL HACK ALERT! Ignore failed loads when we're showing interstitials. 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This means that the interstitial won't be torn down properly, which is 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bad. But if we have an interstitial, go back to another tab type, and 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then load the same interstitial again, we could end up getting the first 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interstitial's "failed" message (as a result of the cancel) when we're on 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the second one. 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't tell this apart, so we think we're tearing down the current page 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which will cause a crash later one. There is also some code in 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHostManager::RendererAbortedProvisionalLoad that is commented 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // out because of this problem. 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=2855 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because this will not tear down the interstitial properly, if "back" is 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back to another tab type, the interstitial will still be somewhat alive 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the previous tab type. If you navigate somewhere that activates the 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tab with the interstitial again, you'll see a flash before the new load 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // commits of the interstitial page. 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShowingInterstitialPage()) { 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Discarding message during interstitial."; 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not clear the pending entry if one exists, so that the user's typed 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL is not lost when a navigation fails or is aborted. We'll allow 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the view to clear the pending entry and typed URL if the user requests. 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.RendererAbortedProvisionalLoad(render_view_host); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailProvisionalLoad(params.frame_id, 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.is_main_frame, 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) validated_url, 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.error_code, 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.error_description, 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidLoadResourceFromMemoryCache( 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_info, 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& http_method, 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type) { 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatsCounter cache("WebKit.CacheHit"); 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache.Increment(); 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send out a notification that we loaded a resource from our memory cache. 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_id = 0; 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CertStatus cert_status = 0; 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int security_bits = -1; 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int connection_status = 0; 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeserializeSecurityInfo(security_info, &cert_id, &cert_status, 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &security_bits, &connection_status); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadFromMemoryCacheDetails details( 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetRenderProcessHost()->GetID(), cert_id, cert_status, http_method, 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type, resource_type); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_FROM_MEMORY_CACHE, 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<NavigationController>(&controller_), 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<LoadFromMemoryCacheDetails>(&details)); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidDisplayInsecureContent() { 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.DisplayedInsecureContent")); 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLManager::NotifySSLInternalStateChanged(&GetController()); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidRunInsecureContent( 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_origin, const GURL& target_url) { 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << security_origin << " ran insecure content from " 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << target_url.possibly_invalid_spec(); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.RanInsecureContent")); 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EndsWith(security_origin, kDotGoogleDotCom, false)) 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordAction(UserMetricsAction("SSL.RanInsecureContentGoogle")); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.ssl_manager()->DidRunInsecureContent(security_origin); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = true; 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLManager::NotifySSLInternalStateChanged(&GetController()); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDocumentLoadedInFrame(int64 frame_id) { 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DocumentLoadedInFrame(); 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentLoadedInFrame(frame_id, message_source_)); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFinishLoad( 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame) { 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishLoad(frame_id, validated_url, is_main_frame, 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_)); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDidFailLoadWithError( 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& error_description) { 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailLoad(frame_id, validated_url, is_main_frame, 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_code, error_description, 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_source_)); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateContentRestrictions(int restrictions) { 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_restrictions_ = restrictions; 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ContentRestrictionsChanged(this); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnGoToEntryAtOffset(int offset) { 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_ || delegate_->OnGoToEntryOffset(offset)) { 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetEntryAtOffset(offset)); 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry) 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we don't call NavigationController::GotToOffset() as we don't 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want to create a pending navigation entry (it might end up lingering 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/51680). 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTransitionType( 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransitionFromInt( 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType() | 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_FORWARD_BACK)); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToEntry(*entry, NavigationControllerImpl::NO_RELOAD); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the entry is being restored and doesn't have a SiteInstance yet, fill 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it in now that we know. This allows us to find the entry when it commits. 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry->site_instance() && 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->restore_type() != NavigationEntryImpl::RESTORE_NONE) { 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->set_site_instance( 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SiteInstanceImpl*>(GetPendingSiteInstance())); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUpdateZoomLimits(int minimum_percent, 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maximum_percent, 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remember) { 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimum_zoom_percent_ = minimum_percent; 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximum_zoom_percent_ = maximum_percent; 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temporary_zoom_settings_ = !remember; 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSaveURL(const GURL& url, 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer) { 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecordDownloadSource(INITIATED_BY_PEPPER_SAVE); 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the URL to save matches the URL of the main frame. Since this 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message originates from Pepper plugins, it may not be the case if the 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin is an embedded element. 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL main_frame_url = GetURL(); 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_frame_url.is_valid()) 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame = (url == main_frame_url); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveURL(url, referrer, is_main_frame); 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEnumerateDirectory(int request_id, 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& path) { 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy->CanReadDirectory(GetRenderProcessHost()->GetID(), path)) 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->EnumerateDirectory(this, request_id, path); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnJSOutOfMemory() { 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->JSOutOfMemory(this); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol, 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture) { 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl* policy = 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance(); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy->IsPseudoScheme(protocol) || policy->IsDisabledScheme(protocol)) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RegisterProtocolHandler(this, protocol, url, title, user_gesture); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindReply(int request_id, 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) { 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindReply(this, request_id, number_of_matches, selection_rect, 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_match_ordinal, final_update); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnFindMatchRectsReply( 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version, 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::RectF>& rects, 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::RectF& active_rect) { 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->FindMatchRectsReply(this, version, rects, active_rect); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnCrashedPlugin(const FilePath& plugin_path) { 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginCrashed(plugin_path)); 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnAppCacheAccessed(const GURL& manifest_url, 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheAccessed(manifest_url, blocked_by_policy)); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnOpenColorChooser(int color_chooser_id, 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_ = delegate_ ? 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OpenColorChooser(this, color_chooser_id, color) : NULL; 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnEndColorChooser(int color_chooser_id) { 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_ && 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_id == color_chooser_->identifier()) 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->End(); 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnSetSelectedColorInColorChooser(int color_chooser_id, 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color) { 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_chooser_ && 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_id == color_chooser_->identifier()) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser_->SetSelectedColor(color); 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnPepperPluginHung(int plugin_child_id, 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& path, 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_hung) { 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Pepper.PluginHung", 1); 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginHungStatusChanged(plugin_child_id, path, is_hung)); 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This exists for render views that don't have a WebUI, but do have WebUI 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bindings enabled. 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnWebUISend(const GURL& source_url, 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name, 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& args) { 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WebUISend(this, source_url, name, args); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnRequestPpapiBrokerPermission( 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& plugin_path) { 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(bool)> callback = 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnPpapiBrokerPermissionResult, 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), request_id); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<WebContentsObserver>::Iterator it(observers_); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver* observer; 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) { 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer->RequestPpapiBrokerPermission(this, url, plugin_path, 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)) 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fall back to allowing the request if no observer handled it. 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPpapiBrokerPermissionResult(request_id, true); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnPpapiBrokerPermissionResult(int request_id, 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result) { 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = GetRenderViewHostImpl(); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->Send(new ViewMsg_PpapiBrokerPermissionResult(rvh->GetRoutingID(), 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result)); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnBrowserPluginCreateGuest( 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int instance_id, 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BrowserPluginHostMsg_CreateGuest_Params& params) { 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This creates a BrowserPluginEmbedder, which handles all the BrowserPlugin 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specific messages for this WebContents (through its 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginEmbedderHelper). This means that any message from browser 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin renderer prior to CreateGuest will be ignored. 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For more info, see comment above classes BrowserPluginEmbedder and 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginGuest. 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first BrowserPluginHostMsg_CreateGuest message from this WebContents' 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // embedder render process is handled here. Once BrowserPluginEmbedder is 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created, all subsequent BrowserPluginHostMsg_CreateGuest messages are 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercepted by the BrowserPluginEmbedderHelper and handled by the 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginEmbedder. Thus, this code will not be executed if a 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowserPluginEmbedder exists for this WebContents. 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!browser_plugin_embedder_.get()); 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_.reset( 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserPluginEmbedder::Create(this, GetRenderViewHost())); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_->CreateGuest(GetRenderViewHost(), 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_id, 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notifies the RenderWidgetHost instance about the fact that the page is 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loading, or done loading and calls the base implementation. 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetIsLoading(bool is_loading, 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNotificationDetails* details) { 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading == is_loading_) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading) { 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE, string16()); 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_.clear(); 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = 0; 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = 0; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.SetIsLoading(is_loading); 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = is_loading; 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_response_ = is_loading; 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LoadingStateChanged(this); 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD); 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = is_loading ? NOTIFICATION_LOAD_START : NOTIFICATION_LOAD_STOP; 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationDetails det = NotificationService::NoDetails(); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details) 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) det = Details<LoadNotificationDetails>(details); 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, Source<NavigationController>(&controller_), det); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigateMainFramePostCommit( 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadCommittedDetails& details, 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_web_ui_type_ != WebUI::kNoWebUI) { 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a window.open navigation, use the same WebUI as the renderer 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that opened the window, as long as both renderers have the same 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // privileges. 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && opener_web_ui_type_ == GetWebUITypeForCurrentState()) { 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIImpl* web_ui = static_cast<WebUIImpl*>(CreateWebUI(GetURL())); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // web_ui might be NULL if the URL refers to a non-existent extension. 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_ui) { 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.SetWebUIPostCommit(web_ui); 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->RenderViewCreated(GetRenderViewHost()); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_web_ui_type_ = WebUI::kNoWebUI; 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.is_navigation_to_different_page()) { 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the status bubble. This is a workaround for a bug where WebKit 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // doesn't let us know that the cursor left an element during a 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transition (this is also why the mouse cursor remains as a hand after 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clicking on a link); see bugs 1184641 and 980803. We don't want to 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clear the bubble when a user navigates to a named anchor in the same 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTargetURL(details.entry->GetPageID(), GURL()); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!details.is_in_page) { 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once the main frame is navigated, we're no longer considered to have 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // displayed insecure content. 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) displayed_insecure_content_ = false; 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateMainFrame(details, params)); 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigateAnyFramePostCommit( 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadCommittedDetails& details, 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we navigate off the page, reset JavaScript state. This does nothing 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to prevent a malicious script from spamming messages, since the script 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could just reload the page to stop blocking. 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dialog_creator_ && !details.is_in_page) { 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_creator_->ResetJavaScriptState(this); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_creator_ = NULL; 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateAnyFrame(details, params)); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateMaxPageIDIfNecessary(RenderViewHost* rvh) { 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are creating a RVH for a restored controller, then we need to make 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the RenderView starts with a next_page_id_ larger than the number 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of restored entries. This must be called before the RenderView starts 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating (to avoid a race between the browser updating max_page_id and 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the renderer updating next_page_id_). Because of this, we only call this 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from CreateRenderView and allow that to notify the RenderView for us. 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_restored_page_id = controller_.GetMaxRestoredPageID(); 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_restored_page_id > 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(rvh->GetSiteInstance())) 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDForSiteInstance(rvh->GetSiteInstance(), 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_restored_page_id); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::UpdateTitleForEntry(NavigationEntryImpl* entry, 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title) { 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For file URLs without a title, use the pathname instead. In the case of a 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synthesized title, we don't want the update to count toward the "one set 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per page of the title to history." 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 final_title; 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool explicit_set; 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry && entry->GetURL().SchemeIsFile() && title.empty()) { 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_title = UTF8ToUTF16(entry->GetURL().ExtractFileName()); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = false; // Don't count synthetic titles toward the set limit. 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimWhitespace(title, TRIM_ALL, &final_title); 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit_set = true; 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a page is created via window.open and never navigated, 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there will be no navigation entry. In this situation, 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_title_when_no_navigation_entry_| will be used for page title. 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_title == entry->GetTitle()) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetTitle(final_title); 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_title_when_no_navigation_entry_ == final_title) 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Nothing changed, don't bother. 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_title_when_no_navigation_entry_ = final_title; 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, set the title for the view. 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SetPageTitle(final_title); 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<NavigationEntry*, bool> details = 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(entry, explicit_set); 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<NavigationEntry*, bool> >(&details)); 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifySwapped() { 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After sending out a swap notification, we need to send a disconnect 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification so that clients that pick up a pointer to |this| can NULL the 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer. See Bug 1230284. 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_SWAPPED, 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that the associated embedder gets cleared after a RenderViewHost 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets swapped, so we don't reuse the same embedder next time a 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderViewHost is attached to this WebContents. 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveBrowserPluginEmbedder(); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyConnected() { 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = true; 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_CONNECTED, 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifyDisconnected() { 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notify_disconnection_) 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_disconnection_ = false; 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::NoDetails()); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_view_host_delegate_view_; 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegate::RendererManagement* 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsImpl::GetRendererManagementDelegate() { 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &render_manager_; 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPreferences WebContentsImpl::GetRendererPrefs( 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context) const { 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_; 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsImpl::GetAsWebContents() { 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const { 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetRootWindowResizerRect(); 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RemoveBrowserPluginEmbedder() { 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_plugin_embedder_.get()) 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_plugin_embedder_.reset(); 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send notifications if we are just creating a swapped-out RVH for 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the opener chain. These won't be used for view-source or WebUI, so it's 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ok to return early. 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(render_view_host)->is_swapped_out()) 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<RenderViewHost>(render_view_host)); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry) 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're creating views, we're still doing initial setup, so we always 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the pending Web UI rather than any possibly existing committed one. 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.pending_web_ui()) 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.pending_web_ui()->RenderViewCreated(render_view_host); 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry->IsViewSourceMode()) { 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put the renderer in view source mode. 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->Send( 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID())); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetView()->RenderViewCreated(render_view_host); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, observers_, RenderViewCreated(render_view_host)); 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't notify the world, since this came from a renderer in the 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyConnected(); 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_crashed = IsCrashed(); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(base::TERMINATION_STATUS_STILL_RUNNING, 0); 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the focus to the tab (otherwise the focus will be on the top 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window). 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (was_crashed && !FocusLocationBarByDefault() && 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!delegate_ || delegate_->ShouldFocusPageAfterCrash())) { 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Focus(); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewReady()); 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewGone(RenderViewHost* rvh, 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TerminationStatus status, 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) { 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pending page's RenderViewHost is gone. 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(false, NULL); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyDisconnected(); 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsCrashed(status, error_code); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetView()->OnTabCrashed(GetCrashedStatus(), crashed_error_code_); 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewGone(GetCrashedStatus())); 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewDeleted(RenderViewHost* rvh) { 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.RenderViewDeleted(rvh); 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderViewDeleted(rvh)); 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidNavigate( 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewHostMsg_FrameNavigate_Params& params) { 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PageTransitionIsMainFrame(params.transition)) 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.DidNavigateMainFrame(rvh); 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the site of the SiteInstance if it doesn't have one yet, unless 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this is for about:blank. In that case, the SiteInstance can still be 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // considered unused until a navigation to a real page. 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<SiteInstanceImpl*>(GetSiteInstance())->HasSite() && 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.url != GURL(chrome::kAboutBlankURL)) { 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<SiteInstanceImpl*>(GetSiteInstance())->SetSite(params.url); 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to update MIME type here because it's referred to in 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateNavigationCommands() called by RendererDidNavigate() to 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // determine whether or not to enable the encoding menu. 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's updated only for the main frame. For a subframe, 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderView::UpdateURL does not set params.contents_mime_type. 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (see http://code.google.com/p/chromium/issues/detail?id=2929 ) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jungshik): Add a test for the encoding menu to avoid 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // regressing it again. 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PageTransitionIsMainFrame(params.transition)) 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_mime_type_ = params.contents_mime_type; 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadCommittedDetails details; 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_navigate = controller_.RendererDidNavigate(params, &details); 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send notification about committed provisional loads. This notification is 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different from the NAV_ENTRY_COMMITTED notification which doesn't include 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the actual URL navigated to and isn't sent for AUTO_SUBFRAME navigations. 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.type != NAVIGATION_TYPE_NAV_IGNORE) { 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For AUTO_SUBFRAME navigations, an event for the main frame is generated 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that is not recorded in the navigation history. For the purpose of 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tracking navigation events, we treat this event as a sub frame navigation 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event. 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame = did_navigate ? details.is_main_frame : false; 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransition transition_type = params.transition; 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether or not a page transition was triggered by going backward or 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // forward in the history is only stored in the navigation controller's 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry list. 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (did_navigate && 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (controller_.GetActiveEntry()->GetTransitionType() & 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_FORWARD_BACK)) { 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type = PageTransitionFromInt( 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition | PAGE_TRANSITION_FORWARD_BACK); 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about the commit of the provisional load. 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCommitProvisionalLoadForFrame(params.frame_id, 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_main_frame, params.url, transition_type, rvh)); 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!did_navigate) 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // No navigation happened. 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the appropriate notification (best) or you can add it to 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary, please). 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run post-commit tasks. 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.is_main_frame) { 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateMainFramePostCommit(details, params); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DidNavigateMainFramePostCommit(this); 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidNavigateAnyFramePostCommit(rvh, details, params); 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateState(RenderViewHost* rvh, 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& state) { 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that this state update comes from either the active RVH or one of 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the swapped out RVHs. We don't expect to hear from any other RVHs. 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(rvh == GetRenderViewHost() || render_manager_.IsSwappedOut(rvh)); 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must be prepared to handle state updates for any page, these occur 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the user is scrolling and entering form data, as well as when we're 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leaving a page, in which case our state may have already been moved to 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the next page. The navigation controller will look up the appropriate 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationEntry and update it when it is notified via the delegate. 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entry_index = controller_.GetEntryIndexWithPageID( 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_index < 0) 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == entry->GetContentState()) 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetContentState(state); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.NotifyEntryChanged(entry, entry_index); 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTitle(RenderViewHost* rvh, 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::TextDirection title_direction) { 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a title, that's a pretty good indication that we've started 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getting useful data. 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to find the navigation entry, which might not be the current one. 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For example, it might be from a pending RVH for the pending entry. 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntryImpl* entry = controller_.GetEntryWithPageID( 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance(), page_id); 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can handle title updates when we don't have an entry in 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateTitleForEntry, but only if the update is from the current RVH. 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry && rvh != GetRenderViewHost()) 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evan): make use of title_direction. 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=27094 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!UpdateTitleForEntry(entry, title)) 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Broadcast notifications when the UI should be updated. 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry == controller_.GetEntryAtOffset(0)) 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateEncoding(RenderViewHost* render_view_host, 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& encoding) { 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEncoding(encoding); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) { 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->UpdateTargetURL(this, page_id, url); 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::Close(RenderViewHost* rvh) { 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The UI may be in an event-tracking loop, such as between the 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse-down and mouse-up in text selection or a button click. 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer the close until after tracking is complete, so that we 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't free objects out from under the UI. 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(shess): This could get more fine-grained. For instance, 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing a tab in another window while selecting text in the 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current window's Omnibox should be just fine. 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetView()->IsEventTracking()) { 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetView()->CloseTabAfterEventTracking(); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore this if it comes from a RenderViewHost that we aren't showing. 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->CloseContents(this); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SwappedOut(RenderViewHost* rvh) { 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && rvh == GetRenderViewHost()) 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SwappedOut(this); 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) { 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && delegate_->IsPopupOrPanel(this)) 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->MoveContents(this, new_bounds); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStartLoading(RenderViewHost* render_view_host) { 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(true, NULL); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ && content_restrictions_) 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUpdateContentRestrictions(0); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStartLoading(render_view_host)); 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidStopLoading(RenderViewHost* render_view_host) { 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoadNotificationDetails> details; 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller_.GetActiveEntry(); 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An entry may not exist for a stop when loading an initial blank page or 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if an iframe injected by script into a blank page finishes loading. 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta elapsed = base::TimeTicks::Now() - current_load_start_; 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.reset(new LoadNotificationDetails( 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetVirtualURL(), 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->GetTransitionType(), 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elapsed, 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &controller_, 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.GetCurrentEntryIndex())); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetIsLoading(false, details.get()); 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers about navigation. 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStopLoading(render_view_host)); 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidCancelLoading() { 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the URL display. 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidChangeLoadProgress(double progress) { 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->LoadProgressChanged(this, progress); 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DidUpdateFrameTree(RenderViewHost* rvh) { 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.DidUpdateFrameTree(rvh); 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentAvailableInMainFrame( 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentAvailableInMainFrame()); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::DocumentOnLoadCompletedInMainFrame( 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id) { 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationService::current()->Notify( 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(this), 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<int>(&page_id)); 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestOpenURL(RenderViewHost* rvh, 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 source_frame_id) { 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this came from a swapped out RenderViewHost, we only allow the request 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if we are still in the same BrowsingInstance. 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() && 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) { 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate to RequestTransferURL because this is just the generic 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case where |old_request_id| is empty. 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestTransferURL(url, referrer, disposition, source_frame_id, 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GlobalRequestID()); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RequestTransferURL( 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 source_frame_id, 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GlobalRequestID& old_request_id) { 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents = NULL; 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageTransition transition_type = PAGE_TRANSITION_LINK; 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.web_ui()) { 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we're a Web UI, it will provide a page transition type for us (this 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is so the new tab page can specify AUTO_BOOKMARK for automatically 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generated suggestions). 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note also that we hide the referrer for Web UI pages. We don't really 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want web sites to see a referrer of "chrome://blah" (and some 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome: URLs might have search terms or other stuff we don't want to 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send to the site), so we send no referrer. 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams params(url, Referrer(), source_frame_id, disposition, 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_manager_.web_ui()->GetLinkTransitionType(), 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* is_renderer_initiated */); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_global_request_id = old_request_id; 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents = OpenURL(params); 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type = render_manager_.web_ui()->GetLinkTransitionType(); 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams params(url, referrer, source_frame_id, disposition, 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_LINK, true /* is_renderer_initiated */); 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_global_request_id = old_request_id; 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_contents = OpenURL(params); 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_contents) { 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidOpenRequestedURL(new_contents, 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition, 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition_type, 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_frame_id)); 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the active RenderViewHost to run unload handlers and close, as long 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the request came from a RenderViewHost in the same BrowsingInstance. 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance())) 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRenderViewHost()->ClosePage(); 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RouteMessageEvent( 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only deliver the message to the active RenderViewHost if the request 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // came from a RenderViewHost in the same BrowsingInstance or if this 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents is dedicated to a browser plugin guest. 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This check means that an embedder could theoretically receive a 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // postMessage from anyone (not just its own guests). However, this is 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probably not a risk for apps since other pages won't have references 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to App windows. 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh->GetSiteInstance()->IsRelatedSiteInstance(GetSiteInstance()) && 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetBrowserPluginGuest() && !GetBrowserPluginEmbedder()) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params new_params(params); 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the renderer has changed while the post message is being routed, 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drop the message, as it will not be delivered to the right target. 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(nasko): Check for process ID and target frame id mismatch, once 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/153701 is fixed. 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a source_routing_id, translate it to the routing ID for 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the equivalent swapped out RVH in the target process. If we need 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to create a swapped out RVH for the source tab, we create its opener 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chain as well, since those will also be accessible to the target page. 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_params.source_routing_id != MSG_ROUTING_NONE) { 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to look up the WebContents for the source page. 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* source_contents = NULL; 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* source_rvh = RenderViewHostImpl::FromID( 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetID(), params.source_routing_id); 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_rvh) { 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents = static_cast<WebContentsImpl*>( 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_rvh->GetDelegate()->GetAsWebContents()); 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_contents) { 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBrowserPluginGuest()) { 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create a swapped out RenderView for the embedder in the guest's 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // render process but we intentionally do not expose the embedder's 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener chain to it. 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateSwappedOutRenderView(GetSiteInstance()); 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_contents->CreateOpenerRenderViews(GetSiteInstance()); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We couldn't find it, so don't pass a source frame. 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_params.source_routing_id = MSG_ROUTING_NONE; 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In most cases, we receive this from a swapped out RenderViewHost. 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive it from one that has just been swapped in, 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in which case we might as well deliver the message anyway. 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunJavaScriptMessage( 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& default_prompt, 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JavaScriptMessageType javascript_message_type, 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_suppress_message) { 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress JavaScript dialogs when requested. Also suppress messages when 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showing an interstitial as it's shown over the previous page and we don't 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want the hidden page's dialogs to interfere with the interstitial. 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suppress_this_message = 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out() || 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowingInterstitialPage() || 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_ || 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ShouldSuppressDialogs() || 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_->GetJavaScriptDialogCreator(); 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!suppress_this_message) { 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string accept_lang = GetContentClient()->browser()-> 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAcceptLangs(GetBrowserContext()); 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_creator_ = delegate_->GetJavaScriptDialogCreator(); 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_creator_->RunJavaScriptDialog( 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url.GetOrigin(), 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accept_lang, 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) javascript_message_type, 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_prompt, 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnDialogClosed, 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh, 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_msg), 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &suppress_this_message); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_this_message) { 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are suppressing messages, just reply as if the user immediately 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pressed "Cancel". 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDialogClosed(rvh, reply_msg, false, string16()); 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_suppress_message = suppress_this_message; 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RunBeforeUnloadConfirm(RenderViewHost* rvh, 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_reload, 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg) { 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WillRunBeforeUnloadConfirm(); 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool suppress_this_message = 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->is_swapped_out() || 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_ || 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->ShouldSuppressDialogs() || 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !delegate_->GetJavaScriptDialogCreator(); 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suppress_this_message) { 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The reply must be sent to the RVH that sent the request. 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->JavaScriptDialogClosed(reply_msg, true, string16()); 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = true; 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_creator_ = delegate_->GetJavaScriptDialogCreator(); 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_creator_->RunBeforeUnloadDialog( 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, message, is_reload, 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), rvh, 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_msg)); 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::AddMessageToConsole(int32 level, 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& source_id) { 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!delegate_) 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AddMessageToConsole(this, level, message, line_no, 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_id); 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences WebContentsImpl::GetWebkitPrefs() { 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want to base the page config off of the real URL, rather than the 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display URL. 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = controller_.GetActiveEntry() 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? controller_.GetActiveEntry()->GetURL() : GURL::EmptyGURL(); 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetWebkitPrefs(GetRenderViewHost(), url); 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateSwappedOutRenderView( 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.CreateRenderView(instance, MSG_ROUTING_NONE, true); 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnUserGesture() { 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rdh) // NULL in unittests. 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rdh->OnUserGesture(this); 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnIgnoredUIEvent() { 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify observers. 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent()); 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererUnresponsive(RenderViewHost* rvh, 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_during_unload) { 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't show hung renderer dialog for a swapped out RVH. 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh != GetRenderViewHost()) 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore renderer unresponsive event if debugger is attached to the tab 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the event may be a result of the renderer sitting on a breakpoint. 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/65458 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsAgentHost* agent = 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsAgentHostRegistry::GetDevToolsAgentHost(rvh); 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (agent && 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManagerImpl::GetInstance()->GetDevToolsClientHostFor(agent)) 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_during_unload) { 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hang occurred while firing the beforeunload/unload handler. 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend the handler fired so tab closing continues as if it had. 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvhi->set_sudden_termination_allowed(true); 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!render_manager_.ShouldCloseTabOnUnresponsiveRenderer()) 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab hangs in the beforeunload/unload handler there's really 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nothing we can do to recover. Pretend the unload listeners have 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all fired and close the tab. If the hang is in the beforeunload handler 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then the user will not have the option of cancelling the close. 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(rvh); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRenderViewHostImpl() || !GetRenderViewHostImpl()->IsRenderViewLive()) 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererUnresponsive(this); 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) { 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RendererResponsive(this); 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::LoadStateChanged( 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::LoadStateWithParam& load_state, 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_position, 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 upload_size) { 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_ = load_state; 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_position_ = upload_position; 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upload_size_ = upload_size; 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_state_host_ = net::IDNToUnicode(url.host(), 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetAcceptLangs( 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserContext())); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_state_.state == net::LOAD_STATE_READING_RESPONSE) 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNotWaitingForResponse(); 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsLoading()) { 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNavigationStateChanged(INVALIDATE_TYPE_LOAD | INVALIDATE_TYPE_TAB); 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::WorkerCrashed() { 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->WorkerCrashed(this); 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::BeforeUnloadFiredFromRenderManager( 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool proceed, const base::TimeTicks& proceed_time, 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* proceed_to_fire_unload) { 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) before_unload_end_time_ = proceed_time; 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->BeforeUnloadFired(this, proceed, proceed_to_fire_unload); 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::RenderViewGoneFromRenderManager( 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(crashed_status_ != base::TERMINATION_STATUS_STILL_RUNNING); 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewGone(render_view_host, crashed_status_, crashed_error_code_); 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::UpdateRenderViewSizeForRenderManager() { 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) this is a hack. See WebContentsView::SizeContents. 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = view_->GetContainerSize(); 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0x0 isn't a valid window size (minimal window size is 1x1) but it may be 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here during container initialization and normal window size will be set 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // later. In case of tab duplication this resizing to 0x0 prevents setting 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal size later so just ignore it. 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!size.IsEmpty()) 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_->SizeContents(size); 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::NotifySwappedFromRenderManager() { 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifySwapped(); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViewsForRenderManager( 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* instance) { 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opener_) 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MSG_ROUTING_NONE; 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recursively create RenderViews for anything else in the opener chain. 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return opener_->CreateOpenerRenderViews(instance); 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opener_route_id = MSG_ROUTING_NONE; 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this tab has an opener, ensure it has a RenderView in the given 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance as well. 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_) 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id = opener_->CreateOpenerRenderViews(instance); 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If any of the renderers for this WebContents has the same SiteInstance, 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use it. 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_manager_.current_host()->GetSiteInstance() == instance) 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.current_host()->GetRoutingID(); 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostImpl* rvh = render_manager_.GetSwappedOutRenderViewHost( 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance); 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rvh->GetRoutingID(); 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a swapped out RenderView in the given SiteInstance if none exists, 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setting its opener to the given route_id. Return the new view's route_id. 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_manager_.CreateRenderView(instance, opener_route_id, true); 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationControllerImpl& WebContentsImpl::GetControllerForRenderManager() { 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetController(); 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIImpl* WebContentsImpl::CreateWebUIForRenderManager(const GURL& url) { 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebUIImpl*>(CreateWebUI(url)); 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationEntry* 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl::GetLastCommittedNavigationEntryForRenderManager() { 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.GetLastCommittedEntry(); 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsImpl::CreateRenderViewForRenderManager( 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host, int opener_route_id) { 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwh_view = view_->CreateViewForWidget(render_view_host); 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the RenderView has been created, we need to tell it its size. 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwh_view->SetSize(view_->GetContainerSize()); 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we use the correct starting page_id in the new RenderView. 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxPageIDIfNecessary(render_view_host); 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 max_page_id = 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMaxPageIDForSiteInstance(render_view_host->GetSiteInstance()); 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!static_cast<RenderViewHostImpl*>( 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host)->CreateRenderView(string16(), 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_route_id, 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_page_id)) { 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_OPENBSD) 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a ViewMsg_Resize to be sent, needed to make plugins show up on 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // linux. See crbug.com/83941. 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) { 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderWidgetHost* render_widget_host = rwh_view->GetRenderWidgetHost()) 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_host->WasResized(); 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::OnDialogClosed(RenderViewHost* rvh, 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg, 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& user_input) { 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_showing_before_unload_dialog_ && !success) { 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a beforeunload dialog is canceled, we need to stop the throbber from 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spinning, since we forced it to start spinning in Navigate. 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidStopLoading(rvh); 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.DiscardNonCommittedEntries(); 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_start_time_ = base::TimeTicks(); 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) before_unload_end_time_ = base::TimeTicks(); 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_showing_before_unload_dialog_ = false; 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderViewHostImpl*>( 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh)->JavaScriptDialogClosed(reply_msg, success, user_input); 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SetEncoding(const std::string& encoding) { 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding_ = GetContentClient()->browser()-> 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCanonicalEncodingNameByAliasName(encoding); 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::SaveURL(const GURL& url, 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame) { 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadManager* dlm = 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext::GetDownloadManager(GetBrowserContext()); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dlm) 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 post_id = -1; 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_main_frame) { 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NavigationEntry* entry = controller_.GetActiveEntry(); 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) post_id = entry->GetPostID(); 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadUrlParameters> params( 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadUrlParameters::FromWebContents(this, url)); 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_referrer(referrer); 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_post_id(post_id); 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_prefer_cache(true); 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (post_id >= 0) 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_method("POST"); 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->set_prompt(true); 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dlm->DownloadUrl(params.Pass()); 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwh_view = GetView()->CreateViewForWidget(rvh); 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can be NULL during tests. 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwh_view) 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwh_view->SetSize(GetView()->GetContainerSize()); 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* WebContentsImpl::GetRenderViewHostImpl() { 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<RenderViewHostImpl*>(GetRenderViewHost()); 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPluginGuest* WebContentsImpl::GetBrowserPluginGuest() { 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_guest_.get(); 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() { 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_embedder_.get(); 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3331