render_frame_host_impl.cc revision 1675a649fd7a8b3cb80ffddae2dc181f122353c5
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/bind.h" 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/command_line.h" 9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/containers/hash_tables.h" 10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/lazy_instance.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/metrics/histogram.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/user_metrics_action.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/time.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/accessibility/accessibility_mode_helper.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/accessibility/browser_accessibility_manager.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/accessibility/browser_accessibility_state_impl.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/cross_process_frame_connector.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/frame_host/cross_site_transferring_request.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/frame_host/frame_accessibility.h" 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/frame_tree.h" 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/frame_tree_node.h" 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/navigator.h" 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_delegate.h" 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/frame_host/render_frame_proxy_host.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/frame_host/render_widget_host_view_child_frame.h" 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/renderer_host/input/input_router.h" 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/renderer_host/input/timeout_monitor.h" 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/renderer_host/render_process_host_impl.h" 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/renderer_host/render_view_host_delegate.h" 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/renderer_host/render_view_host_delegate_view.h" 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/renderer_host/render_widget_host_view_base.h" 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/transition_request_manager.h" 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/accessibility_messages.h" 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/desktop_notification_messages.h" 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/frame_messages.h" 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/input_messages.h" 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/inter_process_time_ticks_converter.h" 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/common/platform_notification_messages.h" 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/render_frame_setup.mojom.h" 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/common/swapped_out_messages.h" 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/ax_event_notification_details.h" 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_accessibility_state.h" 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_context.h" 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_plugin_guest_manager.h" 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/browser/desktop_notification_delegate.h" 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/render_process_host.h" 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/common/content_constants.h" 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/common/content_switches.h" 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_constants.h" 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/common/url_utils.h" 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/accessibility/ax_tree.h" 598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "url/gurl.h" 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX) 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/frame_host/popup_menu_helper_mac.h" 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using base::TimeDelta; 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// The (process id, routing id) pair that identifies one RenderFrame. 72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)typedef std::pair<int32, int32> RenderFrameHostID; 73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> 74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap; 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbase::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = 76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass DesktopNotificationDelegateImpl : public DesktopNotificationDelegate { 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopNotificationDelegateImpl(RenderFrameHost* render_frame_host, 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int notification_id) 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : render_process_id_(render_frame_host->GetProcess()->GetID()), 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch render_frame_id_(render_frame_host->GetRoutingID()), 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch notification_id_(notification_id) {} 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~DesktopNotificationDelegateImpl() {} 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void NotificationDisplayed() OVERRIDE { 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RenderFrameHost* rfh = 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RenderFrameHost::FromID(render_process_id_, render_frame_id_); 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!rfh) 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rfh->Send(new DesktopNotificationMsg_PostDisplay( 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rfh->GetRoutingID(), notification_id_)); 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void NotificationError() OVERRIDE { 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RenderFrameHost* rfh = 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RenderFrameHost::FromID(render_process_id_, render_frame_id_); 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!rfh) 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rfh->Send(new DesktopNotificationMsg_PostError( 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rfh->GetRoutingID(), notification_id_)); 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void NotificationClosed(bool by_user) OVERRIDE { 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RenderFrameHost* rfh = 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RenderFrameHost::FromID(render_process_id_, render_frame_id_); 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!rfh) 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rfh->Send(new DesktopNotificationMsg_PostClose( 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rfh->GetRoutingID(), notification_id_, by_user)); 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static_cast<RenderFrameHostImpl*>(rfh)->NotificationClosed( 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch notification_id_); 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void NotificationClick() OVERRIDE { 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RenderFrameHost* rfh = 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RenderFrameHost::FromID(render_process_id_, render_frame_id_); 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!rfh) 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rfh->Send(new DesktopNotificationMsg_PostClick( 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rfh->GetRoutingID(), notification_id_)); 1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int render_process_id_; 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int render_frame_id_; 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int notification_id_; 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Translate a WebKit text direction into a base::i18n one. 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::i18n::TextDirection WebTextDirectionToChromeTextDirection( 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) blink::WebTextDirection dir) { 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (dir) { 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case blink::WebTextDirectionLeftToRight: 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return base::i18n::LEFT_TO_RIGHT; 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case blink::WebTextDirectionRightToLeft: 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return base::i18n::RIGHT_TO_LEFT; 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return base::i18n::UNKNOWN_DIRECTION; 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RenderFrameHost* RenderFrameHost::FromID(int render_process_id, 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id) { 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return RenderFrameHostImpl::FromID(render_process_id, render_frame_id); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 157424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// static 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)RenderFrameHostImpl* RenderFrameHostImpl::FromID(int process_id, 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int routing_id) { 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); 162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap::iterator it = frames->find( 163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(process_id, routing_id)); 164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return it == frames->end() ? NULL : it->second; 165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHostDelegate* delegate, 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FrameTree* frame_tree, 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FrameTreeNode* frame_tree_node, 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int routing_id, 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_swapped_out) 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : render_view_host_(render_view_host), 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate_(delegate), 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cross_process_frame_connector_(NULL), 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_frame_proxy_host_(NULL), 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_(frame_tree), 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_tree_node_(frame_tree_node), 179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) routing_id_(routing_id), 1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch is_swapped_out_(is_swapped_out), 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_frame_created_(false), 1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) navigations_suspended_(false), 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch weak_ptr_factory_(this) { 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_->RegisterRenderFrameHost(this); 185424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetProcess()->AddRoute(routing_id_, this); 186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) g_routing_id_frame_map.Get().insert(std::make_pair( 187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(GetProcess()->GetID(), routing_id_), 188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) this)); 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (GetProcess()->GetServiceRegistry()) { 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameSetupPtr setup; 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup); 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::ServiceProviderPtr service_provider; 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch setup->GetServiceProviderForFrame(routing_id_, 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::Get(&service_provider)); 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_registry_.BindRemoteServiceProvider( 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_provider.PassMessagePipe()); 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameHostImpl::~RenderFrameHostImpl() { 202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetProcess()->RemoveRoute(routing_id_); 203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) g_routing_id_frame_map.Get().erase( 204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(GetProcess()->GetID(), routing_id_)); 2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (delegate_) 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate_->RenderFrameDeleted(this); 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify the FrameTree that this RFH is going away, allowing it to shut down 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the corresponding RenderViewHost if it is no longer needed. 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_->UnregisterRenderFrameHost(this); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int RenderFrameHostImpl::GetRoutingID() { 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return routing_id_; 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SiteInstance* RenderFrameHostImpl::GetSiteInstance() { 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_host_->GetSiteInstance(); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RenderProcessHost* RenderFrameHostImpl::GetProcess() { 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(nasko): This should return its own process, once we have working 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cross-process navigation for subframes. 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_host_->GetProcess(); 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)RenderFrameHost* RenderFrameHostImpl::GetParent() { 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameTreeNode* parent_node = frame_tree_node_->parent(); 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!parent_node) 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return NULL; 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return parent_node->current_frame_host(); 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const std::string& RenderFrameHostImpl::GetFrameName() { 23823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return frame_tree_node_->frame_name(); 23923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 24023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool RenderFrameHostImpl::IsCrossProcessSubframe() { 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameTreeNode* parent_node = frame_tree_node_->parent(); 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!parent_node) 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetSiteInstance() != 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parent_node->current_frame_host()->GetSiteInstance(); 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GURL RenderFrameHostImpl::GetLastCommittedURL() { 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return frame_tree_node_->current_url(); 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeView RenderFrameHostImpl::GetNativeView() { 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostView* view = render_view_host_->GetView(); 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!view) 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return view->GetNativeView(); 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::ExecuteJavaScript( 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& javascript) { 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameMsg_JavaScriptExecuteRequest(routing_id_, 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) javascript, 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, false)); 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::ExecuteJavaScript( 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& javascript, 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const JavaScriptResultCallback& callback) { 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static int next_id = 1; 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int key = next_id++; 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameMsg_JavaScriptExecuteRequest(routing_id_, 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) javascript, 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) key, true)); 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) javascript_callbacks_.insert(std::make_pair(key, callback)); 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::ExecuteJavaScriptForTests( 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::string16& javascript) { 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new FrameMsg_JavaScriptExecuteRequestForTests(routing_id_, 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci javascript, 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, false)); 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RenderViewHost* RenderFrameHostImpl::GetRenderViewHost() { 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_host_; 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 289116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceRegistry* RenderFrameHostImpl::GetServiceRegistry() { 290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<RenderProcessHostImpl*>(GetProcess())->EnsureMojoActivated(); 291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return &service_registry_; 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool RenderFrameHostImpl::Send(IPC::Message* message) { 295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart) { 296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return render_view_host_->input_router()->SendInput( 297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch make_scoped_ptr(message)); 298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Route IPCs through the RenderFrameProxyHost when in swapped out state. 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Note: For subframes in --site-per-process mode, we don't use swapped out 3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // RenderFrameHosts. 3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (frame_tree_node_->IsMainFrame() && render_view_host_->IsSwappedOut()) { 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(render_frame_proxy_host_); 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return render_frame_proxy_host_->Send(message); 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return GetProcess()->Send(message); 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { 31223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Filter out most IPC messages if this renderer is swapped out. 31323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // We still want to handle certain ACKs to keep our state consistent. 31423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // TODO(nasko): Only check RenderViewHost state, as this object's own state 31523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // isn't yet properly updated. Transition this check once the swapped out 31623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // state is correct in RenderFrameHost itself. 31723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (render_view_host_->IsSwappedOut()) { 31823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) { 31923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // If this is a synchronous message and we decided not to handle it, 32023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // we must send an error reply, or else the renderer will be stuck 32123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // and won't respond to future requests. 32223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (msg.is_sync()) { 32323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); 32423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) reply->set_reply_error(); 32523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Send(reply); 32623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 32723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Don't continue looking for someone to handle it. 32823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return true; 32923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 33023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 33123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (delegate_->OnMessageReceived(this, msg)) 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) RenderFrameProxyHost* proxy = 3366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) frame_tree_node_->render_manager()->GetProxyToParent(); 3376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (proxy && proxy->cross_process_frame_connector() && 3386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) proxy->cross_process_frame_connector()->OnMessageReceived(msg)) 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool handled = true; 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(RenderFrameHostImpl, msg) 343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_AddMessageToConsole, OnAddMessageToConsole) 3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach) 345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_FrameFocused, OnFrameFocused) 3468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartProvisionalLoadForFrame, 3478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) OnDidStartProvisionalLoadForFrame) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailProvisionalLoadWithError, 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnDidFailProvisionalLoadWithError) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailLoadWithError, 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnDidFailLoadWithError) 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(FrameHostMsg_DidCommitProvisionalLoad, 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnDidCommitProvisionalLoad(msg)) 354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_OpenURL, OnOpenURL) 355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DocumentOnLoadCompleted, 356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnDocumentOnLoadCompleted) 357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnload_ACK, OnBeforeUnloadACK) 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_SwapOut_ACK, OnSwapOutACK) 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_ContextMenu, OnContextMenu) 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_JavaScriptExecuteResponse, 361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnJavaScriptExecuteResponse) 362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunJavaScriptMessage, 363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnRunJavaScriptMessage) 364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunBeforeUnloadConfirm, 365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnRunBeforeUnloadConfirm) 3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu IPC_MESSAGE_HANDLER(FrameHostMsg_DidAccessInitialDocument, 3675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OnDidAccessInitialDocument) 368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidDisownOpener, OnDidDisownOpener) 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(FrameHostMsg_DidAssignPageId, OnDidAssignPageId) 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateTitle, OnUpdateTitle) 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateEncoding, OnUpdateEncoding) 372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(FrameHostMsg_BeginNavigation, 373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnBeginNavigation) 3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_RequestPermission, 3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnRequestPlatformNotificationPermission) 3760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_Show, 3770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch OnShowDesktopNotification) 3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_Cancel, 3790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch OnCancelDesktopNotification) 380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, 381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnTextSurroundingSelectionResponse) 382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(AccessibilityHostMsg_Events, OnAccessibilityEvents) 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges, 384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnAccessibilityLocationChanges) 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX) || defined(OS_ANDROID) 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return handled; 392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 394116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::AccessibilitySetFocus(int object_id) { 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new AccessibilityMsg_SetFocus(routing_id_, object_id)); 396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::AccessibilityDoDefaultAction(int object_id) { 399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new AccessibilityMsg_DoDefaultAction(routing_id_, object_id)); 400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 402116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::AccessibilityShowMenu( 403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point& global_point) { 404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host_->GetView()); 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view) 407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view->AccessibilityShowMenu(global_point); 408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::AccessibilityScrollToMakeVisible( 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int acc_obj_id, const gfx::Rect& subfocus) { 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new AccessibilityMsg_ScrollToMakeVisible( 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch routing_id_, acc_obj_id, subfocus)); 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::AccessibilityScrollToPoint( 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int acc_obj_id, const gfx::Point& point) { 418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new AccessibilityMsg_ScrollToPoint( 419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch routing_id_, acc_obj_id, point)); 420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 422116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::AccessibilitySetTextSelection( 423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int object_id, int start_offset, int end_offset) { 424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new AccessibilityMsg_SetTextSelection( 425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch routing_id_, object_id, start_offset, end_offset)); 426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 428116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool RenderFrameHostImpl::AccessibilityViewHasFocus() const { 429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* view = render_view_host_->GetView(); 430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view) 431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return view->HasFocus(); 432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 435116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Rect RenderFrameHostImpl::AccessibilityGetViewBounds() const { 436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostView* view = render_view_host_->GetView(); 437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view) 438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return view->GetViewBounds(); 439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return gfx::Rect(); 440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 442116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Point RenderFrameHostImpl::AccessibilityOriginInScreen( 443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Rect& bounds) const { 444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host_->GetView()); 446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view) 447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return view->AccessibilityOriginInScreen(bounds); 448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return gfx::Point(); 449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 451116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::AccessibilityHitTest(const gfx::Point& point) { 452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new AccessibilityMsg_HitTest(routing_id_, point)); 453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 455116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::AccessibilityFatalError() { 456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new AccessibilityMsg_FatalError(routing_id_)); 457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_accessibility_manager_.reset(NULL); 458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::AcceleratedWidget 4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHostImpl::AccessibilityGetAcceleratedWidget() { 4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) render_view_host_->GetView()); 4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (view) 4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return view->AccessibilityGetAcceleratedWidget(); 4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return gfx::kNullAcceleratedWidget; 4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::NativeViewAccessible 4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameHostImpl::AccessibilityGetNativeViewAccessible() { 4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) render_view_host_->GetView()); 4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (view) 4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return view->AccessibilityGetNativeViewAccessible(); 4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return NULL; 4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBrowserAccessibilityManager* RenderFrameHostImpl::AccessibilityGetChildFrame( 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int accessibility_node_id) { 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderFrameHostImpl* child_frame = 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FrameAccessibility::GetInstance()->GetChild(this, accessibility_node_id); 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!child_frame) 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Return NULL if this isn't an out-of-process iframe. Same-process iframes 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // are already part of the accessibility tree. 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (child_frame->GetProcess()->GetID() == GetProcess()->GetID()) 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // As a sanity check, make sure the frame we're going to return belongs 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to the same BrowserContext. 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (GetSiteInstance()->GetBrowserContext() != 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci child_frame->GetSiteInstance()->GetBrowserContext()) { 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return child_frame->GetOrCreateBrowserAccessibilityManager(); 4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBrowserAccessibility* RenderFrameHostImpl::AccessibilityGetParentFrame() { 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderFrameHostImpl* parent_frame = NULL; 5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int parent_node_id = 0; 5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!FrameAccessibility::GetInstance()->GetParent( 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, &parent_frame, &parent_node_id)) { 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // As a sanity check, make sure the frame we're going to return belongs 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to the same BrowserContext. 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (GetSiteInstance()->GetBrowserContext() != 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parent_frame->GetSiteInstance()->GetBrowserContext()) { 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserAccessibilityManager* manager = 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parent_frame->browser_accessibility_manager(); 5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!manager) 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return manager->GetFromID(parent_node_id); 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool RenderFrameHostImpl::CreateRenderFrame(int parent_routing_id) { 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT0("navigation", "RenderFrameHostImpl::CreateRenderFrame"); 5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(!IsRenderFrameLive()) << "Creating frame twice"; 5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The process may (if we're sharing a process with another host that already 5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // initialized it) or may not (we have our own process or the old process 5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // crashed) have been initialized. Calling Init multiple times will be 5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // ignored, so this is safe. 5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!GetProcess()->Init()) 5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(GetProcess()->HasConnection()); 5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id)); 5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The renderer now has a RenderFrame for this RenderFrameHost. Note that 5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // this path is only used for out-of-process iframes. Main frame RenderFrames 5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // are created with their RenderView, and same-site iframes are created at the 5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // time of OnCreateChildFrame. 5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci set_render_frame_created(true); 5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 5485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool RenderFrameHostImpl::IsRenderFrameLive() { 5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // RenderFrames are created for main frames at the same time as RenderViews, 5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // so we rely on IsRenderViewLive. For subframes, we keep track of each 5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // RenderFrame individually with render_frame_created_. 5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_live = !GetParent() ? 5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_host_->IsRenderViewLive() : 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetProcess()->HasConnection() && render_frame_created_; 5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sanity check: the RenderView should always be live if the RenderFrame is. 5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!is_live || render_view_host_->IsRenderViewLive()); 5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return is_live; 5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 563424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RenderFrameHostImpl::Init() { 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->ResumeRequestsForView(routing_id_); 565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameHostImpl::OnAddMessageToConsole( 568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int32 level, 569c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int32 line_no, 571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& source_id) { 572c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (delegate_->AddMessageToConsole(level, message, line_no, source_id)) 573c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 574c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 575c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Pass through log level only on WebUI pages to limit console spew. 576c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int32 resolved_level = 577c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch HasWebUIScheme(delegate_->GetMainFrameLastCommittedURL()) ? level : 0; 578c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 579c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (resolved_level >= ::logging::GetMinLogLevel()) { 580c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch logging::LogMessage("CONSOLE", line_no, resolved_level).stream() << "\"" << 581c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message << "\", source: " << source_id << " (" << line_no << ")"; 582c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 583c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 584c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id, 5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& frame_name) { 587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( 5881675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch frame_tree_node_, GetProcess()->GetID(), new_routing_id, frame_name); 5891675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch if (!new_frame) 5901675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch return; 5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // We know that the RenderFrame has been created in this case, immediately 5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // after the CreateChildFrame IPC was sent. 5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new_frame->set_render_frame_created(true); 5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (delegate_) 597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate_->RenderFrameCreated(new_frame); 5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::OnDetach() { 601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_->RemoveFrame(frame_tree_node_); 602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::OnFrameFocused() { 605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_->SetFocusedFrame(frame_tree_node_); 606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::OnOpenURL( 609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FrameHostMsg_OpenURL_Params& params) { 610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL validated_url(params.url); 611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetProcess()->FilterURL(false, &validated_url); 612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameHostImpl::OnOpenURL", 6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "url", validated_url.possibly_invalid_spec()); 615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_node_->navigator()->RequestOpenURL( 616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this, validated_url, params.referrer, params.disposition, 617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.should_replace_current_entry, params.user_gesture); 6184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderFrameHostImpl::OnDocumentOnLoadCompleted() { 621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // This message is only sent for top-level frames. TODO(avi): when frame tree 622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // mirroring works correctly, add a check here to enforce it. 623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) delegate_->DocumentOnLoadCompleted(this); 624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 6268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void RenderFrameHostImpl::OnDidStartProvisionalLoadForFrame( 6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& url, 6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_transition_navigation) { 6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) frame_tree_node_->navigator()->DidStartProvisionalLoad( 6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) this, url, is_transition_navigation); 6318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnDidFailProvisionalLoadWithError( 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) { 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_node_->navigator()->DidFailProvisionalLoadWithError(this, params); 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnDidFailLoadWithError( 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int error_code, 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& error_description) { 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL validated_url(url); 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->FilterURL(false, &validated_url); 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_node_->navigator()->DidFailLoadWithError( 646effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this, validated_url, error_code, error_description); 6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Called when the renderer navigates. For every frame loaded, we'll get this 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// notification containing parameters identifying the navigation. 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Subframes are identified by the page transition type. For subframes loaded 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// as part of a wider page load, the page_id will be the same as for the top 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// level frame. If the user explicitly requests a subframe navigation, we will 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// get a new page_id because we need to create a new navigation entry for that 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// action. 6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::OnDidCommitProvisionalLoad(const IPC::Message& msg) { 6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Read the parameters out of the IPC message directly to avoid making another 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // copy when we filter the URLs. 6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PickleIterator iter(msg); 6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameHostMsg_DidCommitProvisionalLoad_Params validated_params; 6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>:: 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Read(&msg, &iter, &validated_params)) 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameHostImpl::OnDidCommitProvisionalLoad", 6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "url", validated_params.url.possibly_invalid_spec()); 6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we're waiting for a cross-site beforeunload ack from this renderer and 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // we receive a Navigate message from the main frame, then the renderer was 67003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // navigating already and sent it before hearing the FrameMsg_Stop message. 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We do not want to cancel the pending navigation in this case, since the 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // old page will soon be stopped. Instead, treat this as a beforeunload ack 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to allow the pending navigation to continue. 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_host_->is_waiting_for_beforeunload_ack_ && 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->unload_ack_is_for_cross_site_transition_ && 6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransitionIsMainFrame(validated_params.transition)) { 677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnBeforeUnloadACK(true, send_before_unload_start_time_, 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks::Now()); 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we're waiting for an unload ack from this renderer and we receive a 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate message, then the renderer was navigating before it received the 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // unload request. It will either respond to the unload request soon or our 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // timer will expire. Either way, we should ignore this message, because we 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have already committed to closing this renderer. 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_host_->IsWaitingForUnloadACK()) 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderProcessHost* process = GetProcess(); 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Attempts to commit certain off-limits URL should be caught more strictly 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // than our FilterURL checks below. If a renderer violates this policy, it 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should be killed. 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!CanCommitURL(validated_params.url)) { 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "Blocked URL " << validated_params.url.spec(); 697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) validated_params.url = GURL(url::kAboutBlankURL); 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("CanCommitURL_BlockedAndKilled")); 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Kills the process. 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->ReceivedBadMessage(); 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Without this check, an evil renderer can trick the browser into creating 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // a navigation entry for a banned URL. If the user clicks the back button 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // followed by the forward button (or clicks reload, or round-trips through 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // session restore, etc), we'll think that the browser commanded the 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // renderer to load the URL and grant the renderer the privileges to request 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the URL. To prevent this attack, we block the renderer from inserting 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // banned URLs into the navigation controller in the first place. 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(false, &validated_params.url); 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.referrer.url); 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<GURL>::iterator it(validated_params.redirects.begin()); 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != validated_params.redirects.end(); ++it) { 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(false, &(*it)); 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.searchable_form_url); 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Without this check, the renderer can trick the browser into using 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // filenames it can't access in a future session restore. 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!render_view_host_->CanAccessFilesOfPageState( 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validated_params.page_state)) { 7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->ReceivedBadMessage(); 7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_node()->navigator()->DidNavigate(this, validated_params); 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { 730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return static_cast<RenderWidgetHostImpl*>(render_view_host_); 731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int RenderFrameHostImpl::GetEnabledBindings() { 734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return render_view_host_->GetEnabledBindings(); 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::OnCrossSiteResponse( 738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GlobalRequestID& global_request_id, 739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request, 740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<GURL>& transfer_url_chain, 741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const Referrer& referrer, 7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition page_transition, 743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool should_replace_current_entry) { 744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_node_->render_manager()->OnCrossSiteResponse( 745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this, global_request_id, cross_site_transferring_request.Pass(), 746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transfer_url_chain, referrer, page_transition, 747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) should_replace_current_entry); 748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 750116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::OnDeferredAfterResponseStarted( 7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GlobalRequestID& global_request_id, 7526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const TransitionLayerData& transition_data) { 753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_tree_node_->render_manager()->OnDeferredAfterResponseStarted( 754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch global_request_id, this); 755116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 756116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (GetParent() || !delegate_->WillHandleDeferAfterResponseStarted()) 757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_tree_node_->render_manager()->ResumeResponseDeferredAtStart(); 758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 7596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate_->DidDeferAfterResponseStarted(transition_data); 760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 761116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameHostImpl::SwapOut(RenderFrameProxyHost* proxy) { 7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The end of this event is in OnSwapOutACK when the RenderFrame has completed 7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the operation and sends back an IPC message. 7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The trace event may not end properly if the ACK times out. We expect this 7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to be fixed when RenderViewHostImpl::OnSwapOut moves to RenderFrameHost. 7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_BEGIN0("navigation", "RenderFrameHostImpl::SwapOut", this); 7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 769effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // TODO(creis): Move swapped out state to RFH. Until then, only update it 770effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // when swapping out the main frame. 771effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GetParent()) { 772effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // If this RenderViewHost is not in the default state, it must have already 773effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // gone through this, therefore just return. 774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (render_view_host_->rvh_state_ != RenderViewHostImpl::STATE_DEFAULT) 775effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 776effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 777effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_host_->SetState( 77803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderViewHostImpl::STATE_PENDING_SWAP_OUT); 779effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_host_->unload_event_monitor_timeout_->Start( 780effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeDelta::FromMilliseconds( 781effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RenderViewHostImpl::kUnloadTimeoutMS)); 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 783effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) set_render_frame_proxy_host(proxy); 785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (IsRenderFrameLive()) 787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new FrameMsg_SwapOut(routing_id_, proxy->GetRoutingID())); 788effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 789effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GetParent()) 790effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch delegate_->SwappedOut(this); 79103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) else 79203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) set_swapped_out(true); 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::OnBeforeUnloadACK( 796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool proceed, 797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::TimeTicks& renderer_before_unload_start_time, 798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::TimeTicks& renderer_before_unload_end_time) { 7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_END0( 8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "navigation", "RenderFrameHostImpl::BeforeUnload", this); 8010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // TODO(creis): Support properly beforeunload on subframes. For now just 8020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // pretend that the handler ran and allowed the navigation to proceed. 803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (GetParent()) { 8040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch render_view_host_->is_waiting_for_beforeunload_ack_ = false; 8050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch frame_tree_node_->render_manager()->OnBeforeUnloadACK( 8060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch render_view_host_->unload_ack_is_for_cross_site_transition_, proceed, 8070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch renderer_before_unload_end_time); 808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_host_->decrement_in_flight_event_count(); 812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_host_->StopHangMonitorTimeout(); 813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If this renderer navigated while the beforeunload request was in flight, we 8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // may have cleared this state in OnDidCommitProvisionalLoad, in which case we 8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // can ignore this message. 816c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // However renderer might also be swapped out but we still want to proceed 817c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // with navigation, otherwise it would block future navigations. This can 818c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // happen when pending cross-site navigation is canceled by a second one just 8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // before OnDidCommitProvisionalLoad while current RVH is waiting for commit 8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // but second navigation is started from the beginning. 821c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!render_view_host_->is_waiting_for_beforeunload_ack_) { 822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_host_->is_waiting_for_beforeunload_ack_ = false; 826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks before_unload_end_time; 828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!send_before_unload_start_time_.is_null() && 829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !renderer_before_unload_start_time.is_null() && 830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !renderer_before_unload_end_time.is_null()) { 831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // When passing TimeTicks across process boundaries, we need to compensate 832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // for any skew between the processes. Here we are converting the 833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // renderer's notion of before_unload_end_time to TimeTicks in the browser 834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // process. See comments in inter_process_time_ticks_converter.h for more. 835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) InterProcessTimeTicksConverter converter( 836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LocalTimeTicks::FromTimeTicks(send_before_unload_start_time_), 837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LocalTimeTicks::FromTimeTicks(base::TimeTicks::Now()), 838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoteTimeTicks::FromTimeTicks(renderer_before_unload_start_time), 839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); 840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LocalTimeTicks browser_before_unload_end_time = 841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) converter.ToLocalTimeTicks( 842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); 843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) before_unload_end_time = browser_before_unload_end_time.ToTimeTicks(); 84403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 84503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Collect UMA on the inter-process skew. 84603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool is_skew_additive = false; 84703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (converter.IsSkewAdditiveForMetrics()) { 84803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_skew_additive = true; 84903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::TimeDelta skew = converter.GetSkewForMetrics(); 85003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (skew >= base::TimeDelta()) { 85103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) UMA_HISTOGRAM_TIMES( 85203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "InterProcessTimeTicks.BrowserBehind_RendererToBrowser", skew); 85303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } else { 85403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) UMA_HISTOGRAM_TIMES( 85503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "InterProcessTimeTicks.BrowserAhead_RendererToBrowser", -skew); 85603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 85703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 85803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN( 85903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "InterProcessTimeTicks.IsSkewAdditive_RendererToBrowser", 86003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_skew_additive); 861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_tree_node_->render_manager()->OnBeforeUnloadACK( 863a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_host_->unload_ack_is_for_cross_site_transition_, proceed, 864a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) before_unload_end_time); 865a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 866a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If canceled, notify the delegate to cancel its pending navigation entry. 867a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!proceed) 868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_host_->GetDelegate()->DidCancelLoading(); 869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 870a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnSwapOutACK() { 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnSwappedOut(false); 8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this); 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnSwappedOut(bool timed_out) { 877effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // For now, we only need to update the RVH state machine for top-level swaps. 878effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GetParent()) 879effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_host_->OnSwappedOut(timed_out); 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnContextMenu(const ContextMenuParams& params) { 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Validate the URLs in |params|. If the renderer can't request the URLs 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // directly, don't show them in the context menu. 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContextMenuParams validated_params(params); 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderProcessHost* process = GetProcess(); 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We don't validate |unfiltered_link_url| so that this field can be used 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // when users want to copy the original link URL. 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.link_url); 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.src_url); 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(false, &validated_params.page_url); 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.frame_url); 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->ShowContextMenu(this, validated_params); 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 898a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameHostImpl::OnJavaScriptExecuteResponse( 899a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int id, const base::ListValue& result) { 900a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::Value* result_value; 901a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!result.Get(0, &result_value)) { 902a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Programming error or rogue renderer. 903a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED() << "Got bad arguments for OnJavaScriptExecuteResponse"; 904a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 905a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 906a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 907a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::map<int, JavaScriptResultCallback>::iterator it = 908a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) javascript_callbacks_.find(id); 909a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (it != javascript_callbacks_.end()) { 910a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) it->second.Run(result_value); 911a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) javascript_callbacks_.erase(it); 912a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 913a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTREACHED() << "Received script response for unknown request"; 914a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 915a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 916a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 917c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameHostImpl::OnRunJavaScriptMessage( 918c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& default_prompt, 920c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& frame_url, 921c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch JavaScriptMessageType type, 922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg) { 923c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // While a JS message dialog is showing, tabs in the same process shouldn't 924c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // process input events. 925c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetProcess()->SetIgnoreInputEvents(true); 926c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->StopHangMonitorTimeout(); 927c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->RunJavaScriptMessage(this, message, default_prompt, 928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_url, type, reply_msg); 929c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameHostImpl::OnRunBeforeUnloadConfirm( 932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& frame_url, 933c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 934c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_reload, 935c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg) { 936c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // While a JS before unload dialog is showing, tabs in the same process 937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // shouldn't process input events. 938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetProcess()->SetIgnoreInputEvents(true); 939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->StopHangMonitorTimeout(); 940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delegate_->RunBeforeUnloadConfirm(this, message, is_reload, reply_msg); 941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 942c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 9435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderFrameHostImpl::OnRequestPlatformNotificationPermission( 9445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& origin, int request_id) { 9455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Callback<void(blink::WebNotificationPermission)> done_callback = 9465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind( 9475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &RenderFrameHostImpl::PlatformNotificationPermissionRequestDone, 9485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 9495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) request_id); 9505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 9510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetContentClient()->browser()->RequestDesktopNotificationPermission( 9525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) origin, this, done_callback); 9530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 9540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid RenderFrameHostImpl::OnShowDesktopNotification( 9560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int notification_id, 9570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const ShowDesktopNotificationHostMsgParams& params) { 9585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<DesktopNotificationDelegateImpl> delegate( 9595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new DesktopNotificationDelegateImpl(this, notification_id)); 9605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 9610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Closure cancel_callback; 9620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetContentClient()->browser()->ShowDesktopNotification( 9635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params, 9645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) this, 9655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) delegate.PassAs<DesktopNotificationDelegate>(), 9660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &cancel_callback); 9670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cancel_notification_callbacks_[notification_id] = cancel_callback; 9680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 9690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid RenderFrameHostImpl::OnCancelDesktopNotification(int notification_id) { 9710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!cancel_notification_callbacks_.count(notification_id)) { 9720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NOTREACHED(); 9730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 9740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 9750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cancel_notification_callbacks_[notification_id].Run(); 9760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cancel_notification_callbacks_.erase(notification_id); 9770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 9780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 979f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RenderFrameHostImpl::OnTextSurroundingSelectionResponse( 980f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::string16& content, 981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t start_offset, 982f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t end_offset) { 983f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) render_view_host_->OnTextSurroundingSelectionResponse( 984f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content, start_offset, end_offset); 985f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 986f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RenderFrameHostImpl::OnDidAccessInitialDocument() { 9885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delegate_->DidAccessInitialDocument(); 9895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 9905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderFrameHostImpl::OnDidDisownOpener() { 992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // This message is only sent for top-level frames. TODO(avi): when frame tree 993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // mirroring works correctly, add a check here to enforce it. 994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) delegate_->DidDisownOpener(this); 995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::OnDidAssignPageId(int32 page_id) { 9981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Update the RVH's current page ID so that future IPCs from the renderer 9991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // correspond to the new page. 10001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_host_->page_id_ = page_id; 10011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 10021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameHostImpl::OnUpdateTitle( 1004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 page_id, 1005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::string16& title, 1006cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) blink::WebTextDirection title_direction) { 1007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This message is only sent for top-level frames. TODO(avi): when frame tree 1008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // mirroring works correctly, add a check here to enforce it. 1009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (title.length() > kMaxTitleChars) { 1010cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED() << "Renderer sent too many characters in title."; 1011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 101403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) delegate_->UpdateTitle(this, page_id, title, 1015cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebTextDirectionToChromeTextDirection( 1016cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) title_direction)); 1017cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1019cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameHostImpl::OnUpdateEncoding(const std::string& encoding_name) { 1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This message is only sent for top-level frames. TODO(avi): when frame tree 1021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // mirroring works correctly, add a check here to enforce it. 1022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate_->UpdateEncoding(this, encoding_name); 1023cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1025116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::OnBeginNavigation( 1026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const FrameHostMsg_BeginNavigation_Params& params) { 102703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CHECK(CommandLine::ForCurrentProcess()->HasSwitch( 102803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) switches::kEnableBrowserSideNavigation)); 1029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_tree_node()->render_manager()->OnBeginNavigation(params); 1030116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1032116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::OnAccessibilityEvents( 1033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::vector<AccessibilityHostMsg_EventParams>& params) { 1034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 1035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host_->GetView()); 1036116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); 1038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if ((accessibility_mode != AccessibilityModeOff) && view && 1039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { 1040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (accessibility_mode & AccessibilityModeFlagPlatform) { 1041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetOrCreateBrowserAccessibilityManager(); 1042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (browser_accessibility_manager_) 1043116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_accessibility_manager_->OnAccessibilityEvents(params); 1044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (browser_accessibility_manager_) { 10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Get the frame routing ids from out-of-process iframes and 10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // browser plugin instance ids from guests and update the mappings in 10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // FrameAccessibility. 10501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (unsigned int i = 0; i < params.size(); ++i) { 10511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const AccessibilityHostMsg_EventParams& param = params[i]; 10521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UpdateCrossProcessIframeAccessibility( 10531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci param.node_to_frame_routing_id_map); 10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UpdateGuestFrameAccessibility( 10551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci param.node_to_browser_plugin_instance_id_map); 10561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 10581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Send the updates to the automation extension API. 1060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<AXEventNotificationDetails> details; 1061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch details.reserve(params.size()); 1062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < params.size(); ++i) { 1063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const AccessibilityHostMsg_EventParams& param = params[i]; 1064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AXEventNotificationDetails detail(param.update.node_id_to_clear, 1065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch param.update.nodes, 1066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch param.event_type, 1067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch param.id, 1068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetProcess()->GetID(), 1069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch routing_id_); 1070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch details.push_back(detail); 1071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1072116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate_->AccessibilityEventReceived(details); 1074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1075116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1076116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Always send an ACK or the renderer can be in a bad state. 1077116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new AccessibilityMsg_Events_ACK(routing_id_)); 1078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The rest of this code is just for testing; bail out if we're not 1080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // in that mode. 1081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (accessibility_testing_callback_.is_null()) 1082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 1083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < params.size(); i++) { 1085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const AccessibilityHostMsg_EventParams& param = params[i]; 1086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (static_cast<int>(param.event_type) < 0) 1087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue; 10881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!ax_tree_for_testing_) { 10901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (browser_accessibility_manager_) { 10911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ax_tree_for_testing_.reset(new ui::AXTree( 10921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_accessibility_manager_->SnapshotAXTreeForTesting())); 10931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 10941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ax_tree_for_testing_.reset(new ui::AXTree()); 10951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(ax_tree_for_testing_->Unserialize(param.update)) 10961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << ax_tree_for_testing_->error(); 10971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1098116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 1099116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(ax_tree_for_testing_->Unserialize(param.update)) 1100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << ax_tree_for_testing_->error(); 1101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accessibility_testing_callback_.Run(param.event_type, param.id); 1103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1106116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::OnAccessibilityLocationChanges( 1107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { 1108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 1109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host_->GetView()); 1110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view && 1111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { 1112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); 1113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (accessibility_mode & AccessibilityModeFlagPlatform) { 1114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!browser_accessibility_manager_) { 1115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_accessibility_manager_.reset( 1116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view->CreateBrowserAccessibilityManager(this)); 1117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (browser_accessibility_manager_) 1119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_accessibility_manager_->OnLocationChanges(params); 1120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aboxhall): send location change events to web contents observers too 1122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX) || defined(OS_ANDROID) 11261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::OnShowPopup( 11271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const FrameHostMsg_ShowPopup_Params& params) { 11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderViewHostDelegateView* view = 11291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_host_->delegate_->GetDelegateView(); 11301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (view) { 11311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view->ShowPopupMenu(this, 11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.bounds, 11331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.item_height, 11341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.item_font_size, 11351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.selected_item, 11361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.popup_items, 11371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.right_aligned, 11381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.allow_multiple_selection); 11391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 11401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 11411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::OnHidePopup() { 11431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderViewHostDelegateView* view = 11441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_host_->delegate_->GetDelegateView(); 11451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (view) 11461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view->HidePopupMenu(); 11471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 11481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 11491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::SetPendingShutdown(const base::Closure& on_swap_out) { 11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->SetPendingShutdown(on_swap_out); 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool RenderFrameHostImpl::CanCommitURL(const GURL& url) { 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(creis): We should also check for WebUI pages here. Also, when the 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // out-of-process iframes implementation is ready, we should check for 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cross-site URLs that are not allowed to commit in this process. 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Give the client a chance to disallow URLs from committing. 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::Navigate(const FrameMsg_Navigate_Params& params) { 11641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT0("navigation", "RenderFrameHostImpl::Navigate"); 11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Browser plugin guests are not allowed to navigate outside web-safe schemes, 11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // so do not grant them the ability to request additional URLs. 1167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!GetProcess()->IsIsolatedGuest()) { 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( 11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->GetID(), params.url); 1170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.url.SchemeIs(url::kDataScheme) && 1171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.base_url_for_data_url.SchemeIs(url::kFileScheme)) { 11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If 'data:' is used, and we have a 'file:' base url, grant access to 11735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // local files. 11745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( 11755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->GetID(), params.base_url_for_data_url); 11765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only send the message if we aren't suspended at the start of a cross-site 11805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // request. 11816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (navigations_suspended_) { 11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Shouldn't be possible to have a second navigation while suspended, since 11835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigations will only be suspended during a cross-site request. If a 11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // second navigation occurs, RenderFrameHostManager will cancel this pending 11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RFH and create a new pending RFH. 11866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(!suspended_nav_params_.get()); 11876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) suspended_nav_params_.reset(new FrameMsg_Navigate_Params(params)); 11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get back to a clean state, in case we start a new navigation without 11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // completing a RVH swap or unload handler. 11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->SetState(RenderViewHostImpl::STATE_DEFAULT); 11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameMsg_Navigate(routing_id_, params)); 11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Force the throbber to start. We do this because Blink's "started 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // loading" message will be received asynchronously from the UI of the 11985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // browser. But we want to keep the throbber in sync with what's happening 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // in the UI. For example, we want to start throbbing immediately when the 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // user naivgates even if the renderer is delayed. There is also an issue 12015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // with the throbber starting because the WebUI (which controls whether the 12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // favicon is displayed) happens synchronously. If the start loading 12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // messages was asynchronous, then the default favicon would flash in. 12045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 12055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Blink doesn't send throb notifications for JavaScript URLs, so we 12065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // don't want to either. 1207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!params.url.SchemeIs(url::kJavaScriptScheme)) 1208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch delegate_->DidStartLoading(this, true); 12095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::NavigateToURL(const GURL& url) { 12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate_Params params; 12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.page_id = -1; 12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.pending_history_list_offset = -1; 12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.current_history_list_offset = -1; 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.current_history_list_length = 0; 12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.url = url; 12181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.transition = ui::PAGE_TRANSITION_LINK; 12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.navigation_type = FrameMsg_Navigate_Type::NORMAL; 1220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.browser_navigation_start = base::TimeTicks::Now(); 12215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Navigate(params); 12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 12235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 122403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void RenderFrameHostImpl::Stop() { 122503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Send(new FrameMsg_Stop(routing_id_)); 122603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 122703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameHostImpl::DispatchBeforeUnload(bool for_cross_site_transition) { 12291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_BEGIN0( 12301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "navigation", "RenderFrameHostImpl::BeforeUnload", this); 1231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(creis): Support subframes. 12321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (GetParent() || !IsRenderFrameLive()) { 1233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // We don't have a live renderer, so just skip running beforeunload. 1234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->is_waiting_for_beforeunload_ack_ = true; 1235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->unload_ack_is_for_cross_site_transition_ = 1236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for_cross_site_transition; 1237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::TimeTicks now = base::TimeTicks::Now(); 1238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnBeforeUnloadACK(true, now, now); 1239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 1241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This may be called more than once (if the user clicks the tab close button 1243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // several times, or if she clicks the tab close button then the browser close 1244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // button), and we only send the message once. 1245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (render_view_host_->is_waiting_for_beforeunload_ack_) { 1246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Some of our close messages could be for the tab, others for cross-site 1247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // transitions. We always want to think it's for closing the tab if any 1248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // of the messages were, since otherwise it might be impossible to close 1249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // (if there was a cross-site "close" request pending when the user clicked 1250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // the close button). We want to keep the "for cross site" flag only if 1251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // both the old and the new ones are also for cross site. 1252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->unload_ack_is_for_cross_site_transition_ = 1253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->unload_ack_is_for_cross_site_transition_ && 1254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for_cross_site_transition; 1255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 1256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Start the hang monitor in case the renderer hangs in the beforeunload 1257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // handler. 1258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->is_waiting_for_beforeunload_ack_ = true; 1259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->unload_ack_is_for_cross_site_transition_ = 1260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for_cross_site_transition; 1261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Increment the in-flight event count, to ensure that input events won't 1262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // cancel the timeout timer. 1263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->increment_in_flight_event_count(); 1264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->StartHangMonitorTimeout( 1265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS)); 1266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch send_before_unload_start_time_ = base::TimeTicks::Now(); 1267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Send(new FrameMsg_BeforeUnload(routing_id_)); 1268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 1269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 12711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::DisownOpener() { 12721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new FrameMsg_DisownOpener(GetRoutingID())); 12731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameHostImpl::ExtendSelectionAndDelete(size_t before, 1276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t after) { 1277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new InputMsg_ExtendSelectionAndDelete(routing_id_, before, after)); 1278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameHostImpl::JavaScriptDialogClosed( 1281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Message* reply_msg, 1282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool success, 1283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& user_input, 1284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool dialog_was_suppressed) { 1285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetProcess()->SetIgnoreInputEvents(false); 1286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_waiting = render_view_host_->is_waiting_for_beforeunload_ack() || 1287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->IsWaitingForUnloadACK(); 1288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If we are executing as part of (before)unload event handling, we don't 1290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // want to use the regular hung_renderer_delay_ms_ if the user has agreed to 1291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // leave the current page. In this case, use the regular timeout value used 1292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // during the (before)unload handling. 1293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (is_waiting) { 1294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds( 1295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch success ? RenderViewHostImpl::kUnloadTimeoutMS 1296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : render_view_host_->hung_renderer_delay_ms_)); 1297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 1298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FrameHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, 1300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch success, user_input); 1301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Send(reply_msg); 1302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If we are waiting for an unload or beforeunload ack and the user has 1304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // suppressed messages, kill the tab immediately; a page that's spamming 1305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // alerts in onbeforeunload is presumably malicious, so there's no point in 1306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // continuing to run its script and dragging out the process. 1307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This must be done after sending the reply since RenderView can't close 1308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // correctly while waiting for a response. 1309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (is_waiting && dialog_was_suppressed) 1310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->delegate_->RendererUnresponsive( 1311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_, 1312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->is_waiting_for_beforeunload_ack(), 1313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view_host_->IsWaitingForUnloadACK()); 1314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid RenderFrameHostImpl::NotificationClosed(int notification_id) { 13170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cancel_notification_callbacks_.erase(notification_id); 13180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 13190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 13205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderFrameHostImpl::PlatformNotificationPermissionRequestDone( 13215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int request_id, blink::WebNotificationPermission permission) { 13225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Send(new PlatformNotificationMsg_PermissionRequestComplete( 13235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) routing_id_, request_id, permission)); 13240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 13250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 13261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::UpdateCrossProcessIframeAccessibility( 13271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::map<int32, int> node_to_frame_routing_id_map) { 13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::map<int32, int>::const_iterator iter; 13291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (iter = node_to_frame_routing_id_map.begin(); 13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter != node_to_frame_routing_id_map.end(); 13311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++iter) { 13321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This is the id of the accessibility node that has a child frame. 13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int32 node_id = iter->first; 13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The routing id from either a RenderFrame or a RenderFrameProxy. 13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int frame_routing_id = iter->second; 13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FrameTree* frame_tree = frame_tree_node()->frame_tree(); 13381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FrameTreeNode* child_frame_tree_node = frame_tree->FindByRoutingID( 13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetProcess()->GetID(), frame_routing_id); 13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (child_frame_tree_node) { 13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FrameAccessibility::GetInstance()->AddChildFrame( 13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, node_id, child_frame_tree_node->frame_tree_node_id()); 13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::UpdateGuestFrameAccessibility( 13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::map<int32, int> node_to_browser_plugin_instance_id_map) { 13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::map<int32, int>::const_iterator iter; 13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (iter = node_to_browser_plugin_instance_id_map.begin(); 13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter != node_to_browser_plugin_instance_id_map.end(); 13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++iter) { 13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This is the id of the accessibility node that hosts a plugin. 13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int32 node_id = iter->first; 13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The id of the browser plugin. 13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int browser_plugin_instance_id = iter->second; 13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FrameAccessibility::GetInstance()->AddGuestWebContents( 13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, node_id, browser_plugin_instance_id); 13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1362116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::SetAccessibilityMode(AccessibilityMode mode) { 1363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new FrameMsg_SetAccessibilityMode(routing_id_, mode)); 1364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1366116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::SetAccessibilityCallbackForTesting( 1367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(ui::AXEvent, int)>& callback) { 1368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accessibility_testing_callback_ = callback; 1369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1371116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst ui::AXTree* RenderFrameHostImpl::GetAXTreeForTesting() { 1372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ax_tree_for_testing_.get(); 1373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1375116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserAccessibilityManager* 1376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostImpl::GetOrCreateBrowserAccessibilityManager() { 1377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 1378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host_->GetView()); 1379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view && 1380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch !browser_accessibility_manager_) { 1381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_accessibility_manager_.reset( 1382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view->CreateBrowserAccessibilityManager(this)); 1383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return browser_accessibility_manager_.get(); 1385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) 13881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1389116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameHostImpl::SetParentNativeViewAccessible( 1390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::NativeViewAccessible accessible_parent) { 1391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 1392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_host_->GetView()); 1393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view) 1394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch view->SetParentNativeViewAccessible(accessible_parent); 1395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1397116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::NativeViewAccessible 1398116680a4aac90f2aa7413d9095a592090648e557Ben MurdochRenderFrameHostImpl::GetParentNativeViewAccessible() const { 1399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return delegate_->GetParentNativeViewAccessible(); 1400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 14011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_MACOSX) 14031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::DidSelectPopupMenuItem(int selected_index) { 14051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new FrameMsg_SelectPopupMenuItem(routing_id_, selected_index)); 14061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::DidCancelPopupMenu() { 14091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new FrameMsg_SelectPopupMenuItem(routing_id_, -1)); 14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_ANDROID) 14131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::DidSelectPopupMenuItems( 14151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<int>& selected_indices) { 14161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new FrameMsg_SelectPopupMenuItems(routing_id_, false, selected_indices)); 14171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameHostImpl::DidCancelPopupMenu() { 14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new FrameMsg_SelectPopupMenuItems( 14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci routing_id_, true, std::vector<int>())); 14221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 14266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderFrameHostImpl::ClearPendingTransitionRequestData() { 1427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BrowserThread::PostTask( 1428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BrowserThread::IO, 1429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 1430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind( 14316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &TransitionRequestManager::ClearPendingTransitionRequestData, 1432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(TransitionRequestManager::GetInstance()), 1433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetProcess()->GetID(), 14346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) routing_id_)); 14356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 14366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 14376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderFrameHostImpl::SetNavigationsSuspended( 14386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool suspend, 14396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const base::TimeTicks& proceed_time) { 14406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // This should only be called to toggle the state. 14416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(navigations_suspended_ != suspend); 14426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 14436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) navigations_suspended_ = suspend; 14441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (navigations_suspended_) { 14451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_BEGIN0("navigation", 14461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "RenderFrameHostImpl navigation suspended", this); 14471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 14481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_END0("navigation", 14491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "RenderFrameHostImpl navigation suspended", this); 14501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 14511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!suspend && suspended_nav_params_) { 14536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // There's navigation message params waiting to be sent. Now that we're not 14546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // suspended anymore, resume navigation by sending them. If we were swapped 14556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // out, we should also stop filtering out the IPC messages now. 14566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) render_view_host_->SetState(RenderViewHostImpl::STATE_DEFAULT); 14576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 14586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(!proceed_time.is_null()); 14596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) suspended_nav_params_->browser_navigation_start = proceed_time; 14606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Send(new FrameMsg_Navigate(routing_id_, *suspended_nav_params_)); 14616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) suspended_nav_params_.reset(); 14626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 14636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 14646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 14656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderFrameHostImpl::CancelSuspendedNavigations() { 14666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Clear any state if a pending navigation is canceled or preempted. 14676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (suspended_nav_params_) 14686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) suspended_nav_params_.reset(); 14691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_ASYNC_END0("navigation", 14711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "RenderFrameHostImpl navigation suspended", this); 14726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) navigations_suspended_ = false; 1473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 1476