15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/debug/trace_event.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/sys_info.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "cc/base/switches.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/cross_site_request_manager.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/dom_storage/session_storage_namespace_impl.h"
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/frame_tree.h"
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/frame_host/render_frame_host_factory.h"
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/gpu/compositor_util.h"
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/gpu/gpu_data_manager_impl.h"
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/gpu/gpu_process_host.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_surface_tracker.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/host_zoom_map_impl.h"
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h"
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/renderer_host/media/audio_renderer_host.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_delegate.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/accessibility_messages.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/desktop_notification_messages.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/drag_messages.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/inter_process_time_ticks_converter.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/speech_recognition_messages.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/swapped_out_messages.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_view_host_delegate_view.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_accessibility_state.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/dom_operation_notification_details.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/render_widget_host_iterator.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/context_menu_params.h"
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/url_utils.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "net/base/network_change_notifier.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/base/touch/touch_device.h"
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/base/touch/touch_enabled.h"
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/base/ui_base_switches.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h"
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/isolated_context.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_MACOSX)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/popup_menu_helper_mac.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h"
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif defined(OS_WIN)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/win/win_util.h"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebConsoleMessage;
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDragOperation;
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDragOperationNone;
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDragOperationsMask;
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMediaPlayerAction;
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginAction;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delay to wait on closing the WebContents for a beforeunload/unload handler to
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fire.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kUnloadTimeoutMS = 1000;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translate a WebKit text direction into a base::i18n one.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::i18n::TextDirection WebTextDirectionToChromeTextDirection(
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTextDirection dir) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (dir) {
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTextDirectionLeftToRight:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return base::i18n::LEFT_TO_RIGHT;
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebTextDirectionRightToLeft:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return base::i18n::RIGHT_TO_LEFT;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return base::i18n::UNKNOWN_DIRECTION;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
122f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)
123f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)const int kVirtualKeyboardDisplayWaitTimeoutMs = 100;
124f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)const int kMaxVirtualKeyboardDisplayRetries = 5;
125f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)
126f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)void DismissVirtualKeyboardTask() {
127f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  static int virtual_keyboard_display_retries = 0;
128f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  // If the virtual keyboard is not yet visible, then we execute the task again
129f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  // waiting for it to show up.
130f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  if (!base::win::DismissVirtualKeyboard()) {
131f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)    if (virtual_keyboard_display_retries < kMaxVirtualKeyboardDisplayRetries) {
132f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)      BrowserThread::PostDelayedTask(
133f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)          BrowserThread::UI, FROM_HERE,
134f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)          base::Bind(base::IgnoreResult(&DismissVirtualKeyboardTask)),
135f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)          TimeDelta::FromMilliseconds(kVirtualKeyboardDisplayWaitTimeoutMs));
136f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)      ++virtual_keyboard_display_retries;
137f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)    } else {
138f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)      virtual_keyboard_display_retries = 0;
139f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)    }
140f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  }
141f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)}
142f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)#endif
143f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderViewHost, public:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* RenderViewHost::FromID(int render_process_id,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int render_view_id) {
152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return RenderViewHostImpl::FromID(render_process_id, render_view_id);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHost* RenderViewHost::From(RenderWidgetHost* rwh) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(rwh->IsRenderView());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<RenderViewHostImpl*>(RenderWidgetHostImpl::From(rwh));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHost::FilterURL(const RenderProcessHost* process,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool empty_allowed,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GURL* url) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl::FilterURL(ChildProcessSecurityPolicyImpl::GetInstance(),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                process, empty_allowed, url);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderViewHostImpl, public:
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl* RenderViewHostImpl::FromID(int render_process_id,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int render_view_id) {
175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderWidgetHost* widget =
176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      RenderWidgetHost::FromID(render_process_id, render_view_id);
177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!widget || !widget->IsRenderView())
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return NULL;
179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return static_cast<RenderViewHostImpl*>(RenderWidgetHostImpl::From(widget));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl::RenderViewHostImpl(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteInstance* instance,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHostDelegate* delegate,
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    RenderFrameHostDelegate* frame_delegate,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetHostDelegate* widget_delegate,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int routing_id,
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int main_frame_routing_id,
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool swapped_out,
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool hidden)
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : RenderWidgetHostImpl(widget_delegate,
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           instance->GetProcess(),
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           routing_id,
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           hidden),
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_(static_cast<SiteInstanceImpl*>(instance)),
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_drag_context_response_(false),
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enabled_bindings_(0),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      navigations_suspended_(false),
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      has_accessed_initial_document_(false),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_swapped_out_(swapped_out),
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_subframe_(false),
203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      main_frame_id_(-1),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      run_modal_reply_msg_(NULL),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      run_modal_opener_id_(MSG_ROUTING_NONE),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_waiting_for_beforeunload_ack_(false),
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_waiting_for_unload_ack_(false),
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_timed_out_on_unload_(false),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unload_ack_is_for_cross_site_transition_(false),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      are_javascript_messages_suppressed_(false),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sudden_termination_allowed_(false),
212f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)      render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING),
213f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)      virtual_keyboard_requested_(false) {
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(instance_.get());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(delegate_);  // http://crbug.com/82827
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (main_frame_routing_id == MSG_ROUTING_NONE)
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    main_frame_routing_id = GetProcess()->GetNextRoutingID();
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  main_render_frame_host_ = RenderFrameHostFactory::Create(
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      this, frame_delegate, delegate_->GetFrameTree(),
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      delegate_->GetFrameTree()->root(),
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      main_frame_routing_id, is_swapped_out_);
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  delegate_->GetFrameTree()->root()->set_render_frame_host(
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      main_render_frame_host_.get(), false);
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetProcess()->EnableSendQueue();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!swapped_out)
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    instance_->increment_active_view_count();
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (ResourceDispatcherHostImpl::Get()) {
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    BrowserThread::PostTask(
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated,
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   base::Unretained(ResourceDispatcherHostImpl::Get()),
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   GetProcess()->GetID(), GetRoutingID()));
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  media_player_manager_.reset(BrowserMediaPlayerManager::Create(this));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostImpl::~RenderViewHostImpl() {
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (ResourceDispatcherHostImpl::Get()) {
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    BrowserThread::PostTask(
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted,
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   base::Unretained(ResourceDispatcherHostImpl::Get()),
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   GetProcess()->GetID(), GetRoutingID()));
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  delegate_->RenderViewDeleted(this);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Be sure to clean up any leftover state from cross-site requests.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrossSiteRequestManager::GetInstance()->SetHasPendingCrossSiteRequest(
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProcess()->GetID(), GetRoutingID(), false);
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If this was swapped out, it already decremented the active view
2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // count of the SiteInstance it belongs to.
2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!is_swapped_out_)
2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    instance_->decrement_active_view_count();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* RenderViewHostImpl::GetSiteInstance() const {
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return instance_.get();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewHostImpl::CreateRenderView(
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& frame_name,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int opener_route_id,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 max_page_id) {
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("renderer_host", "RenderViewHostImpl::CreateRenderView");
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!IsRenderViewLive()) << "Creating view twice";
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The process may (if we're sharing a process with another host that already
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // initialized it) or may not (we have our own process or the old process
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crashed) have been initialized. Calling Init multiple times will be
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ignored, so this is safe.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetProcess()->Init())
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetProcess()->HasConnection());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(GetProcess()->GetBrowserContext());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_initialized_ = true;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuSurfaceTracker::Get()->SetSurfaceHandle(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      surface_id(), GetCompositingSurface());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the RenderView starts with a next_page_id larger than any existing
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page ID it might be asked to render.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 next_page_id = 1;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_page_id > -1)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_page_id = max_page_id + 1;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewMsg_New_Params params;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.renderer_preferences =
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->GetRendererPrefs(GetProcess()->GetBrowserContext());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.web_preferences = delegate_->GetWebkitPrefs();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.view_id = GetRoutingID();
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  params.main_frame_routing_id = main_render_frame_host()->routing_id();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.surface_id = surface_id();
308a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  params.session_storage_namespace_id =
309a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      delegate_->GetSessionStorageNamespace(instance_)->id();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.frame_name = frame_name;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the RenderView sets its opener correctly.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.opener_route_id = opener_route_id;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.swapped_out = is_swapped_out_;
3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  params.hidden = is_hidden();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.next_page_id = next_page_id;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWebScreenInfo(&params.screen_info);
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.accessibility_mode = accessibility_mode();
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.allow_partial_swap = !GetProcess()->IsGuest();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_New(params));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If it's enabled, tell the renderer to set up the Javascript bindings for
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sending messages back to the browser.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetProcess()->IsGuest())
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(0, enabled_bindings_);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_AllowBindings(GetRoutingID(), enabled_bindings_));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let our delegate know that we created a RenderView.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RenderViewCreated(this);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewHostImpl::IsRenderViewLive() const {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetProcess()->HasConnection() && renderer_initialized_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewHostImpl::IsSubframe() const {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return is_subframe_;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::SyncRendererPrefs() {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetRendererPrefs(GetRoutingID(),
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    delegate_->GetRendererPrefs(
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        GetProcess()->GetBrowserContext())));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebPreferences RenderViewHostImpl::GetWebkitPrefs(const GURL& url) {
3481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TRACE_EVENT0("browser", "RenderViewHostImpl::GetWebkitPrefs");
3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebPreferences prefs;
3501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
3521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.javascript_enabled =
3541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableJavaScript);
3551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.web_security_enabled =
3561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableWebSecurity);
3571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.plugins_enabled =
3581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisablePlugins);
3591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.java_enabled =
3601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableJava);
3611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.remote_fonts_enabled =
3631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableRemoteFonts);
3641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.xslt_enabled =
3651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableXSLT);
3661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.xss_auditor_enabled =
3671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableXSSAuditor);
3681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.application_cache_enabled =
3691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableApplicationCache);
3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.local_storage_enabled =
3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableLocalStorage);
3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.databases_enabled =
3741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableDatabases);
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID) && defined(ARCH_CPU_X86)
376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  prefs.webaudio_enabled =
377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableWebAudio);
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else
3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.webaudio_enabled =
3801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableWebAudio);
381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.experimental_webgl_enabled =
3841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisable3DAPIs) &&
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableExperimentalWebGL);
3871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.flash_3d_enabled =
3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableFlash3d);
3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.flash_stage3d_enabled =
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableFlashStage3d);
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.flash_stage3d_baseline_enabled =
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableFlashStage3d);
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.gl_multisampling_enabled =
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableGLMultisampling);
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.privileged_webgl_extensions_enabled =
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kEnablePrivilegedWebGLExtensions);
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.site_specific_quirks_enabled =
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableSiteSpecificQuirks);
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.allow_file_access_from_file_urls =
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kAllowFileAccessFromFiles);
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_compositing_for_overflow_scroll_enabled = false;
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableAcceleratedOverflowScroll))
4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.accelerated_compositing_for_overflow_scroll_enabled = true;
4101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableAcceleratedOverflowScroll))
4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.accelerated_compositing_for_overflow_scroll_enabled = false;
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  prefs.layer_squashing_enabled = false;
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableLayerSquashing))
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      prefs.layer_squashing_enabled = true;
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableLayerSquashing))
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      prefs.layer_squashing_enabled = false;
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_compositing_for_scrollable_frames_enabled = false;
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableAcceleratedScrollableFrames))
4211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.accelerated_compositing_for_scrollable_frames_enabled = true;
4221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableAcceleratedScrollableFrames))
4231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.accelerated_compositing_for_scrollable_frames_enabled = false;
4241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.composited_scrolling_for_frames_enabled = false;
4261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableCompositedScrollingForFrames))
4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.composited_scrolling_for_frames_enabled = true;
4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableCompositedScrollingForFrames))
4291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.composited_scrolling_for_frames_enabled = false;
4301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.universal_accelerated_compositing_for_overflow_scroll_enabled = false;
4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(
4331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          switches::kEnableUniversalAcceleratedOverflowScroll))
4341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.universal_accelerated_compositing_for_overflow_scroll_enabled = true;
4351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(
4361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          switches::kDisableUniversalAcceleratedOverflowScroll))
4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.universal_accelerated_compositing_for_overflow_scroll_enabled = false;
4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.show_paint_rects =
4401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kShowPaintRects);
4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_compositing_enabled =
4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
4431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableAcceleratedCompositing);
4441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.force_compositing_mode =
4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      content::IsForceCompositingModeEnabled() &&
4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableForceCompositingMode);
4471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_2d_canvas_enabled =
4481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
4491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableAccelerated2dCanvas);
4501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.antialiased_2d_canvas_disabled =
4511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kDisable2dCanvasAntialiasing);
4521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_2d_canvas_msaa_sample_count =
4531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      atoi(command_line.GetSwitchValueASCII(
4541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kAcceleratedCanvas2dMSAASampleCount).c_str());
4551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_filters_enabled =
4561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GpuProcessHost::gpu_enabled() &&
4571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableAcceleratedFilters);
4581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_compositing_for_3d_transforms_enabled =
4591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      prefs.accelerated_compositing_for_animation_enabled =
4601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          !command_line.HasSwitch(switches::kDisableAcceleratedLayers);
4611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_compositing_for_plugins_enabled =
4621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableAcceleratedPlugins);
4631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.accelerated_compositing_for_video_enabled =
4641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableAcceleratedVideo);
4651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.fullscreen_enabled =
4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableFullScreen);
4671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.lazy_layout_enabled =
4681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures);
4691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.region_based_columns_enabled =
4701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableRegionBasedColumns);
4711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.threaded_html_parser =
4721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableThreadedHTMLParser);
4731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.experimental_websocket_enabled =
4741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableExperimentalWebSocket);
4751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(cc::switches::kEnablePinchVirtualViewport)) {
4761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.pinch_virtual_viewport_enabled = true;
4771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.pinch_overlay_scrollbar_thickness = 10;
4781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.use_solid_color_scrollbars = command_line.HasSwitch(
4801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kEnableOverlayScrollbars);
4811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_ANDROID)
4831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.user_gesture_required_for_media_playback = !command_line.HasSwitch(
4841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kDisableGestureRequirementForMediaPlayback);
4851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.user_gesture_required_for_media_fullscreen = !command_line.HasSwitch(
4861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kDisableGestureRequirementForMediaFullscreen);
4871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
4881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.touch_enabled = ui::AreTouchEventsEnabled();
4901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.device_supports_touch = prefs.touch_enabled &&
4911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ui::IsTouchDevicePresent();
4921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_ANDROID)
4931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.device_supports_mouse = false;
4941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
4951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.pointer_events_max_touch_points = ui::MaxTouchPoints();
4971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.touch_adjustment_enabled =
4991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kDisableTouchAdjustment);
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.compositor_touch_hit_testing =
5011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(cc::switches::kDisableCompositorTouchHitTesting);
5021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool default_enable_scroll_animator = true;
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
5061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool default_enable_scroll_animator = false;
5071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
5081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.enable_scroll_animator = default_enable_scroll_animator;
5091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableSmoothScrolling))
5101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.enable_scroll_animator = true;
5111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (command_line.HasSwitch(switches::kDisableSmoothScrolling))
5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.enable_scroll_animator = false;
5131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.visual_word_movement_enabled =
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableVisualWordMovement);
5161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Certain GPU features might have been blacklisted.
5181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GpuDataManagerImpl::GetInstance()->UpdateRendererWebPrefs(&prefs);
5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
5211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          GetProcess()->GetID())) {
5221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.loads_images_automatically = true;
5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.javascript_enabled = true;
5241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.is_online = !net::NetworkChangeNotifier::IsOffline();
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if !defined(USE_AURA)
5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Force accelerated compositing and 2d canvas off for chrome: and about:
5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // pages (unless it's specifically allowed).
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if ((url.SchemeIs(chrome::kChromeUIScheme) ||
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (url.SchemeIs(chrome::kAboutScheme) &&
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       url.spec() != kAboutBlankURL)) &&
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !command_line.HasSwitch(switches::kAllowWebUICompositing)) {
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.accelerated_compositing_enabled = false;
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.accelerated_2d_canvas_enabled = false;
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
5391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.fixed_position_creates_stacking_context = !command_line.HasSwitch(
5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kDisableFixedPositionCreatesStackingContext);
5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_CHROMEOS)
5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.gesture_tap_highlight_enabled = !command_line.HasSwitch(
5451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kDisableGestureTapHighlight);
5461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.gesture_tap_highlight_enabled = command_line.HasSwitch(
5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kEnableGestureTapHighlight);
5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.number_of_cpu_cores = base::SysInfo::NumberOfProcessors();
5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  prefs.viewport_meta_enabled =
554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      command_line.HasSwitch(switches::kEnableViewportMeta);
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  prefs.viewport_enabled =
557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      command_line.HasSwitch(switches::kEnableViewport) ||
558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      prefs.viewport_meta_enabled;
559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  prefs.main_frame_resizes_are_orientation_changes =
561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      command_line.HasSwitch(switches::kMainFrameResizesAreOrientationChanges);
5621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.deferred_image_decoding_enabled =
5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.HasSwitch(switches::kEnableDeferredImageDecoding) ||
5651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cc::switches::IsImplSidePaintingEnabled();
5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  prefs.spatial_navigation_enabled = command_line.HasSwitch(
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kEnableSpatialNavigation);
5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GetContentClient()->browser()->OverrideWebkitPrefs(this, url, &prefs);
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Disable compositing in guests until we have compositing path implemented
5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // for guests.
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool guest_compositing_enabled = !command_line.HasSwitch(
5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switches::kDisableBrowserPluginCompositing);
5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (GetProcess()->IsGuest() && !guest_compositing_enabled) {
5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.force_compositing_mode = false;
5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    prefs.accelerated_compositing_enabled = false;
5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return prefs;
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::Navigate(const ViewMsg_Navigate_Params& params) {
5857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TRACE_EVENT0("renderer_host", "RenderViewHostImpl::Navigate");
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Browser plugin guests are not allowed to navigate outside web-safe schemes,
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so do not grant them the ability to request additional URLs.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetProcess()->IsGuest()) {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL(
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcess()->GetID(), params.url);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (params.url.SchemeIs(chrome::kDataScheme) &&
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        params.base_url_for_data_url.SchemeIs(chrome::kFileScheme)) {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If 'data:' is used, and we have a 'file:' base url, grant access to
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // local files.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL(
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetProcess()->GetID(), params.base_url_for_data_url);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only send the message if we aren't suspended at the start of a cross-site
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (navigations_suspended_) {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Shouldn't be possible to have a second navigation while suspended, since
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // navigations will only be suspended during a cross-site request.  If a
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // second navigation occurs, WebContentsImpl will cancel this pending RVH
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // create a new pending RVH.
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(!suspended_nav_params_.get());
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    suspended_nav_params_.reset(new ViewMsg_Navigate_Params(params));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Get back to a clean state, in case we start a new navigation without
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // completing a RVH swap or unload handler.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSwappedOut(false);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Send(new ViewMsg_Navigate(GetRoutingID(), params));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force the throbber to start. We do this because WebKit's "started
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loading" message will be received asynchronously from the UI of the
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser. But we want to keep the throbber in sync with what's happening
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the UI. For example, we want to start throbbing immediately when the
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user naivgates even if the renderer is delayed. There is also an issue
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with the throbber starting because the WebUI (which controls whether the
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // favicon is displayed) happens synchronously. If the start loading
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages was asynchronous, then the default favicon would flash in.
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit doesn't send throb notifications for JavaScript URLs, so we
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't want to either.
6283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!params.url.SchemeIs(kJavaScriptScheme))
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->DidStartLoading(this);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::NavigateToURL(const GURL& url) {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewMsg_Navigate_Params params;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.page_id = -1;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.pending_history_list_offset = -1;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.current_history_list_offset = -1;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.current_history_list_length = 0;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.url = url;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.transition = PAGE_TRANSITION_LINK;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.navigation_type = ViewMsg_Navigate_Type::NORMAL;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Navigate(params);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewHostImpl::SetNavigationsSuspended(
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool suspend,
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::TimeTicks& proceed_time) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should only be called to toggle the state.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(navigations_suspended_ != suspend);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigations_suspended_ = suspend;
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!suspend && suspended_nav_params_) {
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // There's navigation message params waiting to be sent.  Now that we're not
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // suspended anymore, resume navigation by sending them.  If we were swapped
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // out, we should also stop filtering out the IPC messages now.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetSwappedOut(false);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(!proceed_time.is_null());
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    suspended_nav_params_->browser_navigation_start = proceed_time;
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Send(new ViewMsg_Navigate(GetRoutingID(), *suspended_nav_params_.get()));
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    suspended_nav_params_.reset();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::CancelSuspendedNavigations() {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear any state if a pending navigation is canceled or pre-empted.
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (suspended_nav_params_)
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    suspended_nav_params_.reset();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigations_suspended_ = false;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::FirePageBeforeUnload(bool for_cross_site_transition) {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsRenderViewLive()) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This RenderViewHostImpl doesn't have a live renderer, so just
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // skip running the onbeforeunload handler.
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_waiting_for_beforeunload_ack_ = true;  // Checked by OnShouldCloseACK.
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unload_ack_is_for_cross_site_transition_ = for_cross_site_transition;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeTicks now = base::TimeTicks::Now();
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnShouldCloseACK(true, now, now);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This may be called more than once (if the user clicks the tab close button
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // several times, or if she clicks the tab close button then the browser close
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // button), and we only send the message once.
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_waiting_for_beforeunload_ack_) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Some of our close messages could be for the tab, others for cross-site
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // transitions. We always want to think it's for closing the tab if any
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // of the messages were, since otherwise it might be impossible to close
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (if there was a cross-site "close" request pending when the user clicked
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the close button). We want to keep the "for cross site" flag only if
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // both the old and the new ones are also for cross site.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unload_ack_is_for_cross_site_transition_ =
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unload_ack_is_for_cross_site_transition_ && for_cross_site_transition;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start the hang monitor in case the renderer hangs in the beforeunload
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // handler.
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_waiting_for_beforeunload_ack_ = true;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unload_ack_is_for_cross_site_transition_ = for_cross_site_transition;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Increment the in-flight event count, to ensure that input events won't
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // cancel the timeout timer.
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    increment_in_flight_event_count();
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    send_should_close_start_time_ = base::TimeTicks::Now();
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_ShouldClose(GetRoutingID()));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderViewHostImpl::OnCrossSiteResponse(
709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const GlobalRequestID& global_request_id,
710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool is_transfer,
711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::vector<GURL>& transfer_url_chain,
712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const Referrer& referrer,
713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    PageTransition page_transition,
714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int64 frame_id,
715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool should_replace_current_entry) {
716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderViewHostDelegate::RendererManagement* manager =
717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      delegate_->GetRendererManagementDelegate();
718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (manager) {
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    manager->OnCrossSiteResponse(this, global_request_id, is_transfer,
720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 transfer_url_chain, referrer, page_transition,
721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 frame_id, should_replace_current_entry);
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderViewHostImpl::SuppressDialogsUntilSwapOut() {
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Send(new ViewMsg_SuppressDialogsUntilSwapOut(GetRoutingID()));
727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewHostImpl::SwapOut() {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will be set back to false in OnSwapOutACK, just before we replace
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this RVH with the pending RVH.
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_waiting_for_unload_ack_ = true;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the hang monitor in case the renderer hangs in the unload handler.
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment the in-flight event count, to ensure that input events won't
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cancel the timeout timer.
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  increment_in_flight_event_count();
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsRenderViewLive()) {
7407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Send(new ViewMsg_SwapOut(GetRoutingID()));
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This RenderViewHost doesn't have a live renderer, so just skip the unload
7437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // event.
7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    OnSwappedOut(true);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewHostImpl::OnSwapOutACK() {
7497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  OnSwappedOut(false);
7507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
7517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewHostImpl::OnSwappedOut(bool timed_out) {
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop the hang monitor now that the unload handler has finished.
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decrement_in_flight_event_count();
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopHangMonitorTimeout();
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_waiting_for_unload_ack_ = false;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_timed_out_on_unload_ = timed_out;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->SwappedOut(this);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::WasSwappedOut() {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't bother reporting hung state anymore.
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopHangMonitorTimeout();
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have timed out on running the unload handler, we consider
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the process hung and we should terminate it if there are no other tabs
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // using the process. If there are other views using this process, the
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unresponsive renderer timeout will catch it.
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hung = has_timed_out_on_unload_;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that we're no longer the active RVH in the tab, start filtering out
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // most IPC messages.  Usually the renderer will have stopped sending
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages as of OnSwapOutACK.  However, we may have timed out waiting
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for that message, and additional IPC messages may keep streaming in.
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We filter them out, as long as that won't cause problems (e.g., we
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // still allow synchronous messages through).
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSwappedOut(true);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are not running the renderer in process and no other tab is using
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the hung process, consider it eligible to be killed, assuming it is a real
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process (unit tests don't have real processes).
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hung) {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ProcessHandle process_handle = GetProcess()->GetHandle();
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int views = 0;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Count the number of active widget hosts for the process, which
7877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // is equivalent to views using the process as of this writing.
78858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<RenderWidgetHostIterator> widgets(
78958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      RenderWidgetHost::GetRenderWidgetHosts());
79058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    while (RenderWidgetHost* widget = widgets->GetNextHost()) {
79158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (widget->GetProcess()->GetID() == GetProcess()->GetID())
792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        ++views;
793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!RenderProcessHost::run_renderer_in_process() &&
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_handle && views <= 1) {
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The process can safely be terminated, only if WebContents sets
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // SuddenTerminationAllowed, which indicates that the timer has expired.
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This is not the case if we load data URLs or about:blank. The reason
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // is that those have no network requests and this code is hit without
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // setting the unresponsiveness timer. This allows a corner case where a
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // navigation to a data URL will leave a process running, if the
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // beforeunload handler completes fine, but the unload handler hangs.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // At this time, the complexity to solve this edge case is not worthwhile.
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (SuddenTerminationAllowed()) {
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We should kill the process, but for now, just log the data so we can
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // diagnose the kill rate and investigate if separate timer is needed.
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // http://crbug.com/104346.
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Log a histogram point to help us diagnose how many of those kills
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // we have performed. 1 is the enum value for RendererType Normal for
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // the histogram.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UMA_HISTOGRAM_PERCENTAGE(
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "BrowserRenderProcessHost.ChildKillsUnresponsive", 1);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inform the renderer that it can exit if no one else is using it.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_WasSwappedOut(GetRoutingID()));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ClosePage() {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the hang monitor in case the renderer hangs in the unload handler.
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_waiting_for_unload_ack_ = true;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsRenderViewLive()) {
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since we are sending an IPC message to the renderer, increase the event
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // count to prevent the hang monitor timeout from being stopped by input
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // event acknowledgements.
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    increment_in_flight_event_count();
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(creis): Should this be moved to Shutdown?  It may not be called for
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // RenderViewHosts that have been swapped out.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotificationService::current()->Notify(
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW,
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Source<RenderViewHost>(this),
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NotificationService::NoDetails());
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_ClosePage(GetRoutingID()));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This RenderViewHost doesn't have a live renderer, so just skip the unload
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // event and close the page.
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClosePageIgnoringUnloadEvents();
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ClosePageIgnoringUnloadEvents() {
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopHangMonitorTimeout();
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_waiting_for_beforeunload_ack_ = false;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_waiting_for_unload_ack_ = false;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sudden_termination_allowed_ = true;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Close(this);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RenderViewHostImpl::HasPendingCrossSiteRequest() {
8597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return CrossSiteRequestManager::GetInstance()->HasPendingCrossSiteRequest(
8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetProcess()->GetID(), GetRoutingID());
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewHostImpl::SetHasPendingCrossSiteRequest(
8647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool has_pending_request) {
8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CrossSiteRequestManager::GetInstance()->SetHasPendingCrossSiteRequest(
8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetProcess()->GetID(), GetRoutingID(), has_pending_request);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ActivateNearestFindResult(int request_id,
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   float x,
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   float y) {
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Send(new InputMsg_ActivateNearestFindResult(GetRoutingID(),
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              request_id, x, y));
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::RequestFindMatchRects(int current_version) {
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_FindMatchRects(GetRoutingID(), current_version));
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderViewHostImpl::DisableFullscreenEncryptedMediaPlayback() {
8824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  media_player_manager_->DisableFullscreenEncryptedMediaPlayback();
8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DragTargetDragEnter(
887eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const DropData& drop_data,
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& client_pt,
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& screen_pt,
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebDragOperationsMask operations_allowed,
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int key_modifiers) {
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int renderer_id = GetProcess()->GetID();
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL could have been cobbled together from any highlighted text string,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and can't be interpreted as a capability.
898eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DropData filtered_data(drop_data);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, GetProcess(), true, &filtered_data.url);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The filenames vector, on the other hand, does represent a capability to
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // access the given files.
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fileapi::IsolatedContext::FileInfoSet files;
904eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (std::vector<DropData::FileInfo>::iterator iter(
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           filtered_data.filenames.begin());
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != filtered_data.filenames.end(); ++iter) {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A dragged file may wind up as the value of an input element, or it
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // may be used as the target of a navigation instead.  We don't know
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // which will happen at this point, so generously grant both access
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and request permissions to the specific file to cover both cases.
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We do not give it the permission to request all file:// URLs.
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path =
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath::FromUTF8Unsafe(UTF16ToUTF8(iter->path));
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we have the same display_name as the one we register.
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter->display_name.empty()) {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string name;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      files.AddPath(path, &name);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iter->display_name = UTF8ToUTF16(name);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      files.AddPathWithName(path, UTF16ToUTF8(iter->display_name));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy->GrantRequestSpecificFileURL(renderer_id,
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        net::FilePathToFileURL(path));
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the renderer already has permission to read these paths, we don't need
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to re-grant them. This prevents problems with DnD for files in the CrOS
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // file manager--the file manager already had read/write access to those
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // directories, but dragging a file would cause the read/write access to be
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // overwritten with read-only access, making them impossible to delete or
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // rename until the renderer was killed.
9334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!policy->CanReadFile(renderer_id, path))
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy->GrantReadFile(renderer_id, path);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fileapi::IsolatedContext* isolated_context =
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fileapi::IsolatedContext::GetInstance();
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(isolated_context);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string filesystem_id = isolated_context->RegisterDraggedFileSystem(
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      files);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!filesystem_id.empty()) {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Grant the permission iff the ID is valid.
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy->GrantReadFileSystem(renderer_id, filesystem_id);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filtered_data.filesystem_id = UTF8ToUTF16(filesystem_id);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DragMsg_TargetDragEnter(GetRoutingID(), filtered_data, client_pt,
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   screen_pt, operations_allowed,
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   key_modifiers));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DragTargetDragOver(
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& client_pt,
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& screen_pt,
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebDragOperationsMask operations_allowed,
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int key_modifiers) {
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DragMsg_TargetDragOver(GetRoutingID(), client_pt, screen_pt,
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  operations_allowed, key_modifiers));
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DragTargetDragLeave() {
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DragMsg_TargetDragLeave(GetRoutingID()));
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DragTargetDrop(
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& client_pt,
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& screen_pt,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int key_modifiers) {
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DragMsg_TargetDrop(GetRoutingID(), client_pt, screen_pt,
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              key_modifiers));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DesktopNotificationPermissionRequestDone(
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int callback_context) {
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DesktopNotificationMsg_PermissionRequestDone(
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRoutingID(), callback_context));
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DesktopNotificationPostDisplay(int callback_context) {
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DesktopNotificationMsg_PostDisplay(GetRoutingID(),
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              callback_context));
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderViewHostImpl::DesktopNotificationPostError(
986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int notification_id,
987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& message) {
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DesktopNotificationMsg_PostError(
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRoutingID(), notification_id, message));
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DesktopNotificationPostClose(int notification_id,
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      bool by_user) {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DesktopNotificationMsg_PostClose(
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRoutingID(), notification_id, by_user));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DesktopNotificationPostClick(int notification_id) {
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DesktopNotificationMsg_PostClick(GetRoutingID(), notification_id));
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ExecuteJavascriptInWebFrame(
1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& frame_xpath,
1004a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& jscript) {
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_ScriptEvalRequest(GetRoutingID(), frame_xpath, jscript,
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     0, false));
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::ExecuteJavascriptInWebFrameCallbackResult(
1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     const base::string16& frame_xpath,
1011a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     const base::string16& jscript,
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     const JavascriptResultCallback& callback) {
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int next_id = 1;
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int key = next_id++;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_ScriptEvalRequest(GetRoutingID(), frame_xpath, jscript,
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     key, true));
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  javascript_callbacks_.insert(std::make_pair(key, callback));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderViewHostImpl::JavaScriptDialogClosed(
1021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    IPC::Message* reply_msg,
1022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool success,
1023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& user_input) {
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetProcess()->SetIgnoreInputEvents(false);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_waiting =
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_waiting_for_beforeunload_ack_ || is_waiting_for_unload_ack_;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are executing as part of (before)unload event handling, we don't
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // want to use the regular hung_renderer_delay_ms_ if the user has agreed to
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leave the current page. In this case, use the regular timeout value used
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // during the (before)unload handling.
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_waiting) {
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StartHangMonitorTimeout(TimeDelta::FromMilliseconds(
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success ? kUnloadTimeoutMS : hung_renderer_delay_ms_));
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg,
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     success, user_input);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(reply_msg);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are waiting for an unload or beforeunload ack and the user has
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // suppressed messages, kill the tab immediately; a page that's spamming
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // alerts in onbeforeunload is presumably malicious, so there's no point in
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // continuing to run its script and dragging out the process.
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This must be done after sending the reply since RenderView can't close
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // correctly while waiting for a response.
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_waiting && are_javascript_messages_suppressed_)
10483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    delegate_->RendererUnresponsive(
10493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        this, is_waiting_for_beforeunload_ack_, is_waiting_for_unload_ack_);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DragSourceEndedAt(
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int client_x, int client_y, int screen_x, int screen_y,
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebDragOperation operation) {
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DragMsg_SourceEndedOrMoved(
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRoutingID(),
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(client_x, client_y),
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(screen_x, screen_y),
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true, operation));
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DragSourceMovedTo(
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int client_x, int client_y, int screen_x, int screen_y) {
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DragMsg_SourceEndedOrMoved(
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRoutingID(),
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(client_x, client_y),
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point(screen_x, screen_y),
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false, WebDragOperationNone));
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DragSourceSystemDragEnded() {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new DragMsg_SourceSystemDragEnded(GetRoutingID()));
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::AllowBindings(int bindings_flags) {
10763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Never grant any bindings to browser plugin guests.
10773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (GetProcess()->IsGuest()) {
10783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    NOTREACHED() << "Never grant bindings to a guest process.";
10793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
10803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
10813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure we aren't granting WebUI bindings to a process that has already
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been used for non-privileged views.
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bindings_flags & BINDINGS_POLICY_WEB_UI &&
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProcess()->HasConnection() &&
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetProcess()->GetID())) {
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This process has no bindings yet. Make sure it does not have more
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // than this single active view.
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderProcessHostImpl* process =
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<RenderProcessHostImpl*>(GetProcess());
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (process->GetActiveViewCount() > 1)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bindings_flags & BINDINGS_POLICY_WEB_UI) {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChildProcessSecurityPolicyImpl::GetInstance()->GrantWebUIBindings(
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcess()->GetID());
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enabled_bindings_ |= bindings_flags;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (renderer_initialized_)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_AllowBindings(GetRoutingID(), enabled_bindings_));
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewHostImpl::GetEnabledBindings() const {
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enabled_bindings_;
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::SetWebUIProperty(const std::string& name,
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const std::string& value) {
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is a sanity check before telling the renderer to enable the property.
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It could lie and send the corresponding IPC messages anyway, but we will
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not act on them if enabled_bindings_ doesn't agree. If we get here without
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WebUI bindings, kill the renderer process.
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (enabled_bindings_ & BINDINGS_POLICY_WEB_UI) {
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ViewMsg_SetWebUIProperty(GetRoutingID(), name, value));
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RecordAction(UserMetricsAction("BindingsMismatchTerminate_RVH_WebUI"));
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::KillProcess(
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetProcess()->GetHandle(), content::RESULT_CODE_KILLED, false);
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::GotFocus() {
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl::GotFocus();  // Notifies the renderer it got focus.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostDelegateView* view = delegate_->GetDelegateView();
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view->GotFocus();
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::LostCapture() {
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl::LostCapture();
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->LostCapture();
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::LostMouseLock() {
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl::LostMouseLock();
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->LostMouseLock();
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::SetInitialFocus(bool reverse) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetInitialFocus(GetRoutingID(), reverse));
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::FilesSelectedInChooser(
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<ui::SelectedFileInfo>& files,
11497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    FileChooserParams::Mode permissions) {
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Grant the security access requested to the given files.
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < files.size(); ++i) {
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::SelectedFileInfo& file = files[i];
11537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (permissions == FileChooserParams::Save) {
115468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance()->GrantCreateReadWriteFile(
11557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          GetProcess()->GetID(), file.local_path);
11567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else {
11577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile(
11587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          GetProcess()->GetID(), file.local_path);
11597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_RunFileChooserResponse(GetRoutingID(), files));
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DirectoryEnumerationFinished(
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int request_id,
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<base::FilePath>& files) {
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Grant the security access requested to the given files.
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<base::FilePath>::const_iterator file = files.begin();
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       file != files.end(); ++file) {
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile(
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcess()->GetID(), *file);
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_EnumerateDirectoryResponse(GetRoutingID(),
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              request_id,
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              files));
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::LoadStateChanged(
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::LoadStateWithParam& load_state,
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 upload_position,
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 upload_size) {
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->LoadStateChanged(url, load_state, upload_position, upload_size);
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewHostImpl::SuddenTerminationAllowed() const {
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sudden_termination_allowed_ ||
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProcess()->SuddenTerminationAllowed();
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderViewHostImpl, IPC message handlers:
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewHostImpl::OnMessageReceived(const IPC::Message& msg) {
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!BrowserMessageFilter::CheckCanDispatchOnUI(msg, this))
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter out most IPC messages if this renderer is swapped out.
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We still want to handle certain ACKs to keep our state consistent.
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_swapped_out_) {
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) {
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If this is a synchronous message and we decided not to handle it,
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // we must send an error reply, or else the renderer will be stuck
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // and won't respond to future requests.
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (msg.is_sync()) {
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reply->set_reply_error();
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Send(reply);
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Don't continue looking for someone to handle it.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_->OnMessageReceived(this, msg))
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool msg_is_ok = true;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP_EX(RenderViewHostImpl, msg, msg_is_ok)
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ShowView, OnShowView)
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ShowWidget, OnShowWidget)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ShowFullscreenWidget,
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnShowFullscreenWidget)
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunModal, OnRunModal)
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RenderViewReady, OnRenderViewReady)
12277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(ViewHostMsg_RenderProcessGone, OnRenderProcessGone)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidRedirectProvisionalLoad,
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDidRedirectProvisionalLoad)
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidFailProvisionalLoadWithError,
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDidFailProvisionalLoadWithError)
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_FrameNavigate, OnNavigate(msg))
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateState, OnUpdateState)
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateTitle, OnUpdateTitle)
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateEncoding, OnUpdateEncoding)
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateTargetURL, OnUpdateTargetURL)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateInspectorSetting,
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnUpdateInspectorSetting)
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_Close, OnClose)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RequestMove, OnRequestMove)
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartLoading, OnDidStartLoading)
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidStopLoading, OnDidStopLoading)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeLoadProgress,
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDidChangeLoadProgress)
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidDisownOpener, OnDidDisownOpener)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentAvailableInMainFrame,
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDocumentAvailableInMainFrame)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentOnLoadCompletedInMainFrame,
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDocumentOnLoadCompletedInMainFrame)
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ContextMenu, OnContextMenu)
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ToggleFullscreen, OnToggleFullscreen)
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_OpenURL, OnOpenURL)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidContentsPreferredSizeChange,
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDidContentsPreferredSizeChange)
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeScrollOffset,
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDidChangeScrollOffset)
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeScrollbarsForMainFrame,
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDidChangeScrollbarsForMainFrame)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeScrollOffsetPinningForMainFrame,
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDidChangeScrollOffsetPinningForMainFrame)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeNumWheelEvents,
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnDidChangeNumWheelEvents)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RouteCloseEvent,
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnRouteCloseEvent)
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RouteMessageEvent, OnRouteMessageEvent)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage,
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    OnRunJavaScriptMessage)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm,
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    OnRunBeforeUnloadConfirm)
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(DragHostMsg_StartDragging, OnStartDragging)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(DragHostMsg_TargetDrop_ACK, OnTargetDropACK)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnFocusedNodeChanged)
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole)
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnShouldCloseACK)
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnClosePageACK)
12787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_SwapOut_ACK, OnSwapOutACK)
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnSelectionChanged)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionBoundsChanged,
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnSelectionBoundsChanged)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ScriptEvalResponse, OnScriptEvalResponse)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidZoomURL, OnDidZoomURL)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_RequestPermission,
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnRequestDesktopNotificationPermission)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_Show,
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnShowDesktopNotification)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_Cancel,
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnCancelDesktopNotification)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_ANDROID)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_ShowPopup, OnShowPopup)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnRunFileChooser)
1294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidAccessInitialDocument,
1295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        OnDidAccessInitialDocument)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DomOperationResponse,
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDomOperationResponse)
129858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    IPC_MESSAGE_HANDLER(AccessibilityHostMsg_Events, OnAccessibilityEvents)
1299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeTouched, OnFocusedNodeTouched)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Have the super handle all other messages.
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handled = RenderWidgetHostImpl::OnMessageReceived(msg))
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP_EX()
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!msg_is_ok) {
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The message had a handler, but its de-serialization failed.
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Kill the renderer.
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RecordAction(UserMetricsAction("BadMessageTerminate_RVH"));
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetProcess()->ReceivedBadMessage();
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RenderViewHostImpl::Init() {
1316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderWidgetHostImpl::Init();
1317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  main_render_frame_host()->Init();
1318424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1319424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::Shutdown() {
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are being run modally (see RunModal), then we need to cleanup.
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (run_modal_reply_msg_) {
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(run_modal_reply_msg_);
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_modal_reply_msg_ = NULL;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHostImpl* opener =
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RenderViewHostImpl::FromID(GetProcess()->GetID(), run_modal_opener_id_);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (opener) {
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      opener->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          hung_renderer_delay_ms_));
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Balance out the decrement when we got created.
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      opener->increment_in_flight_event_count();
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_modal_opener_id_ = MSG_ROUTING_NONE;
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl::Shutdown();
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewHostImpl::IsRenderView() const {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::CreateNewWindow(
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id,
1345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int main_frame_route_id,
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_CreateWindow_Params& params,
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionStorageNamespace* session_storage_namespace) {
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ViewHostMsg_CreateWindow_Params validated_params(params);
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FilterURL(policy, GetProcess(), false, &validated_params.target_url);
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FilterURL(policy, GetProcess(), false, &validated_params.opener_url);
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FilterURL(policy, GetProcess(), true,
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &validated_params.opener_security_origin);
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  delegate_->CreateNewWindow(
1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      GetProcess()->GetID(), route_id, main_frame_route_id, validated_params,
1358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      session_storage_namespace);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::CreateNewWidget(int route_id,
1362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     blink::WebPopupType popup_type) {
1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  delegate_->CreateNewWidget(GetProcess()->GetID(), route_id, popup_type);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::CreateNewFullscreenWidget(int route_id) {
1367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  delegate_->CreateNewFullscreenWidget(GetProcess()->GetID(), route_id);
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnShowView(int route_id,
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    WindowOpenDisposition disposition,
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const gfx::Rect& initial_pos,
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    bool user_gesture) {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_swapped_out_) {
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ShowCreatedWindow(
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        route_id, disposition, initial_pos, user_gesture);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_Move_ACK(route_id));
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnShowWidget(int route_id,
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const gfx::Rect& initial_pos) {
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_swapped_out_)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ShowCreatedWidget(route_id, initial_pos);
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_Move_ACK(route_id));
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnShowFullscreenWidget(int route_id) {
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_swapped_out_)
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ShowCreatedFullscreenWidget(route_id);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_Move_ACK(route_id));
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnRunModal(int opener_id, IPC::Message* reply_msg) {
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!run_modal_reply_msg_);
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_modal_reply_msg_ = reply_msg;
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_modal_opener_id_ = opener_id;
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecordAction(UserMetricsAction("ShowModalDialog"));
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostImpl* opener =
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderViewHostImpl::FromID(GetProcess()->GetID(), run_modal_opener_id_);
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (opener) {
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    opener->StopHangMonitorTimeout();
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The ack for the mouse down won't come until the dialog closes, so fake it
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // so that we don't get a timeout.
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    opener->decrement_in_flight_event_count();
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(darin): Bug 1107929: Need to inform our delegate to show this view in
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an app-modal fashion.
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnRenderViewReady() {
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view_termination_status_ = base::TERMINATION_STATUS_STILL_RUNNING;
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendScreenRects();
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WasResized();
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RenderViewReady(this);
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderViewHostImpl::OnRenderProcessGone(int status, int exit_code) {
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep the termination status so we can get at it later when we
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to know why it died.
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view_termination_status_ =
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<base::TerminationStatus>(status);
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Reset frame tree state.
1428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // TODO(creis): Once subframes can be in different processes, we'll need to
1429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // clear just the FrameTreeNodes affected by the crash (and their subtrees).
1430b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  main_frame_id_ = -1;
1431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  delegate_->GetFrameTree()->SwapMainFrame(main_render_frame_host_.get());
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our base class RenderWidgetHost needs to reset some stuff.
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererExited(render_view_termination_status_, exit_code);
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delegate_->RenderViewTerminated(this,
1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  static_cast<base::TerminationStatus>(status),
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  exit_code);
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidStartProvisionalLoadForFrame(
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 frame_id,
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 parent_frame_id,
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url) {
1446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NOTREACHED();
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidRedirectProvisionalLoad(
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 page_id,
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& source_url,
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& target_url) {
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->DidRedirectProvisionalLoad(
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, page_id, source_url, target_url);
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidFailProvisionalLoadWithError(
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewHostMsg_DidFailProvisionalLoadWithError_Params& params) {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->DidFailProvisionalLoadWithError(this, params);
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called when the renderer navigates.  For every frame loaded, we'll get this
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notification containing parameters identifying the navigation.
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subframes are identified by the page transition type.  For subframes loaded
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as part of a wider page load, the page_id will be the same as for the top
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// level frame.  If the user explicitly requests a subframe navigation, we will
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// get a new page_id because we need to create a new navigation entry for that
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// action.
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnNavigate(const IPC::Message& msg) {
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read the parameters out of the IPC message directly to avoid making another
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // copy when we filter the URLs.
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PickleIterator iter(msg);
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewHostMsg_FrameNavigate_Params validated_params;
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IPC::ParamTraits<ViewHostMsg_FrameNavigate_Params>::
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Read(&msg, &iter, &validated_params))
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're waiting for a cross-site beforeunload ack from this renderer and
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we receive a Navigate message from the main frame, then the renderer was
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigating already and sent it before hearing the ViewMsg_Stop message.
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not want to cancel the pending navigation in this case, since the
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // old page will soon be stopped.  Instead, treat this as a beforeunload ack
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to allow the pending navigation to continue.
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_waiting_for_beforeunload_ack_ &&
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unload_ack_is_for_cross_site_transition_ &&
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PageTransitionIsMainFrame(validated_params.transition)) {
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnShouldCloseACK(true, send_should_close_start_time_,
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::TimeTicks::Now());
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're waiting for an unload ack from this renderer and we receive a
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate message, then the renderer was navigating before it received the
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unload request.  It will either respond to the unload request soon or our
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // timer will expire.  Either way, we should ignore this message, because we
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have already committed to closing this renderer.
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_waiting_for_unload_ack_)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1501b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Cache the main frame id, so we can use it for creating the frame tree
1502b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // root node when needed.
1503b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (PageTransitionIsMainFrame(validated_params.transition)) {
1504b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (main_frame_id_ == -1) {
1505b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      main_frame_id_ = validated_params.frame_id;
1506b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    } else {
1507b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      // TODO(nasko): We plan to remove the usage of frame_id in navigation
1508b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      // and move to routing ids. This is in place to ensure that a
1509b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      // renderer is not misbehaving and sending us incorrect data.
1510b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      DCHECK_EQ(main_frame_id_, validated_params.frame_id);
1511b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1512b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* process = GetProcess();
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1515a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Attempts to commit certain off-limits URL should be caught more strictly
1516a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // than our FilterURL checks below.  If a renderer violates this policy, it
1517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // should be killed.
1518a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!CanCommitURL(validated_params.url)) {
1519a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    VLOG(1) << "Blocked URL " << validated_params.url.spec();
152090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    validated_params.url = GURL(kAboutBlankURL);
1521a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    RecordAction(UserMetricsAction("CanCommitURL_BlockedAndKilled"));
1522a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // Kills the process.
1523a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    process->ReceivedBadMessage();
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Now that something has committed, we don't need to track whether the
1527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // initial page has been accessed.
1528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  has_accessed_initial_document_ = false;
1529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Without this check, an evil renderer can trick the browser into creating
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a navigation entry for a banned URL.  If the user clicks the back button
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // followed by the forward button (or clicks reload, or round-trips through
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // session restore, etc), we'll think that the browser commanded the
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // renderer to load the URL and grant the renderer the privileges to request
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the URL.  To prevent this attack, we block the renderer from inserting
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // banned URLs into the navigation controller in the first place.
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, process, false, &validated_params.url);
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, process, true, &validated_params.referrer.url);
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<GURL>::iterator it(validated_params.redirects.begin());
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      it != validated_params.redirects.end(); ++it) {
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FilterURL(policy, process, false, &(*it));
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, process, true, &validated_params.searchable_form_url);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1547b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Without this check, the renderer can trick the browser into using
1548b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // filenames it can't access in a future session restore.
154990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!CanAccessFilesOfPageState(validated_params.page_state)) {
1550b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    GetProcess()->ReceivedBadMessage();
1551b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return;
1552b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1553b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->DidNavigate(this, validated_params);
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderViewHostImpl::OnUpdateState(int32 page_id, const PageState& state) {
1558b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Without this check, the renderer can trick the browser into using
1559b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // filenames it can't access in a future session restore.
156090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!CanAccessFilesOfPageState(state)) {
1561b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    GetProcess()->ReceivedBadMessage();
1562b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return;
1563b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1564b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->UpdateState(this, page_id, state);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnUpdateTitle(
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 page_id,
1570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& title,
1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebTextDirection title_direction) {
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (title.length() > kMaxTitleChars) {
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Renderer sent too many characters in title.";
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->UpdateTitle(this, page_id, title,
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         WebTextDirectionToChromeTextDirection(
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             title_direction));
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnUpdateEncoding(const std::string& encoding_name) {
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->UpdateEncoding(this, encoding_name);
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnUpdateTargetURL(int32 page_id, const GURL& url) {
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_swapped_out_)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->UpdateTargetURL(page_id, url);
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send a notification back to the renderer that we are ready to
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // receive more target urls.
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_UpdateTargetURL_ACK(GetRoutingID()));
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnUpdateInspectorSetting(
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key, const std::string& value) {
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetContentClient()->browser()->UpdateInspectorSetting(
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, key, value);
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnClose() {
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the renderer is telling us to close, it has already run the unload
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // events, and we can take the fast path.
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClosePageIgnoringUnloadEvents();
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnRequestMove(const gfx::Rect& pos) {
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_swapped_out_)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RequestMove(pos);
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_Move_ACK(GetRoutingID()));
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidStartLoading() {
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->DidStartLoading(this);
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidStopLoading() {
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->DidStopLoading(this);
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidChangeLoadProgress(double load_progress) {
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->DidChangeLoadProgress(load_progress);
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidDisownOpener() {
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_->DidDisownOpener(this);
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDocumentAvailableInMainFrame() {
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->DocumentAvailableInMainFrame(this);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDocumentOnLoadCompletedInMainFrame(
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 page_id) {
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->DocumentOnLoadCompletedInMainFrame(this, page_id);
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnContextMenu(const ContextMenuParams& params) {
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Validate the URLs in |params|.  If the renderer can't request the URLs
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // directly, don't show them in the context menu.
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContextMenuParams validated_params(params);
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* process = GetProcess();
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't validate |unfiltered_link_url| so that this field can be used
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when users want to copy the original link URL.
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, process, true, &validated_params.link_url);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, process, true, &validated_params.src_url);
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, process, false, &validated_params.page_url);
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, process, true, &validated_params.frame_url);
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delegate_->ShowContextMenu(validated_params);
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnToggleFullscreen(bool enter_fullscreen) {
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->ToggleFullscreenMode(enter_fullscreen);
1659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // We need to notify the contents that its fullscreen state has changed. This
1660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // is done as part of the resize message.
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WasResized();
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnOpenURL(
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ViewHostMsg_OpenURL_Params& params) {
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL validated_url(params.url);
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(ChildProcessSecurityPolicyImpl::GetInstance(),
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetProcess(), false, &validated_url);
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RequestOpenURL(
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, validated_url, params.referrer, params.disposition, params.frame_id,
1672ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      params.should_replace_current_entry, params.user_gesture);
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidContentsPreferredSizeChange(
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Size& new_size) {
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->UpdatePreferredSize(new_size);
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnRenderAutoResized(const gfx::Size& new_size) {
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->ResizeDueToAutoResize(new_size);
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidChangeScrollOffset() {
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view_)
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->ScrollOffsetChanged();
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidChangeScrollbarsForMainFrame(
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_horizontal_scrollbar, bool has_vertical_scrollbar) {
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->SetHasHorizontalScrollbar(has_horizontal_scrollbar);
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidChangeScrollOffsetPinningForMainFrame(
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_pinned_to_left, bool is_pinned_to_right) {
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->SetScrollOffsetPinning(is_pinned_to_left, is_pinned_to_right);
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnDidChangeNumWheelEvents(int count) {
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderViewHostImpl::OnSelectionChanged(const base::string16& text,
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            size_t offset,
170658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            const gfx::Range& range) {
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_)
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_->SelectionChanged(text, offset, range);
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnSelectionBoundsChanged(
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ViewHostMsg_SelectionBounds_Params& params) {
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_) {
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SelectionBoundsChanged(params);
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnRouteCloseEvent() {
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have the delegate route this to the active RenderViewHost.
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RouteCloseEvent(this);
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnRouteMessageEvent(
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ViewMsg_PostMessage_Params& params) {
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Give to the delegate to route to the active RenderViewHost.
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RouteMessageEvent(this, params);
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnRunJavaScriptMessage(
1730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& message,
1731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& default_prompt,
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& frame_url,
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JavaScriptMessageType type,
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply_msg) {
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // While a JS message dialog is showing, tabs in the same process shouldn't
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process input events.
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetProcess()->SetIgnoreInputEvents(true);
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopHangMonitorTimeout();
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RunJavaScriptMessage(this, message, default_prompt, frame_url,
1740d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                  type, reply_msg,
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  &are_javascript_messages_suppressed_);
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnRunBeforeUnloadConfirm(const GURL& frame_url,
1745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                  const base::string16& message,
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  bool is_reload,
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  IPC::Message* reply_msg) {
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // While a JS before unload dialog is showing, tabs in the same process
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // shouldn't process input events.
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetProcess()->SetIgnoreInputEvents(true);
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopHangMonitorTimeout();
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RunBeforeUnloadConfirm(this, message, is_reload, reply_msg);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnStartDragging(
1756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const DropData& drop_data,
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebDragOperationsMask drag_operations_mask,
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkBitmap& bitmap,
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Vector2d& bitmap_offset_in_dip,
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DragEventSourceInfo& event_info) {
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostDelegateView* view = delegate_->GetDelegateView();
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view)
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DropData filtered_data(drop_data);
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* process = GetProcess();
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow drag of Javascript URLs to enable bookmarklet drag to bookmark bar.
17713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!filtered_data.url.SchemeIs(kJavaScriptScheme))
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FilterURL(policy, process, true, &filtered_data.url);
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilterURL(policy, process, false, &filtered_data.html_base_url);
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Filter out any paths that the renderer didn't have access to. This prevents
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the following attack on a malicious renderer:
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. StartDragging IPC sent with renderer-specified filesystem paths that it
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    doesn't have read permissions for.
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. We initiate a native DnD operation.
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. DnD operation immediately ends since mouse is not held down. DnD events
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    still fire though, which causes read permissions to be granted to the
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    renderer for any file paths in the drop.
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filtered_data.filenames.clear();
1783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (std::vector<DropData::FileInfo>::const_iterator it =
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           drop_data.filenames.begin();
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != drop_data.filenames.end(); ++it) {
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path(base::FilePath::FromUTF8Unsafe(UTF16ToUTF8(it->path)));
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy->CanReadFile(GetProcess()->GetID(), path))
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      filtered_data.filenames.push_back(*it);
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
179068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  float scale = ui::GetImageScale(GetScaleFactorForView(GetView()));
179168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::ImageSkia image(gfx::ImageSkiaRep(bitmap, scale));
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->StartDragging(filtered_data, drag_operations_mask, image,
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bitmap_offset_in_dip, event_info);
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnUpdateDragCursor(WebDragOperation current_op) {
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostDelegateView* view = delegate_->GetDelegateView();
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view->UpdateDragCursor(current_op);
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnTargetDropACK() {
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_RENDER_VIEW_HOST_DID_RECEIVE_DRAG_TARGET_DROP_ACK,
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<RenderViewHost>(this),
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NotificationService::NoDetails());
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnTakeFocus(bool reverse) {
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostDelegateView* view = delegate_->GetDelegateView();
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view->TakeFocus(reverse);
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnFocusedNodeChanged(bool is_editable_node) {
1816f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
1817f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  if (!is_editable_node && virtual_keyboard_requested_) {
1818f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)    virtual_keyboard_requested_ = false;
1819f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)    BrowserThread::PostDelayedTask(
1820f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
1821f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)        base::Bind(base::IgnoreResult(&DismissVirtualKeyboardTask)),
1822f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)        TimeDelta::FromMilliseconds(kVirtualKeyboardDisplayWaitTimeoutMs));
1823f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  }
1824f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)#endif
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<RenderViewHost>(this),
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<const bool>(&is_editable_node));
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnAddMessageToConsole(
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 level,
1833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& message,
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 line_no,
1835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& source_id) {
183658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (delegate_->AddMessageToConsole(level, message, line_no, source_id))
1837bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return;
183858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1839bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Pass through log level only on WebUI pages to limit console spew.
1840bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  int32 resolved_level = HasWebUIScheme(delegate_->GetURL()) ? level : 0;
1841bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
1842bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (resolved_level >= ::logging::GetMinLogLevel()) {
1843bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    logging::LogMessage("CONSOLE", line_no, resolved_level).stream() << "\"" <<
1844bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        message << "\", source: " << source_id << " (" << line_no << ")";
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnUserGesture() {
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->OnUserGesture();
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnShouldCloseACK(
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool proceed,
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::TimeTicks& renderer_before_unload_start_time,
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::TimeTicks& renderer_before_unload_end_time) {
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decrement_in_flight_event_count();
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopHangMonitorTimeout();
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this renderer navigated while the beforeunload request was in flight, we
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // may have cleared this state in OnNavigate, in which case we can ignore
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this message.
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_waiting_for_beforeunload_ack_ || is_swapped_out_)
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_waiting_for_beforeunload_ack_ = false;
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostDelegate::RendererManagement* management_delegate =
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->GetRendererManagementDelegate();
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (management_delegate) {
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeTicks before_unload_end_time;
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!send_should_close_start_time_.is_null() &&
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !renderer_before_unload_start_time.is_null() &&
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !renderer_before_unload_end_time.is_null()) {
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // When passing TimeTicks across process boundaries, we need to compensate
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // for any skew between the processes. Here we are converting the
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // renderer's notion of before_unload_end_time to TimeTicks in the browser
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // process. See comments in inter_process_time_ticks_converter.h for more.
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InterProcessTimeTicksConverter converter(
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          LocalTimeTicks::FromTimeTicks(send_should_close_start_time_),
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          LocalTimeTicks::FromTimeTicks(base::TimeTicks::Now()),
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          RemoteTimeTicks::FromTimeTicks(renderer_before_unload_start_time),
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time));
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LocalTimeTicks browser_before_unload_end_time =
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          converter.ToLocalTimeTicks(
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time));
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      before_unload_end_time = browser_before_unload_end_time.ToTimeTicks();
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    management_delegate->ShouldClosePage(
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unload_ack_is_for_cross_site_transition_, proceed,
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        before_unload_end_time);
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If canceled, notify the delegate to cancel its pending navigation entry.
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proceed)
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->DidCancelLoading();
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnClosePageACK() {
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decrement_in_flight_event_count();
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClosePageIgnoringUnloadEvents();
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::NotifyRendererUnresponsive() {
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RendererUnresponsive(
19043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      this, is_waiting_for_beforeunload_ack_, is_waiting_for_unload_ack_);
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::NotifyRendererResponsive() {
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RendererResponsive(this);
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::RequestToLockMouse(bool user_gesture,
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            bool last_unlocked_by_target) {
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RequestToLockMouse(user_gesture, last_unlocked_by_target);
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewHostImpl::IsFullscreen() const {
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_->IsFullscreenForCurrentTab();
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnFocus() {
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: We allow focus and blur from swapped out RenderViewHosts, even when
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the active RenderViewHost is in a different BrowsingInstance (e.g., WebUI).
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Activate();
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnBlur() {
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->Deactivate();
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect RenderViewHostImpl::GetRootWindowResizerRect() const {
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_->GetRootWindowResizerRect();
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ForwardMouseEvent(
1935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebMouseEvent& mouse_event) {
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We make a copy of the mouse event because
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderWidgetHost::ForwardMouseEvent will delete |mouse_event|.
1939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent event_copy(mouse_event);
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl::ForwardMouseEvent(event_copy);
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event_copy.type) {
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::MouseMove:
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->HandleMouseMove();
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::MouseLeave:
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->HandleMouseLeave();
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::MouseDown:
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->HandleMouseDown();
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::MouseWheel:
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ignore_input_events())
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate_->OnIgnoredUIEvent();
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::MouseUp:
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->HandleMouseUp();
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For now, we don't care about the rest.
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnPointerEventActivate() {
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->HandlePointerActivate();
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ForwardKeyboardEvent(
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NativeWebKeyboardEvent& key_event) {
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ignore_input_events()) {
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (key_event.type == WebInputEvent::RawKeyDown)
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_->OnIgnoredUIEvent();
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostImpl::ForwardKeyboardEvent(key_event);
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DidSelectPopupMenuItems(
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<int>& selected_indices) {
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SelectPopupMenuItems(GetRoutingID(), false,
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        selected_indices));
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DidCancelPopupMenu() {
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SelectPopupMenuItems(GetRoutingID(), true,
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        std::vector<int>()));
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DidSelectPopupMenuItem(int selected_index) {
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SelectPopupMenuItem(GetRoutingID(), selected_index));
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DidCancelPopupMenu() {
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SelectPopupMenuItem(GetRoutingID(), -1));
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::SendOrientationChangeEvent(int orientation) {
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_OrientationChangeEvent(GetRoutingID(), orientation));
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ToggleSpeechInput() {
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new InputTagSpeechMsg_ToggleSpeechInput(GetRoutingID()));
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2009a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool RenderViewHostImpl::CanCommitURL(const GURL& url) {
2010a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // TODO(creis): We should also check for WebUI pages here.  Also, when the
2011a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // out-of-process iframes implementation is ready, we should check for
2012a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // cross-site URLs that are not allowed to commit in this process.
2013a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2014a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Give the client a chance to disallow URLs from committing.
2015a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return GetContentClient()->browser()->CanCommitURL(GetProcess(), url);
2016a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
2017a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::FilterURL(ChildProcessSecurityPolicyImpl* policy,
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const RenderProcessHost* process,
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool empty_allowed,
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   GURL* url) {
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (empty_allowed && url->is_empty())
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The browser process should never hear the swappedout:// URL from any
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of the renderer's messages.  Check for this in debug builds, but don't
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // let it crash a release browser.
20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(GURL(kSwappedOutURL) != *url);
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url->is_valid()) {
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Have to use about:blank for the denied case, instead of an empty GURL.
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is because the browser treats navigation to an empty GURL as a
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // navigation to the home page. This is often a privileged page
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (chrome://newtab/) which is exactly what we don't want.
203590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    *url = GURL(kAboutBlankURL);
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RecordAction(UserMetricsAction("FilterURLTermiate_Invalid"));
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url->SchemeIs(chrome::kAboutScheme)) {
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The renderer treats all URLs in the about: scheme as being about:blank.
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Canonicalize about: URLs to about:blank.
204390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    *url = GURL(kAboutBlankURL);
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RecordAction(UserMetricsAction("FilterURLTermiate_About"));
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not allow browser plugin guests to navigate to non-web URLs, since they
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cannot swap processes or grant bindings.
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool non_web_url_in_guest = process->IsGuest() &&
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !(url->is_valid() && policy->IsWebSafeScheme(url->scheme()));
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (non_web_url_in_guest || !policy->CanRequestURL(process->GetID(), *url)) {
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If this renderer is not permitted to request this URL, we invalidate the
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // URL.  This prevents us from storing the blocked URL and becoming confused
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // later.
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "Blocked URL " << url->spec();
205790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    *url = GURL(kAboutBlankURL);
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RecordAction(UserMetricsAction("FilterURLTermiate_Blocked"));
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::SetAltErrorPageURL(const GURL& url) {
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_SetAltErrorPageURL(GetRoutingID(), url));
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ExitFullscreen() {
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RejectMouseLockOrUnlockIfNecessary();
2068d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Notify delegate_ and renderer of fullscreen state change.
2069d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  OnToggleFullscreen(false);
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebPreferences RenderViewHostImpl::GetWebkitPreferences() {
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delegate_->GetWebkitPrefs();
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::DisownOpener() {
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should only be called when swapped out.
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(is_swapped_out_);
20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Send(new ViewMsg_DisownOpener(GetRoutingID()));
20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewHostImpl::SetAccessibilityCallbackForTesting(
2084f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::Callback<void(blink::WebAXEvent)>& callback) {
20857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  accessibility_testing_callback_ = callback;
20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewHostImpl::UpdateWebkitPreferences(const WebPreferences& prefs) {
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_UpdateWebPreferences(GetRoutingID(), prefs));
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::NotifyTimezoneChange() {
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_TimezoneChange(GetRoutingID()));
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RenderViewHostImpl::GetAudioOutputControllers(
20971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const GetAudioOutputControllersCallback& callback) const {
20981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AudioRendererHost* audio_host =
20991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      static_cast<RenderProcessHostImpl*>(GetProcess())->audio_renderer_host();
21001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  audio_host->GetOutputControllers(GetRoutingID(), callback);
21011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
21021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ClearFocusedNode() {
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_ClearFocusedNode(GetRoutingID()));
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::Zoom(PageZoom zoom) {
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_Zoom(GetRoutingID(), zoom));
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ReloadFrame() {
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_ReloadFrame(GetRoutingID()));
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::Find(int request_id,
2116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              const base::string16& search_text,
2117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              const blink::WebFindOptions& options) {
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_Find(GetRoutingID(), request_id, search_text, options));
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderViewHostImpl::InsertCSS(const base::string16& frame_xpath,
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& css) {
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_CSSInsertRequest(GetRoutingID(), frame_xpath, css));
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DisableScrollbarsForThreshold(const gfx::Size& size) {
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_DisableScrollbarsForSmallWindows(GetRoutingID(), size));
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::EnablePreferredSizeMode() {
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_EnablePreferredSizeChangedMode(GetRoutingID()));
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::EnableAutoResize(const gfx::Size& min_size,
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const gfx::Size& max_size) {
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetShouldAutoResize(true);
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_EnableAutoResize(GetRoutingID(), min_size, max_size));
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::DisableAutoResize(const gfx::Size& new_size) {
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetShouldAutoResize(false);
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_DisableAutoResize(GetRoutingID(), new_size));
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ExecuteCustomContextMenuCommand(
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int action, const CustomContextMenuContext& context) {
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_CustomContextMenuAction(GetRoutingID(), context, action));
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::NotifyContextMenuClosed(
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CustomContextMenuContext& context) {
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_ContextMenuClosed(GetRoutingID(), context));
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::CopyImageAt(int x, int y) {
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_CopyImageAt(GetRoutingID(), x, y));
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ExecuteMediaPlayerActionAtLocation(
2160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const gfx::Point& location, const blink::WebMediaPlayerAction& action) {
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_MediaPlayerActionAt(GetRoutingID(), location, action));
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::ExecutePluginActionAtLocation(
2165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const gfx::Point& location, const blink::WebPluginAction& action) {
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_PluginActionAt(GetRoutingID(), location, action));
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::NotifyMoveOrResizeStarted() {
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_MoveOrResizeStarted(GetRoutingID()));
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::StopFinding(StopFindAction action) {
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewMsg_StopFinding(GetRoutingID(), action));
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RenderViewHostImpl::OnAccessibilityEvents(
217858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<AccessibilityHostMsg_EventParams>& params) {
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (view_ && !is_swapped_out_)
218058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->OnAccessibilityEvents(params);
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Always send an ACK or the renderer can be in a bad state.
218358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Send(new AccessibilityMsg_Events_ACK(GetRoutingID()));
21847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
21857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The rest of this code is just for testing; bail out if we're not
21867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // in that mode.
21877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (accessibility_testing_callback_.is_null())
21887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
21897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned i = 0; i < params.size(); i++) {
219158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const AccessibilityHostMsg_EventParams& param = params[i];
2192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebAXEvent src_type = param.event_type;
2193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (src_type == blink::WebAXEventLayoutComplete ||
2194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        src_type == blink::WebAXEventLoadComplete) {
21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MakeAccessibilityNodeDataTree(param.nodes, &accessibility_tree_);
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    accessibility_testing_callback_.Run(src_type);
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewHostImpl::OnScriptEvalResponse(int id,
22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              const base::ListValue& result) {
22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::Value* result_value;
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result.Get(0, &result_value)) {
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Programming error or rogue renderer.
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Got bad arguments for OnScriptEvalResponse";
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<int, JavascriptResultCallback>::iterator it =
22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      javascript_callbacks_.find(id);
22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (it != javascript_callbacks_.end()) {
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ExecuteJavascriptInWebFrameCallbackResult was used; do callback.
22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    it->second.Run(result_value);
22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    javascript_callbacks_.erase(it);
22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Received script response for unknown request";
22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnDidZoomURL(double zoom_level,
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool remember,
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const GURL& url) {
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostZoomMapImpl* host_zoom_map = static_cast<HostZoomMapImpl*>(
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HostZoomMap::GetForBrowserContext(GetProcess()->GetBrowserContext()));
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remember) {
22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_zoom_map->
22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SetZoomLevelForHost(net::GetHostOrSpecFromURL(url), zoom_level);
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_zoom_map->SetTemporaryZoomLevel(
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcess()->GetID(), GetRoutingID(), zoom_level);
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnRequestDesktopNotificationPermission(
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& source_origin, int callback_context) {
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetContentClient()->browser()->RequestDesktopNotificationPermission(
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_origin, callback_context, GetProcess()->GetID(), GetRoutingID());
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnShowDesktopNotification(
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShowDesktopNotificationHostMsgParams& params) {
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetContentClient()->browser()->ShowDesktopNotification(
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params, GetProcess()->GetID(), GetRoutingID(), false);
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnCancelDesktopNotification(int notification_id) {
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetContentClient()->browser()->CancelDesktopNotification(
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProcess()->GetID(), GetRoutingID(), notification_id);
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnRunFileChooser(const FileChooserParams& params) {
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RunFileChooser(this, params);
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RenderViewHostImpl::OnDidAccessInitialDocument() {
2257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  has_accessed_initial_document_ = true;
2258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  delegate_->DidAccessInitialDocument();
2259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewHostImpl::OnDomOperationResponse(
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& json_string, int automation_id) {
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DomOperationNotificationDetails details(json_string, automation_id);
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationService::current()->Notify(
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTIFICATION_DOM_OPERATION_RESPONSE,
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Source<RenderViewHost>(this),
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Details<DomOperationNotificationDetails>(&details));
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderViewHostImpl::OnFocusedNodeTouched(bool editable) {
2271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
2272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (editable) {
2273f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)    virtual_keyboard_requested_ = base::win::DisplayVirtualKeyboard();
2274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
2275f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)    virtual_keyboard_requested_ = false;
2276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::win::DismissVirtualKeyboard();
2277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
2279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_ANDROID)
2282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewHostImpl::OnShowPopup(
2283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ViewHostMsg_ShowPopup_Params& params) {
2284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderViewHostDelegateView* view = delegate_->GetDelegateView();
2285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view) {
2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view->ShowPopupMenu(params.bounds,
2287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        params.item_height,
2288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        params.item_font_size,
2289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        params.selected_item,
2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        params.popup_items,
2291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        params.right_aligned,
2292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        params.allow_multiple_selection);
2293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
2296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewHostImpl::SetSwappedOut(bool is_swapped_out) {
22987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // We update the number of RenderViews in a SiteInstance when the
22997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // swapped out status of this RenderView gets flipped.
23007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (is_swapped_out_ && !is_swapped_out)
23017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    instance_->increment_active_view_count();
23027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  else if (!is_swapped_out_ && is_swapped_out)
23037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    instance_->decrement_active_view_count();
23047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  is_swapped_out_ = is_swapped_out;
2306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whenever we change swap out state, we should not be waiting for
2308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // beforeunload or unload acks.  We clear them here to be safe, since they
2309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // can cause navigations to be ignored in OnNavigate.
2310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  is_waiting_for_beforeunload_ack_ = false;
2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  is_waiting_for_unload_ack_ = false;
2312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  has_timed_out_on_unload_ = false;
2313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool RenderViewHostImpl::CanAccessFilesOfPageState(
231690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const PageState& state) const {
2317b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
2318b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
231990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
232090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const std::vector<base::FilePath>& file_paths = state.GetReferencedFiles();
2321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  for (std::vector<base::FilePath>::const_iterator file = file_paths.begin();
2322b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)       file != file_paths.end(); ++file) {
2323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (!policy->CanReadFile(GetProcess()->GetID(), *file))
2324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      return false;
2325b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
2326b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return true;
2327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
2328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
23294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderViewHostImpl::AttachToFrameTree() {
23304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FrameTree* frame_tree = delegate_->GetFrameTree();
23314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  frame_tree->SwapMainFrame(main_render_frame_host_.get());
23334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (main_frame_id() != FrameTreeNode::kInvalidFrameId) {
23344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    frame_tree->OnFirstNavigationAfterSwap(main_frame_id());
23354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
23364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
23374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2339