render_frame_host_impl.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Copyright 2013 The Chromium Authors. All rights reserved.
2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Use of this source code is governed by a BSD-style license that can be
3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// found in the LICENSE file.
4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/render_frame_host_impl.h"
6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/containers/hash_tables.h"
8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/lazy_instance.h"
9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/metrics/user_metrics_action.h"
10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/child_process_security_policy_impl.h"
11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/cross_process_frame_connector.h"
12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/cross_site_transferring_request.h"
13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/frame_tree.h"
14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/frame_tree_node.h"
15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/navigator.h"
16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/render_frame_host_delegate.h"
17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/renderer_host/input/input_router.h"
18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/renderer_host/input/timeout_monitor.h"
19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/renderer_host/render_view_host_impl.h"
20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/common/frame_messages.h"
21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/common/input_messages.h"
22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/common/inter_process_time_ticks_converter.h"
23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/common/swapped_out_messages.h"
24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/browser/browser_thread.h"
25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/browser/content_browser_client.h"
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/browser/render_process_host.h"
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/browser/render_widget_host_view.h"
285dfe556188df2a3b2bfe73c8bc3b3b9216171a93osdl.org!shemminger#include "content/public/browser/user_metrics.h"
29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/common/url_constants.h"
3090f93024a0818dc691138d8401721e797004b042shemminger#include "content/public/common/url_utils.h"
3190f93024a0818dc691138d8401721e797004b042shemminger#include "url/gurl.h"
3290f93024a0818dc691138d8401721e797004b042shemminger
33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerusing base::TimeDelta;
34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingernamespace content {
364094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// The (process id, routing id) pair that identifies one RenderFrame.
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingertypedef std::pair<int32, int32> RenderFrameHostID;
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingertypedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*>
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    RoutingIDFrameMap;
41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map =
42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    LAZY_INSTANCE_INITIALIZER;
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerRenderFrameHost* RenderFrameHost::FromID(int render_process_id,
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                                         int render_frame_id) {
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  return RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// static
506b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen HemmingerRenderFrameHostImpl* RenderFrameHostImpl::FromID(
514b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger    int process_id, int routing_id) {
524b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
536b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger  RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer();
546b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger  RoutingIDFrameMap::iterator it = frames->find(
554b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger      RenderFrameHostID(process_id, routing_id));
566b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger  return it == frames->end() ? NULL : it->second;
576b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger}
586b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger
594b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen HemmingerRenderFrameHostImpl::RenderFrameHostImpl(
606b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger    RenderViewHostImpl* render_view_host,
616b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger    RenderFrameHostDelegate* delegate,
624b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger    FrameTree* frame_tree,
634b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger    FrameTreeNode* frame_tree_node,
644b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger    int routing_id,
655a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson    bool is_swapped_out)
665a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson    : render_view_host_(render_view_host),
675a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson      delegate_(delegate),
685a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson      cross_process_frame_connector_(NULL),
695a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson      frame_tree_(frame_tree),
705a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson      frame_tree_node_(frame_tree_node),
715a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson      routing_id_(routing_id),
725a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson      is_swapped_out_(is_swapped_out) {
736b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger  frame_tree_->RegisterRenderFrameHost(this);
746b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger  GetProcess()->AddRoute(routing_id_, this);
756b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger  g_routing_id_frame_map.Get().insert(std::make_pair(
766b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger      RenderFrameHostID(GetProcess()->GetID(), routing_id_),
776b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger      this));
785a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson}
796b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger
805a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas HenrikssonRenderFrameHostImpl::~RenderFrameHostImpl() {
815a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson  GetProcess()->RemoveRoute(routing_id_);
825a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson  g_routing_id_frame_map.Get().erase(
835a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson      RenderFrameHostID(GetProcess()->GetID(), routing_id_));
845a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson  if (delegate_)
854094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger    delegate_->RenderFrameDeleted(this);
86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Notify the FrameTree that this RFH is going away, allowing it to shut down
88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // the corresponding RenderViewHost if it is no longer needed.
89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_->UnregisterRenderFrameHost(this);
90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint RenderFrameHostImpl::GetRoutingID() {
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  return routing_id_;
94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerSiteInstance* RenderFrameHostImpl::GetSiteInstance() {
97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  return render_view_host_->GetSiteInstance();
98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
9954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
10054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick JonesRenderProcessHost* RenderFrameHostImpl::GetProcess() {
10154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  // TODO(nasko): This should return its own process, once we have working
10254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  // cross-process navigation for subframes.
10354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  return render_view_host_->GetProcess();
10454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
10554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
10654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick JonesRenderFrameHost* RenderFrameHostImpl::GetParent() {
10754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  FrameTreeNode* parent_node = frame_tree_node_->parent();
10854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  if (!parent_node)
10954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones    return NULL;
11054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  return parent_node->current_frame_host();
11154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
11254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
11354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesconst std::string& RenderFrameHostImpl::GetFrameName() {
11454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  return frame_tree_node_->frame_name();
11554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
11654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
11754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesbool RenderFrameHostImpl::IsCrossProcessSubframe() {
11854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  FrameTreeNode* parent_node = frame_tree_node_->parent();
11954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  if (!parent_node)
12054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones    return false;
12154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  return GetSiteInstance() !=
12254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones      parent_node->current_frame_host()->GetSiteInstance();
12354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
12454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
12554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick JonesGURL RenderFrameHostImpl::GetLastCommittedURL() {
12654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  return frame_tree_node_->current_url();
12754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
12854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
12954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesgfx::NativeView RenderFrameHostImpl::GetNativeView() {
13054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  RenderWidgetHostView* view = render_view_host_->GetView();
13154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  if (!view)
13254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones    return NULL;
13354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  return view->GetNativeView();
13454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
13554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
13654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesvoid RenderFrameHostImpl::ExecuteJavaScript(
13754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones    const base::string16& javascript) {
13854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  Send(new FrameMsg_JavaScriptExecuteRequest(routing_id_,
13954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones                                             javascript,
14054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones                                             0, false));
14154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
14254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
14354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesvoid RenderFrameHostImpl::ExecuteJavaScript(
14454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones     const base::string16& javascript,
14554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones     const JavaScriptResultCallback& callback) {
14654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  static int next_id = 1;
14754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  int key = next_id++;
14854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  Send(new FrameMsg_JavaScriptExecuteRequest(routing_id_,
14954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones                                             javascript,
15054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones                                             key, true));
15154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  javascript_callbacks_.insert(std::make_pair(key, callback));
15254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
15354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
15454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick JonesRenderViewHost* RenderFrameHostImpl::GetRenderViewHost() {
15554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  return render_view_host_;
15654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones}
15754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones
15854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesbool RenderFrameHostImpl::Send(IPC::Message* message) {
15954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  if (IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart) {
16054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones    return render_view_host_->input_router()->SendInput(
16154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones        make_scoped_ptr(message));
16254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones  }
163c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger
164c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger  return GetProcess()->Send(message);
165c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger}
166c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger
167c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerbool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) {
168c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger  // Filter out most IPC messages if this renderer is swapped out.
169c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger  // We still want to handle certain ACKs to keep our state consistent.
170c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger  // TODO(nasko): Only check RenderViewHost state, as this object's own state
171c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger  // isn't yet properly updated. Transition this check once the swapped out
172c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger  // state is correct in RenderFrameHost itself.
173c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger  if (render_view_host_->IsSwappedOut()) {
174c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger    if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) {
175c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger      // If this is a synchronous message and we decided not to handle it,
176c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger      // we must send an error reply, or else the renderer will be stuck
1774094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger      // and won't respond to future requests.
178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      if (msg.is_sync()) {
179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        reply->set_reply_error();
181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        Send(reply);
182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      }
183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      // Don't continue looking for someone to handle it.
184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      return true;
185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    }
186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (delegate_->OnMessageReceived(this, msg))
189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return true;
190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
1914094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger  if (cross_process_frame_connector_ &&
192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      cross_process_frame_connector_->OnMessageReceived(msg))
193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return true;
194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  bool handled = true;
196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  bool msg_is_ok = true;
197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameHostImpl, msg, msg_is_ok)
198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_AddMessageToConsole, OnAddMessageToConsole)
199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach)
200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_FrameFocused, OnFrameFocused)
201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartProvisionalLoadForFrame,
202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                        OnDidStartProvisionalLoadForFrame)
203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailProvisionalLoadWithError,
204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                        OnDidFailProvisionalLoadWithError)
2054094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_DidRedirectProvisionalLoad,
206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                        OnDidRedirectProvisionalLoad)
207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailLoadWithError,
208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                        OnDidFailLoadWithError)
209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER_GENERIC(FrameHostMsg_DidCommitProvisionalLoad,
210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                                OnNavigate(msg))
211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartLoading, OnDidStartLoading)
212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading)
213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_OpenURL, OnOpenURL)
214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnload_ACK, OnBeforeUnloadACK)
215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_SwapOut_ACK, OnSwapOutACK)
216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_ContextMenu, OnContextMenu)
217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER(FrameHostMsg_JavaScriptExecuteResponse,
218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                        OnJavaScriptExecuteResponse)
2194094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger    IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunJavaScriptMessage,
220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                                    OnRunJavaScriptMessage)
221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunBeforeUnloadConfirm,
222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                                    OnRunBeforeUnloadConfirm)
223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  IPC_END_MESSAGE_MAP_EX()
224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!msg_is_ok) {
226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // The message had a handler, but its de-serialization failed.
227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // Kill the renderer.
228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    RecordAction(base::UserMetricsAction("BadMessageTerminate_RFH"));
229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    GetProcess()->ReceivedBadMessage();
230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  return handled;
2334094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger}
234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::Init() {
236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  GetProcess()->ResumeRequestsForView(routing_id_);
237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnAddMessageToConsole(
240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    int32 level,
241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const base::string16& message,
242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    int32 line_no,
243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const base::string16& source_id) {
244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (delegate_->AddMessageToConsole(level, message, line_no, source_id))
245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
247cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  // Pass through log level only on WebUI pages to limit console spew.
248cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  int32 resolved_level =
249cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger      HasWebUIScheme(delegate_->GetMainFrameLastCommittedURL()) ? level : 0;
250cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger
251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (resolved_level >= ::logging::GetMinLogLevel()) {
252cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger    logging::LogMessage("CONSOLE", line_no, resolved_level).stream() << "\"" <<
253cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger        message << "\", source: " << source_id << " (" << line_no << ")";
254cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  }
255cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger}
256cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger
257cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemmingervoid RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id,
258cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger                                             const std::string& frame_name) {
259cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  RenderFrameHostImpl* new_frame = frame_tree_->AddFrame(
260cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger      frame_tree_node_, new_routing_id, frame_name);
261cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  if (delegate_)
262cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger    delegate_->RenderFrameCreated(new_frame);
263cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger}
26494afda752956ddc6ff1accf931bc3d03c070bb18Stephen Hemminger
265cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemmingervoid RenderFrameHostImpl::OnDetach() {
266cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  frame_tree_->RemoveFrame(frame_tree_node_);
267cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger}
268cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger
269cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemmingervoid RenderFrameHostImpl::OnFrameFocused() {
270cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  frame_tree_->SetFocusedFrame(frame_tree_node_);
271cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger}
272cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger
273cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemmingervoid RenderFrameHostImpl::OnOpenURL(
274cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger    const FrameHostMsg_OpenURL_Params& params) {
275cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  GURL validated_url(params.url);
276cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  GetProcess()->FilterURL(false, &validated_url);
277cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger
278cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger  frame_tree_node_->navigator()->RequestOpenURL(
279cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger      this, validated_url, params.referrer, params.disposition,
280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      params.should_replace_current_entry, params.user_gesture);
281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidStartProvisionalLoadForFrame(
284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    int parent_routing_id,
285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const GURL& url) {
286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_node_->navigator()->DidStartProvisionalLoad(
287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      this, parent_routing_id, url);
288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
290aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidFailProvisionalLoadWithError(
291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) {
292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_node_->navigator()->DidFailProvisionalLoadWithError(this, params);
293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidFailLoadWithError(
296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const GURL& url,
297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    int error_code,
298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const base::string16& error_description) {
299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  GURL validated_url(url);
300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  GetProcess()->FilterURL(false, &validated_url);
301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_node_->navigator()->DidFailLoadWithError(
303aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      this, validated_url, error_code, error_description);
304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidRedirectProvisionalLoad(
307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    int32 page_id,
308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const GURL& source_url,
309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const GURL& target_url) {
310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_node_->navigator()->DidRedirectProvisionalLoad(
311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      this, page_id, source_url, target_url);
312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Called when the renderer navigates.  For every frame loaded, we'll get this
315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// notification containing parameters identifying the navigation.
316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger//
317aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Subframes are identified by the page transition type.  For subframes loaded
31894afda752956ddc6ff1accf931bc3d03c070bb18Stephen Hemminger// as part of a wider page load, the page_id will be the same as for the top
319cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger// level frame.  If the user explicitly requests a subframe navigation, we will
320516ffb6b7724e97ca035293dcfd9f94cf6ce3a47Stephen Hemminger// get a new page_id because we need to create a new navigation entry for that
32194afda752956ddc6ff1accf931bc3d03c070bb18Stephen Hemminger// action.
322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnNavigate(const IPC::Message& msg) {
323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Read the parameters out of the IPC message directly to avoid making another
324aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // copy when we filter the URLs.
325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  PickleIterator iter(msg);
326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  FrameHostMsg_DidCommitProvisionalLoad_Params validated_params;
327fb9b1d0f6a9f355bceae435ea43f1c8f3635b2dfosdl.net!shemminger  if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>::
328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      Read(&msg, &iter, &validated_params))
329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
330aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
331aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // If we're waiting for a cross-site beforeunload ack from this renderer and
332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // we receive a Navigate message from the main frame, then the renderer was
333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // navigating already and sent it before hearing the ViewMsg_Stop message.
334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // We do not want to cancel the pending navigation in this case, since the
335aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // old page will soon be stopped.  Instead, treat this as a beforeunload ack
336aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // to allow the pending navigation to continue.
337aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (render_view_host_->is_waiting_for_beforeunload_ack_ &&
338aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      render_view_host_->unload_ack_is_for_cross_site_transition_ &&
339aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      PageTransitionIsMainFrame(validated_params.transition)) {
340aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    OnBeforeUnloadACK(true, send_before_unload_start_time_,
341aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                      base::TimeTicks::Now());
342aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
343aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
344aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
345aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // If we're waiting for an unload ack from this renderer and we receive a
346aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Navigate message, then the renderer was navigating before it received the
347aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // unload request.  It will either respond to the unload request soon or our
348aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // timer will expire.  Either way, we should ignore this message, because we
349fb9b1d0f6a9f355bceae435ea43f1c8f3635b2dfosdl.net!shemminger  // have already committed to closing this renderer.
350aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (render_view_host_->IsWaitingForUnloadACK())
351aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
352aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
353aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  RenderProcessHost* process = GetProcess();
354aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
355aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Attempts to commit certain off-limits URL should be caught more strictly
356aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // than our FilterURL checks below.  If a renderer violates this policy, it
357aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // should be killed.
358aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!CanCommitURL(validated_params.url)) {
359aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    VLOG(1) << "Blocked URL " << validated_params.url.spec();
360aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    validated_params.url = GURL(kAboutBlankURL);
361aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    RecordAction(base::UserMetricsAction("CanCommitURL_BlockedAndKilled"));
362aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // Kills the process.
363aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    process->ReceivedBadMessage();
3645a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson  }
3655a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson
366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Now that something has committed, we don't need to track whether the
367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // initial page has been accessed.
368aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  render_view_host_->has_accessed_initial_document_ = false;
369f082b64fb40b467bc1f9e5d245114aae4e256d5cnet[shemminger]!shemminger
370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Without this check, an evil renderer can trick the browser into creating
371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // a navigation entry for a banned URL.  If the user clicks the back button
372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // followed by the forward button (or clicks reload, or round-trips through
373aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // session restore, etc), we'll think that the browser commanded the
374aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // renderer to load the URL and grant the renderer the privileges to request
375aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // the URL.  To prevent this attack, we block the renderer from inserting
376aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // banned URLs into the navigation controller in the first place.
377aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  process->FilterURL(false, &validated_params.url);
378aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  process->FilterURL(true, &validated_params.referrer.url);
379c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger  for (std::vector<GURL>::iterator it(validated_params.redirects.begin());
380aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      it != validated_params.redirects.end(); ++it) {
381aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    process->FilterURL(false, &(*it));
382aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
383aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  process->FilterURL(true, &validated_params.searchable_form_url);
384aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
385aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Without this check, the renderer can trick the browser into using
386aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // filenames it can't access in a future session restore.
387aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!render_view_host_->CanAccessFilesOfPageState(
388aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger          validated_params.page_state)) {
389aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    GetProcess()->ReceivedBadMessage();
390aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
391aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
392fb9b1d0f6a9f355bceae435ea43f1c8f3635b2dfosdl.net!shemminger
393aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_node()->navigator()->DidNavigate(this, validated_params);
394aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
395aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
396aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint RenderFrameHostImpl::GetEnabledBindings() {
397aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  return render_view_host_->GetEnabledBindings();
398aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
399aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
400aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnCrossSiteResponse(
401aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const GlobalRequestID& global_request_id,
402aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request,
403aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const std::vector<GURL>& transfer_url_chain,
404aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const Referrer& referrer,
405c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger    PageTransition page_transition,
406aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    bool should_replace_current_entry) {
407aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_node_->render_manager()->OnCrossSiteResponse(
408aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      this, global_request_id, cross_site_transferring_request.Pass(),
409aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      transfer_url_chain, referrer, page_transition,
410aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      should_replace_current_entry);
411aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
412aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
413aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::SwapOut() {
414aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // TODO(creis): Move swapped out state to RFH.  Until then, only update it
4154094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger  // when swapping out the main frame.
416aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!GetParent()) {
417aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // If this RenderViewHost is not in the default state, it must have already
418aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // gone through this, therefore just return.
419aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    if (render_view_host_->rvh_state_ != RenderViewHostImpl::STATE_DEFAULT)
420aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      return;
421c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger
422c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger    render_view_host_->SetState(
423c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger        RenderViewHostImpl::STATE_WAITING_FOR_UNLOAD_ACK);
424c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger    render_view_host_->unload_event_monitor_timeout_->Start(
425c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger        base::TimeDelta::FromMilliseconds(
426c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger            RenderViewHostImpl::kUnloadTimeoutMS));
4274094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger  }
428aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
429aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (render_view_host_->IsRenderViewLive())
430aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    Send(new FrameMsg_SwapOut(routing_id_));
431aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
432aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!GetParent())
4334094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger    delegate_->SwappedOut(this);
434aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
435aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Allow the navigation to proceed.
436aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_node_->render_manager()->SwappedOut(this);
437aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
438aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
4394094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemmingervoid RenderFrameHostImpl::OnDidStartLoading(bool to_different_document) {
440aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  delegate_->DidStartLoading(this, to_different_document);
441aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
442aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
443aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidStopLoading() {
444aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  delegate_->DidStopLoading(this);
4454094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger}
446aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
447aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnBeforeUnloadACK(
448aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    bool proceed,
449aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const base::TimeTicks& renderer_before_unload_start_time,
450aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const base::TimeTicks& renderer_before_unload_end_time) {
451aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // TODO(creis): Support beforeunload on subframes.
452aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (GetParent()) {
4534094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger    NOTREACHED() << "Should only receive BeforeUnload_ACK from the main frame.";
454aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
4559626dfd54c3cc4deec1c651a0bfee65b50feb78bStephen Hemminger  }
4569626dfd54c3cc4deec1c651a0bfee65b50feb78bStephen Hemminger
457aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  render_view_host_->decrement_in_flight_event_count();
458aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  render_view_host_->StopHangMonitorTimeout();
459aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // If this renderer navigated while the beforeunload request was in flight, we
460aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // may have cleared this state in OnNavigate, in which case we can ignore
461aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // this message.
462aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // However renderer might also be swapped out but we still want to proceed
463aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // with navigation, otherwise it would block future navigations. This can
464aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // happen when pending cross-site navigation is canceled by a second one just
465aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // before OnNavigate while current RVH is waiting for commit but second
466aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // navigation is started from the beginning.
467aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!render_view_host_->is_waiting_for_beforeunload_ack_) {
468aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
469aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
470aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
471aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  render_view_host_->is_waiting_for_beforeunload_ack_ = false;
472aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
473aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  base::TimeTicks before_unload_end_time;
474aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!send_before_unload_start_time_.is_null() &&
475aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      !renderer_before_unload_start_time.is_null() &&
476aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      !renderer_before_unload_end_time.is_null()) {
477aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // When passing TimeTicks across process boundaries, we need to compensate
478aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // for any skew between the processes. Here we are converting the
479aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // renderer's notion of before_unload_end_time to TimeTicks in the browser
480aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // process. See comments in inter_process_time_ticks_converter.h for more.
481aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    InterProcessTimeTicksConverter converter(
482aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        LocalTimeTicks::FromTimeTicks(send_before_unload_start_time_),
483aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        LocalTimeTicks::FromTimeTicks(base::TimeTicks::Now()),
484aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        RemoteTimeTicks::FromTimeTicks(renderer_before_unload_start_time),
485aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time));
486aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    LocalTimeTicks browser_before_unload_end_time =
487aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        converter.ToLocalTimeTicks(
488aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger            RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time));
489aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    before_unload_end_time = browser_before_unload_end_time.ToTimeTicks();
490aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
491aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  frame_tree_node_->render_manager()->OnBeforeUnloadACK(
492aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      render_view_host_->unload_ack_is_for_cross_site_transition_, proceed,
493aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      before_unload_end_time);
494c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger
495aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // If canceled, notify the delegate to cancel its pending navigation entry.
496aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!proceed)
497aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->GetDelegate()->DidCancelLoading();
498aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
499aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
500aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnSwapOutACK() {
501aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  OnSwappedOut(false);
502aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
503aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
504aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnSwappedOut(bool timed_out) {
505aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // For now, we only need to update the RVH state machine for top-level swaps.
506aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Subframe swaps (in --site-per-process) can just continue via RFHM.
507aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!GetParent())
508aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->OnSwappedOut(timed_out);
509aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  else
510aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    frame_tree_node_->render_manager()->SwappedOut(this);
511aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
512aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
5135e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemmingervoid RenderFrameHostImpl::OnContextMenu(const ContextMenuParams& params) {
5145e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger  // Validate the URLs in |params|.  If the renderer can't request the URLs
5155e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger  // directly, don't show them in the context menu.
5165e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger  ContextMenuParams validated_params(params);
5175e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger  RenderProcessHost* process = GetProcess();
5185e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger
5195e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger  // We don't validate |unfiltered_link_url| so that this field can be used
5204094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger  // when users want to copy the original link URL.
521aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  process->FilterURL(true, &validated_params.link_url);
522aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  process->FilterURL(true, &validated_params.src_url);
523aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  process->FilterURL(false, &validated_params.page_url);
524aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  process->FilterURL(true, &validated_params.frame_url);
525aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
526aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  delegate_->ShowContextMenu(this, validated_params);
527aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
528aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
529aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnJavaScriptExecuteResponse(
530aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    int id, const base::ListValue& result) {
531aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  const base::Value* result_value;
532aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!result.Get(0, &result_value)) {
533aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // Programming error or rogue renderer.
534aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    NOTREACHED() << "Got bad arguments for OnJavaScriptExecuteResponse";
535aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
536aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
537aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
538aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  std::map<int, JavaScriptResultCallback>::iterator it =
539aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      javascript_callbacks_.find(id);
540aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (it != javascript_callbacks_.end()) {
541aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    it->second.Run(result_value);
542aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    javascript_callbacks_.erase(it);
5437dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger  } else {
544aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    NOTREACHED() << "Received script response for unknown request";
545aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
546aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
5477dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger
5487dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemmingervoid RenderFrameHostImpl::OnRunJavaScriptMessage(
549aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const base::string16& message,
5507dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger    const base::string16& default_prompt,
551aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const GURL& frame_url,
552aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    JavaScriptMessageType type,
553aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC::Message* reply_msg) {
554aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // While a JS message dialog is showing, tabs in the same process shouldn't
555aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // process input events.
556aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  GetProcess()->SetIgnoreInputEvents(true);
557aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  render_view_host_->StopHangMonitorTimeout();
558aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  delegate_->RunJavaScriptMessage(this, message, default_prompt,
559aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger                                  frame_url, type, reply_msg);
560aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
561aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
562aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnRunBeforeUnloadConfirm(
563aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const GURL& frame_url,
564aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    const base::string16& message,
5657dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger    bool is_reload,
566aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    IPC::Message* reply_msg) {
567aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // While a JS before unload dialog is showing, tabs in the same process
568aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // shouldn't process input events.
569aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  GetProcess()->SetIgnoreInputEvents(true);
570aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  render_view_host_->StopHangMonitorTimeout();
571aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  delegate_->RunBeforeUnloadConfirm(this, message, is_reload, reply_msg);
572aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
573aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
574aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::SetPendingShutdown(const base::Closure& on_swap_out) {
575aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  render_view_host_->SetPendingShutdown(on_swap_out);
576aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
577aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
578aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerbool RenderFrameHostImpl::CanCommitURL(const GURL& url) {
579aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // TODO(creis): We should also check for WebUI pages here.  Also, when the
580aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // out-of-process iframes implementation is ready, we should check for
581aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // cross-site URLs that are not allowed to commit in this process.
582aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
583aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Give the client a chance to disallow URLs from committing.
584aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  return GetContentClient()->browser()->CanCommitURL(GetProcess(), url);
585c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger}
586aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
587aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::Navigate(const FrameMsg_Navigate_Params& params) {
588aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  TRACE_EVENT0("frame_host", "RenderFrameHostImpl::Navigate");
589aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Browser plugin guests are not allowed to navigate outside web-safe schemes,
590aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // so do not grant them the ability to request additional URLs.
591aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!GetProcess()->IsGuest()) {
592aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL(
593aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        GetProcess()->GetID(), params.url);
594c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger    if (params.url.SchemeIs(kDataScheme) &&
5954094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger        params.base_url_for_data_url.SchemeIs(kFileScheme)) {
596aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      // If 'data:' is used, and we have a 'file:' base url, grant access to
597aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      // local files.
598aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger      ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL(
5997dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger          GetProcess()->GetID(), params.base_url_for_data_url);
6007dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger    }
601aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
602aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
603aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Only send the message if we aren't suspended at the start of a cross-site
604aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // request.
605aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (render_view_host_->navigations_suspended_) {
606aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // Shouldn't be possible to have a second navigation while suspended, since
607aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // navigations will only be suspended during a cross-site request.  If a
608aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // second navigation occurs, RenderFrameHostManager will cancel this pending
609aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // RFH and create a new pending RFH.
610aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    DCHECK(!render_view_host_->suspended_nav_params_.get());
611aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->suspended_nav_params_.reset(
612aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        new FrameMsg_Navigate_Params(params));
613aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  } else {
614aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // Get back to a clean state, in case we start a new navigation without
615aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // completing a RVH swap or unload handler.
616aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->SetState(RenderViewHostImpl::STATE_DEFAULT);
617aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
618aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    Send(new FrameMsg_Navigate(routing_id_, params));
619aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
620aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
621aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Force the throbber to start. We do this because Blink's "started
622aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // loading" message will be received asynchronously from the UI of the
623aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // browser. But we want to keep the throbber in sync with what's happening
624aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // in the UI. For example, we want to start throbbing immediately when the
625aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // user naivgates even if the renderer is delayed. There is also an issue
626aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // with the throbber starting because the WebUI (which controls whether the
627aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // favicon is displayed) happens synchronously. If the start loading
628aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // messages was asynchronous, then the default favicon would flash in.
629aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  //
630aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // Blink doesn't send throb notifications for JavaScript URLs, so we
631f332d169246447bd5e258ac03d5ee840a70adb1eshemminger  // don't want to either.
632aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!params.url.SchemeIs(kJavaScriptScheme))
633f332d169246447bd5e258ac03d5ee840a70adb1eshemminger    delegate_->DidStartLoading(this, true);
634aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
635aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
636aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::NavigateToURL(const GURL& url) {
637aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  FrameMsg_Navigate_Params params;
638aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  params.page_id = -1;
639aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  params.pending_history_list_offset = -1;
640aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  params.current_history_list_offset = -1;
641aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  params.current_history_list_length = 0;
642aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  params.url = url;
643aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  params.transition = PAGE_TRANSITION_LINK;
644aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  params.navigation_type = FrameMsg_Navigate_Type::NORMAL;
645aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  Navigate(params);
646aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
647aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
648aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::DispatchBeforeUnload(bool for_cross_site_transition) {
649aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // TODO(creis): Support subframes.
650f332d169246447bd5e258ac03d5ee840a70adb1eshemminger  DCHECK(!GetParent());
651aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
652aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (!render_view_host_->IsRenderViewLive()) {
653aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // We don't have a live renderer, so just skip running beforeunload.
654aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->is_waiting_for_beforeunload_ack_ = true;
655aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->unload_ack_is_for_cross_site_transition_ =
656aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        for_cross_site_transition;
657aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    base::TimeTicks now = base::TimeTicks::Now();
658aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    OnBeforeUnloadACK(true, now, now);
659aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    return;
660aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  }
661aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
662aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // This may be called more than once (if the user clicks the tab close button
663aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // several times, or if she clicks the tab close button then the browser close
664aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  // button), and we only send the message once.
665aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  if (render_view_host_->is_waiting_for_beforeunload_ack_) {
666aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // Some of our close messages could be for the tab, others for cross-site
667aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // transitions. We always want to think it's for closing the tab if any
668aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // of the messages were, since otherwise it might be impossible to close
669aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // (if there was a cross-site "close" request pending when the user clicked
670aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // the close button). We want to keep the "for cross site" flag only if
671aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // both the old and the new ones are also for cross site.
672aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->unload_ack_is_for_cross_site_transition_ =
673aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        render_view_host_->unload_ack_is_for_cross_site_transition_ &&
674aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        for_cross_site_transition;
675aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger  } else {
676aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // Start the hang monitor in case the renderer hangs in the beforeunload
677aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // handler.
678aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->is_waiting_for_beforeunload_ack_ = true;
679aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->unload_ack_is_for_cross_site_transition_ =
680aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        for_cross_site_transition;
681aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // Increment the in-flight event count, to ensure that input events won't
682aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    // cancel the timeout timer.
683aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->increment_in_flight_event_count();
684aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    render_view_host_->StartHangMonitorTimeout(
685aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS));
686aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger    send_before_unload_start_time_ = base::TimeTicks::Now();
68790f93024a0818dc691138d8401721e797004b042shemminger    Send(new FrameMsg_BeforeUnload(routing_id_));
68890f93024a0818dc691138d8401721e797004b042shemminger  }
68990f93024a0818dc691138d8401721e797004b042shemminger}
69090f93024a0818dc691138d8401721e797004b042shemminger
69190f93024a0818dc691138d8401721e797004b042shemmingervoid RenderFrameHostImpl::ExtendSelectionAndDelete(size_t before,
69290f93024a0818dc691138d8401721e797004b042shemminger                                                   size_t after) {
69390f93024a0818dc691138d8401721e797004b042shemminger  Send(new FrameMsg_ExtendSelectionAndDelete(routing_id_, before, after));
69490f93024a0818dc691138d8401721e797004b042shemminger}
69590f93024a0818dc691138d8401721e797004b042shemminger
69690f93024a0818dc691138d8401721e797004b042shemmingervoid RenderFrameHostImpl::JavaScriptDialogClosed(
69790f93024a0818dc691138d8401721e797004b042shemminger    IPC::Message* reply_msg,
69890f93024a0818dc691138d8401721e797004b042shemminger    bool success,
69990f93024a0818dc691138d8401721e797004b042shemminger    const base::string16& user_input,
70090f93024a0818dc691138d8401721e797004b042shemminger    bool dialog_was_suppressed) {
701351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  GetProcess()->SetIgnoreInputEvents(false);
702351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  bool is_waiting = render_view_host_->is_waiting_for_beforeunload_ack() ||
703351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger                    render_view_host_->IsWaitingForUnloadACK();
704351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger
705d21e88354b2a42b026384730a767f2108bcf8efeAndreas Henriksson  // If we are executing as part of (before)unload event handling, we don't
706351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  // want to use the regular hung_renderer_delay_ms_ if the user has agreed to
707d21e88354b2a42b026384730a767f2108bcf8efeAndreas Henriksson  // leave the current page. In this case, use the regular timeout value used
708351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  // during the (before)unload handling.
709ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger  if (is_waiting) {
710351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger    render_view_host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(
711351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger        success ? RenderViewHostImpl::kUnloadTimeoutMS
712351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger                : render_view_host_->hung_renderer_delay_ms_));
713351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  }
714351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger
715ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger  FrameHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg,
716351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger                                                      success, user_input);
717ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger  Send(reply_msg);
718351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger
719351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  // If we are waiting for an unload or beforeunload ack and the user has
720351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  // suppressed messages, kill the tab immediately; a page that's spamming
721351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  // alerts in onbeforeunload is presumably malicious, so there's no point in
722351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  // continuing to run its script and dragging out the process.
723351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  // This must be done after sending the reply since RenderView can't close
724351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  // correctly while waiting for a response.
725351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger  if (is_waiting && dialog_was_suppressed)
726351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger    render_view_host_->delegate_->RendererUnresponsive(
727351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger        render_view_host_,
728351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger        render_view_host_->is_waiting_for_beforeunload_ack(),
729351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger        render_view_host_->IsWaitingForUnloadACK());
730351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger}
731351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger
732ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger}  // namespace content
733351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger