blob: 6f5017dfb27f58028d73ae7713385361c7d4a576 [file] [log] [blame]
[email protected]b553edd52012-01-10 12:15:231// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]310ebd6302011-10-10 19:06:285#include "content/renderer/render_view_impl.h"
initial.commit09911bf2008-07-26 23:55:296
7#include <algorithm>
[email protected]b75b8292010-10-01 07:28:258#include <cmath>
initial.commit09911bf2008-07-26 23:55:299
[email protected]5d4e36d2013-02-15 15:18:2010#include "base/auto_reset.h"
[email protected]6e806822011-11-19 01:51:0811#include "base/bind.h"
12#include "base/bind_helpers.h"
initial.commit09911bf2008-07-26 23:55:2913#include "base/command_line.h"
[email protected]bb063b72009-03-27 23:18:5014#include "base/compiler_specific.h"
[email protected]2132d6b2013-06-05 00:15:4315#include "base/debug/alias.h"
[email protected]e7ca2892012-09-01 00:52:1516#include "base/debug/trace_event.h"
[email protected]728c2ee2013-06-25 04:01:0717#include "base/files/file_path.h"
[email protected]edc3af82013-12-12 21:24:0718#include "base/i18n/rtl.h"
[email protected]b1cf3372011-04-20 21:28:1019#include "base/json/json_writer.h"
[email protected]625332e02010-12-14 07:48:4920#include "base/lazy_instance.h"
[email protected]cffd7522012-10-23 19:10:5821#include "base/memory/scoped_ptr.h"
[email protected]7ccb7072013-06-10 20:56:2822#include "base/message_loop/message_loop_proxy.h"
[email protected]f29efe6b2014-06-09 05:01:5123#include "base/metrics/field_trial.h"
[email protected]835d7c82010-10-14 04:38:3824#include "base/metrics/histogram.h"
[email protected]d3b4ee22013-07-24 22:50:0625#include "base/process/kill.h"
[email protected]7d08a9352013-10-15 08:24:5626#include "base/process/process.h"
[email protected]21aa99682013-06-11 07:17:0127#include "base/strings/string_number_conversions.h"
[email protected]b9e7c479f2013-04-12 04:33:2428#include "base/strings/string_piece.h"
[email protected]27c05732013-02-15 21:55:4929#include "base/strings/string_split.h"
[email protected]21aa99682013-06-11 07:17:0130#include "base/strings/string_util.h"
[email protected]40d11e02013-03-28 17:43:1431#include "base/strings/sys_string_conversions.h"
[email protected]74ebfb12013-06-07 20:48:0032#include "base/strings/utf_string_conversions.h"
[email protected]abb522162013-06-28 01:54:1633#include "base/time/time.h"
[email protected]e3415902013-10-17 15:00:4634#include "cc/base/switches.h"
[email protected]a8cb3b73b2013-08-12 05:50:5035#include "content/child/appcache/appcache_dispatcher.h"
36#include "content/child/appcache/web_application_cache_host_impl.h"
[email protected]cb189e062014-04-23 00:57:0137#include "content/child/child_shared_bitmap_manager.h"
[email protected]10208ea2013-06-06 20:08:0338#include "content/child/child_thread.h"
[email protected]29e2fb42013-07-19 01:13:4739#include "content/child/npapi/webplugin_delegate_impl.h"
[email protected]541b7b02013-06-07 00:59:3440#include "content/child/request_extra_data.h"
[email protected]10208ea2013-06-06 20:08:0341#include "content/child/webmessageportchannel_impl.h"
jinho.bang632a1a722014-09-18 03:02:5642#include "content/common/content_constants_internal.h"
[email protected]37666cf2011-03-13 21:51:4243#include "content/common/database_messages.h"
[email protected]5f2aa722013-08-07 16:59:4144#include "content/common/dom_storage/dom_storage_types.h"
[email protected]59f4f2fa2011-03-23 01:00:5545#include "content/common/drag_messages.h"
[email protected]c6bc20332014-02-28 18:30:3946#include "content/common/frame_messages.h"
alexmosbc7eafa2014-12-06 01:38:0947#include "content/common/frame_replication_state.h"
[email protected]c26ad882012-02-07 06:41:2048#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
[email protected]c084330e02013-04-27 01:08:1549#include "content/common/input_messages.h"
[email protected]127dd582011-03-16 21:32:1050#include "content/common/pepper_messages.h"
[email protected]e4495212012-12-06 03:09:1251#include "content/common/ssl_status_serialization.h"
[email protected]778574e2011-03-21 22:03:5052#include "content/common/view_messages.h"
[email protected]e091df82011-10-11 18:13:2153#include "content/public/common/bindings_policy.h"
[email protected]744c2a22012-03-15 18:42:0454#include "content/public/common/content_client.h"
[email protected]54087fe2011-10-28 22:02:4855#include "content/public/common/content_constants.h"
[email protected]c08950d22011-10-13 22:20:2956#include "content/public/common/content_switches.h"
[email protected]dc293a72013-07-01 11:11:2257#include "content/public/common/drop_data.h"
[email protected]41225fe2013-03-29 05:32:0258#include "content/public/common/favicon_url.h"
hirono570357bd2014-10-08 12:39:2759#include "content/public/common/file_chooser_file_info.h"
[email protected]8caadeb2011-11-22 02:45:2360#include "content/public/common/file_chooser_params.h"
clamyda97e8322014-10-07 21:57:2561#include "content/public/common/page_state.h"
[email protected]7940b8e2013-07-25 23:08:4962#include "content/public/common/page_zoom.h"
[email protected]e4495212012-12-06 03:09:1263#include "content/public/common/ssl_status.h"
[email protected]818915cd2012-11-20 13:14:1164#include "content/public/common/three_d_api_types.h"
[email protected]a1d29162011-10-14 17:14:0365#include "content/public/common/url_constants.h"
[email protected]3b366ae2013-05-17 21:16:5866#include "content/public/common/url_utils.h"
[email protected]b3a97b52014-07-09 06:25:0567#include "content/public/common/web_preferences.h"
[email protected]d344114c2011-10-01 01:24:3468#include "content/public/renderer/content_renderer_client.h"
[email protected]007733c2011-11-17 00:34:0769#include "content/public/renderer/document_state.h"
[email protected]82ddba1c2011-10-04 00:15:3270#include "content/public/renderer/navigation_state.h"
[email protected]3a034ebb2011-10-03 19:19:4471#include "content/public/renderer/render_view_observer.h"
[email protected]64ffa0442011-10-03 22:08:3672#include "content/public/renderer/render_view_visitor.h"
[email protected]e6e56752012-08-10 00:46:0673#include "content/renderer/browser_plugin/browser_plugin.h"
74#include "content/renderer/browser_plugin/browser_plugin_manager.h"
[email protected]70019152012-12-19 11:44:1975#include "content/renderer/devtools/devtools_agent.h"
[email protected]f9526d12012-10-18 01:55:0376#include "content/renderer/disambiguation_popup_helper.h"
[email protected]1910fe82012-05-10 00:04:1077#include "content/renderer/dom_storage/webstoragenamespace_impl.h"
[email protected]dc293a72013-07-01 11:11:2278#include "content/renderer/drop_data_builder.h"
jochen26f639922014-10-23 21:59:5779#include "content/renderer/gpu/gpu_benchmarking_extension.h"
[email protected]ba91a792013-02-06 09:48:2880#include "content/renderer/gpu/render_widget_compositor.h"
[email protected]d4734982014-04-15 02:05:5581#include "content/renderer/history_controller.h"
[email protected]dc064352014-04-25 08:36:3882#include "content/renderer/history_serialization.h"
[email protected]1784b2f2011-11-24 10:53:4883#include "content/renderer/idle_user_detector.h"
[email protected]66fca5bc2013-05-23 06:58:2984#include "content/renderer/ime_event_guard.h"
[email protected]7a72d452013-12-13 10:01:1385#include "content/renderer/input/input_handler_manager.h"
[email protected]92d457802013-04-01 19:18:4986#include "content/renderer/internal_document_state_data.h"
[email protected]4a914882013-01-10 00:43:4887#include "content/renderer/media/audio_device_factory.h"
[email protected]6392d982013-04-16 16:59:2288#include "content/renderer/media/video_capture_impl_manager.h"
[email protected]3fad220d2014-01-23 11:30:0689#include "content/renderer/memory_benchmarking_extension.h"
[email protected]4a19be92011-09-22 14:25:0290#include "content/renderer/mhtml_generator.h"
[email protected]b3a97b52014-07-09 06:25:0591#include "content/renderer/net_info_helper.h"
[email protected]227692c52013-05-31 22:43:0492#include "content/renderer/render_frame_impl.h"
[email protected]5a7100d2014-05-19 01:29:0493#include "content/renderer/render_frame_proxy.h"
[email protected]8704f89b2011-04-15 00:30:0594#include "content/renderer/render_process.h"
[email protected]f1a29a02011-10-06 23:08:4495#include "content/renderer/render_thread_impl.h"
[email protected]89054502012-06-03 10:29:2496#include "content/renderer/render_view_mouse_lock_dispatcher.h"
[email protected]2cff0052011-03-18 16:51:4497#include "content/renderer/render_widget_fullscreen_pepper.h"
[email protected]663bd9e2011-03-21 01:07:0198#include "content/renderer/renderer_webapplicationcachehost_impl.h"
[email protected]5b45ad42013-10-25 00:42:0499#include "content/renderer/resizing_mode_selector.h"
[email protected]12a936d2013-05-15 04:55:49100#include "content/renderer/savable_resources.h"
[email protected]cdb6b1e2014-01-23 00:06:49101#include "content/renderer/skia_benchmarking_extension.h"
[email protected]64d09222012-05-25 10:10:34102#include "content/renderer/speech_recognition_dispatcher.h"
[email protected]27c521a2013-05-29 20:44:32103#include "content/renderer/stats_collection_controller.h"
104#include "content/renderer/stats_collection_observer.h"
[email protected]86a7d3c2011-09-12 16:45:32105#include "content/renderer/text_input_client_observer.h"
[email protected]8d86f13d2011-10-04 17:01:19106#include "content/renderer/v8_value_converter_impl.h"
[email protected]940ed1d2012-11-27 21:03:21107#include "content/renderer/web_ui_extension.h"
108#include "content/renderer/web_ui_extension_data.h"
[email protected]1c142a52014-04-05 20:14:17109#include "content/renderer/web_ui_mojo.h"
[email protected]6f516082011-03-17 19:15:35110#include "content/renderer/websharedworker_proxy.h"
[email protected]f5961142013-04-17 23:09:42111#include "media/audio/audio_output_device.h"
[email protected]ee68378a2010-08-10 01:05:41112#include "media/base/media_switches.h"
[email protected]37136d162012-04-09 23:39:19113#include "media/filters/audio_renderer_impl.h"
[email protected]1cad8802013-08-13 16:54:32114#include "media/filters/gpu_video_accelerator_factories.h"
[email protected]d1ef81d2012-07-24 11:39:36115#include "net/base/data_url.h"
initial.commit09911bf2008-07-26 23:55:29116#include "net/base/escape.h"
117#include "net/base/net_errors.h"
[email protected]18fb7a772012-09-20 19:25:09118#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
[email protected]52c68652010-12-07 17:47:04119#include "net/http/http_util.h"
lukenb171b532014-09-24 05:50:38120#include "skia/ext/platform_canvas.h"
[email protected]d0fcff72013-07-23 02:45:43121#include "third_party/WebKit/public/platform/WebCString.h"
[email protected]b3a97b52014-07-09 06:25:05122#include "third_party/WebKit/public/platform/WebConnectionType.h"
[email protected]d0fcff72013-07-23 02:45:43123#include "third_party/WebKit/public/platform/WebDragData.h"
[email protected]d0fcff72013-07-23 02:45:43124#include "third_party/WebKit/public/platform/WebHTTPBody.h"
125#include "third_party/WebKit/public/platform/WebImage.h"
126#include "third_party/WebKit/public/platform/WebMessagePortChannel.h"
127#include "third_party/WebKit/public/platform/WebPoint.h"
128#include "third_party/WebKit/public/platform/WebRect.h"
129#include "third_party/WebKit/public/platform/WebSize.h"
[email protected]ec173b522013-11-14 11:01:18130#include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h"
[email protected]d0fcff72013-07-23 02:45:43131#include "third_party/WebKit/public/platform/WebString.h"
132#include "third_party/WebKit/public/platform/WebURL.h"
133#include "third_party/WebKit/public/platform/WebURLError.h"
134#include "third_party/WebKit/public/platform/WebURLRequest.h"
135#include "third_party/WebKit/public/platform/WebURLResponse.h"
136#include "third_party/WebKit/public/platform/WebVector.h"
[email protected]10760e4a2013-09-04 23:32:20137#include "third_party/WebKit/public/web/WebAXObject.h"
[email protected]2255a9332013-06-17 05:12:31138#include "third_party/WebKit/public/web/WebColorName.h"
[email protected]8bc5ff02013-11-29 06:34:03139#include "third_party/WebKit/public/web/WebColorSuggestion.h"
[email protected]2255a9332013-06-17 05:12:31140#include "third_party/WebKit/public/web/WebDOMEvent.h"
141#include "third_party/WebKit/public/web/WebDOMMessageEvent.h"
142#include "third_party/WebKit/public/web/WebDataSource.h"
143#include "third_party/WebKit/public/web/WebDateTimeChooserCompletion.h"
144#include "third_party/WebKit/public/web/WebDateTimeChooserParams.h"
145#include "third_party/WebKit/public/web/WebDevToolsAgent.h"
146#include "third_party/WebKit/public/web/WebDocument.h"
147#include "third_party/WebKit/public/web/WebElement.h"
148#include "third_party/WebKit/public/web/WebFileChooserParams.h"
[email protected]2255a9332013-06-17 05:12:31149#include "third_party/WebKit/public/web/WebFindOptions.h"
150#include "third_party/WebKit/public/web/WebFormControlElement.h"
151#include "third_party/WebKit/public/web/WebFormElement.h"
152#include "third_party/WebKit/public/web/WebFrame.h"
[email protected]6bd867b2013-07-24 22:10:20153#include "third_party/WebKit/public/web/WebGlyphCache.h"
[email protected]2255a9332013-06-17 05:12:31154#include "third_party/WebKit/public/web/WebHistoryItem.h"
[email protected]91dcc6d32014-07-30 00:01:33155#include "third_party/WebKit/public/web/WebHitTestResult.h"
[email protected]2255a9332013-06-17 05:12:31156#include "third_party/WebKit/public/web/WebInputElement.h"
157#include "third_party/WebKit/public/web/WebInputEvent.h"
[email protected]afe7d90d2014-07-19 05:10:22158#include "third_party/WebKit/public/web/WebKit.h"
[email protected]35b2a972014-04-04 15:50:22159#include "third_party/WebKit/public/web/WebLocalFrame.h"
[email protected]2255a9332013-06-17 05:12:31160#include "third_party/WebKit/public/web/WebMediaPlayerAction.h"
161#include "third_party/WebKit/public/web/WebNavigationPolicy.h"
[email protected]b3a97b52014-07-09 06:25:05162#include "third_party/WebKit/public/web/WebNetworkStateNotifier.h"
[email protected]2255a9332013-06-17 05:12:31163#include "third_party/WebKit/public/web/WebNodeList.h"
164#include "third_party/WebKit/public/web/WebPageSerializer.h"
165#include "third_party/WebKit/public/web/WebPlugin.h"
166#include "third_party/WebKit/public/web/WebPluginAction.h"
167#include "third_party/WebKit/public/web/WebPluginContainer.h"
168#include "third_party/WebKit/public/web/WebPluginDocument.h"
[email protected]2255a9332013-06-17 05:12:31169#include "third_party/WebKit/public/web/WebRange.h"
[email protected]b3a97b52014-07-09 06:25:05170#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
[email protected]2255a9332013-06-17 05:12:31171#include "third_party/WebKit/public/web/WebScriptSource.h"
172#include "third_party/WebKit/public/web/WebSearchableFormData.h"
173#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
174#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
175#include "third_party/WebKit/public/web/WebSerializedScriptValue.h"
176#include "third_party/WebKit/public/web/WebSettings.h"
[email protected]2255a9332013-06-17 05:12:31177#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
[email protected]2255a9332013-06-17 05:12:31178#include "third_party/WebKit/public/web/WebView.h"
179#include "third_party/WebKit/public/web/WebWindowFeatures.h"
180#include "third_party/WebKit/public/web/default/WebRenderTheme.h"
[email protected]b3a97b52014-07-09 06:25:05181#include "third_party/icu/source/common/unicode/uchar.h"
182#include "third_party/icu/source/common/unicode/uscript.h"
[email protected]4ee64622014-03-21 22:34:15183#include "ui/base/clipboard/clipboard.h"
[email protected]1400e6dc2013-04-27 02:36:27184#include "ui/base/ui_base_switches_util.h"
[email protected]7d08a9352013-10-15 08:24:56185#include "ui/events/latency_info.h"
tfarina655f81d2014-12-23 02:38:50186#include "ui/gfx/geometry/point.h"
tfarina3b0452d2014-12-31 15:20:09187#include "ui/gfx/geometry/rect.h"
188#include "ui/gfx/geometry/rect_conversions.h"
tfarinaebe974f02015-01-03 04:25:32189#include "ui/gfx/geometry/size_conversions.h"
[email protected]08397d52011-02-05 01:53:38190#include "ui/gfx/native_widget_types.h"
[email protected]c4a9e932011-03-05 04:05:55191#include "v8/include/v8.h"
initial.commit09911bf2008-07-26 23:55:29192
[email protected]25fb9b32012-04-27 03:21:55193#if defined(OS_ANDROID)
[email protected]befe54782013-04-23 00:49:25194#include <cpu-features.h>
195
[email protected]20657a82012-08-21 20:23:03196#include "content/renderer/android/address_detector.h"
197#include "content/renderer/android/content_detector.h"
198#include "content/renderer/android/email_detector.h"
199#include "content/renderer/android/phone_number_detector.h"
[email protected]74d9c5242014-05-01 05:10:03200#include "net/android/network_library.h"
[email protected]5c30b5e02013-05-30 03:46:08201#include "third_party/WebKit/public/platform/WebFloatPoint.h"
202#include "third_party/WebKit/public/platform/WebFloatRect.h"
tfarina3b0452d2014-12-31 15:20:09203#include "ui/gfx/geometry/rect_f.h"
[email protected]e69bb062013-06-03 13:05:40204
[email protected]25fb9b32012-04-27 03:21:55205#elif defined(OS_WIN)
[email protected]6c8afae52009-01-22 02:24:57206// TODO(port): these files are currently Windows only because they concern:
[email protected]6c8afae52009-01-22 02:24:57207// * theming
[email protected]990e6222012-11-16 13:31:18208#include "ui/native_theme/native_theme_win.h"
[email protected]6981f7f2010-03-09 00:53:03209#elif defined(USE_X11)
[email protected]990e6222012-11-16 13:31:18210#include "ui/native_theme/native_theme.h"
[email protected]78043bdd2010-04-05 18:45:33211#elif defined(OS_MACOSX)
212#include "skia/ext/skia_utils_mac.h"
[email protected]6c8afae52009-01-22 02:24:57213#endif
214
[email protected]ea2fb972013-08-07 05:44:26215#if defined(ENABLE_PLUGINS)
[email protected]a80af12e2013-08-07 23:36:13216#include "content/renderer/npapi/webplugin_delegate_proxy.h"
[email protected]ea2fb972013-08-07 05:44:26217#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
218#include "content/renderer/pepper/pepper_plugin_registry.h"
[email protected]ea2fb972013-08-07 05:44:26219#endif
220
[email protected]9ac667e2013-09-09 12:49:21221#if defined(ENABLE_WEBRTC)
222#include "content/renderer/media/rtc_peer_connection_handler.h"
[email protected]22fe91d2014-08-12 17:07:12223#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
[email protected]9ac667e2013-09-09 12:49:21224#endif
225
[email protected]180ef242013-11-07 06:50:46226using blink::WebAXObject;
227using blink::WebApplicationCacheHost;
228using blink::WebApplicationCacheHostClient;
229using blink::WebCString;
230using blink::WebColor;
231using blink::WebColorName;
232using blink::WebConsoleMessage;
[email protected]180ef242013-11-07 06:50:46233using blink::WebData;
234using blink::WebDataSource;
235using blink::WebDocument;
236using blink::WebDOMEvent;
237using blink::WebDOMMessageEvent;
238using blink::WebDragData;
239using blink::WebDragOperation;
240using blink::WebDragOperationsMask;
241using blink::WebElement;
[email protected]180ef242013-11-07 06:50:46242using blink::WebFileChooserCompletion;
243using blink::WebFindOptions;
244using blink::WebFormControlElement;
245using blink::WebFormElement;
246using blink::WebFrame;
247using blink::WebGestureEvent;
248using blink::WebHistoryItem;
249using blink::WebHTTPBody;
250using blink::WebIconURL;
251using blink::WebImage;
252using blink::WebInputElement;
253using blink::WebInputEvent;
[email protected]35b2a972014-04-04 15:50:22254using blink::WebLocalFrame;
[email protected]180ef242013-11-07 06:50:46255using blink::WebMediaPlayerAction;
[email protected]180ef242013-11-07 06:50:46256using blink::WebMouseEvent;
257using blink::WebNavigationPolicy;
258using blink::WebNavigationType;
259using blink::WebNode;
260using blink::WebPageSerializer;
261using blink::WebPageSerializerClient;
262using blink::WebPeerConnection00Handler;
263using blink::WebPeerConnection00HandlerClient;
264using blink::WebPeerConnectionHandler;
265using blink::WebPeerConnectionHandlerClient;
266using blink::WebPluginAction;
267using blink::WebPluginContainer;
268using blink::WebPluginDocument;
[email protected]180ef242013-11-07 06:50:46269using blink::WebPoint;
[email protected]180ef242013-11-07 06:50:46270using blink::WebRange;
271using blink::WebRect;
272using blink::WebReferrerPolicy;
[email protected]180ef242013-11-07 06:50:46273using blink::WebScriptSource;
274using blink::WebSearchableFormData;
275using blink::WebSecurityOrigin;
276using blink::WebSecurityPolicy;
277using blink::WebSerializedScriptValue;
278using blink::WebSettings;
279using blink::WebSize;
[email protected]180ef242013-11-07 06:50:46280using blink::WebStorageNamespace;
281using blink::WebStorageQuotaCallbacks;
282using blink::WebStorageQuotaError;
283using blink::WebStorageQuotaType;
284using blink::WebString;
285using blink::WebTextAffinity;
286using blink::WebTextDirection;
287using blink::WebTouchEvent;
288using blink::WebURL;
289using blink::WebURLError;
290using blink::WebURLRequest;
291using blink::WebURLResponse;
292using blink::WebUserGestureIndicator;
293using blink::WebVector;
294using blink::WebView;
295using blink::WebWidget;
296using blink::WebWindowFeatures;
[email protected]b3a97b52014-07-09 06:25:05297using blink::WebNetworkStateNotifier;
298using blink::WebRuntimeFeatures;
[email protected]6fdd4182010-10-14 23:59:26299using base::Time;
300using base::TimeDelta;
[email protected]e1acf6f2008-10-27 20:43:33301
[email protected]20657a82012-08-21 20:23:03302#if defined(OS_ANDROID)
[email protected]180ef242013-11-07 06:50:46303using blink::WebContentDetectionResult;
304using blink::WebFloatPoint;
305using blink::WebFloatRect;
306using blink::WebHitTestResult;
[email protected]20657a82012-08-21 20:23:03307#endif
308
[email protected]e9ff79c2012-10-19 21:31:26309namespace content {
310
initial.commit09911bf2008-07-26 23:55:29311//-----------------------------------------------------------------------------
312
[email protected]180ef242013-11-07 06:50:46313typedef std::map<blink::WebView*, RenderViewImpl*> ViewMap;
[email protected]6de0fd1d2011-11-15 13:31:49314static base::LazyInstance<ViewMap> g_view_map = LAZY_INSTANCE_INITIALIZER;
[email protected]058561b2012-12-03 06:48:22315typedef std::map<int32, RenderViewImpl*> RoutingIDViewMap;
316static base::LazyInstance<RoutingIDViewMap> g_routing_id_view_map =
317 LAZY_INSTANCE_INITIALIZER;
[email protected]3354d3e2010-06-10 19:53:02318
[email protected]882daa92009-11-05 16:31:31319// Time, in seconds, we delay before sending content state changes (such as form
320// state and scroll position) to the browser. We delay sending changes to avoid
321// spamming the browser.
322// To avoid having tab/session restore require sending a message to get the
323// current content state during tab closing we use a shorter timeout for the
324// foreground renderer. This means there is a small window of time from which
325// content state is modified and not sent to session restore, but this is
326// better than having to wake up all renderers during shutdown.
avif937e1d2014-11-02 18:13:07327const int kDelaySecondsForContentStateSyncHidden = 5;
328const int kDelaySecondsForContentStateSync = 1;
initial.commit09911bf2008-07-26 23:55:29329
[email protected]20657a82012-08-21 20:23:03330#if defined(OS_ANDROID)
331// Delay between tapping in content and launching the associated android intent.
332// Used to allow users see what has been recognized as content.
[email protected]9afc14e22013-09-25 22:34:14333const size_t kContentIntentDelayMilliseconds = 700;
[email protected]20657a82012-08-21 20:23:03334#endif
335
naskobd911332014-11-25 01:13:36336static RenderViewImpl* (*g_create_render_view_impl)(const ViewMsg_New_Params&) =
[email protected]8d41d7612012-11-14 20:32:19337 NULL;
338
[email protected]c6bc20332014-02-28 18:30:39339// static
clamy9bfeef42014-09-30 20:50:42340bool RenderViewImpl::IsReload(FrameMsg_Navigate_Type::Value navigation_type) {
341 return navigation_type == FrameMsg_Navigate_Type::RELOAD ||
342 navigation_type == FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE ||
343 navigation_type == FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL;
[email protected]007733c2011-11-17 00:34:07344}
345
[email protected]e507045d2013-07-24 15:23:44346// static
[email protected]e507045d2013-07-24 15:23:44347Referrer RenderViewImpl::GetReferrerFromRequest(
[email protected]44e55b012013-07-23 14:21:56348 WebFrame* frame,
349 const WebURLRequest& request) {
350 return Referrer(GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))),
[email protected]cacbd7a2014-02-04 01:26:02351 request.referrerPolicy());
[email protected]44e55b012013-07-23 14:21:56352}
353
[email protected]c6bc20332014-02-28 18:30:39354// static
[email protected]65920f332014-03-04 21:14:18355WindowOpenDisposition RenderViewImpl::NavigationPolicyToDisposition(
[email protected]48861e22013-01-09 00:27:32356 WebNavigationPolicy policy) {
357 switch (policy) {
[email protected]180ef242013-11-07 06:50:46358 case blink::WebNavigationPolicyIgnore:
[email protected]48861e22013-01-09 00:27:32359 return IGNORE_ACTION;
[email protected]180ef242013-11-07 06:50:46360 case blink::WebNavigationPolicyDownload:
[email protected]48861e22013-01-09 00:27:32361 return SAVE_TO_DISK;
[email protected]180ef242013-11-07 06:50:46362 case blink::WebNavigationPolicyCurrentTab:
[email protected]48861e22013-01-09 00:27:32363 return CURRENT_TAB;
[email protected]180ef242013-11-07 06:50:46364 case blink::WebNavigationPolicyNewBackgroundTab:
[email protected]48861e22013-01-09 00:27:32365 return NEW_BACKGROUND_TAB;
[email protected]180ef242013-11-07 06:50:46366 case blink::WebNavigationPolicyNewForegroundTab:
[email protected]48861e22013-01-09 00:27:32367 return NEW_FOREGROUND_TAB;
[email protected]180ef242013-11-07 06:50:46368 case blink::WebNavigationPolicyNewWindow:
[email protected]48861e22013-01-09 00:27:32369 return NEW_WINDOW;
[email protected]180ef242013-11-07 06:50:46370 case blink::WebNavigationPolicyNewPopup:
[email protected]48861e22013-01-09 00:27:32371 return NEW_POPUP;
372 default:
373 NOTREACHED() << "Unexpected WebNavigationPolicy";
374 return IGNORE_ACTION;
375 }
376}
377
[email protected]d8221b22013-05-23 05:35:43378// Returns true if the device scale is high enough that losing subpixel
379// antialiasing won't have a noticeable effect on text quality.
380static bool DeviceScaleEnsuresTextQuality(float device_scale_factor) {
381#if defined(OS_ANDROID)
382 // On Android, we never have subpixel antialiasing.
383 return true;
384#else
385 return device_scale_factor > 1.5f;
386#endif
387
388}
389
danakj6e3bf8012014-12-16 18:27:53390static bool PreferCompositingToLCDText(CompositorDependencies* compositor_deps,
391 float device_scale_factor) {
avi83883c82014-12-23 00:08:49392 const base::CommandLine& command_line =
393 *base::CommandLine::ForCurrentProcess();
[email protected]b8ec1112014-08-17 20:09:10394 if (command_line.HasSwitch(switches::kDisablePreferCompositingToLCDText))
[email protected]fb854192013-02-06 01:30:04395 return false;
[email protected]b8ec1112014-08-17 20:09:10396 if (command_line.HasSwitch(switches::kEnablePreferCompositingToLCDText))
[email protected]fb854192013-02-06 01:30:04397 return true;
danakj6e3bf8012014-12-16 18:27:53398 if (!compositor_deps->IsLcdTextEnabled())
[email protected]10c19732014-08-18 19:39:23399 return true;
[email protected]d8221b22013-05-23 05:35:43400 return DeviceScaleEnsuresTextQuality(device_scale_factor);
401}
402
[email protected]180ef242013-11-07 06:50:46403static FaviconURL::IconType ToFaviconType(blink::WebIconURL::Type type) {
[email protected]41225fe2013-03-29 05:32:02404 switch (type) {
[email protected]180ef242013-11-07 06:50:46405 case blink::WebIconURL::TypeFavicon:
[email protected]41225fe2013-03-29 05:32:02406 return FaviconURL::FAVICON;
[email protected]180ef242013-11-07 06:50:46407 case blink::WebIconURL::TypeTouch:
[email protected]41225fe2013-03-29 05:32:02408 return FaviconURL::TOUCH_ICON;
[email protected]180ef242013-11-07 06:50:46409 case blink::WebIconURL::TypeTouchPrecomposed:
[email protected]41225fe2013-03-29 05:32:02410 return FaviconURL::TOUCH_PRECOMPOSED_ICON;
[email protected]180ef242013-11-07 06:50:46411 case blink::WebIconURL::TypeInvalid:
[email protected]41225fe2013-03-29 05:32:02412 return FaviconURL::INVALID_ICON;
413 }
414 return FaviconURL::INVALID_ICON;
415}
416
[email protected]f34ac132014-03-20 23:02:05417static void ConvertToFaviconSizes(
418 const blink::WebVector<blink::WebSize>& web_sizes,
419 std::vector<gfx::Size>* sizes) {
[email protected]2bd262b2014-04-16 05:31:23420 DCHECK(sizes->empty());
421 sizes->reserve(web_sizes.size());
[email protected]f34ac132014-03-20 23:02:05422 for (size_t i = 0; i < web_sizes.size(); ++i)
423 sizes->push_back(gfx::Size(web_sizes[i]));
424}
425
initial.commit09911bf2008-07-26 23:55:29426///////////////////////////////////////////////////////////////////////////////
427
[email protected]310ebd6302011-10-10 19:06:28428struct RenderViewImpl::PendingFileChooser {
[email protected]e9ff79c2012-10-19 21:31:26429 PendingFileChooser(const FileChooserParams& p, WebFileChooserCompletion* c)
[email protected]cdaf8d02010-03-30 19:52:47430 : params(p),
431 completion(c) {
432 }
[email protected]e9ff79c2012-10-19 21:31:26433 FileChooserParams params;
[email protected]cdaf8d02010-03-30 19:52:47434 WebFileChooserCompletion* completion; // MAY BE NULL to skip callback.
435};
436
[email protected]217690d2012-01-27 07:33:11437namespace {
438
439class WebWidgetLockTarget : public MouseLockDispatcher::LockTarget {
440 public:
[email protected]180ef242013-11-07 06:50:46441 explicit WebWidgetLockTarget(blink::WebWidget* webwidget)
[email protected]217690d2012-01-27 07:33:11442 : webwidget_(webwidget) {}
443
dcheng6d18e402014-10-21 12:32:52444 void OnLockMouseACK(bool succeeded) override {
[email protected]217690d2012-01-27 07:33:11445 if (succeeded)
446 webwidget_->didAcquirePointerLock();
447 else
448 webwidget_->didNotAcquirePointerLock();
449 }
450
dcheng6d18e402014-10-21 12:32:52451 void OnMouseLockLost() override { webwidget_->didLosePointerLock(); }
[email protected]217690d2012-01-27 07:33:11452
dcheng6d18e402014-10-21 12:32:52453 bool HandleMouseLockedInputEvent(const blink::WebMouseEvent& event) override {
[email protected]217690d2012-01-27 07:33:11454 // The WebWidget handles mouse lock in WebKit's handleInputEvent().
455 return false;
456 }
457
458 private:
[email protected]180ef242013-11-07 06:50:46459 blink::WebWidget* webwidget_;
[email protected]217690d2012-01-27 07:33:11460};
461
[email protected]41225fe2013-03-29 05:32:02462bool TouchEnabled() {
463// Based on the definition of chrome::kEnableTouchIcon.
464#if defined(OS_ANDROID)
465 return true;
466#else
467 return false;
468#endif
469}
470
[email protected]dc293a72013-07-01 11:11:22471WebDragData DropDataToWebDragData(const DropData& drop_data) {
[email protected]c10680312013-05-31 15:22:05472 std::vector<WebDragData::Item> item_list;
473
474 // These fields are currently unused when dragging into WebKit.
475 DCHECK(drop_data.download_metadata.empty());
476 DCHECK(drop_data.file_contents.empty());
477 DCHECK(drop_data.file_description_filename.empty());
478
479 if (!drop_data.text.is_null()) {
480 WebDragData::Item item;
481 item.storageType = WebDragData::Item::StorageTypeString;
482 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeText);
483 item.stringData = drop_data.text.string();
484 item_list.push_back(item);
485 }
486
487 // TODO(dcheng): Do we need to distinguish between null and empty URLs? Is it
488 // meaningful to write an empty URL to the clipboard?
489 if (!drop_data.url.is_empty()) {
490 WebDragData::Item item;
491 item.storageType = WebDragData::Item::StorageTypeString;
492 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeURIList);
493 item.stringData = WebString::fromUTF8(drop_data.url.spec());
494 item.title = drop_data.url_title;
495 item_list.push_back(item);
496 }
497
498 if (!drop_data.html.is_null()) {
499 WebDragData::Item item;
500 item.storageType = WebDragData::Item::StorageTypeString;
501 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeHTML);
502 item.stringData = drop_data.html.string();
503 item.baseURL = drop_data.html_base_url;
504 item_list.push_back(item);
505 }
506
[email protected]17ea0ae22014-03-28 21:54:46507 for (std::vector<ui::FileInfo>::const_iterator it =
[email protected]c10680312013-05-31 15:22:05508 drop_data.filenames.begin();
509 it != drop_data.filenames.end();
510 ++it) {
511 WebDragData::Item item;
512 item.storageType = WebDragData::Item::StorageTypeFilename;
[email protected]17ea0ae22014-03-28 21:54:46513 item.filenameData = it->path.AsUTF16Unsafe();
514 item.displayNameData = it->display_name.AsUTF16Unsafe();
[email protected]c10680312013-05-31 15:22:05515 item_list.push_back(item);
516 }
517
[email protected]60ed95f2014-04-23 12:19:48518 for (std::vector<DropData::FileSystemFileInfo>::const_iterator it =
519 drop_data.file_system_files.begin();
520 it != drop_data.file_system_files.end();
521 ++it) {
522 WebDragData::Item item;
523 item.storageType = WebDragData::Item::StorageTypeFileSystemFile;
524 item.fileSystemURL = it->url;
525 item.fileSystemFileSize = it->size;
526 item_list.push_back(item);
527 }
528
[email protected]c10680312013-05-31 15:22:05529 for (std::map<base::string16, base::string16>::const_iterator it =
530 drop_data.custom_data.begin();
531 it != drop_data.custom_data.end();
532 ++it) {
533 WebDragData::Item item;
534 item.storageType = WebDragData::Item::StorageTypeString;
535 item.stringType = it->first;
536 item.stringData = it->second;
537 item_list.push_back(item);
538 }
539
540 WebDragData result;
541 result.initialize();
542 result.setItems(item_list);
543 result.setFilesystemId(drop_data.filesystem_id);
544 return result;
545}
546
[email protected]b3a97b52014-07-09 06:25:05547typedef void (*SetFontFamilyWrapper)(blink::WebSettings*,
548 const base::string16&,
549 UScriptCode);
550
551void SetStandardFontFamilyWrapper(WebSettings* settings,
552 const base::string16& font,
553 UScriptCode script) {
554 settings->setStandardFontFamily(font, script);
555}
556
557void SetFixedFontFamilyWrapper(WebSettings* settings,
558 const base::string16& font,
559 UScriptCode script) {
560 settings->setFixedFontFamily(font, script);
561}
562
563void SetSerifFontFamilyWrapper(WebSettings* settings,
564 const base::string16& font,
565 UScriptCode script) {
566 settings->setSerifFontFamily(font, script);
567}
568
569void SetSansSerifFontFamilyWrapper(WebSettings* settings,
570 const base::string16& font,
571 UScriptCode script) {
572 settings->setSansSerifFontFamily(font, script);
573}
574
575void SetCursiveFontFamilyWrapper(WebSettings* settings,
576 const base::string16& font,
577 UScriptCode script) {
578 settings->setCursiveFontFamily(font, script);
579}
580
581void SetFantasyFontFamilyWrapper(WebSettings* settings,
582 const base::string16& font,
583 UScriptCode script) {
584 settings->setFantasyFontFamily(font, script);
585}
586
587void SetPictographFontFamilyWrapper(WebSettings* settings,
588 const base::string16& font,
589 UScriptCode script) {
590 settings->setPictographFontFamily(font, script);
591}
592
593// If |scriptCode| is a member of a family of "similar" script codes, returns
594// the script code in that family that is used by WebKit for font selection
595// purposes. For example, USCRIPT_KATAKANA_OR_HIRAGANA and USCRIPT_JAPANESE are
596// considered equivalent for the purposes of font selection. WebKit uses the
597// script code USCRIPT_KATAKANA_OR_HIRAGANA. So, if |scriptCode| is
598// USCRIPT_JAPANESE, the function returns USCRIPT_KATAKANA_OR_HIRAGANA. WebKit
599// uses different scripts than the ones in Chrome pref names because the version
600// of ICU included on certain ports does not have some of the newer scripts. If
601// |scriptCode| is not a member of such a family, returns |scriptCode|.
602UScriptCode GetScriptForWebSettings(UScriptCode scriptCode) {
603 switch (scriptCode) {
604 case USCRIPT_HIRAGANA:
605 case USCRIPT_KATAKANA:
606 case USCRIPT_JAPANESE:
607 return USCRIPT_KATAKANA_OR_HIRAGANA;
608 case USCRIPT_KOREAN:
609 return USCRIPT_HANGUL;
610 default:
611 return scriptCode;
612 }
613}
614
615void ApplyFontsFromMap(const ScriptFontFamilyMap& map,
616 SetFontFamilyWrapper setter,
617 WebSettings* settings) {
618 for (ScriptFontFamilyMap::const_iterator it = map.begin(); it != map.end();
619 ++it) {
620 int32 script = u_getPropertyValueEnum(UCHAR_SCRIPT, (it->first).c_str());
621 if (script >= 0 && script < USCRIPT_CODE_LIMIT) {
622 UScriptCode code = static_cast<UScriptCode>(script);
623 (*setter)(settings, it->second, GetScriptForWebSettings(code));
624 }
625 }
626}
627
[email protected]217690d2012-01-27 07:33:11628} // namespace
629
naskobd911332014-11-25 01:13:36630RenderViewImpl::RenderViewImpl(const ViewMsg_New_Params& params)
[email protected]180ef242013-11-07 06:50:46631 : RenderWidget(blink::WebPopupTypeNone,
naskobd911332014-11-25 01:13:36632 params.initial_size.screen_info,
633 params.swapped_out,
634 params.hidden,
635 params.never_visible),
636 webkit_preferences_(params.web_preferences),
avif937e1d2014-11-02 18:13:07637 send_content_state_immediately_(false),
[email protected]81e63782009-02-27 19:35:09638 enabled_bindings_(0),
[email protected]3354d3e2010-06-10 19:53:02639 send_preferred_size_changes_(false),
[email protected]e75cb49e2009-01-05 23:13:21640 navigation_gesture_(NavigationGestureUnknown),
[email protected]3354d3e2010-06-10 19:53:02641 opened_by_user_gesture_(true),
642 opener_suppressed_(false),
[email protected]88f10a22013-11-06 21:22:12643 suppress_dialogs_until_swap_out_(false),
[email protected]81a34412009-01-05 19:17:24644 page_id_(-1),
645 last_page_id_sent_to_browser_(-1),
naskobd911332014-11-25 01:13:36646 next_page_id_(params.next_page_id),
[email protected]3cc72b12010-03-18 23:03:00647 history_list_offset_(-1),
648 history_list_length_(0),
[email protected]7e9523b2014-03-25 03:02:42649 frames_in_progress_(0),
[email protected]3354d3e2010-06-10 19:53:02650 target_url_status_(TARGET_NONE),
[email protected]d42bf472014-06-14 01:49:38651 uses_temporary_zoom_level_(false),
[email protected]bbc8856d2013-06-14 10:37:04652#if defined(OS_ANDROID)
653 top_controls_constraints_(cc::BOTH),
654#endif
[email protected]1875bc02014-03-14 06:33:59655 has_scrolled_focused_editable_node_into_rect_(false),
[email protected]64d09222012-05-25 10:10:34656 speech_recognition_dispatcher_(NULL),
[email protected]c5c1d6d2011-07-28 18:42:41657 devtools_agent_(NULL),
[email protected]217690d2012-01-27 07:33:11658 mouse_lock_dispatcher_(NULL),
[email protected]20657a82012-08-21 20:23:03659#if defined(OS_ANDROID)
660 expected_content_intent_id_(0),
[email protected]a7564272013-04-19 14:24:46661#endif
662#if defined(OS_WIN)
663 focused_plugin_id_(-1),
664#endif
[email protected]e16c7a12013-12-05 16:30:08665#if defined(ENABLE_PLUGINS)
[email protected]54ea9ff2014-03-20 00:27:54666 plugin_find_handler_(NULL),
[email protected]e16c7a12013-12-05 16:30:08667 focused_pepper_plugin_(NULL),
668 pepper_last_mouse_event_target_(NULL),
669#endif
[email protected]8a67aa352013-02-20 02:58:29670 enumeration_completion_id_(0),
naskobd911332014-11-25 01:13:36671 session_storage_namespace_id_(params.session_storage_namespace_id),
[email protected]f2c530d2014-02-20 20:15:30672 next_snapshot_id_(0) {
[email protected]075366912013-02-18 07:13:24673}
674
danakj6e3bf8012014-12-16 18:27:53675void RenderViewImpl::Initialize(const ViewMsg_New_Params& params,
676 CompositorDependencies* compositor_deps,
677 bool was_created_by_renderer) {
naskobd911332014-11-25 01:13:36678 routing_id_ = params.view_id;
679 surface_id_ = params.surface_id;
680 if (params.opener_route_id != MSG_ROUTING_NONE && was_created_by_renderer)
681 opener_id_ = params.opener_route_id;
[email protected]676126f72011-01-15 00:03:51682
[email protected]74ce1ad2011-12-16 21:51:46683 // Ensure we start with a valid next_page_id_ from the browser.
684 DCHECK_GE(next_page_id_, 0);
685
[email protected]8eae0802014-06-02 21:35:55686 main_render_frame_.reset(RenderFrameImpl::Create(
naskobd911332014-11-25 01:13:36687 this, params.main_frame_routing_id));
[email protected]34f288c2014-04-28 16:25:37688 // The main frame WebLocalFrame object is closed by
689 // RenderFrameImpl::frameDetached().
[email protected]8eae0802014-06-02 21:35:55690 WebLocalFrame* web_frame = WebLocalFrame::create(main_render_frame_.get());
691 main_render_frame_->SetWebFrame(web_frame);
[email protected]34f288c2014-04-28 16:25:37692
danakj6e3bf8012014-12-16 18:27:53693 compositor_deps_ = compositor_deps;
[email protected]11fee2332011-03-29 20:36:35694 webwidget_ = WebView::create(this);
[email protected]217690d2012-01-27 07:33:11695 webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_));
[email protected]11fee2332011-03-29 20:36:35696
avi83883c82014-12-23 00:08:49697 const base::CommandLine& command_line =
698 *base::CommandLine::ForCurrentProcess();
[email protected]20657a82012-08-21 20:23:03699
[email protected]27c521a2013-05-29 20:44:32700 if (command_line.HasSwitch(switches::kStatsCollectionController))
701 stats_collection_observer_.reset(new StatsCollectionObserver(this));
702
[email protected]20657a82012-08-21 20:23:03703#if defined(OS_ANDROID)
[email protected]20657a82012-08-21 20:23:03704 const std::string region_code =
705 command_line.HasSwitch(switches::kNetworkCountryIso)
706 ? command_line.GetSwitchValueASCII(switches::kNetworkCountryIso)
wangxianzhu4e645e92014-10-08 01:01:07707 : net::android::GetTelephonyNetworkCountryIso();
[email protected]20657a82012-08-21 20:23:03708 content_detectors_.push_back(linked_ptr<ContentDetector>(
709 new AddressDetector()));
qinmin0d5560df2014-11-12 19:03:39710 if (!region_code.empty()) {
711 content_detectors_.push_back(linked_ptr<ContentDetector>(
712 new PhoneNumberDetector(region_code)));
713 }
[email protected]20657a82012-08-21 20:23:03714 content_detectors_.push_back(linked_ptr<ContentDetector>(
715 new EmailDetector()));
716#endif
717
[email protected]380244092011-10-07 17:26:27718 RenderThread::Get()->AddRoute(routing_id_, this);
[email protected]676126f72011-01-15 00:03:51719 // Take a reference on behalf of the RenderThread. This will be balanced
[email protected]8a5e0ca2011-08-25 06:30:47720 // when we receive ViewMsg_ClosePage.
[email protected]676126f72011-01-15 00:03:51721 AddRef();
[email protected]b2db9272014-01-10 17:42:00722 if (RenderThreadImpl::current()) {
723 RenderThreadImpl::current()->WidgetCreated();
724 if (is_hidden_)
725 RenderThreadImpl::current()->WidgetHidden();
726 }
[email protected]676126f72011-01-15 00:03:51727
728 // If this is a popup, we must wait for the CreatingNew_ACK message before
729 // completing initialization. Otherwise, we can finish it now.
[email protected]6cd7c6b2012-10-25 03:26:23730 if (opener_id_ == MSG_ROUTING_NONE) {
[email protected]676126f72011-01-15 00:03:51731 did_show_ = true;
[email protected]fc4404d2012-11-07 19:53:30732 CompleteInit();
[email protected]676126f72011-01-15 00:03:51733 }
734
[email protected]34c61bd52011-05-02 19:38:33735 g_view_map.Get().insert(std::make_pair(webview(), this));
[email protected]058561b2012-12-03 06:48:22736 g_routing_id_view_map.Get().insert(std::make_pair(routing_id_, this));
[email protected]60051ec2012-06-08 22:40:57737 webview()->setDeviceScaleFactor(device_scale_factor_);
[email protected]b8ec1112014-08-17 20:09:10738 webview()->settings()->setPreferCompositingToLCDTextEnabled(
danakj6e3bf8012014-12-16 18:27:53739 PreferCompositingToLCDText(compositor_deps_, device_scale_factor_));
jdduke2eee6cb2014-09-25 17:02:21740 webview()->settings()->setThreadedScrollingEnabled(
741 !command_line.HasSwitch(switches::kDisableThreadedScrolling));
skobes92ed7d462014-11-05 22:05:23742 webview()->settings()->setRootLayerScrolls(
743 command_line.HasSwitch(switches::kRootLayerScrolls));
[email protected]fb854192013-02-06 01:30:04744
[email protected]49a20002013-08-18 12:43:31745 ApplyWebPreferences(webkit_preferences_, webview());
[email protected]9b159a52013-10-03 17:24:55746
[email protected]7fe71f02014-04-26 00:47:56747 webview()->settings()->setAllowConnectingInsecureWebSocket(
748 command_line.HasSwitch(switches::kAllowInsecureWebSocketFromHttpsOrigin));
749
[email protected]82307f6b2014-08-07 03:30:12750 RenderFrameProxy* proxy = NULL;
naskobd911332014-11-25 01:13:36751 if (params.proxy_routing_id != MSG_ROUTING_NONE) {
752 CHECK(params.swapped_out);
[email protected]82307f6b2014-08-07 03:30:12753 proxy = RenderFrameProxy::CreateProxyToReplaceFrame(
naskobd911332014-11-25 01:13:36754 main_render_frame_.get(), params.proxy_routing_id);
[email protected]82307f6b2014-08-07 03:30:12755 main_render_frame_->set_render_frame_proxy(proxy);
756 }
757
758 // In --site-per-process, just use the WebRemoteFrame as the main frame.
danakj6e3bf8012014-12-16 18:27:53759 if (command_line.HasSwitch(switches::kSitePerProcess) && proxy) {
[email protected]82307f6b2014-08-07 03:30:12760 webview()->setMainFrame(proxy->web_frame());
alexmosbc7eafa2014-12-06 01:38:09761 // Initialize the WebRemoteFrame with information replicated from the
762 // browser process.
763 proxy->SetReplicatedState(params.replicated_frame_state);
[email protected]82307f6b2014-08-07 03:30:12764 } else {
765 webview()->setMainFrame(main_render_frame_->GetWebFrame());
766 }
[email protected]0287e762014-04-11 13:07:58767 main_render_frame_->Initialize();
[email protected]edbea622012-11-28 20:39:38768
[email protected]1400e6dc2013-04-27 02:36:27769 if (switches::IsTouchDragDropEnabled())
[email protected]edbea622012-11-28 20:39:38770 webview()->settings()->setTouchDragDropEnabled(true);
771
[email protected]1400e6dc2013-04-27 02:36:27772 if (switches::IsTouchEditingEnabled())
[email protected]47822262013-04-23 17:22:36773 webview()->settings()->setTouchEditingEnabled(true);
774
naskobd911332014-11-25 01:13:36775 if (!params.frame_name.empty())
776 webview()->mainFrame()->setName(params.frame_name);
[email protected]34c61bd52011-05-02 19:38:33777
[email protected]c7c0d822014-04-16 20:19:49778 // TODO(davidben): Move this state from Blink into content.
naskobd911332014-11-25 01:13:36779 if (params.window_was_created_with_opener)
[email protected]c7c0d822014-04-16 20:19:49780 webview()->setOpenedByDOM();
781
naskobd911332014-11-25 01:13:36782 OnSetRendererPrefs(params.renderer_preferences);
[email protected]34c61bd52011-05-02 19:38:33783
naskobd911332014-11-25 01:13:36784 if (!params.enable_auto_resize) {
785 OnResize(params.initial_size);
mkosiba58fa72f02014-11-12 01:21:36786 } else {
naskobd911332014-11-25 01:13:36787 OnEnableAutoResize(params.min_size, params.max_size);
mkosiba58fa72f02014-11-12 01:21:36788 }
789
[email protected]8f6a3b852011-07-19 16:48:56790 new MHTMLGenerator(this);
[email protected]86a7d3c2011-09-12 16:45:32791#if defined(OS_MACOSX)
792 new TextInputClientObserver(this);
793#endif // defined(OS_MACOSX)
[email protected]8f6a3b852011-07-19 16:48:56794
[email protected]217690d2012-01-27 07:33:11795 // The next group of objects all implement RenderViewObserver, so are deleted
796 // along with the RenderView automatically.
yurys65e008f2014-11-25 11:29:49797 devtools_agent_ = new DevToolsAgent(main_render_frame_.get());
[email protected]6e89eb72013-07-23 13:28:22798 if (RenderWidgetCompositor* rwc = compositor()) {
799 webview()->devToolsAgent()->setLayerTreeId(rwc->GetLayerTreeId());
800 }
[email protected]89054502012-06-03 10:29:24801 mouse_lock_dispatcher_ = new RenderViewMouseLockDispatcher(this);
[email protected]063afcb2011-09-29 07:54:32802
[email protected]d4734982014-04-15 02:05:55803 history_controller_.reset(new HistoryController(this));
804
[email protected]1784b2f2011-11-24 10:53:48805 new IdleUserDetector(this);
806
[email protected]766a7082012-02-03 23:39:15807 if (command_line.HasSwitch(switches::kDomAutomationController))
[email protected]e9ff79c2012-10-19 21:31:26808 enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION;
[email protected]27c521a2013-05-29 20:44:32809 if (command_line.HasSwitch(switches::kStatsCollectionController))
810 enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION;
[email protected]766a7082012-02-03 23:39:15811
[email protected]e9ff79c2012-10-19 21:31:26812 GetContentClient()->renderer()->RenderViewCreated(this);
[email protected]14392a52012-05-02 20:28:44813
814 // If we have an opener_id but we weren't created by a renderer, then
815 // it's the browser asking us to set our opener to another RenderView.
naskobd911332014-11-25 01:13:36816 if (params.opener_route_id != MSG_ROUTING_NONE && !was_created_by_renderer) {
817 RenderViewImpl* opener_view = FromRoutingID(params.opener_route_id);
[email protected]f546640b2012-05-15 00:03:49818 if (opener_view)
819 webview()->mainFrame()->setOpener(opener_view->webview()->mainFrame());
[email protected]14392a52012-05-02 20:28:44820 }
821
822 // If we are initially swapped out, navigate to kSwappedOutURL.
823 // This ensures we are in a unique origin that others cannot script.
[email protected]82307f6b2014-08-07 03:30:12824 if (is_swapped_out_ && webview()->mainFrame()->isWebLocalFrame())
nasko78f06bc2014-11-18 18:18:57825 main_render_frame_->NavigateToSwappedOutURL();
initial.commit09911bf2008-07-26 23:55:29826}
827
[email protected]310ebd6302011-10-10 19:06:28828RenderViewImpl::~RenderViewImpl() {
[email protected]cb189e062014-04-23 00:57:01829 for (BitmapMap::iterator it = disambiguation_bitmaps_.begin();
830 it != disambiguation_bitmaps_.end();
831 ++it)
832 delete it->second;
[email protected]91a2aea2013-07-08 23:14:39833 base::debug::TraceLog::GetInstance()->RemoveProcessLabel(routing_id_);
834
[email protected]a1128322009-10-06 18:38:46835 // If file chooser is still waiting for answer, dispatch empty answer.
[email protected]cdaf8d02010-03-30 19:52:47836 while (!file_chooser_completions_.empty()) {
837 if (file_chooser_completions_.front()->completion) {
838 file_chooser_completions_.front()->completion->didChooseFile(
839 WebVector<WebString>());
840 }
841 file_chooser_completions_.pop_front();
842 }
[email protected]a1128322009-10-06 18:38:46843
[email protected]8ed1d3f2013-02-20 11:45:55844#if defined(OS_ANDROID)
845 // The date/time picker client is both a scoped_ptr member of this class and
846 // a RenderViewObserver. Reset it to prevent double deletion.
847 date_time_picker_client_.reset();
848#endif
849
[email protected]60c42a8c72009-10-09 04:08:59850#ifndef NDEBUG
[email protected]058561b2012-12-03 06:48:22851 // Make sure we are no longer referenced by the ViewMap or RoutingIDViewMap.
[email protected]625332e02010-12-14 07:48:49852 ViewMap* views = g_view_map.Pointer();
[email protected]60c42a8c72009-10-09 04:08:59853 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it)
854 DCHECK_NE(this, it->second) << "Failed to call Close?";
[email protected]058561b2012-12-03 06:48:22855 RoutingIDViewMap* routing_id_views = g_routing_id_view_map.Pointer();
856 for (RoutingIDViewMap::iterator it = routing_id_views->begin();
857 it != routing_id_views->end(); ++it)
858 DCHECK_NE(this, it->second) << "Failed to call Close?";
[email protected]60c42a8c72009-10-09 04:08:59859#endif
[email protected]676126f72011-01-15 00:03:51860
[email protected]310ebd6302011-10-10 19:06:28861 FOR_EACH_OBSERVER(RenderViewObserver, observers_, RenderViewGone());
[email protected]676126f72011-01-15 00:03:51862 FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct());
[email protected]60c42a8c72009-10-09 04:08:59863}
864
865/*static*/
[email protected]310ebd6302011-10-10 19:06:28866RenderViewImpl* RenderViewImpl::FromWebView(WebView* webview) {
[email protected]a2ef54c2011-10-10 16:20:31867 ViewMap* views = g_view_map.Pointer();
868 ViewMap::iterator it = views->find(webview);
869 return it == views->end() ? NULL : it->second;
870}
871
872/*static*/
[email protected]180ef242013-11-07 06:50:46873RenderView* RenderView::FromWebView(blink::WebView* webview) {
[email protected]310ebd6302011-10-10 19:06:28874 return RenderViewImpl::FromWebView(webview);
[email protected]a2ef54c2011-10-10 16:20:31875}
876
877/*static*/
[email protected]640e303c2012-12-05 01:36:07878RenderViewImpl* RenderViewImpl::FromRoutingID(int32 routing_id) {
879 RoutingIDViewMap* views = g_routing_id_view_map.Pointer();
880 RoutingIDViewMap::iterator it = views->find(routing_id);
881 return it == views->end() ? NULL : it->second;
882}
883
884/*static*/
885RenderView* RenderView::FromRoutingID(int routing_id) {
886 return RenderViewImpl::FromRoutingID(routing_id);
887}
888
[email protected]f3a95312014-06-12 16:46:58889/* static */
890size_t RenderViewImpl::GetRenderViewCount() {
891 return g_view_map.Get().size();
892}
893
[email protected]640e303c2012-12-05 01:36:07894/*static*/
[email protected]e9ff79c2012-10-19 21:31:26895void RenderView::ForEach(RenderViewVisitor* visitor) {
[email protected]625332e02010-12-14 07:48:49896 ViewMap* views = g_view_map.Pointer();
[email protected]60c42a8c72009-10-09 04:08:59897 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) {
898 if (!visitor->Visit(it->second))
899 return;
900 }
901}
902
903/*static*/
[email protected]b3a97b52014-07-09 06:25:05904void RenderView::ApplyWebPreferences(const WebPreferences& prefs,
905 WebView* web_view) {
906 WebSettings* settings = web_view->settings();
907 ApplyFontsFromMap(prefs.standard_font_family_map,
908 SetStandardFontFamilyWrapper, settings);
909 ApplyFontsFromMap(prefs.fixed_font_family_map,
910 SetFixedFontFamilyWrapper, settings);
911 ApplyFontsFromMap(prefs.serif_font_family_map,
912 SetSerifFontFamilyWrapper, settings);
913 ApplyFontsFromMap(prefs.sans_serif_font_family_map,
914 SetSansSerifFontFamilyWrapper, settings);
915 ApplyFontsFromMap(prefs.cursive_font_family_map,
916 SetCursiveFontFamilyWrapper, settings);
917 ApplyFontsFromMap(prefs.fantasy_font_family_map,
918 SetFantasyFontFamilyWrapper, settings);
919 ApplyFontsFromMap(prefs.pictograph_font_family_map,
920 SetPictographFontFamilyWrapper, settings);
921 settings->setDefaultFontSize(prefs.default_font_size);
922 settings->setDefaultFixedFontSize(prefs.default_fixed_font_size);
923 settings->setMinimumFontSize(prefs.minimum_font_size);
924 settings->setMinimumLogicalFontSize(prefs.minimum_logical_font_size);
925 settings->setDefaultTextEncodingName(
926 base::ASCIIToUTF16(prefs.default_encoding));
927 settings->setJavaScriptEnabled(prefs.javascript_enabled);
928 settings->setWebSecurityEnabled(prefs.web_security_enabled);
929 settings->setJavaScriptCanOpenWindowsAutomatically(
930 prefs.javascript_can_open_windows_automatically);
931 settings->setLoadsImagesAutomatically(prefs.loads_images_automatically);
932 settings->setImagesEnabled(prefs.images_enabled);
933 settings->setPluginsEnabled(prefs.plugins_enabled);
934 settings->setDOMPasteAllowed(prefs.dom_paste_enabled);
[email protected]b3a97b52014-07-09 06:25:05935 settings->setShrinksStandaloneImagesToFit(
936 prefs.shrinks_standalone_images_to_fit);
937 settings->setUsesEncodingDetector(prefs.uses_universal_detector);
938 settings->setTextAreasAreResizable(prefs.text_areas_are_resizable);
939 settings->setAllowScriptsToCloseWindows(prefs.allow_scripts_to_close_windows);
940 settings->setDownloadableBinaryFontsEnabled(prefs.remote_fonts_enabled);
941 settings->setJavaScriptCanAccessClipboard(
942 prefs.javascript_can_access_clipboard);
943 WebRuntimeFeatures::enableXSLT(prefs.xslt_enabled);
leviwb6fdf8872014-10-28 17:46:52944 WebRuntimeFeatures::enableSlimmingPaint(prefs.slimming_paint_enabled);
[email protected]b3a97b52014-07-09 06:25:05945 settings->setXSSAuditorEnabled(prefs.xss_auditor_enabled);
946 settings->setDNSPrefetchingEnabled(prefs.dns_prefetching_enabled);
947 settings->setLocalStorageEnabled(prefs.local_storage_enabled);
948 settings->setSyncXHRInDocumentsEnabled(prefs.sync_xhr_in_documents_enabled);
949 WebRuntimeFeatures::enableDatabase(prefs.databases_enabled);
950 settings->setOfflineWebApplicationCacheEnabled(
951 prefs.application_cache_enabled);
952 settings->setCaretBrowsingEnabled(prefs.caret_browsing_enabled);
953 settings->setHyperlinkAuditingEnabled(prefs.hyperlink_auditing_enabled);
954 settings->setCookieEnabled(prefs.cookie_enabled);
955 settings->setNavigateOnDragDrop(prefs.navigate_on_drag_drop);
956
957 settings->setJavaEnabled(prefs.java_enabled);
958
959 // By default, allow_universal_access_from_file_urls is set to false and thus
960 // we mitigate attacks from local HTML files by not granting file:// URLs
961 // universal access. Only test shell will enable this.
962 settings->setAllowUniversalAccessFromFileURLs(
963 prefs.allow_universal_access_from_file_urls);
964 settings->setAllowFileAccessFromFileURLs(
965 prefs.allow_file_access_from_file_urls);
966
967 // Enable the web audio API if requested on the command line.
968 settings->setWebAudioEnabled(prefs.webaudio_enabled);
969
970 // Enable experimental WebGL support if requested on command line
971 // and support is compiled in.
972 settings->setExperimentalWebGLEnabled(prefs.experimental_webgl_enabled);
973
974 // Disable GL multisampling if requested on command line.
975 settings->setOpenGLMultisamplingEnabled(prefs.gl_multisampling_enabled);
976
977 // Enable WebGL errors to the JS console if requested.
978 settings->setWebGLErrorsToConsoleEnabled(
979 prefs.webgl_errors_to_console_enabled);
980
981 // Uses the mock theme engine for scrollbars.
982 settings->setMockScrollbarsEnabled(prefs.mock_scrollbars_enabled);
983
[email protected]b3a97b52014-07-09 06:25:05984 // Enable gpu-accelerated 2d canvas if requested on the command line.
985 settings->setAccelerated2dCanvasEnabled(prefs.accelerated_2d_canvas_enabled);
986
987 settings->setMinimumAccelerated2dCanvasSize(
988 prefs.minimum_accelerated_2d_canvas_size);
989
990 // Disable antialiasing for 2d canvas if requested on the command line.
991 settings->setAntialiased2dCanvasEnabled(
992 !prefs.antialiased_2d_canvas_disabled);
993
robertphillipse25137b2014-10-20 13:44:34994 // Enabled antialiasing of clips for 2d canvas if requested on the command
995 // line.
996 settings->setAntialiasedClips2dCanvasEnabled(
997 prefs.antialiased_clips_2d_canvas_enabled);
998
[email protected]b3a97b52014-07-09 06:25:05999 // Set MSAA sample count for 2d canvas if requested on the command line (or
1000 // default value if not).
1001 settings->setAccelerated2dCanvasMSAASampleCount(
1002 prefs.accelerated_2d_canvas_msaa_sample_count);
1003
fmalita6d3d8f112014-10-08 01:58:061004 WebRuntimeFeatures::enableTextBlobs(prefs.text_blobs_enabled);
1005
[email protected]b3a97b52014-07-09 06:25:051006 settings->setAsynchronousSpellCheckingEnabled(
1007 prefs.asynchronous_spell_checking_enabled);
1008 settings->setUnifiedTextCheckerEnabled(prefs.unified_textchecker_enabled);
1009
[email protected]b3a97b52014-07-09 06:25:051010 // Tabs to link is not part of the settings. WebCore calls
1011 // ChromeClient::tabsToLinks which is part of the glue code.
1012 web_view->setTabsToLinks(prefs.tabs_to_links);
1013
1014 settings->setAllowDisplayOfInsecureContent(
1015 prefs.allow_displaying_insecure_content);
1016 settings->setAllowRunningOfInsecureContent(
1017 prefs.allow_running_insecure_content);
mkwst772ce8142015-01-16 13:28:071018 settings->setDisableReadingFromCanvas(prefs.disable_reading_from_canvas);
mkwst2fc2c4f2015-01-08 08:29:181019 settings->setStrictMixedContentChecking(prefs.strict_mixed_content_checking);
mkwst673a452f2015-01-10 14:41:501020 settings->setStrictPowerfulFeatureRestrictions(
1021 prefs.strict_powerful_feature_restrictions);
[email protected]b3a97b52014-07-09 06:25:051022 settings->setPasswordEchoEnabled(prefs.password_echo_enabled);
1023 settings->setShouldPrintBackgrounds(prefs.should_print_backgrounds);
1024 settings->setShouldClearDocumentBackground(
1025 prefs.should_clear_document_background);
1026 settings->setEnableScrollAnimator(prefs.enable_scroll_animator);
1027
1028 settings->setRegionBasedColumnsEnabled(prefs.region_based_columns_enabled);
1029
1030 WebRuntimeFeatures::enableTouch(prefs.touch_enabled);
1031 settings->setMaxTouchPoints(prefs.pointer_events_max_touch_points);
mustaq29eb7092014-11-14 00:32:121032 settings->setAvailablePointerTypes(prefs.available_pointer_types);
1033 settings->setPrimaryPointerType(
1034 static_cast<WebSettings::PointerType>(prefs.primary_pointer_type));
1035 settings->setAvailableHoverTypes(prefs.available_hover_types);
1036 settings->setPrimaryHoverType(
1037 static_cast<WebSettings::HoverType>(prefs.primary_hover_type));
[email protected]b3a97b52014-07-09 06:25:051038 settings->setDeviceSupportsTouch(prefs.device_supports_touch);
1039 settings->setDeviceSupportsMouse(prefs.device_supports_mouse);
1040 settings->setEnableTouchAdjustment(prefs.touch_adjustment_enabled);
1041
1042 settings->setDeferredImageDecodingEnabled(
1043 prefs.deferred_image_decoding_enabled);
noelf552c5172014-11-05 22:53:211044 WebRuntimeFeatures::enableImageColorProfiles(
1045 prefs.image_color_profiles_enabled);
[email protected]b3a97b52014-07-09 06:25:051046 settings->setShouldRespectImageOrientation(
1047 prefs.should_respect_image_orientation);
1048
1049 settings->setUnsafePluginPastingEnabled(false);
1050 settings->setEditingBehavior(
1051 static_cast<WebSettings::EditingBehavior>(prefs.editing_behavior));
1052
1053 settings->setSupportsMultipleWindows(prefs.supports_multiple_windows);
1054
1055 settings->setViewportEnabled(prefs.viewport_enabled);
1056 settings->setLoadWithOverviewMode(prefs.initialize_at_minimum_page_scale);
1057 settings->setViewportMetaEnabled(prefs.viewport_meta_enabled);
1058 settings->setMainFrameResizesAreOrientationChanges(
1059 prefs.main_frame_resizes_are_orientation_changes);
1060
1061 settings->setSmartInsertDeleteEnabled(prefs.smart_insert_delete_enabled);
1062
1063 settings->setSpatialNavigationEnabled(prefs.spatial_navigation_enabled);
1064
1065 settings->setSelectionIncludesAltImageText(true);
1066
[email protected]35103c02014-08-12 15:08:471067 settings->setV8CacheOptions(
1068 static_cast<WebSettings::V8CacheOptions>(prefs.v8_cache_options));
1069
marjaaaf62662014-09-18 08:51:471070 settings->setV8ScriptStreamingEnabled(prefs.v8_script_streaming_enabled);
marjae1c3b8b2014-11-03 11:29:031071 settings->setV8ScriptStreamingMode(
1072 static_cast<WebSettings::V8ScriptStreamingMode>(
1073 prefs.v8_script_streaming_mode));
marjaaaf62662014-09-18 08:51:471074
[email protected]b3a97b52014-07-09 06:25:051075#if defined(OS_ANDROID)
1076 settings->setAllowCustomScrollbarInMainFrame(false);
1077 settings->setTextAutosizingEnabled(prefs.text_autosizing_enabled);
1078 settings->setAccessibilityFontScaleFactor(prefs.font_scale_factor);
1079 settings->setDeviceScaleAdjustment(prefs.device_scale_adjustment);
[email protected]023fed312014-08-11 16:13:051080 settings->setFullscreenSupported(prefs.fullscreen_supported);
[email protected]b3a97b52014-07-09 06:25:051081 web_view->setIgnoreViewportTagScaleLimits(prefs.force_enable_zoom);
1082 settings->setAutoZoomFocusedNodeToLegibleScale(true);
1083 settings->setDoubleTapToZoomEnabled(prefs.double_tap_to_zoom_enabled);
1084 settings->setMediaControlsOverlayPlayButtonEnabled(true);
1085 settings->setMediaPlaybackRequiresUserGesture(
1086 prefs.user_gesture_required_for_media_playback);
1087 settings->setDefaultVideoPosterURL(
1088 base::ASCIIToUTF16(prefs.default_video_poster_url.spec()));
1089 settings->setSupportDeprecatedTargetDensityDPI(
1090 prefs.support_deprecated_target_density_dpi);
1091 settings->setUseLegacyBackgroundSizeShorthandBehavior(
1092 prefs.use_legacy_background_size_shorthand_behavior);
1093 settings->setWideViewportQuirkEnabled(prefs.wide_viewport_quirk);
1094 settings->setUseWideViewport(prefs.use_wide_viewport);
[email protected]9954ea92014-08-12 15:48:451095 settings->setForceZeroLayoutHeight(prefs.force_zero_layout_height);
[email protected]b3a97b52014-07-09 06:25:051096 settings->setViewportMetaLayoutSizeQuirk(
1097 prefs.viewport_meta_layout_size_quirk);
1098 settings->setViewportMetaMergeContentQuirk(
1099 prefs.viewport_meta_merge_content_quirk);
1100 settings->setViewportMetaNonUserScalableQuirk(
1101 prefs.viewport_meta_non_user_scalable_quirk);
1102 settings->setViewportMetaZeroValuesQuirk(
1103 prefs.viewport_meta_zero_values_quirk);
1104 settings->setClobberUserAgentInitialScaleQuirk(
1105 prefs.clobber_user_agent_initial_scale_quirk);
1106 settings->setIgnoreMainFrameOverflowHiddenQuirk(
1107 prefs.ignore_main_frame_overflow_hidden_quirk);
1108 settings->setReportScreenSizeInPhysicalPixelsQuirk(
1109 prefs.report_screen_size_in_physical_pixels_quirk);
timav7a5032e2014-12-05 01:59:431110
1111 bool record_full_layer =
1112 RenderViewImpl::FromWebView(web_view)
1113 ? RenderViewImpl::FromWebView(web_view)->DoesRecordFullLayer()
1114 : false;
1115 settings->setMainFrameClipsContent(!record_full_layer);
1116
[email protected]b3a97b52014-07-09 06:25:051117 settings->setShrinksStandaloneImagesToFit(false);
1118 settings->setShrinksViewportContentToFit(true);
1119#endif
1120
1121 WebNetworkStateNotifier::setOnLine(prefs.is_online);
1122 WebNetworkStateNotifier::setWebConnectionType(
1123 NetConnectionTypeToWebConnectionType(prefs.connection_type));
1124 settings->setPinchVirtualViewportEnabled(
1125 prefs.pinch_virtual_viewport_enabled);
1126
1127 settings->setPinchOverlayScrollbarThickness(
1128 prefs.pinch_overlay_scrollbar_thickness);
ccameron0ffe2152014-11-14 22:31:261129 settings->setRubberBandingOnCompositorThread(
1130 prefs.rubber_banding_on_compositor_thread);
[email protected]b3a97b52014-07-09 06:25:051131 settings->setUseSolidColorScrollbars(prefs.use_solid_color_scrollbars);
jinho.bang8f11ffa2014-12-04 06:03:031132
1133#if defined(OS_WIN)
1134 settings->setShowContextMenuOnMouseUp(true);
1135#endif
bokan28eb1a562015-01-16 02:09:201136
1137 web_view->setDefaultPageScaleLimits(
1138 prefs.default_minimum_page_scale_factor,
1139 prefs.default_maximum_page_scale_factor);
[email protected]b3a97b52014-07-09 06:25:051140}
1141
1142/*static*/
danakj6e3bf8012014-12-16 18:27:531143RenderViewImpl* RenderViewImpl::Create(const ViewMsg_New_Params& params,
1144 CompositorDependencies* compositor_deps,
1145 bool was_created_by_renderer) {
naskobd911332014-11-25 01:13:361146 DCHECK(params.view_id != MSG_ROUTING_NONE);
[email protected]075366912013-02-18 07:13:241147 RenderViewImpl* render_view = NULL;
[email protected]8d41d7612012-11-14 20:32:191148 if (g_create_render_view_impl)
naskobd911332014-11-25 01:13:361149 render_view = g_create_render_view_impl(params);
[email protected]075366912013-02-18 07:13:241150 else
naskobd911332014-11-25 01:13:361151 render_view = new RenderViewImpl(params);
[email protected]0287e762014-04-11 13:07:581152
danakj6e3bf8012014-12-16 18:27:531153 render_view->Initialize(params, compositor_deps, was_created_by_renderer);
[email protected]075366912013-02-18 07:13:241154 return render_view;
[email protected]8d41d7612012-11-14 20:32:191155}
1156
1157// static
1158void RenderViewImpl::InstallCreateHook(
naskobd911332014-11-25 01:13:361159 RenderViewImpl* (*create_render_view_impl)(const ViewMsg_New_Params&)) {
[email protected]8d41d7612012-11-14 20:32:191160 CHECK(!g_create_render_view_impl);
1161 g_create_render_view_impl = create_render_view_impl;
initial.commit09911bf2008-07-26 23:55:291162}
1163
[email protected]310ebd6302011-10-10 19:06:281164void RenderViewImpl::AddObserver(RenderViewObserver* observer) {
[email protected]676126f72011-01-15 00:03:511165 observers_.AddObserver(observer);
1166}
1167
[email protected]310ebd6302011-10-10 19:06:281168void RenderViewImpl::RemoveObserver(RenderViewObserver* observer) {
1169 observer->RenderViewGone();
[email protected]676126f72011-01-15 00:03:511170 observers_.RemoveObserver(observer);
1171}
1172
[email protected]180ef242013-11-07 06:50:461173blink::WebView* RenderViewImpl::webview() const {
1174 return static_cast<blink::WebView*>(webwidget());
[email protected]4d51d5bf2010-07-26 18:48:261175}
1176
[email protected]ea2fb972013-08-07 05:44:261177#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:571178void RenderViewImpl::PepperInstanceCreated(
1179 PepperPluginInstanceImpl* instance) {
1180 active_pepper_instances_.insert(instance);
1181}
1182
1183void RenderViewImpl::PepperInstanceDeleted(
1184 PepperPluginInstanceImpl* instance) {
1185 active_pepper_instances_.erase(instance);
1186
1187 if (pepper_last_mouse_event_target_ == instance)
1188 pepper_last_mouse_event_target_ = NULL;
1189 if (focused_pepper_plugin_ == instance)
1190 PepperFocusChanged(instance, false);
1191}
1192
1193void RenderViewImpl::PepperFocusChanged(PepperPluginInstanceImpl* instance,
1194 bool focused) {
1195 if (focused)
1196 focused_pepper_plugin_ = instance;
1197 else if (focused_pepper_plugin_ == instance)
1198 focused_pepper_plugin_ = NULL;
1199
shuchen3517bb62014-10-15 03:55:571200 UpdateTextInputType();
[email protected]a99a38802014-01-14 15:46:571201 UpdateSelectionBounds();
1202}
1203
[email protected]310ebd6302011-10-10 19:06:281204void RenderViewImpl::RegisterPluginDelegate(WebPluginDelegateProxy* delegate) {
[email protected]d8fd6fa2010-02-01 15:54:261205 plugin_delegates_.insert(delegate);
[email protected]49232292010-09-03 19:07:301206 // If the renderer is visible, set initial visibility and focus state.
1207 if (!is_hidden()) {
[email protected]784ea1ab2010-09-18 00:02:341208#if defined(OS_MACOSX)
[email protected]49232292010-09-03 19:07:301209 delegate->SetContainerVisibility(true);
1210 if (webview() && webview()->isActive())
1211 delegate->SetWindowFocus(true);
[email protected]784ea1ab2010-09-18 00:02:341212#endif
[email protected]49232292010-09-03 19:07:301213 }
[email protected]784ea1ab2010-09-18 00:02:341214 // Plugins start assuming the content has focus (so that they work in
1215 // environments where RenderView isn't hosting them), so we always have to
1216 // set the initial state. See webplugin_delegate_impl.h for details.
1217 delegate->SetContentAreaFocus(has_focus());
[email protected]d8fd6fa2010-02-01 15:54:261218}
1219
[email protected]310ebd6302011-10-10 19:06:281220void RenderViewImpl::UnregisterPluginDelegate(
1221 WebPluginDelegateProxy* delegate) {
[email protected]d8fd6fa2010-02-01 15:54:261222 plugin_delegates_.erase(delegate);
1223}
[email protected]d8fd6fa2010-02-01 15:54:261224
[email protected]a80af12e2013-08-07 23:36:131225#if defined(OS_WIN)
1226void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
1227 if (focused)
1228 focused_plugin_id_ = plugin_id;
1229 else
1230 focused_plugin_id_ = -1;
1231}
1232#endif
1233
1234#if defined(OS_MACOSX)
1235void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
1236 Send(new ViewHostMsg_PluginFocusChanged(routing_id(), focused, plugin_id));
1237}
1238
[email protected]7411a3c2014-08-15 05:20:191239void RenderViewImpl::OnGetRenderedText() {
1240 if (!webview())
1241 return;
1242 // Get rendered text from WebLocalFrame.
1243 // TODO: Currently IPC truncates any data that has a
1244 // size > kMaximumMessageSize. May be split the text into smaller chunks and
1245 // send back using multiple IPC. See http://crbug.com/393444.
1246 static const size_t kMaximumMessageSize = 8 * 1024 * 1024;
1247 std::string text = webview()->mainFrame()->contentAsText(
1248 kMaximumMessageSize).utf8();
1249
1250 Send(new ViewMsg_GetRenderedTextCompleted(routing_id(), text));
1251}
1252
[email protected]a80af12e2013-08-07 23:36:131253void RenderViewImpl::StartPluginIme() {
1254 IPC::Message* msg = new ViewHostMsg_StartPluginIme(routing_id());
1255 // This message can be sent during event-handling, and needs to be delivered
1256 // within that context.
1257 msg->set_unblock(true);
1258 Send(msg);
1259}
1260#endif // defined(OS_MACOSX)
1261
1262#endif // ENABLE_PLUGINS
1263
[email protected]7a1ec28a2012-03-28 21:10:241264void RenderViewImpl::TransferActiveWheelFlingAnimation(
[email protected]180ef242013-11-07 06:50:461265 const blink::WebActiveWheelFlingParameters& params) {
[email protected]7a1ec28a2012-03-28 21:10:241266 if (webview())
1267 webview()->transferActiveWheelFlingAnimation(params);
1268}
1269
[email protected]8fe8f742012-06-14 00:36:081270bool RenderViewImpl::HasIMETextFocus() {
1271 return GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE;
1272}
1273
[email protected]310ebd6302011-10-10 19:06:281274bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
[email protected]26aa0482009-09-30 16:55:271275 WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL;
[email protected]82307f6b2014-08-07 03:30:121276 if (main_frame && main_frame->isWebLocalFrame())
[email protected]e9ff79c2012-10-19 21:31:261277 GetContentClient()->SetActiveURL(main_frame->document().url());
[email protected]f8b6b6f2009-03-10 16:48:261278
[email protected]676126f72011-01-15 00:03:511279 ObserverListBase<RenderViewObserver>::Iterator it(observers_);
1280 RenderViewObserver* observer;
1281 while ((observer = it.GetNext()) != NULL)
1282 if (observer->OnMessageReceived(message))
1283 return true;
[email protected]b2abac72009-02-26 12:39:281284
[email protected]a95986a82010-12-24 06:19:281285 bool handled = true;
[email protected]e44d1342014-05-16 21:29:331286 IPC_BEGIN_MESSAGE_MAP(RenderViewImpl, message)
[email protected]c084330e02013-04-27 01:08:151287 IPC_MESSAGE_HANDLER(InputMsg_ExecuteEditCommand, OnExecuteEditCommand)
1288 IPC_MESSAGE_HANDLER(InputMsg_MoveCaret, OnMoveCaret)
[email protected]c084330e02013-04-27 01:08:151289 IPC_MESSAGE_HANDLER(InputMsg_ScrollFocusedEditableNodeIntoRect,
1290 OnScrollFocusedEditableNodeIntoRect)
[email protected]c084330e02013-04-27 01:08:151291 IPC_MESSAGE_HANDLER(InputMsg_SetEditCommandsForNextKeyEvent,
1292 OnSetEditCommandsForNextKeyEvent)
initial.commit09911bf2008-07-26 23:55:291293 IPC_MESSAGE_HANDLER(ViewMsg_CopyImageAt, OnCopyImageAt)
[email protected]6a6fa3e2014-05-09 06:57:181294 IPC_MESSAGE_HANDLER(ViewMsg_SaveImageAt, OnSaveImageAt)
initial.commit09911bf2008-07-26 23:55:291295 IPC_MESSAGE_HANDLER(ViewMsg_Find, OnFind)
[email protected]24a7f3c2010-03-25 08:26:491296 IPC_MESSAGE_HANDLER(ViewMsg_StopFinding, OnStopFinding)
[email protected]630e26b2008-10-14 22:55:171297 IPC_MESSAGE_HANDLER(ViewMsg_Zoom, OnZoom)
[email protected]9d797f32010-04-23 07:17:541298 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForLoadingURL,
1299 OnSetZoomLevelForLoadingURL)
[email protected]d42bf472014-06-14 01:49:381300 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForView,
1301 OnSetZoomLevelForView)
initial.commit09911bf2008-07-26 23:55:291302 IPC_MESSAGE_HANDLER(ViewMsg_SetPageEncoding, OnSetPageEncoding)
[email protected]a697f4c2009-09-14 22:30:181303 IPC_MESSAGE_HANDLER(ViewMsg_ResetPageEncodingToDefault,
1304 OnResetPageEncodingToDefault)
[email protected]f546640b2012-05-15 00:03:491305 IPC_MESSAGE_HANDLER(ViewMsg_PostMessageEvent, OnPostMessageEvent)
[email protected]59f4f2fa2011-03-23 01:00:551306 IPC_MESSAGE_HANDLER(DragMsg_TargetDragEnter, OnDragTargetDragEnter)
1307 IPC_MESSAGE_HANDLER(DragMsg_TargetDragOver, OnDragTargetDragOver)
1308 IPC_MESSAGE_HANDLER(DragMsg_TargetDragLeave, OnDragTargetDragLeave)
1309 IPC_MESSAGE_HANDLER(DragMsg_TargetDrop, OnDragTargetDrop)
[email protected]7a6d773f2014-04-04 01:25:091310 IPC_MESSAGE_HANDLER(DragMsg_SourceEnded, OnDragSourceEnded)
[email protected]59f4f2fa2011-03-23 01:00:551311 IPC_MESSAGE_HANDLER(DragMsg_SourceSystemDragEnded,
1312 OnDragSourceSystemDragEnded)
[email protected]18cb2572008-08-21 20:34:451313 IPC_MESSAGE_HANDLER(ViewMsg_AllowBindings, OnAllowBindings)
initial.commit09911bf2008-07-26 23:55:291314 IPC_MESSAGE_HANDLER(ViewMsg_SetInitialFocus, OnSetInitialFocus)
initial.commit09911bf2008-07-26 23:55:291315 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTargetURL_ACK, OnUpdateTargetURLAck)
1316 IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences)
[email protected]600ea402011-04-12 00:01:511317 IPC_MESSAGE_HANDLER(ViewMsg_EnumerateDirectoryResponse,
1318 OnEnumerateDirectoryResponse)
initial.commit09911bf2008-07-26 23:55:291319 IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse)
[email protected]88f10a22013-11-06 21:22:121320 IPC_MESSAGE_HANDLER(ViewMsg_SuppressDialogsUntilSwapOut,
1321 OnSuppressDialogsUntilSwapOut)
initial.commit09911bf2008-07-26 23:55:291322 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage)
1323 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged)
[email protected]30f75e62009-02-25 22:01:001324 IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
[email protected]ab6c9112014-02-27 00:20:581325 IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedElement, OnClearFocusedElement)
[email protected]61f91832014-05-13 01:24:421326 IPC_MESSAGE_HANDLER(ViewMsg_SetBackgroundOpaque, OnSetBackgroundOpaque)
[email protected]ab32b16c2009-10-16 14:57:251327 IPC_MESSAGE_HANDLER(ViewMsg_EnablePreferredSizeChangedMode,
1328 OnEnablePreferredSizeChangedMode)
[email protected]244ac1892011-12-02 17:04:471329 IPC_MESSAGE_HANDLER(ViewMsg_EnableAutoResize, OnEnableAutoResize)
[email protected]61e2b3cc2012-03-02 16:13:341330 IPC_MESSAGE_HANDLER(ViewMsg_DisableAutoResize, OnDisableAutoResize)
[email protected]cda45c02010-02-25 19:28:101331 IPC_MESSAGE_HANDLER(ViewMsg_DisableScrollbarsForSmallWindows,
1332 OnDisableScrollbarsForSmallWindows)
[email protected]80d96fa2009-06-10 22:34:511333 IPC_MESSAGE_HANDLER(ViewMsg_SetRendererPrefs, OnSetRendererPrefs)
[email protected]581b87eb2009-07-23 23:06:561334 IPC_MESSAGE_HANDLER(ViewMsg_MediaPlayerActionAt, OnMediaPlayerActionAt)
[email protected]81375e872012-01-11 21:40:361335 IPC_MESSAGE_HANDLER(ViewMsg_PluginActionAt, OnPluginActionAt)
[email protected]8c66c5a2009-07-22 17:26:341336 IPC_MESSAGE_HANDLER(ViewMsg_SetActive, OnSetActive)
[email protected]18d5be92011-07-25 18:00:191337 IPC_MESSAGE_HANDLER(ViewMsg_GetAllSavableResourceLinksForCurrentPage,
1338 OnGetAllSavableResourceLinksForCurrentPage)
1339 IPC_MESSAGE_HANDLER(
1340 ViewMsg_GetSerializedHtmlDataForCurrentPageWithLocalLinks,
1341 OnGetSerializedHtmlDataForCurrentPageWithLocalLinks)
[email protected]47822262013-04-23 17:22:361342 IPC_MESSAGE_HANDLER(ViewMsg_ShowContextMenu, OnShowContextMenu)
[email protected]f0557932011-01-25 20:20:511343 // TODO(viettrungluu): Move to a separate message filter.
avi2b177592014-12-10 02:08:021344 IPC_MESSAGE_HANDLER(ViewMsg_SetHistoryOffsetAndLength,
1345 OnSetHistoryOffsetAndLength)
[email protected]5a7b15a2011-08-22 22:48:181346 IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode)
[email protected]cb189e062014-04-23 00:57:011347 IPC_MESSAGE_HANDLER(ViewMsg_ReleaseDisambiguationPopupBitmap,
1348 OnReleaseDisambiguationPopupBitmap)
[email protected]a794f3a2013-10-30 17:00:321349 IPC_MESSAGE_HANDLER(ViewMsg_WindowSnapshotCompleted,
1350 OnWindowSnapshotCompleted)
[email protected]506563d2014-06-23 12:22:411351 IPC_MESSAGE_HANDLER(ViewMsg_ForceRedraw, OnForceRedraw)
[email protected]4dda6a6c2014-05-17 15:35:041352 IPC_MESSAGE_HANDLER(ViewMsg_SelectWordAroundCaret, OnSelectWordAroundCaret)
[email protected]55750b32012-09-21 14:05:031353#if defined(OS_ANDROID)
[email protected]c084330e02013-04-27 01:08:151354 IPC_MESSAGE_HANDLER(InputMsg_ActivateNearestFindResult,
[email protected]55750b32012-09-21 14:05:031355 OnActivateNearestFindResult)
1356 IPC_MESSAGE_HANDLER(ViewMsg_FindMatchRects, OnFindMatchRects)
[email protected]452b4a92013-03-28 21:24:381357 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTopControlsState,
1358 OnUpdateTopControlsState)
[email protected]c4790dcb2013-12-27 22:08:021359 IPC_MESSAGE_HANDLER(ViewMsg_ExtractSmartClipData, OnExtractSmartClipData)
[email protected]55750b32012-09-21 14:05:031360#elif defined(OS_MACOSX)
[email protected]7411a3c2014-08-15 05:20:191361 IPC_MESSAGE_HANDLER(ViewMsg_GetRenderedText,
1362 OnGetRenderedText)
[email protected]55750b32012-09-21 14:05:031363 IPC_MESSAGE_HANDLER(ViewMsg_PluginImeCompositionCompleted,
1364 OnPluginImeCompositionCompleted)
[email protected]55750b32012-09-21 14:05:031365 IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize)
1366 IPC_MESSAGE_HANDLER(ViewMsg_SetWindowVisibility, OnSetWindowVisibility)
1367 IPC_MESSAGE_HANDLER(ViewMsg_WindowFrameChanged, OnWindowFrameChanged)
1368#endif
[email protected]a794f3a2013-10-30 17:00:321369 // Adding a new message? Add platform independent ones first, then put the
1370 // platform specific ones at the end.
[email protected]9e1ad4b2011-08-14 16:49:191371
initial.commit09911bf2008-07-26 23:55:291372 // Have the super handle all other messages.
[email protected]a95986a82010-12-24 06:19:281373 IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
initial.commit09911bf2008-07-26 23:55:291374 IPC_END_MESSAGE_MAP()
[email protected]ffc906f2011-10-04 22:55:401375
[email protected]a95986a82010-12-24 06:19:281376 return handled;
initial.commit09911bf2008-07-26 23:55:291377}
1378
[email protected]4dda6a6c2014-05-17 15:35:041379void RenderViewImpl::OnSelectWordAroundCaret() {
1380 if (!webview())
1381 return;
1382
1383 handling_input_event_ = true;
1384 webview()->focusedFrame()->selectWordAroundCaret();
1385 handling_input_event_ = false;
1386}
1387
[email protected]310ebd6302011-10-10 19:06:281388void RenderViewImpl::OnCopyImageAt(int x, int y) {
[email protected]26aa0482009-09-30 16:55:271389 webview()->copyImageAt(WebPoint(x, y));
initial.commit09911bf2008-07-26 23:55:291390}
1391
[email protected]6a6fa3e2014-05-09 06:57:181392void RenderViewImpl::OnSaveImageAt(int x, int y) {
1393 webview()->saveImageAt(WebPoint(x, y));
1394}
1395
[email protected]310ebd6302011-10-10 19:06:281396void RenderViewImpl::OnUpdateTargetURLAck() {
initial.commit09911bf2008-07-26 23:55:291397 // Check if there is a targeturl waiting to be sent.
avi450ce00e2014-09-24 01:58:521398 if (target_url_status_ == TARGET_PENDING)
1399 Send(new ViewHostMsg_UpdateTargetURL(routing_id_, pending_target_url_));
initial.commit09911bf2008-07-26 23:55:291400
1401 target_url_status_ = TARGET_NONE;
1402}
1403
[email protected]c084330e02013-04-27 01:08:151404void RenderViewImpl::OnExecuteEditCommand(const std::string& name,
1405 const std::string& value) {
1406 if (!webview() || !webview()->focusedFrame())
1407 return;
1408
1409 webview()->focusedFrame()->executeCommand(
1410 WebString::fromUTF8(name), WebString::fromUTF8(value));
1411}
1412
1413void RenderViewImpl::OnMoveCaret(const gfx::Point& point) {
1414 if (!webview())
1415 return;
1416
christiankaeed9862014-11-05 10:49:141417 Send(new InputHostMsg_MoveCaret_ACK(routing_id_));
[email protected]c084330e02013-04-27 01:08:151418
[email protected]b74d4064d2013-11-27 01:45:091419 webview()->focusedFrame()->moveCaretSelection(point);
[email protected]c084330e02013-04-27 01:08:151420}
[email protected]a954bf72009-09-12 07:30:351421
[email protected]c084330e02013-04-27 01:08:151422void RenderViewImpl::OnScrollFocusedEditableNodeIntoRect(
1423 const gfx::Rect& rect) {
[email protected]1875bc02014-03-14 06:33:591424 if (has_scrolled_focused_editable_node_into_rect_ &&
1425 rect == rect_for_scrolled_focused_editable_node_) {
rouslanf7ebd8832015-01-22 01:54:141426 FocusChangeComplete();
[email protected]1875bc02014-03-14 06:33:591427 return;
1428 }
1429
[email protected]c39f7442014-02-27 03:33:171430 blink::WebElement element = GetFocusedElement();
rouslanf7ebd8832015-01-22 01:54:141431 bool will_animate = false;
[email protected]1875bc02014-03-14 06:33:591432 if (!element.isNull() && IsEditableNode(element)) {
1433 rect_for_scrolled_focused_editable_node_ = rect;
1434 has_scrolled_focused_editable_node_into_rect_ = true;
rouslanf7ebd8832015-01-22 01:54:141435 will_animate = webview()->scrollFocusedNodeIntoRect(rect);
[email protected]c084330e02013-04-27 01:08:151436 }
rouslanf7ebd8832015-01-22 01:54:141437
1438 if (!will_animate)
1439 FocusChangeComplete();
[email protected]25bcc8f2013-01-09 02:49:251440}
1441
[email protected]c084330e02013-04-27 01:08:151442void RenderViewImpl::OnSetEditCommandsForNextKeyEvent(
1443 const EditCommands& edit_commands) {
1444 edit_commands_ = edit_commands;
1445}
1446
avi2b177592014-12-10 02:08:021447void RenderViewImpl::OnSetHistoryOffsetAndLength(int history_offset,
1448 int history_length) {
1449 DCHECK_GE(history_offset, -1);
[email protected]e1ed5a12012-08-08 19:57:441450 DCHECK_GE(history_length, 0);
[email protected]9e1ad4b2011-08-14 16:49:191451
avi2b177592014-12-10 02:08:021452 history_list_offset_ = history_offset;
1453 history_list_length_ = history_length;
[email protected]9e1ad4b2011-08-14 16:49:191454}
1455
[email protected]310ebd6302011-10-10 19:06:281456void RenderViewImpl::OnSetInitialFocus(bool reverse) {
initial.commit09911bf2008-07-26 23:55:291457 if (!webview())
1458 return;
[email protected]26aa0482009-09-30 16:55:271459 webview()->setInitialFocus(reverse);
initial.commit09911bf2008-07-26 23:55:291460}
1461
[email protected]54ca3ca892011-06-07 21:14:541462#if defined(OS_MACOSX)
[email protected]310ebd6302011-10-10 19:06:281463void RenderViewImpl::OnSetInLiveResize(bool in_live_resize) {
[email protected]4274b3e2011-08-09 19:09:331464 if (!webview())
1465 return;
1466 if (in_live_resize)
1467 webview()->willStartLiveResize();
1468 else
1469 webview()->willEndLiveResize();
[email protected]54ca3ca892011-06-07 21:14:541470}
1471#endif
1472
initial.commit09911bf2008-07-26 23:55:291473///////////////////////////////////////////////////////////////////////////////
1474
avif937e1d2014-11-02 18:13:071475// Sends the current history state to the browser so it will be saved before we
1476// navigate to a new page.
1477void RenderViewImpl::UpdateSessionHistory(WebFrame* frame) {
1478 // If we have a valid page ID at this point, then it corresponds to the page
1479 // we are navigating away from. Otherwise, this is the first navigation, so
1480 // there is no past session history to record.
1481 if (page_id_ == -1)
1482 return;
1483 SendUpdateState(history_controller_->GetCurrentEntry());
1484}
1485
1486void RenderViewImpl::SendUpdateState(HistoryEntry* entry) {
1487 if (!entry)
1488 return;
1489
1490 // Don't send state updates for kSwappedOutURL.
1491 if (entry->root().urlString() == WebString::fromUTF8(kSwappedOutURL))
1492 return;
1493
1494 Send(new ViewHostMsg_UpdateState(
1495 routing_id_, page_id_, HistoryEntryToPageState(entry)));
1496}
1497
[email protected]310ebd6302011-10-10 19:06:281498bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) {
[email protected]c1f50aa2010-02-18 03:46:571499 // Before WebKit asks us to show an alert (etc.), it takes care of doing the
1500 // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog
1501 // it is particularly important that we do not call willEnterModalLoop as
1502 // that would defer resource loads for the dialog itself.
[email protected]f1a29a02011-10-06 23:08:441503 if (RenderThreadImpl::current()) // Will be NULL during unit tests.
1504 RenderThreadImpl::current()->DoNotNotifyWebKitOfModalLoop();
[email protected]c1f50aa2010-02-18 03:46:571505
1506 message->EnableMessagePumping(); // Runs a nested message loop.
1507 return Send(message);
1508}
1509
[email protected]c9bc8f12012-12-15 22:20:091510void RenderViewImpl::GetWindowSnapshot(const WindowSnapshotCallback& callback) {
1511 int id = next_snapshot_id_++;
1512 pending_snapshots_.insert(std::make_pair(id, callback));
[email protected]7d08a9352013-10-15 08:24:561513 ui::LatencyInfo latency_info;
[email protected]506563d2014-06-23 12:22:411514 latency_info.AddLatencyNumber(ui::WINDOW_OLD_SNAPSHOT_FRAME_NUMBER_COMPONENT,
1515 0,
1516 id);
1517 scoped_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor;
1518 if (RenderWidgetCompositor* rwc = compositor()) {
1519 latency_info_swap_promise_monitor =
1520 rwc->CreateLatencyInfoSwapPromiseMonitor(&latency_info).Pass();
1521 }
1522 ScheduleCompositeWithForcedRedraw();
1523}
1524
1525void RenderViewImpl::OnForceRedraw(int id) {
1526 ui::LatencyInfo latency_info;
[email protected]f9f3fac2014-08-05 00:47:591527 if (id) {
1528 latency_info.AddLatencyNumber(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
1529 0,
1530 id);
1531 }
[email protected]6be422b2013-12-08 06:47:311532 scoped_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor;
[email protected]7d08a9352013-10-15 08:24:561533 if (RenderWidgetCompositor* rwc = compositor()) {
[email protected]6be422b2013-12-08 06:47:311534 latency_info_swap_promise_monitor =
1535 rwc->CreateLatencyInfoSwapPromiseMonitor(&latency_info).Pass();
[email protected]7d08a9352013-10-15 08:24:561536 }
1537 ScheduleCompositeWithForcedRedraw();
[email protected]c9bc8f12012-12-15 22:20:091538}
1539
1540void RenderViewImpl::OnWindowSnapshotCompleted(const int snapshot_id,
1541 const gfx::Size& size, const std::vector<unsigned char>& png) {
[email protected]7d08a9352013-10-15 08:24:561542
1543 // Any pending snapshots with a lower ID than the one received are considered
1544 // to be implicitly complete, and returned the same snapshot data.
1545 PendingSnapshotMap::iterator it = pending_snapshots_.begin();
1546 while(it != pending_snapshots_.end()) {
1547 if (it->first <= snapshot_id) {
1548 it->second.Run(size, png);
1549 pending_snapshots_.erase(it++);
1550 } else {
1551 ++it;
1552 }
1553 }
[email protected]c9bc8f12012-12-15 22:20:091554}
1555
[email protected]180ef242013-11-07 06:50:461556// blink::WebViewClient ------------------------------------------------------
[email protected]48c9cf2d2009-09-16 16:47:521557
[email protected]35b2a972014-04-04 15:50:221558WebView* RenderViewImpl::createView(WebLocalFrame* creator,
1559 const WebURLRequest& request,
1560 const WebWindowFeatures& features,
1561 const WebString& frame_name,
1562 WebNavigationPolicy policy,
1563 bool suppress_opener) {
[email protected]8ab04652010-06-12 02:47:261564 ViewHostMsg_CreateWindow_Params params;
1565 params.opener_id = routing_id_;
[email protected]af15bf22013-03-08 01:18:171566 params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture();
[email protected]00323f02013-07-24 15:47:411567 if (GetContentClient()->renderer()->AllowPopup())
1568 params.user_gesture = true;
[email protected]8ab04652010-06-12 02:47:261569 params.window_container_type = WindowFeaturesToContainerType(features);
1570 params.session_storage_namespace_id = session_storage_namespace_id_;
[email protected]5cef23d2013-02-27 13:11:211571 if (frame_name != "_blank")
1572 params.frame_name = frame_name;
[email protected]a7531d772014-03-25 16:15:071573 params.opener_render_frame_id =
[email protected]501052ff2014-02-21 22:19:071574 RenderFrameImpl::FromWebFrame(creator)->GetRoutingID();
[email protected]b6cb3a842011-06-24 18:28:411575 params.opener_url = creator->document().url();
[email protected]931bc922013-09-11 21:42:571576 params.opener_top_level_frame_url = creator->top()->document().url();
[email protected]6c53a7f2014-03-31 16:56:281577 GURL security_url(creator->document().securityOrigin().toString());
[email protected]7f48b712013-01-25 01:48:301578 if (!security_url.is_valid())
1579 security_url = GURL();
1580 params.opener_security_origin = security_url;
[email protected]147b2bf2013-11-05 04:00:041581 params.opener_suppressed = suppress_opener;
[email protected]f92ce2b2012-03-06 18:02:591582 params.disposition = NavigationPolicyToDisposition(policy);
[email protected]44e55b012013-07-23 14:21:561583 if (!request.isNull()) {
[email protected]41e65502011-01-21 09:29:111584 params.target_url = request.url();
[email protected]44e55b012013-07-23 14:21:561585 params.referrer = GetReferrerFromRequest(creator, request);
1586 }
[email protected]453c1b22013-07-23 09:31:481587 params.features = features;
[email protected]8ab04652010-06-12 02:47:261588
[email protected]22217ed32013-11-18 18:40:231589 for (size_t i = 0; i < features.additionalFeatures.size(); ++i)
1590 params.additional_features.push_back(features.additionalFeatures[i]);
1591
[email protected]48c9cf2d2009-09-16 16:47:521592 int32 routing_id = MSG_ROUTING_NONE;
[email protected]227692c52013-05-31 22:43:041593 int32 main_frame_routing_id = MSG_ROUTING_NONE;
[email protected]9f4f3322012-01-18 22:29:561594 int32 surface_id = 0;
[email protected]176fe9a2014-07-08 02:31:531595 int64 cloned_session_storage_namespace_id = 0;
[email protected]48c9cf2d2009-09-16 16:47:521596
danakj6e3bf8012014-12-16 18:27:531597 RenderThread::Get()->Send(new ViewHostMsg_CreateWindow(
1598 params, &routing_id, &main_frame_routing_id, &surface_id,
1599 &cloned_session_storage_namespace_id));
[email protected]12636df2009-09-28 22:32:211600 if (routing_id == MSG_ROUTING_NONE)
[email protected]48c9cf2d2009-09-16 16:47:521601 return NULL;
[email protected]48c9cf2d2009-09-16 16:47:521602
[email protected]af15bf22013-03-08 01:18:171603 WebUserGestureIndicator::consumeUserGesture();
[email protected]c59262422012-11-30 21:20:521604
[email protected]7912e822014-04-16 02:37:031605 // While this view may be a background extension page, it can spawn a visible
1606 // render view. So we just assume that the new one is not another background
1607 // page instead of passing on our own value.
1608 // TODO(vangelis): Can we tell if the new view will be a background page?
1609 bool never_visible = false;
[email protected]9115d5f2013-03-24 04:37:411610
mkosiba58fa72f02014-11-12 01:21:361611 ViewMsg_Resize_Params initial_size = ViewMsg_Resize_Params();
1612 initial_size.screen_info = screen_info_;
1613
[email protected]d6fa88f2013-10-18 16:00:431614 // The initial hidden state for the RenderViewImpl here has to match what the
1615 // browser will eventually decide for the given disposition. Since we have to
1616 // return from this call synchronously, we just have to make our best guess
1617 // and rely on the browser sending a WasHidden / WasShown message if it
1618 // disagrees.
naskobd911332014-11-25 01:13:361619 ViewMsg_New_Params view_params;
1620 view_params.opener_route_id = routing_id_;
1621 view_params.window_was_created_with_opener = true;
1622 view_params.renderer_preferences = renderer_preferences_;
1623 view_params.web_preferences = webkit_preferences_;
1624 view_params.view_id = routing_id;
1625 view_params.main_frame_routing_id = main_frame_routing_id;
1626 view_params.surface_id = surface_id;
1627 view_params.session_storage_namespace_id =
1628 cloned_session_storage_namespace_id;
1629 // WebCore will take care of setting the correct name.
1630 view_params.frame_name = base::string16();
1631 view_params.swapped_out = false;
alexmosbc7eafa2014-12-06 01:38:091632 view_params.replicated_frame_state = FrameReplicationState();
naskobd911332014-11-25 01:13:361633 view_params.proxy_routing_id = MSG_ROUTING_NONE;
1634 view_params.hidden = (params.disposition == NEW_BACKGROUND_TAB);
1635 view_params.never_visible = never_visible;
1636 view_params.next_page_id = 1;
1637 view_params.initial_size = initial_size;
1638 view_params.enable_auto_resize = false;
1639 view_params.min_size = gfx::Size();
1640 view_params.max_size = gfx::Size();
1641
danakj6e3bf8012014-12-16 18:27:531642 RenderViewImpl* view =
1643 RenderViewImpl::Create(view_params, compositor_deps_, true);
[email protected]8ab04652010-06-12 02:47:261644 view->opened_by_user_gesture_ = params.user_gesture;
[email protected]48c9cf2d2009-09-16 16:47:521645
[email protected]007a848b2009-10-26 15:55:461646 // Record whether the creator frame is trying to suppress the opener field.
[email protected]f92ce2b2012-03-06 18:02:591647 view->opener_suppressed_ = params.opener_suppressed;
[email protected]007a848b2009-10-26 15:55:461648
[email protected]48c9cf2d2009-09-16 16:47:521649 return view->webview();
1650}
1651
[email protected]180ef242013-11-07 06:50:461652WebWidget* RenderViewImpl::createPopupMenu(blink::WebPopupType popup_type) {
danakj6e3bf8012014-12-16 18:27:531653 RenderWidget* widget = RenderWidget::Create(routing_id_, compositor_deps_,
1654 popup_type, screen_info_);
[email protected]3b78ec12014-03-04 05:18:281655 if (!widget)
1656 return NULL;
[email protected]b2e4c70132013-10-03 02:07:511657 if (screen_metrics_emulator_) {
1658 widget->SetPopupOriginAdjustmentsForEmulation(
1659 screen_metrics_emulator_.get());
1660 }
[email protected]48c9cf2d2009-09-16 16:47:521661 return widget->webwidget();
1662}
1663
[email protected]23367482013-06-27 21:06:541664WebStorageNamespace* RenderViewImpl::createSessionStorageNamespace() {
[email protected]5f2aa722013-08-07 16:59:411665 CHECK(session_storage_namespace_id_ != kInvalidSessionStorageNamespaceId);
[email protected]1910fe82012-05-10 00:04:101666 return new WebStorageNamespaceImpl(session_storage_namespace_id_);
[email protected]bd92c3a2010-01-13 05:02:341667}
1668
[email protected]35b2a972014-04-04 15:50:221669void RenderViewImpl::printPage(WebLocalFrame* frame) {
[email protected]b0553c7e2012-09-19 21:36:111670 FOR_EACH_OBSERVER(RenderViewObserver, observers_,
1671 PrintPage(frame, handling_input_event_));
[email protected]48c9cf2d2009-09-16 16:47:521672}
1673
jinho.bang632a1a722014-09-18 03:02:561674void RenderViewImpl::saveImageFromDataURL(const blink::WebString& data_url) {
1675 // Note: We should basically send GURL but we use size-limited string instead
1676 // in order to send a larger data url to save a image for <canvas> or <img>.
1677 if (data_url.length() < kMaxLengthOfDataURLString)
1678 Send(new ViewHostMsg_SaveImageFromDataURL(routing_id_, data_url.utf8()));
1679}
1680
[email protected]310ebd6302011-10-10 19:06:281681bool RenderViewImpl::enumerateChosenDirectory(
[email protected]8a58c1c2011-04-19 18:40:121682 const WebString& path,
1683 WebFileChooserCompletion* chooser_completion) {
1684 int id = enumeration_completion_id_++;
1685 enumeration_completions_[id] = chooser_completion;
1686 return Send(new ViewHostMsg_EnumerateDirectory(
1687 routing_id_,
1688 id,
[email protected]728c2ee2013-06-25 04:01:071689 base::FilePath::FromUTF16Unsafe(path)));
[email protected]8a58c1c2011-04-19 18:40:121690}
1691
[email protected]7e9523b2014-03-25 03:02:421692void RenderViewImpl::FrameDidStartLoading(WebFrame* frame) {
[email protected]7e9523b2014-03-25 03:02:421693 DCHECK_GE(frames_in_progress_, 0);
1694 if (frames_in_progress_ == 0)
1695 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStartLoading());
1696 frames_in_progress_++;
[email protected]6dd5c322014-03-12 07:58:461697}
1698
[email protected]7e9523b2014-03-25 03:02:421699void RenderViewImpl::FrameDidStopLoading(WebFrame* frame) {
[email protected]eb473772014-04-11 20:54:331700 // TODO(japhet): This should be a DCHECK, but the pdf plugin sometimes
1701 // calls DidStopLoading() without a matching DidStartLoading().
1702 if (frames_in_progress_ == 0)
1703 return;
[email protected]7e9523b2014-03-25 03:02:421704 frames_in_progress_--;
[email protected]7e9523b2014-03-25 03:02:421705 if (frames_in_progress_ == 0) {
1706 DidStopLoadingIcons();
1707 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStopLoading());
1708 }
[email protected]48c9cf2d2009-09-16 16:47:521709}
1710
[email protected]550b0c92013-02-04 05:09:151711void RenderViewImpl::didCancelCompositionOnSelectionChange() {
[email protected]a2214eb2014-06-23 18:31:221712 Send(new InputHostMsg_ImeCancelComposition(routing_id()));
[email protected]550b0c92013-02-04 05:09:151713}
1714
[email protected]310ebd6302011-10-10 19:06:281715bool RenderViewImpl::handleCurrentKeyboardEvent() {
[email protected]b2528b72009-09-24 06:57:101716 if (edit_commands_.empty())
1717 return false;
1718
[email protected]26aa0482009-09-30 16:55:271719 WebFrame* frame = webview()->focusedFrame();
[email protected]b2528b72009-09-24 06:57:101720 if (!frame)
1721 return false;
1722
1723 EditCommands::iterator it = edit_commands_.begin();
1724 EditCommands::iterator end = edit_commands_.end();
1725
[email protected]507b33ea2009-09-29 03:56:511726 bool did_execute_command = false;
[email protected]b2528b72009-09-24 06:57:101727 for (; it != end; ++it) {
[email protected]e6e15012009-09-30 14:59:331728 // In gtk and cocoa, it's possible to bind multiple edit commands to one
1729 // key (but it's the exception). Once one edit command is not executed, it
1730 // seems safest to not execute the rest.
[email protected]b2528b72009-09-24 06:57:101731 if (!frame->executeCommand(WebString::fromUTF8(it->name),
[email protected]b77fac52013-06-01 01:03:461732 WebString::fromUTF8(it->value),
[email protected]c39f7442014-02-27 03:33:171733 GetFocusedElement()))
[email protected]b2528b72009-09-24 06:57:101734 break;
[email protected]507b33ea2009-09-29 03:56:511735 did_execute_command = true;
[email protected]b2528b72009-09-24 06:57:101736 }
1737
[email protected]507b33ea2009-09-29 03:56:511738 return did_execute_command;
[email protected]b2528b72009-09-24 06:57:101739}
1740
[email protected]310ebd6302011-10-10 19:06:281741bool RenderViewImpl::runFileChooser(
[email protected]180ef242013-11-07 06:50:461742 const blink::WebFileChooserParams& params,
[email protected]cdaf8d02010-03-30 19:52:471743 WebFileChooserCompletion* chooser_completion) {
[email protected]7ef03e02010-10-23 11:58:351744 // Do not open the file dialog in a hidden RenderView.
1745 if (is_hidden())
1746 return false;
[email protected]e9ff79c2012-10-19 21:31:261747 FileChooserParams ipc_params;
[email protected]b5977a0c2010-08-24 19:46:261748 if (params.directory)
[email protected]6bedbef2013-07-31 06:33:491749 ipc_params.mode = FileChooserParams::UploadFolder;
[email protected]b5977a0c2010-08-24 19:46:261750 else if (params.multiSelect)
[email protected]e9ff79c2012-10-19 21:31:261751 ipc_params.mode = FileChooserParams::OpenMultiple;
[email protected]459fba82011-10-13 02:48:501752 else if (params.saveAs)
[email protected]e9ff79c2012-10-19 21:31:261753 ipc_params.mode = FileChooserParams::Save;
[email protected]b5977a0c2010-08-24 19:46:261754 else
[email protected]e9ff79c2012-10-19 21:31:261755 ipc_params.mode = FileChooserParams::Open;
[email protected]cdaf8d02010-03-30 19:52:471756 ipc_params.title = params.title;
1757 ipc_params.default_file_name =
[email protected]728c2ee2013-06-25 04:01:071758 base::FilePath::FromUTF16Unsafe(params.initialValue);
[email protected]f9a4c41a2012-05-30 00:05:321759 ipc_params.accept_types.reserve(params.acceptTypes.size());
1760 for (size_t i = 0; i < params.acceptTypes.size(); ++i)
1761 ipc_params.accept_types.push_back(params.acceptTypes[i]);
hironoe9f2732b2014-10-22 08:06:411762 ipc_params.need_local_path = params.needLocalPath;
[email protected]2fdf2352012-11-01 19:23:021763#if defined(OS_ANDROID)
[email protected]b7b4beb2013-07-09 14:06:501764 ipc_params.capture = params.useMediaCapture;
[email protected]2fdf2352012-11-01 19:23:021765#endif
[email protected]cdaf8d02010-03-30 19:52:471766
1767 return ScheduleFileChooser(ipc_params, chooser_completion);
[email protected]a1128322009-10-06 18:38:461768}
1769
habib.virji597255e2014-09-09 00:30:181770void RenderViewImpl::SetValidationMessageDirection(
1771 base::string16* wrapped_main_text,
1772 blink::WebTextDirection main_text_hint,
1773 base::string16* wrapped_sub_text,
1774 blink::WebTextDirection sub_text_hint) {
1775 if (main_text_hint == blink::WebTextDirectionLeftToRight) {
1776 *wrapped_main_text =
1777 base::i18n::GetDisplayStringInLTRDirectionality(*wrapped_main_text);
1778 } else if (main_text_hint == blink::WebTextDirectionRightToLeft &&
1779 !base::i18n::IsRTL()) {
1780 base::i18n::WrapStringWithRTLFormatting(wrapped_main_text);
1781 }
1782
1783 if (!wrapped_sub_text->empty()) {
1784 if (sub_text_hint == blink::WebTextDirectionLeftToRight) {
1785 *wrapped_sub_text =
1786 base::i18n::GetDisplayStringInLTRDirectionality(*wrapped_sub_text);
1787 } else if (sub_text_hint == blink::WebTextDirectionRightToLeft) {
1788 base::i18n::WrapStringWithRTLFormatting(wrapped_sub_text);
1789 }
1790 }
1791}
1792
[email protected]edc3af82013-12-12 21:24:071793void RenderViewImpl::showValidationMessage(
1794 const blink::WebRect& anchor_in_root_view,
1795 const blink::WebString& main_text,
habib.virji597255e2014-09-09 00:30:181796 blink::WebTextDirection main_text_hint,
[email protected]edc3af82013-12-12 21:24:071797 const blink::WebString& sub_text,
habib.virji597255e2014-09-09 00:30:181798 blink::WebTextDirection sub_text_hint) {
[email protected]edc3af82013-12-12 21:24:071799 base::string16 wrapped_main_text = main_text;
1800 base::string16 wrapped_sub_text = sub_text;
habib.virji597255e2014-09-09 00:30:181801
1802 SetValidationMessageDirection(
1803 &wrapped_main_text, main_text_hint, &wrapped_sub_text, sub_text_hint);
1804
[email protected]edc3af82013-12-12 21:24:071805 Send(new ViewHostMsg_ShowValidationMessage(
[email protected]2d6836f42014-07-02 17:25:311806 routing_id(), AdjustValidationMessageAnchor(anchor_in_root_view),
1807 wrapped_main_text, wrapped_sub_text));
[email protected]edc3af82013-12-12 21:24:071808}
1809
1810void RenderViewImpl::hideValidationMessage() {
1811 Send(new ViewHostMsg_HideValidationMessage(routing_id()));
1812}
1813
1814void RenderViewImpl::moveValidationMessage(
1815 const blink::WebRect& anchor_in_root_view) {
[email protected]2d6836f42014-07-02 17:25:311816 Send(new ViewHostMsg_MoveValidationMessage(
1817 routing_id(), AdjustValidationMessageAnchor(anchor_in_root_view)));
[email protected]edc3af82013-12-12 21:24:071818}
1819
[email protected]310ebd6302011-10-10 19:06:281820void RenderViewImpl::setStatusText(const WebString& text) {
[email protected]48c9cf2d2009-09-16 16:47:521821}
1822
[email protected]310ebd6302011-10-10 19:06:281823void RenderViewImpl::UpdateTargetURL(const GURL& url,
1824 const GURL& fallback_url) {
[email protected]aa6b90b32010-04-26 15:49:581825 GURL latest_url = url.is_empty() ? fallback_url : url;
[email protected]48c9cf2d2009-09-16 16:47:521826 if (latest_url == target_url_)
1827 return;
[email protected]163f8242009-10-30 20:19:551828
[email protected]48c9cf2d2009-09-16 16:47:521829 // Tell the browser to display a destination link.
1830 if (target_url_status_ == TARGET_INFLIGHT ||
1831 target_url_status_ == TARGET_PENDING) {
1832 // If we have a request in-flight, save the URL to be sent when we
1833 // receive an ACK to the in-flight request. We can happily overwrite
1834 // any existing pending sends.
1835 pending_target_url_ = latest_url;
1836 target_url_status_ = TARGET_PENDING;
1837 } else {
[email protected]f16cc6782013-12-16 23:42:571838 // URLs larger than |MaxURLChars()| cannot be sent through IPC -
[email protected]c85f0212011-11-04 16:54:411839 // see |ParamTraits<GURL>|.
[email protected]f16cc6782013-12-16 23:42:571840 if (latest_url.possibly_invalid_spec().size() > GetMaxURLChars())
[email protected]c85f0212011-11-04 16:54:411841 latest_url = GURL();
avi450ce00e2014-09-24 01:58:521842 Send(new ViewHostMsg_UpdateTargetURL(routing_id_, latest_url));
[email protected]48c9cf2d2009-09-16 16:47:521843 target_url_ = latest_url;
1844 target_url_status_ = TARGET_INFLIGHT;
1845 }
1846}
1847
[email protected]70221f02013-01-31 22:17:071848gfx::RectF RenderViewImpl::ClientRectToPhysicalWindowRect(
1849 const gfx::RectF& rect) const {
1850 gfx::RectF window_rect = rect;
1851 window_rect.Scale(device_scale_factor_ * webview()->pageScaleFactor());
1852 return window_rect;
1853}
1854
avif937e1d2014-11-02 18:13:071855void RenderViewImpl::StartNavStateSyncTimerIfNecessary() {
1856 // No need to update state if no page has committed yet.
[email protected]a183fb82012-12-14 04:46:221857 if (page_id_ == -1)
1858 return;
1859
[email protected]882daa92009-11-05 16:31:311860 int delay;
avif937e1d2014-11-02 18:13:071861 if (send_content_state_immediately_)
[email protected]882daa92009-11-05 16:31:311862 delay = 0;
1863 else if (is_hidden())
avif937e1d2014-11-02 18:13:071864 delay = kDelaySecondsForContentStateSyncHidden;
[email protected]882daa92009-11-05 16:31:311865 else
avif937e1d2014-11-02 18:13:071866 delay = kDelaySecondsForContentStateSync;
[email protected]882daa92009-11-05 16:31:311867
avif937e1d2014-11-02 18:13:071868 if (nav_state_sync_timer_.IsRunning()) {
[email protected]882daa92009-11-05 16:31:311869 // The timer is already running. If the delay of the timer maches the amount
1870 // we want to delay by, then return. Otherwise stop the timer so that it
1871 // gets started with the right delay.
avif937e1d2014-11-02 18:13:071872 if (nav_state_sync_timer_.GetCurrentDelay().InSeconds() == delay)
[email protected]882daa92009-11-05 16:31:311873 return;
avif937e1d2014-11-02 18:13:071874 nav_state_sync_timer_.Stop();
[email protected]882daa92009-11-05 16:31:311875 }
1876
avif937e1d2014-11-02 18:13:071877 nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this,
1878 &RenderViewImpl::SyncNavigationState);
[email protected]882daa92009-11-05 16:31:311879}
1880
[email protected]310ebd6302011-10-10 19:06:281881void RenderViewImpl::setMouseOverURL(const WebURL& url) {
[email protected]163f8242009-10-30 20:19:551882 mouse_over_url_ = GURL(url);
1883 UpdateTargetURL(mouse_over_url_, focus_url_);
1884}
1885
[email protected]310ebd6302011-10-10 19:06:281886void RenderViewImpl::setKeyboardFocusURL(const WebURL& url) {
[email protected]163f8242009-10-30 20:19:551887 focus_url_ = GURL(url);
1888 UpdateTargetURL(focus_url_, mouse_over_url_);
1889}
1890
[email protected]35b2a972014-04-04 15:50:221891void RenderViewImpl::startDragging(WebLocalFrame* frame,
[email protected]0407e422012-05-18 19:51:251892 const WebDragData& data,
[email protected]310ebd6302011-10-10 19:06:281893 WebDragOperationsMask mask,
1894 const WebImage& image,
[email protected]ceb36f7d2012-10-31 18:33:241895 const WebPoint& webImageOffset) {
[email protected]dc293a72013-07-01 11:11:221896 DropData drop_data(DropDataBuilder::Build(data));
[email protected]b67151d2012-05-25 23:23:241897 drop_data.referrer_policy = frame->document().referrerPolicy();
[email protected]ceb36f7d2012-10-31 18:33:241898 gfx::Vector2d imageOffset(webImageOffset.x, webImageOffset.y);
[email protected]59f4f2fa2011-03-23 01:00:551899 Send(new DragHostMsg_StartDragging(routing_id_,
[email protected]b67151d2012-05-25 23:23:241900 drop_data,
[email protected]c27ae592010-03-18 15:24:411901 mask,
[email protected]976127072012-05-10 20:08:111902 image.getSkBitmap(),
[email protected]41d86852012-11-07 12:23:241903 imageOffset,
1904 possible_drag_event_info_));
[email protected]48c9cf2d2009-09-16 16:47:521905}
1906
[email protected]310ebd6302011-10-10 19:06:281907bool RenderViewImpl::acceptsLoadDrops() {
[email protected]28b92df2009-09-25 17:35:451908 return renderer_preferences_.can_accept_load_drops;
1909}
1910
[email protected]310ebd6302011-10-10 19:06:281911void RenderViewImpl::focusNext() {
[email protected]48c9cf2d2009-09-16 16:47:521912 Send(new ViewHostMsg_TakeFocus(routing_id_, false));
1913}
1914
[email protected]310ebd6302011-10-10 19:06:281915void RenderViewImpl::focusPrevious() {
[email protected]48c9cf2d2009-09-16 16:47:521916 Send(new ViewHostMsg_TakeFocus(routing_id_, true));
1917}
1918
estade31c54342015-01-23 03:34:361919void RenderViewImpl::focusedNodeChanged(const WebNode& fromNode,
1920 const WebNode& toNode) {
[email protected]1875bc02014-03-14 06:33:591921 has_scrolled_focused_editable_node_into_rect_ = false;
1922
jennyz399d6e62014-12-16 01:40:051923 gfx::Rect node_bounds;
estade31c54342015-01-23 03:34:361924 if (!toNode.isNull() && toNode.isElementNode()) {
1925 WebNode web_node = const_cast<WebNode&>(toNode);
jennyz399d6e62014-12-16 01:40:051926 node_bounds = gfx::Rect(web_node.to<WebElement>().boundsInViewportSpace());
1927 }
estade31c54342015-01-23 03:34:361928 Send(new ViewHostMsg_FocusedNodeChanged(routing_id_, IsEditableNode(toNode),
jennyz399d6e62014-12-16 01:40:051929 node_bounds));
[email protected]a4b103b2010-10-05 18:46:071930
estade31c54342015-01-23 03:34:361931 // TODO(estade): remove.
1932 FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusedNodeChanged(toNode));
[email protected]95640212014-07-26 18:14:301933
estade31c54342015-01-23 03:34:361934 RenderFrameImpl* previous_frame = nullptr;
1935 if (!fromNode.isNull())
1936 previous_frame = RenderFrameImpl::FromWebFrame(fromNode.document().frame());
1937 RenderFrameImpl* new_frame = nullptr;
1938 if (!toNode.isNull())
1939 new_frame = RenderFrameImpl::FromWebFrame(toNode.document().frame());
1940
1941 if (previous_frame && previous_frame != new_frame)
1942 previous_frame->FocusedNodeChanged(WebNode());
1943 if (new_frame)
1944 new_frame->FocusedNodeChanged(toNode);
1945
1946 // TODO(dmazzoni): remove once there's a separate a11y tree per frame.
1947 GetMainRenderFrame()->FocusedNodeChangedForAccessibility(toNode);
[email protected]08e9e132010-06-01 16:58:491948}
1949
[email protected]169d4282011-11-30 19:33:591950void RenderViewImpl::didUpdateLayout() {
[email protected]d01b2a62013-09-18 23:21:331951 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidUpdateLayout());
1952
[email protected]169d4282011-11-30 19:33:591953 // We don't always want to set up a timer, only if we've been put in that
1954 // mode by getting a |ViewMsg_EnablePreferredSizeChangedMode|
1955 // message.
1956 if (!send_preferred_size_changes_ || !webview())
1957 return;
1958
1959 if (check_preferred_size_timer_.IsRunning())
1960 return;
1961 check_preferred_size_timer_.Start(FROM_HERE,
1962 TimeDelta::FromMilliseconds(0), this,
1963 &RenderViewImpl::CheckPreferredSize);
1964}
1965
[email protected]310ebd6302011-10-10 19:06:281966void RenderViewImpl::navigateBackForwardSoon(int offset) {
[email protected]48c9cf2d2009-09-16 16:47:521967 Send(new ViewHostMsg_GoToEntryAtOffset(routing_id_, offset));
1968}
1969
[email protected]310ebd6302011-10-10 19:06:281970int RenderViewImpl::historyBackListCount() {
[email protected]3cc72b12010-03-18 23:03:001971 return history_list_offset_ < 0 ? 0 : history_list_offset_;
[email protected]48c9cf2d2009-09-16 16:47:521972}
1973
[email protected]310ebd6302011-10-10 19:06:281974int RenderViewImpl::historyForwardListCount() {
[email protected]3cc72b12010-03-18 23:03:001975 return history_list_length_ - historyBackListCount() - 1;
[email protected]48c9cf2d2009-09-16 16:47:521976}
1977
[email protected]180ef242013-11-07 06:50:461978// blink::WebWidgetClient ----------------------------------------------------
[email protected]79dbc662009-09-04 05:42:511979
[email protected]310ebd6302011-10-10 19:06:281980void RenderViewImpl::didFocus() {
[email protected]ea42e7782010-08-23 23:58:121981 // TODO(jcivelli): when https://bugs.webkit.org/show_bug.cgi?id=33389 is fixed
1982 // we won't have to test for user gesture anymore and we can
1983 // move that code back to render_widget.cc
[email protected]af15bf22013-03-08 01:18:171984 if (WebUserGestureIndicator::isProcessingUserGesture() &&
[email protected]70dee7e2013-05-29 18:28:301985 !RenderThreadImpl::current()->layout_test_mode()) {
[email protected]e1176152013-03-06 09:16:441986 Send(new ViewHostMsg_Focus(routing_id_));
[email protected]ea42e7782010-08-23 23:58:121987 }
1988}
1989
[email protected]310ebd6302011-10-10 19:06:281990void RenderViewImpl::didBlur() {
[email protected]ea42e7782010-08-23 23:58:121991 // TODO(jcivelli): see TODO above in didFocus().
[email protected]af15bf22013-03-08 01:18:171992 if (WebUserGestureIndicator::isProcessingUserGesture() &&
[email protected]70dee7e2013-05-29 18:28:301993 !RenderThreadImpl::current()->layout_test_mode()) {
[email protected]e1176152013-03-06 09:16:441994 Send(new ViewHostMsg_Blur(routing_id_));
[email protected]ea42e7782010-08-23 23:58:121995 }
1996}
1997
initial.commit09911bf2008-07-26 23:55:291998// We are supposed to get a single call to Show for a newly created RenderView
[email protected]310ebd6302011-10-10 19:06:281999// that was created via RenderViewImpl::CreateWebView. So, we wait until this
initial.commit09911bf2008-07-26 23:55:292000// point to dispatch the ShowView message.
2001//
2002// This method provides us with the information about how to display the newly
[email protected]5f9de5882011-09-30 23:36:282003// created RenderView (i.e., as a blocked popup or as a new tab).
initial.commit09911bf2008-07-26 23:55:292004//
[email protected]310ebd6302011-10-10 19:06:282005void RenderViewImpl::show(WebNavigationPolicy policy) {
[email protected]b2142e962012-10-30 13:59:252006 if (did_show_) {
[email protected]b2142e962012-10-30 13:59:252007 // When supports_multiple_windows is disabled, popups are reusing
2008 // the same view. In some scenarios, this makes WebKit to call show() twice.
[email protected]c9edabd2013-05-23 13:56:242009 if (webkit_preferences_.supports_multiple_windows)
2010 NOTREACHED() << "received extraneous Show call";
initial.commit09911bf2008-07-26 23:55:292011 return;
[email protected]b2142e962012-10-30 13:59:252012 }
initial.commit09911bf2008-07-26 23:55:292013 did_show_ = true;
2014
[email protected]b2142e962012-10-30 13:59:252015 DCHECK(opener_id_ != MSG_ROUTING_NONE);
2016
initial.commit09911bf2008-07-26 23:55:292017 // NOTE: initial_pos_ may still have its default values at this point, but
2018 // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the
2019 // browser process will impose a default position otherwise.
[email protected]4873c7d2009-07-16 06:36:282020 Send(new ViewHostMsg_ShowView(opener_id_, routing_id_,
2021 NavigationPolicyToDisposition(policy), initial_pos_,
[email protected]7e7414ae2010-01-26 20:19:292022 opened_by_user_gesture_));
[email protected]2533ce12009-05-09 00:02:242023 SetPendingWindowRect(initial_pos_);
initial.commit09911bf2008-07-26 23:55:292024}
2025
[email protected]dd48d492014-03-16 05:04:392026void RenderViewImpl::runModal() {
2027 DCHECK(did_show_) << "should already have shown the view";
2028
2029 // Don't allow further dialogs if we are waiting to swap out, since the
2030 // PageGroupLoadDeferrer in our stack prevents it.
2031 if (suppress_dialogs_until_swap_out_)
2032 return;
2033
2034 // We must keep WebKit's shared timer running in this case in order to allow
2035 // showModalDialog to function properly.
2036 //
2037 // TODO(darin): WebKit should really be smarter about suppressing events and
2038 // timers so that we do not need to manage the shared timer in such a heavy
2039 // handed manner.
2040 //
2041 if (RenderThreadImpl::current()) // Will be NULL during unit tests.
2042 RenderThreadImpl::current()->DoNotSuspendWebKitSharedTimer();
2043
2044 SendAndRunNestedMessageLoop(new ViewHostMsg_RunModal(
2045 routing_id_, opener_id_));
2046}
2047
[email protected]217690d2012-01-27 07:33:112048bool RenderViewImpl::requestPointerLock() {
2049 return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get());
2050}
2051
2052void RenderViewImpl::requestPointerUnlock() {
2053 mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get());
2054}
2055
2056bool RenderViewImpl::isPointerLocked() {
2057 return mouse_lock_dispatcher_->IsMouseLockedTo(
2058 webwidget_mouse_lock_target_.get());
2059}
2060
[email protected]c68c3e4e2013-01-24 00:36:562061void RenderViewImpl::didHandleGestureEvent(
2062 const WebGestureEvent& event,
2063 bool event_cancelled) {
2064 RenderWidget::didHandleGestureEvent(event, event_cancelled);
[email protected]bb37b652013-11-27 23:47:112065
[email protected]91dcc6d32014-07-30 00:01:332066 if (!event_cancelled) {
2067 FOR_EACH_OBSERVER(
2068 RenderViewObserver, observers_, DidHandleGestureEvent(event));
2069 }
2070
jdduke45762d22014-10-07 04:19:082071 // TODO(ananta): Piggyback off existing IPCs to communicate this information,
2072 // crbug/420130.
2073#if defined(OS_WIN)
[email protected]bb37b652013-11-27 23:47:112074 if (event.type != blink::WebGestureEvent::GestureTap)
2075 return;
2076
[email protected]91dcc6d32014-07-30 00:01:332077 // TODO(estade): hit test the event against focused node to make sure
2078 // the tap actually hit the focused node.
[email protected]bb37b652013-11-27 23:47:112079 blink::WebTextInputType text_input_type =
2080 GetWebView()->textInputInfo().type;
2081
2082 Send(new ViewHostMsg_FocusedNodeTouched(
2083 routing_id(), text_input_type != blink::WebTextInputTypeNone));
jdduke45762d22014-10-07 04:19:082084#endif
[email protected]c68c3e4e2013-01-24 00:36:562085}
2086
[email protected]6e89eb72013-07-23 13:28:222087void RenderViewImpl::initializeLayerTreeView() {
2088 RenderWidget::initializeLayerTreeView();
2089 RenderWidgetCompositor* rwc = compositor();
[email protected]9f7638f42014-05-30 01:51:162090 if (!rwc)
[email protected]6e89eb72013-07-23 13:28:222091 return;
[email protected]9f7638f42014-05-30 01:51:162092 if (webview() && webview()->devToolsAgent())
2093 webview()->devToolsAgent()->setLayerTreeId(rwc->GetLayerTreeId());
2094
ccameron1f89c002014-10-21 06:19:052095 bool use_threaded_event_handling = true;
2096#if defined(OS_MACOSX) && !defined(OS_IOS)
ccamerona7644752014-12-30 01:16:312097 // Disable threaded event handling if content is not handling the elastic
2098 // overscroll effect. This includes the cases where the elastic overscroll
2099 // effect is being handled by Blink (because of command line flags) and older
2100 // operating system versions which do not have an elastic overscroll effect
2101 // (SnowLeopard, which has Aqua scrollbars which need synchronous updates).
2102 use_threaded_event_handling = compositor_deps_->IsElasticOverscrollEnabled();
[email protected]9f7638f42014-05-30 01:51:162103#endif
ccameron1f89c002014-10-21 06:19:052104 if (use_threaded_event_handling) {
2105 RenderThreadImpl* render_thread = RenderThreadImpl::current();
2106 // render_thread may be NULL in tests.
2107 InputHandlerManager* input_handler_manager =
2108 render_thread ? render_thread->input_handler_manager() : NULL;
2109 if (input_handler_manager) {
2110 input_handler_manager->AddInputHandler(
2111 routing_id_, rwc->GetInputHandler(), AsWeakPtr());
2112 }
2113 }
[email protected]6e89eb72013-07-23 13:28:222114}
2115
[email protected]180ef242013-11-07 06:50:462116// blink::WebFrameClient -----------------------------------------------------
[email protected]3d9689372009-09-10 04:29:172117
[email protected]5e92282f2012-08-17 08:11:572118void RenderViewImpl::Repaint(const gfx::Size& size) {
[email protected]3d9ec5052013-01-02 22:05:252119 OnRepaint(size);
[email protected]5e92282f2012-08-17 08:11:572120}
2121
[email protected]b2324b092012-11-01 10:34:112122void RenderViewImpl::SetEditCommandForNextKeyEvent(const std::string& name,
2123 const std::string& value) {
2124 EditCommands edit_commands;
2125 edit_commands.push_back(EditCommand(name, value));
2126 OnSetEditCommandsForNextKeyEvent(edit_commands);
2127}
2128
2129void RenderViewImpl::ClearEditCommands() {
2130 edit_commands_.clear();
2131}
2132
[email protected]180ef242013-11-07 06:50:462133SSLStatus RenderViewImpl::GetSSLStatusOfFrame(blink::WebFrame* frame) const {
[email protected]83c0abca2013-07-23 20:09:422134 std::string security_info;
2135 if (frame && frame->dataSource())
2136 security_info = frame->dataSource()->response().securityInfo();
2137
2138 SSLStatus ssl_status;
2139 DeserializeSecurityInfo(security_info,
2140 &ssl_status.cert_id,
2141 &ssl_status.cert_status,
2142 &ssl_status.security_bits,
[email protected]0bbd63b2013-11-29 00:02:122143 &ssl_status.connection_status,
2144 &ssl_status.signed_certificate_timestamp_ids);
[email protected]83c0abca2013-07-23 20:09:422145 return ssl_status;
[email protected]e4495212012-12-06 03:09:122146}
2147
[email protected]b38806a2013-10-04 16:01:382148const std::string& RenderViewImpl::GetAcceptLanguages() const {
2149 return renderer_preferences_.accept_languages;
2150}
2151
[email protected]35b2a972014-04-04 15:50:222152void RenderViewImpl::didCreateDataSource(WebLocalFrame* frame,
2153 WebDataSource* ds) {
[email protected]45d83a12012-04-06 22:57:572154 bool content_initiated = !pending_navigation_params_.get();
2155
[email protected]f8872902013-10-30 03:18:572156 // Make sure any previous redirect URLs end up in our new data source.
2157 if (pending_navigation_params_.get()) {
2158 for (std::vector<GURL>::const_iterator i =
2159 pending_navigation_params_->redirects.begin();
2160 i != pending_navigation_params_->redirects.end(); ++i) {
2161 ds->appendRedirect(*i);
2162 }
2163 }
2164
[email protected]007733c2011-11-17 00:34:072165 DocumentState* document_state = DocumentState::FromDataSource(ds);
2166 if (!document_state) {
2167 document_state = new DocumentState;
2168 ds->setExtraData(document_state);
[email protected]45d83a12012-04-06 22:57:572169 if (!content_initiated)
2170 PopulateDocumentStateFromPending(document_state);
[email protected]007733c2011-11-17 00:34:072171 }
2172
[email protected]bf70edce2012-06-20 22:32:222173 // Carry over the user agent override flag, if it exists.
2174 if (content_initiated && webview() && webview()->mainFrame() &&
[email protected]82307f6b2014-08-07 03:30:122175 webview()->mainFrame()->isWebLocalFrame() &&
[email protected]bf70edce2012-06-20 22:32:222176 webview()->mainFrame()->dataSource()) {
2177 DocumentState* old_document_state =
2178 DocumentState::FromDataSource(webview()->mainFrame()->dataSource());
2179 if (old_document_state) {
[email protected]e20b88d2013-04-09 15:28:372180 InternalDocumentStateData* internal_data =
2181 InternalDocumentStateData::FromDocumentState(document_state);
2182 InternalDocumentStateData* old_internal_data =
2183 InternalDocumentStateData::FromDocumentState(old_document_state);
2184 internal_data->set_is_overriding_user_agent(
2185 old_internal_data->is_overriding_user_agent());
[email protected]bf70edce2012-06-20 22:32:222186 }
2187 }
2188
[email protected]3d9689372009-09-10 04:29:172189 // The rest of RenderView assumes that a WebDataSource will always have a
2190 // non-null NavigationState.
[email protected]e1ed5a12012-08-08 19:57:442191 if (content_initiated) {
[email protected]007733c2011-11-17 00:34:072192 document_state->set_navigation_state(
2193 NavigationState::CreateContentInitiated());
[email protected]e1ed5a12012-08-08 19:57:442194 } else {
[email protected]45d83a12012-04-06 22:57:572195 document_state->set_navigation_state(CreateNavigationStateFromPending());
2196 pending_navigation_params_.reset();
2197 }
[email protected]8a3125a712010-08-09 18:58:512198
[email protected]007733c2011-11-17 00:34:072199 // DocumentState::referred_by_prefetcher_ is true if we are
[email protected]8a3125a712010-08-09 18:58:512200 // navigating from a page that used prefetching using a link on that
2201 // page. We are early enough in the request process here that we
[email protected]007733c2011-11-17 00:34:072202 // can still see the DocumentState of the previous page and set
[email protected]8a3125a712010-08-09 18:58:512203 // this value appropriately.
2204 // TODO(gavinp): catch the important case of navigation in a new
2205 // renderer process.
2206 if (webview()) {
[email protected]e47aec52010-08-12 00:50:302207 if (WebFrame* old_frame = webview()->mainFrame()) {
[email protected]05c8e502010-08-15 15:13:522208 const WebURLRequest& original_request = ds->originalRequest();
[email protected]8a3125a712010-08-09 18:58:512209 const GURL referrer(
2210 original_request.httpHeaderField(WebString::fromUTF8("Referer")));
[email protected]82307f6b2014-08-07 03:30:122211 if (!referrer.is_empty() && old_frame->isWebLocalFrame() &&
2212 DocumentState::FromDataSource(old_frame->dataSource())
2213 ->was_prefetcher()) {
[email protected]82114f52012-03-20 22:53:412214 for (; old_frame; old_frame = old_frame->traverseNext(false)) {
[email protected]8a3125a712010-08-09 18:58:512215 WebDataSource* old_frame_ds = old_frame->dataSource();
2216 if (old_frame_ds && referrer == GURL(old_frame_ds->request().url())) {
[email protected]007733c2011-11-17 00:34:072217 document_state->set_was_referred_by_prefetcher(true);
[email protected]8a3125a712010-08-09 18:58:512218 break;
2219 }
2220 }
2221 }
2222 }
2223 }
2224
[email protected]4c1b6f0b2010-02-07 16:38:182225 if (content_initiated) {
[email protected]05c8e502010-08-15 15:13:522226 const WebURLRequest& request = ds->request();
[email protected]8a3125a712010-08-09 18:58:512227 switch (request.cachePolicy()) {
[email protected]4c1b6f0b2010-02-07 16:38:182228 case WebURLRequest::UseProtocolCachePolicy: // normal load.
[email protected]007733c2011-11-17 00:34:072229 document_state->set_load_type(DocumentState::LINK_LOAD_NORMAL);
[email protected]4c1b6f0b2010-02-07 16:38:182230 break;
2231 case WebURLRequest::ReloadIgnoringCacheData: // reload.
[email protected]22492062014-06-04 13:31:172232 case WebURLRequest::ReloadBypassingCache: // end-to-end reload.
[email protected]007733c2011-11-17 00:34:072233 document_state->set_load_type(DocumentState::LINK_LOAD_RELOAD);
[email protected]4c1b6f0b2010-02-07 16:38:182234 break;
2235 case WebURLRequest::ReturnCacheDataElseLoad: // allow stale data.
[email protected]007733c2011-11-17 00:34:072236 document_state->set_load_type(
2237 DocumentState::LINK_LOAD_CACHE_STALE_OK);
[email protected]4c1b6f0b2010-02-07 16:38:182238 break;
2239 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post.
[email protected]007733c2011-11-17 00:34:072240 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY);
[email protected]4c1b6f0b2010-02-07 16:38:182241 break;
[email protected]82f0e6c92014-06-02 08:18:392242 default:
2243 NOTREACHED();
[email protected]4c1b6f0b2010-02-07 16:38:182244 }
2245 }
[email protected]fa7b6b542009-11-03 05:02:302246
[email protected]946a0032011-03-31 18:42:282247 FOR_EACH_OBSERVER(
2248 RenderViewObserver, observers_, DidCreateDataSource(frame, ds));
[email protected]3d9689372009-09-10 04:29:172249}
2250
[email protected]45d83a12012-04-06 22:57:572251void RenderViewImpl::PopulateDocumentStateFromPending(
[email protected]007733c2011-11-17 00:34:072252 DocumentState* document_state) {
[email protected]c6bc20332014-02-28 18:30:392253 const FrameMsg_Navigate_Params& params = *pending_navigation_params_.get();
[email protected]45d83a12012-04-06 22:57:572254 document_state->set_request_time(params.request_time);
[email protected]007733c2011-11-17 00:34:072255
[email protected]e20b88d2013-04-09 15:28:372256 InternalDocumentStateData* internal_data =
2257 InternalDocumentStateData::FromDocumentState(document_state);
2258
clamy9bfeef42014-09-30 20:50:422259 if (!params.common_params.url.SchemeIs(url::kJavaScriptScheme) &&
2260 params.common_params.navigation_type == FrameMsg_Navigate_Type::RESTORE) {
[email protected]45d83a12012-04-06 22:57:572261 // We're doing a load of a page that was restored from the last session. By
2262 // default this prefers the cache over loading (LOAD_PREFERRING_CACHE) which
2263 // can result in stale data for pages that are set to expire. We explicitly
2264 // override that by setting the policy here so that as necessary we load
2265 // from the network.
[email protected]a8ff8ed2014-01-09 07:32:262266 //
2267 // TODO(davidben): Remove this in favor of passing a cache policy to the
2268 // loadHistoryItem call in OnNavigate. That requires not overloading
2269 // UseProtocolCachePolicy to mean both "normal load" and "determine cache
2270 // policy based on load type, etc".
[email protected]e20b88d2013-04-09 15:28:372271 internal_data->set_cache_policy_override(
[email protected]45d83a12012-04-06 22:57:572272 WebURLRequest::UseProtocolCachePolicy);
[email protected]007733c2011-11-17 00:34:072273 }
2274
clamy9bfeef42014-09-30 20:50:422275 if (IsReload(params.common_params.navigation_type))
[email protected]007733c2011-11-17 00:34:072276 document_state->set_load_type(DocumentState::RELOAD);
clamy9bfeef42014-09-30 20:50:422277 else if (params.commit_params.page_state.IsValid())
[email protected]007733c2011-11-17 00:34:072278 document_state->set_load_type(DocumentState::HISTORY_LOAD);
2279 else
2280 document_state->set_load_type(DocumentState::NORMAL_LOAD);
[email protected]ca662822012-05-11 17:53:592281
clamy9bfeef42014-09-30 20:50:422282 internal_data->set_is_overriding_user_agent(
2283 params.commit_params.is_overriding_user_agent);
[email protected]e20b88d2013-04-09 15:28:372284 internal_data->set_must_reset_scroll_and_scale_state(
clamy9bfeef42014-09-30 20:50:422285 params.common_params.navigation_type ==
2286 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL);
[email protected]951a64832012-10-11 16:26:372287 document_state->set_can_load_local_resources(params.can_load_local_resources);
[email protected]45d83a12012-04-06 22:57:572288}
[email protected]007733c2011-11-17 00:34:072289
[email protected]45d83a12012-04-06 22:57:572290NavigationState* RenderViewImpl::CreateNavigationStateFromPending() {
[email protected]c6bc20332014-02-28 18:30:392291 const FrameMsg_Navigate_Params& params = *pending_navigation_params_.get();
[email protected]45d83a12012-04-06 22:57:572292 NavigationState* navigation_state = NULL;
2293
2294 // A navigation resulting from loading a javascript URL should not be treated
2295 // as a browser initiated event. Instead, we want it to look as if the page
2296 // initiated any load resulting from JS execution.
clamy9bfeef42014-09-30 20:50:422297 if (!params.common_params.url.SchemeIs(url::kJavaScriptScheme)) {
[email protected]45d83a12012-04-06 22:57:572298 navigation_state = NavigationState::CreateBrowserInitiated(
2299 params.page_id,
2300 params.pending_history_list_offset,
[email protected]60d6cca2013-04-30 08:47:132301 params.should_clear_history_list,
clamy9bfeef42014-09-30 20:50:422302 params.common_params.transition);
[email protected]4972fc82013-11-19 04:33:422303 navigation_state->set_should_replace_current_entry(
2304 params.should_replace_current_entry);
[email protected]45d83a12012-04-06 22:57:572305 navigation_state->set_transferred_request_child_id(
2306 params.transferred_request_child_id);
2307 navigation_state->set_transferred_request_request_id(
2308 params.transferred_request_request_id);
clamy9bfeef42014-09-30 20:50:422309 navigation_state->set_allow_download(params.common_params.allow_download);
2310 navigation_state->set_extra_headers(params.request_params.extra_headers);
[email protected]45d83a12012-04-06 22:57:572311 } else {
2312 navigation_state = NavigationState::CreateContentInitiated();
2313 }
2314 return navigation_state;
[email protected]007733c2011-11-17 00:34:072315}
2316
[email protected]06181e52014-05-10 11:59:092317void RenderViewImpl::didClearWindowObject(WebLocalFrame* frame) {
2318 FOR_EACH_OBSERVER(
2319 RenderViewObserver, observers_, DidClearWindowObject(frame));
[email protected]29043082014-01-22 21:53:512320
[email protected]f5c9f0882014-02-16 22:19:322321 if (enabled_bindings_& BINDINGS_POLICY_WEB_UI)
2322 WebUIExtension::Install(frame);
2323
[email protected]caa8dc042014-01-13 12:07:582324 if (enabled_bindings_ & BINDINGS_POLICY_STATS_COLLECTION)
2325 StatsCollectionController::Install(frame);
[email protected]cdb6b1e2014-01-23 00:06:492326
avi83883c82014-12-23 00:08:492327 const base::CommandLine& command_line =
2328 *base::CommandLine::ForCurrentProcess();
[email protected]cdb6b1e2014-01-23 00:06:492329
2330 if (command_line.HasSwitch(switches::kEnableSkiaBenchmarking))
2331 SkiaBenchmarking::Install(frame);
[email protected]3fad220d2014-01-23 11:30:062332
jochen26f639922014-10-23 21:59:572333 if (command_line.HasSwitch(cc::switches::kEnableGpuBenchmarking))
2334 GpuBenchmarking::Install(frame);
2335
[email protected]3fad220d2014-01-23 11:30:062336 if (command_line.HasSwitch(switches::kEnableMemoryBenchmarking))
2337 MemoryBenchmarkingExtension::Install(frame);
[email protected]3d9689372009-09-10 04:29:172338}
2339
[email protected]35b2a972014-04-04 15:50:222340void RenderViewImpl::didChangeIcon(WebLocalFrame* frame,
[email protected]41225fe2013-03-29 05:32:022341 WebIconURL::Type icon_type) {
2342 if (frame->parent())
2343 return;
2344
2345 if (!TouchEnabled() && icon_type != WebIconURL::TypeFavicon)
2346 return;
2347
2348 WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type);
2349 std::vector<FaviconURL> urls;
2350 for (size_t i = 0; i < icon_urls.size(); i++) {
[email protected]2bd262b2014-04-16 05:31:232351 std::vector<gfx::Size> sizes;
[email protected]f34ac132014-03-20 23:02:052352 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes);
2353 urls.push_back(FaviconURL(
2354 icon_urls[i].iconURL(), ToFaviconType(icon_urls[i].iconType()), sizes));
[email protected]41225fe2013-03-29 05:32:022355 }
2356 SendUpdateFaviconURL(urls);
[email protected]5019ef12010-04-27 17:26:582357}
2358
[email protected]35b2a972014-04-04 15:50:222359void RenderViewImpl::didUpdateCurrentHistoryItem(WebLocalFrame* frame) {
avif937e1d2014-11-02 18:13:072360 StartNavStateSyncTimerIfNecessary();
[email protected]476b6f82009-09-10 21:00:592361}
2362
[email protected]310ebd6302011-10-10 19:06:282363void RenderViewImpl::CheckPreferredSize() {
[email protected]d812fd12011-05-27 23:05:072364 // We don't always want to send the change messages over IPC, only if we've
2365 // been put in that mode by getting a |ViewMsg_EnablePreferredSizeChangedMode|
2366 // message.
2367 if (!send_preferred_size_changes_ || !webview())
2368 return;
2369
[email protected]e76b7972013-06-06 02:58:482370 gfx::Size size = webview()->contentsPreferredMinimumSize();
[email protected]705243f2010-05-05 19:58:072371 if (size == preferred_size_)
2372 return;
[email protected]c27324b2009-11-19 22:44:292373
[email protected]705243f2010-05-05 19:58:072374 preferred_size_ = size;
2375 Send(new ViewHostMsg_DidContentsPreferredSizeChange(routing_id_,
2376 preferred_size_));
[email protected]3d9689372009-09-10 04:29:172377}
2378
[email protected]35b2a972014-04-04 15:50:222379void RenderViewImpl::didChangeScrollOffset(WebLocalFrame* frame) {
avif937e1d2014-11-02 18:13:072380 StartNavStateSyncTimerIfNecessary();
[email protected]dd6afca2011-08-13 03:44:312381}
2382
[email protected]55750b32012-09-21 14:05:032383void RenderViewImpl::SendFindReply(int request_id,
2384 int match_count,
2385 int ordinal,
2386 const WebRect& selection_rect,
2387 bool final_status_update) {
[email protected]55750b32012-09-21 14:05:032388 Send(new ViewHostMsg_Find_Reply(routing_id_,
2389 request_id,
2390 match_count,
2391 selection_rect,
2392 ordinal,
2393 final_status_update));
2394}
2395
[email protected]180ef242013-11-07 06:50:462396blink::WebString RenderViewImpl::acceptLanguages() {
[email protected]9982c802013-06-12 15:22:062397 return WebString::fromUTF8(renderer_preferences_.accept_languages);
2398}
2399
[email protected]180ef242013-11-07 06:50:462400// blink::WebPageSerializerClient implementation ------------------------------
[email protected]18d5be92011-07-25 18:00:192401
[email protected]310ebd6302011-10-10 19:06:282402void RenderViewImpl::didSerializeDataForFrame(
[email protected]18d5be92011-07-25 18:00:192403 const WebURL& frame_url,
2404 const WebCString& data,
2405 WebPageSerializerClient::PageSerializationStatus status) {
2406 Send(new ViewHostMsg_SendSerializedHtmlData(
2407 routing_id(),
2408 frame_url,
2409 data.data(),
2410 static_cast<int32>(status)));
2411}
2412
[email protected]e9ff79c2012-10-19 21:31:262413// RenderView implementation ---------------------------------------------------
[email protected]a2ef54c2011-10-10 16:20:312414
[email protected]310ebd6302011-10-10 19:06:282415bool RenderViewImpl::Send(IPC::Message* message) {
[email protected]a2ef54c2011-10-10 16:20:312416 return RenderWidget::Send(message);
2417}
2418
mostynbc33353232014-09-12 09:38:312419RenderFrameImpl* RenderViewImpl::GetMainRenderFrame() {
[email protected]b849847b2013-12-10 21:57:582420 return main_render_frame_.get();
2421}
2422
[email protected]82114f52012-03-20 22:53:412423int RenderViewImpl::GetRoutingID() const {
[email protected]a2ef54c2011-10-10 16:20:312424 return routing_id_;
2425}
2426
[email protected]82114f52012-03-20 22:53:412427gfx::Size RenderViewImpl::GetSize() const {
[email protected]a2ef54c2011-10-10 16:20:312428 return size();
2429}
2430
[email protected]82114f52012-03-20 22:53:412431WebPreferences& RenderViewImpl::GetWebkitPreferences() {
[email protected]a2ef54c2011-10-10 16:20:312432 return webkit_preferences_;
2433}
2434
[email protected]324825d2012-11-30 12:37:152435void RenderViewImpl::SetWebkitPreferences(const WebPreferences& preferences) {
2436 OnUpdateWebPreferences(preferences);
2437}
2438
[email protected]180ef242013-11-07 06:50:462439blink::WebView* RenderViewImpl::GetWebView() {
[email protected]a2ef54c2011-10-10 16:20:312440 return webview();
2441}
2442
[email protected]c39f7442014-02-27 03:33:172443blink::WebElement RenderViewImpl::GetFocusedElement() const {
[email protected]a2ef54c2011-10-10 16:20:312444 if (!webview())
[email protected]c39f7442014-02-27 03:33:172445 return WebElement();
[email protected]a2ef54c2011-10-10 16:20:312446 WebFrame* focused_frame = webview()->focusedFrame();
2447 if (focused_frame) {
2448 WebDocument doc = focused_frame->document();
2449 if (!doc.isNull())
[email protected]c39f7442014-02-27 03:33:172450 return doc.focusedElement();
[email protected]a2ef54c2011-10-10 16:20:312451 }
2452
[email protected]c39f7442014-02-27 03:33:172453 return WebElement();
[email protected]a2ef54c2011-10-10 16:20:312454}
2455
[email protected]2a84f9d2012-06-05 21:50:432456bool RenderViewImpl::IsEditableNode(const WebNode& node) const {
2457 if (node.isNull())
2458 return false;
2459
2460 if (node.isContentEditable())
2461 return true;
2462
2463 if (node.isElementNode()) {
2464 const WebElement& element = node.toConst<WebElement>();
ajith.ve77498c32014-10-22 05:32:292465 if (element.isTextFormControlElement()) {
2466 if (!(element.hasAttribute("readonly") ||
2467 element.hasAttribute("disabled")))
2468 return true;
2469 }
[email protected]2a84f9d2012-06-05 21:50:432470
2471 // Also return true if it has an ARIA role of 'textbox'.
2472 for (unsigned i = 0; i < element.attributeCount(); ++i) {
[email protected]df807042014-08-13 16:48:412473 if (LowerCaseEqualsASCII(element.attributeLocalName(i), "role")) {
2474 if (LowerCaseEqualsASCII(element.attributeValue(i), "textbox"))
[email protected]2a84f9d2012-06-05 21:50:432475 return true;
2476 break;
2477 }
[email protected]a2ef54c2011-10-10 16:20:312478 }
2479 }
[email protected]2a84f9d2012-06-05 21:50:432480
2481 return false;
[email protected]a2ef54c2011-10-10 16:20:312482}
2483
[email protected]91dcc6d32014-07-30 00:01:332484bool RenderViewImpl::NodeContainsPoint(const WebNode& node,
2485 const gfx::Point& point) const {
2486 blink::WebHitTestResult hit_test =
2487 webview()->hitTestResultAt(WebPoint(point.x(), point.y()));
2488 return node.containsIncludingShadowDOM(hit_test.node());
2489}
2490
[email protected]310ebd6302011-10-10 19:06:282491bool RenderViewImpl::ShouldDisplayScrollbars(int width, int height) const {
[email protected]a2ef54c2011-10-10 16:20:312492 return (!send_preferred_size_changes_ ||
2493 (disable_scrollbars_size_limit_.width() <= width ||
2494 disable_scrollbars_size_limit_.height() <= height));
2495}
2496
[email protected]82114f52012-03-20 22:53:412497int RenderViewImpl::GetEnabledBindings() const {
[email protected]a2ef54c2011-10-10 16:20:312498 return enabled_bindings_;
2499}
2500
avif937e1d2014-11-02 18:13:072501bool RenderViewImpl::GetContentStateImmediately() const {
2502 return send_content_state_immediately_;
[email protected]a2ef54c2011-10-10 16:20:312503}
2504
[email protected]180ef242013-11-07 06:50:462505blink::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const {
[email protected]a2ef54c2011-10-10 16:20:312506 return visibilityState();
2507}
2508
[email protected]3c71576ce2013-07-23 02:00:012509void RenderViewImpl::DidStartLoading() {
[email protected]6dd5c322014-03-12 07:58:462510 main_render_frame_->didStartLoading(true);
[email protected]3c71576ce2013-07-23 02:00:012511}
2512
2513void RenderViewImpl::DidStopLoading() {
[email protected]6dd5c322014-03-12 07:58:462514 main_render_frame_->didStopLoading();
[email protected]3c71576ce2013-07-23 02:00:012515}
2516
avif937e1d2014-11-02 18:13:072517void RenderViewImpl::SyncNavigationState() {
2518 if (!webview())
2519 return;
2520 SendUpdateState(history_controller_->GetCurrentEntry());
initial.commit09911bf2008-07-26 23:55:292521}
2522
[email protected]54ea9ff2014-03-20 00:27:542523blink::WebPlugin* RenderViewImpl::GetWebPluginForFind() {
2524 if (!webview())
2525 return NULL;
2526
2527 WebFrame* main_frame = webview()->mainFrame();
[email protected]82307f6b2014-08-07 03:30:122528 if (main_frame->isWebLocalFrame() &&
2529 main_frame->document().isPluginDocument())
[email protected]54ea9ff2014-03-20 00:27:542530 return webview()->mainFrame()->document().to<WebPluginDocument>().plugin();
2531
2532#if defined(ENABLE_PLUGINS)
2533 if (plugin_find_handler_)
2534 return plugin_find_handler_->container()->plugin();
2535#endif
2536
2537 return NULL;
[email protected]24a7f3c2010-03-25 08:26:492538}
2539
[email protected]55750b32012-09-21 14:05:032540void RenderViewImpl::OnFind(int request_id,
[email protected]fcf75d42013-12-03 20:11:262541 const base::string16& search_text,
[email protected]310ebd6302011-10-10 19:06:282542 const WebFindOptions& options) {
[email protected]26aa0482009-09-30 16:55:272543 WebFrame* main_frame = webview()->mainFrame();
[email protected]54ea9ff2014-03-20 00:27:542544 blink::WebPlugin* plugin = GetWebPluginForFind();
[email protected]872542532011-06-23 00:43:162545 // Check if the plugin still exists in the document.
[email protected]54ea9ff2014-03-20 00:27:542546 if (plugin) {
[email protected]24a7f3c2010-03-25 08:26:492547 if (options.findNext) {
2548 // Just navigate back/forward.
[email protected]54ea9ff2014-03-20 00:27:542549 plugin->selectFindResult(options.forward);
[email protected]24a7f3c2010-03-25 08:26:492550 } else {
[email protected]54ea9ff2014-03-20 00:27:542551 if (!plugin->startFind(
[email protected]afdbd142010-07-10 08:01:232552 search_text, options.matchCase, request_id)) {
[email protected]e7c58a32010-08-13 19:47:112553 // Send "no results".
[email protected]55750b32012-09-21 14:05:032554 SendFindReply(request_id, 0, 0, gfx::Rect(), true);
[email protected]24a7f3c2010-03-25 08:26:492555 }
2556 }
2557 return;
2558 }
2559
[email protected]b4bb2502009-10-01 22:35:272560 WebFrame* frame_after_main = main_frame->traverseNext(true);
[email protected]26aa0482009-09-30 16:55:272561 WebFrame* focused_frame = webview()->focusedFrame();
initial.commit09911bf2008-07-26 23:55:292562 WebFrame* search_frame = focused_frame; // start searching focused frame.
2563
2564 bool multi_frame = (frame_after_main != main_frame);
2565
2566 // If we have multiple frames, we don't want to wrap the search within the
2567 // frame, so we check here if we only have main_frame in the chain.
2568 bool wrap_within_frame = !multi_frame;
2569
[email protected]b3f2b912009-04-09 16:18:522570 WebRect selection_rect;
initial.commit09911bf2008-07-26 23:55:292571 bool result = false;
2572
[email protected]7830da3e2009-11-06 16:27:262573 // If something is selected when we start searching it means we cannot just
2574 // increment the current match ordinal; we need to re-generate it.
2575 WebRange current_selection = focused_frame->selectionRange();
2576
initial.commit09911bf2008-07-26 23:55:292577 do {
[email protected]dd7daa82009-08-10 05:46:452578 result = search_frame->find(
[email protected]7ea066a2009-04-06 20:21:592579 request_id, search_text, options, wrap_within_frame, &selection_rect);
initial.commit09911bf2008-07-26 23:55:292580
2581 if (!result) {
2582 // don't leave text selected as you move to the next frame.
[email protected]6dd17a8a2013-05-01 05:50:102583 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172584 GetFocusedElement());
initial.commit09911bf2008-07-26 23:55:292585
2586 // Find the next frame, but skip the invisible ones.
2587 do {
2588 // What is the next frame to search? (we might be going backwards). Note
2589 // that we specify wrap=true so that search_frame never becomes NULL.
[email protected]7ea066a2009-04-06 20:21:592590 search_frame = options.forward ?
[email protected]b4bb2502009-10-01 22:35:272591 search_frame->traverseNext(true) :
2592 search_frame->traversePrevious(true);
[email protected]dd7daa82009-08-10 05:46:452593 } while (!search_frame->hasVisibleContent() &&
2594 search_frame != focused_frame);
initial.commit09911bf2008-07-26 23:55:292595
[email protected]884db412008-11-24 23:46:502596 // Make sure selection doesn't affect the search operation in new frame.
[email protected]6dd17a8a2013-05-01 05:50:102597 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172598 GetFocusedElement());
initial.commit09911bf2008-07-26 23:55:292599
2600 // If we have multiple frames and we have wrapped back around to the
2601 // focused frame, we need to search it once more allowing wrap within
2602 // the frame, otherwise it will report 'no match' if the focused frame has
2603 // reported matches, but no frames after the focused_frame contain a
2604 // match for the search word(s).
2605 if (multi_frame && search_frame == focused_frame) {
[email protected]dd7daa82009-08-10 05:46:452606 result = search_frame->find(
[email protected]7ea066a2009-04-06 20:21:592607 request_id, search_text, options, true, // Force wrapping.
2608 &selection_rect);
initial.commit09911bf2008-07-26 23:55:292609 }
2610 }
2611
[email protected]26aa0482009-09-30 16:55:272612 webview()->setFocusedFrame(search_frame);
initial.commit09911bf2008-07-26 23:55:292613 } while (!result && search_frame != focused_frame);
2614
[email protected]7830da3e2009-11-06 16:27:262615 if (options.findNext && current_selection.isNull()) {
[email protected]4f3dc372009-02-24 00:10:292616 // Force the main_frame to report the actual count.
[email protected]dd7daa82009-08-10 05:46:452617 main_frame->increaseMatchCount(0, request_id);
[email protected]4f3dc372009-02-24 00:10:292618 } else {
2619 // If nothing is found, set result to "0 of 0", otherwise, set it to
2620 // "-1 of 1" to indicate that we found at least one item, but we don't know
2621 // yet what is active.
2622 int ordinal = result ? -1 : 0; // -1 here means, we might know more later.
2623 int match_count = result ? 1 : 0; // 1 here means possibly more coming.
initial.commit09911bf2008-07-26 23:55:292624
[email protected]4f3dc372009-02-24 00:10:292625 // If we find no matches then this will be our last status update.
2626 // Otherwise the scoping effort will send more results.
2627 bool final_status_update = !result;
initial.commit09911bf2008-07-26 23:55:292628
[email protected]55750b32012-09-21 14:05:032629 SendFindReply(request_id, match_count, ordinal, selection_rect,
2630 final_status_update);
initial.commit09911bf2008-07-26 23:55:292631
initial.commit09911bf2008-07-26 23:55:292632 // Scoping effort begins, starting with the mainframe.
2633 search_frame = main_frame;
2634
[email protected]dd7daa82009-08-10 05:46:452635 main_frame->resetMatchCount();
initial.commit09911bf2008-07-26 23:55:292636
2637 do {
2638 // Cancel all old scoping requests before starting a new one.
[email protected]dd7daa82009-08-10 05:46:452639 search_frame->cancelPendingScopingEffort();
initial.commit09911bf2008-07-26 23:55:292640
2641 // We don't start another scoping effort unless at least one match has
2642 // been found.
2643 if (result) {
2644 // Start new scoping request. If the scoping function determines that it
2645 // needs to scope, it will defer until later.
[email protected]dd7daa82009-08-10 05:46:452646 search_frame->scopeStringMatches(request_id,
[email protected]7ea066a2009-04-06 20:21:592647 search_text,
2648 options,
initial.commit09911bf2008-07-26 23:55:292649 true); // reset the tickmarks
2650 }
2651
2652 // Iterate to the next frame. The frame will not necessarily scope, for
2653 // example if it is not visible.
[email protected]b4bb2502009-10-01 22:35:272654 search_frame = search_frame->traverseNext(true);
initial.commit09911bf2008-07-26 23:55:292655 } while (search_frame != main_frame);
2656 }
2657}
2658
[email protected]e9ff79c2012-10-19 21:31:262659void RenderViewImpl::OnStopFinding(StopFindAction action) {
[email protected]24a7f3c2010-03-25 08:26:492660 WebView* view = webview();
2661 if (!view)
2662 return;
2663
[email protected]54ea9ff2014-03-20 00:27:542664 blink::WebPlugin* plugin = GetWebPluginForFind();
2665 if (plugin) {
2666 plugin->stopFind();
[email protected]24a7f3c2010-03-25 08:26:492667 return;
2668 }
2669
[email protected]e9ff79c2012-10-19 21:31:262670 bool clear_selection = action == STOP_FIND_ACTION_CLEAR_SELECTION;
[email protected]6dd17a8a2013-05-01 05:50:102671 if (clear_selection) {
2672 view->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172673 GetFocusedElement());
[email protected]6dd17a8a2013-05-01 05:50:102674 }
[email protected]24a7f3c2010-03-25 08:26:492675
2676 WebFrame* frame = view->mainFrame();
2677 while (frame) {
2678 frame->stopFinding(clear_selection);
2679 frame = frame->traverseNext(false);
2680 }
2681
[email protected]e9ff79c2012-10-19 21:31:262682 if (action == STOP_FIND_ACTION_ACTIVATE_SELECTION) {
[email protected]24a7f3c2010-03-25 08:26:492683 WebFrame* focused_frame = view->focusedFrame();
2684 if (focused_frame) {
2685 WebDocument doc = focused_frame->document();
2686 if (!doc.isNull()) {
[email protected]c39f7442014-02-27 03:33:172687 WebElement element = doc.focusedElement();
2688 if (!element.isNull())
2689 element.simulateClick();
[email protected]24a7f3c2010-03-25 08:26:492690 }
2691 }
2692 }
2693}
2694
[email protected]59363fc92012-09-05 03:46:312695#if defined(OS_ANDROID)
2696void RenderViewImpl::OnActivateNearestFindResult(int request_id,
2697 float x, float y) {
2698 if (!webview())
2699 return;
2700
2701 WebFrame* main_frame = webview()->mainFrame();
2702 WebRect selection_rect;
2703 int ordinal = main_frame->selectNearestFindMatch(WebFloatPoint(x, y),
2704 &selection_rect);
2705 if (ordinal == -1) {
2706 // Something went wrong, so send a no-op reply (force the main_frame to
2707 // report the current match count) in case the host is waiting for a
2708 // response due to rate-limiting).
2709 main_frame->increaseMatchCount(0, request_id);
2710 return;
2711 }
2712
[email protected]55750b32012-09-21 14:05:032713 SendFindReply(request_id,
2714 -1 /* number_of_matches */,
2715 ordinal,
2716 selection_rect,
2717 true /* final_update */);
[email protected]59363fc92012-09-05 03:46:312718}
2719
2720void RenderViewImpl::OnFindMatchRects(int current_version) {
2721 if (!webview())
2722 return;
2723
2724 WebFrame* main_frame = webview()->mainFrame();
2725 std::vector<gfx::RectF> match_rects;
2726
2727 int rects_version = main_frame->findMatchMarkersVersion();
2728 if (current_version != rects_version) {
2729 WebVector<WebFloatRect> web_match_rects;
2730 main_frame->findMatchRects(web_match_rects);
2731 match_rects.reserve(web_match_rects.size());
2732 for (size_t i = 0; i < web_match_rects.size(); ++i)
2733 match_rects.push_back(gfx::RectF(web_match_rects[i]));
2734 }
2735
2736 gfx::RectF active_rect = main_frame->activeFindMatchRect();
2737 Send(new ViewHostMsg_FindMatchRects_Reply(routing_id_,
2738 rects_version,
2739 match_rects,
2740 active_rect));
2741}
2742#endif
2743
[email protected]e9ff79c2012-10-19 21:31:262744void RenderViewImpl::OnZoom(PageZoom zoom) {
[email protected]40bd6582009-12-04 23:49:512745 if (!webview()) // Not sure if this can happen, but no harm in being safe.
2746 return;
2747
[email protected]258d31122010-05-09 10:59:412748 webview()->hidePopups();
[email protected]854ab5462011-11-22 20:48:102749
[email protected]b75b8292010-10-01 07:28:252750 double old_zoom_level = webview()->zoomLevel();
2751 double zoom_level;
[email protected]e9ff79c2012-10-19 21:31:262752 if (zoom == PAGE_ZOOM_RESET) {
[email protected]b75b8292010-10-01 07:28:252753 zoom_level = 0;
2754 } else if (static_cast<int>(old_zoom_level) == old_zoom_level) {
2755 // Previous zoom level is a whole number, so just increment/decrement.
[email protected]54087fe2011-10-28 22:02:482756 zoom_level = old_zoom_level + zoom;
[email protected]b75b8292010-10-01 07:28:252757 } else {
2758 // Either the user hit the zoom factor limit and thus the zoom level is now
2759 // not a whole number, or a plugin changed it to a custom value. We want
2760 // to go to the next whole number so that the user can always get back to
2761 // 100% with the keyboard/menu.
[email protected]54087fe2011-10-28 22:02:482762 if ((old_zoom_level > 1 && zoom > 0) ||
2763 (old_zoom_level < 1 && zoom < 0)) {
2764 zoom_level = static_cast<int>(old_zoom_level + zoom);
[email protected]b75b8292010-10-01 07:28:252765 } else {
2766 // We're going towards 100%, so first go to the next whole number.
2767 zoom_level = static_cast<int>(old_zoom_level);
2768 }
2769 }
[email protected]91219702013-09-18 07:33:512770 webview()->setZoomLevel(zoom_level);
[email protected]47578fa02011-11-02 19:34:412771 zoomLevelChanged();
2772}
2773
[email protected]310ebd6302011-10-10 19:06:282774void RenderViewImpl::OnSetZoomLevelForLoadingURL(const GURL& url,
2775 double zoom_level) {
[email protected]cbe55d22013-02-14 17:04:332776#if !defined(OS_ANDROID)
2777 // On Android, page zoom isn't used, and in case of WebView, text zoom is used
2778 // for legacy WebView text scaling emulation. Thus, the code that resets
2779 // the zoom level from this map will be effectively resetting text zoom level.
[email protected]9d797f32010-04-23 07:17:542780 host_zoom_levels_[url] = zoom_level;
[email protected]cbe55d22013-02-14 17:04:332781#endif
initial.commit09911bf2008-07-26 23:55:292782}
2783
[email protected]d42bf472014-06-14 01:49:382784void RenderViewImpl::OnSetZoomLevelForView(bool uses_temporary_zoom_level,
2785 double level) {
2786 uses_temporary_zoom_level_ = uses_temporary_zoom_level;
2787
2788 webview()->hidePopups();
2789 webview()->setZoomLevel(level);
2790}
2791
[email protected]310ebd6302011-10-10 19:06:282792void RenderViewImpl::OnSetPageEncoding(const std::string& encoding_name) {
[email protected]26aa0482009-09-30 16:55:272793 webview()->setPageEncoding(WebString::fromUTF8(encoding_name));
initial.commit09911bf2008-07-26 23:55:292794}
2795
[email protected]310ebd6302011-10-10 19:06:282796void RenderViewImpl::OnResetPageEncodingToDefault() {
[email protected]26aa0482009-09-30 16:55:272797 WebString no_encoding;
2798 webview()->setPageEncoding(no_encoding);
[email protected]a697f4c2009-09-14 22:30:182799}
2800
[email protected]f546640b2012-05-15 00:03:492801void RenderViewImpl::OnPostMessageEvent(
2802 const ViewMsg_PostMessage_Params& params) {
[email protected]bf4a2312013-04-23 00:32:112803 // TODO(nasko): Support sending to subframes.
[email protected]e12dbe6f2012-10-04 22:11:192804 WebFrame* frame = webview()->mainFrame();
[email protected]f546640b2012-05-15 00:03:492805
2806 // Find the source frame if it exists.
[email protected]f546640b2012-05-15 00:03:492807 WebFrame* source_frame = NULL;
2808 if (params.source_routing_id != MSG_ROUTING_NONE) {
2809 RenderViewImpl* source_view = FromRoutingID(params.source_routing_id);
2810 if (source_view)
[email protected]e12dbe6f2012-10-04 22:11:192811 source_frame = source_view->webview()->mainFrame();
[email protected]f546640b2012-05-15 00:03:492812 }
2813
[email protected]0bc7f3542013-10-21 15:05:532814 // If the message contained MessagePorts, create the corresponding endpoints.
2815 DCHECK_EQ(params.message_port_ids.size(), params.new_routing_ids.size());
[email protected]180ef242013-11-07 06:50:462816 blink::WebMessagePortChannelArray channels(params.message_port_ids.size());
[email protected]0bc7f3542013-10-21 15:05:532817 for (size_t i = 0;
2818 i < params.message_port_ids.size() && i < params.new_routing_ids.size();
2819 ++i) {
2820 channels[i] =
2821 new WebMessagePortChannelImpl(params.new_routing_ids[i],
2822 params.message_port_ids[i],
2823 base::MessageLoopProxy::current().get());
2824 }
2825
[email protected]afe7d90d2014-07-19 05:10:222826 WebSerializedScriptValue serialized_script_value;
2827 if (params.is_data_raw_string) {
2828 v8::HandleScope handle_scope(blink::mainThreadIsolate());
2829 v8::Local<v8::Context> context = frame->mainWorldScriptContext();
2830 v8::Context::Scope context_scope(context);
2831 V8ValueConverterImpl converter;
2832 converter.SetDateAllowed(true);
2833 converter.SetRegExpAllowed(true);
2834 scoped_ptr<base::Value> value(new base::StringValue(params.data));
2835 v8::Handle<v8::Value> result_value = converter.ToV8Value(value.get(),
2836 context);
2837 serialized_script_value = WebSerializedScriptValue::serialize(result_value);
2838 } else {
2839 serialized_script_value = WebSerializedScriptValue::fromString(params.data);
2840 }
2841
[email protected]f546640b2012-05-15 00:03:492842 // Create an event with the message. The final parameter to initMessageEvent
2843 // is the last event ID, which is not used with postMessage.
2844 WebDOMEvent event = frame->document().createEvent("MessageEvent");
2845 WebDOMMessageEvent msg_event = event.to<WebDOMMessageEvent>();
2846 msg_event.initMessageEvent("message",
2847 // |canBubble| and |cancellable| are always false
2848 false, false,
[email protected]afe7d90d2014-07-19 05:10:222849 serialized_script_value,
[email protected]0bc7f3542013-10-21 15:05:532850 params.source_origin, source_frame, "", channels);
[email protected]f546640b2012-05-15 00:03:492851
2852 // We must pass in the target_origin to do the security check on this side,
2853 // since it may have changed since the original postMessage call was made.
2854 WebSecurityOrigin target_origin;
2855 if (!params.target_origin.empty()) {
2856 target_origin =
2857 WebSecurityOrigin::createFromString(WebString(params.target_origin));
2858 }
2859 frame->dispatchMessageEventWithOriginCheck(target_origin, msg_event);
2860}
2861
[email protected]310ebd6302011-10-10 19:06:282862void RenderViewImpl::OnAllowBindings(int enabled_bindings_flags) {
[email protected]940ed1d2012-11-27 21:03:212863 if ((enabled_bindings_flags & BINDINGS_POLICY_WEB_UI) &&
2864 !(enabled_bindings_ & BINDINGS_POLICY_WEB_UI)) {
[email protected]69a0a132014-03-26 16:45:022865 // WebUIExtensionData deletes itself when we're destroyed.
[email protected]940ed1d2012-11-27 21:03:212866 new WebUIExtensionData(this);
[email protected]69a0a132014-03-26 16:45:022867 // WebUIMojo deletes itself when we're destroyed.
2868 new WebUIMojo(this);
[email protected]940ed1d2012-11-27 21:03:212869 }
2870
[email protected]81e63782009-02-27 19:35:092871 enabled_bindings_ |= enabled_bindings_flags;
[email protected]744c2a22012-03-15 18:42:042872
2873 // Keep track of the total bindings accumulated in this process.
2874 RenderProcess::current()->AddBindings(enabled_bindings_flags);
initial.commit09911bf2008-07-26 23:55:292875}
2876
[email protected]dc293a72013-07-01 11:11:222877void RenderViewImpl::OnDragTargetDragEnter(const DropData& drop_data,
[email protected]310ebd6302011-10-10 19:06:282878 const gfx::Point& client_point,
2879 const gfx::Point& screen_point,
[email protected]1f2230b2012-05-17 23:43:422880 WebDragOperationsMask ops,
2881 int key_modifiers) {
[email protected]59f4f2fa2011-03-23 01:00:552882 WebDragOperation operation = webview()->dragTargetDragEnter(
[email protected]dc293a72013-07-01 11:11:222883 DropDataToWebDragData(drop_data),
[email protected]59f4f2fa2011-03-23 01:00:552884 client_point,
2885 screen_point,
[email protected]1f2230b2012-05-17 23:43:422886 ops,
2887 key_modifiers);
[email protected]59f4f2fa2011-03-23 01:00:552888
2889 Send(new DragHostMsg_UpdateDragCursor(routing_id_, operation));
2890}
2891
[email protected]310ebd6302011-10-10 19:06:282892void RenderViewImpl::OnDragTargetDragOver(const gfx::Point& client_point,
2893 const gfx::Point& screen_point,
[email protected]1f2230b2012-05-17 23:43:422894 WebDragOperationsMask ops,
2895 int key_modifiers) {
[email protected]59f4f2fa2011-03-23 01:00:552896 WebDragOperation operation = webview()->dragTargetDragOver(
2897 client_point,
2898 screen_point,
[email protected]1f2230b2012-05-17 23:43:422899 ops,
2900 key_modifiers);
[email protected]59f4f2fa2011-03-23 01:00:552901
2902 Send(new DragHostMsg_UpdateDragCursor(routing_id_, operation));
2903}
2904
[email protected]310ebd6302011-10-10 19:06:282905void RenderViewImpl::OnDragTargetDragLeave() {
[email protected]59f4f2fa2011-03-23 01:00:552906 webview()->dragTargetDragLeave();
2907}
2908
[email protected]310ebd6302011-10-10 19:06:282909void RenderViewImpl::OnDragTargetDrop(const gfx::Point& client_point,
[email protected]1f2230b2012-05-17 23:43:422910 const gfx::Point& screen_point,
2911 int key_modifiers) {
2912 webview()->dragTargetDrop(client_point, screen_point, key_modifiers);
[email protected]fcad49452011-06-28 17:11:572913
2914 Send(new DragHostMsg_TargetDrop_ACK(routing_id_));
[email protected]59f4f2fa2011-03-23 01:00:552915}
2916
[email protected]7a6d773f2014-04-04 01:25:092917void RenderViewImpl::OnDragSourceEnded(const gfx::Point& client_point,
2918 const gfx::Point& screen_point,
2919 WebDragOperation op) {
2920 webview()->dragSourceEndedAt(client_point, screen_point, op);
initial.commit09911bf2008-07-26 23:55:292921}
2922
[email protected]310ebd6302011-10-10 19:06:282923void RenderViewImpl::OnDragSourceSystemDragEnded() {
[email protected]26aa0482009-09-30 16:55:272924 webview()->dragSourceSystemDragEnded();
initial.commit09911bf2008-07-26 23:55:292925}
2926
[email protected]310ebd6302011-10-10 19:06:282927void RenderViewImpl::OnUpdateWebPreferences(const WebPreferences& prefs) {
[email protected]2fab253a2009-08-17 23:00:592928 webkit_preferences_ = prefs;
[email protected]49a20002013-08-18 12:43:312929 ApplyWebPreferences(webkit_preferences_, webview());
initial.commit09911bf2008-07-26 23:55:292930}
2931
[email protected]310ebd6302011-10-10 19:06:282932void RenderViewImpl::OnEnumerateDirectoryResponse(
[email protected]600ea402011-04-12 00:01:512933 int id,
[email protected]c42de732013-02-16 06:26:312934 const std::vector<base::FilePath>& paths) {
[email protected]600ea402011-04-12 00:01:512935 if (!enumeration_completions_[id])
2936 return;
2937
2938 WebVector<WebString> ws_file_names(paths.size());
2939 for (size_t i = 0; i < paths.size(); ++i)
[email protected]728c2ee2013-06-25 04:01:072940 ws_file_names[i] = paths[i].AsUTF16Unsafe();
[email protected]600ea402011-04-12 00:01:512941
2942 enumeration_completions_[id]->didChooseFile(ws_file_names);
2943 enumeration_completions_.erase(id);
2944}
2945
[email protected]fb11b6a42012-03-14 07:25:122946void RenderViewImpl::OnFileChooserResponse(
hirono570357bd2014-10-08 12:39:272947 const std::vector<content::FileChooserFileInfo>& files) {
[email protected]8029f5672009-03-20 22:33:362948 // This could happen if we navigated to a different page before the user
2949 // closed the chooser.
[email protected]cdaf8d02010-03-30 19:52:472950 if (file_chooser_completions_.empty())
[email protected]8029f5672009-03-20 22:33:362951 return;
2952
[email protected]b5188522012-03-15 00:18:042953 // Convert Chrome's SelectedFileInfo list to WebKit's.
2954 WebVector<WebFileChooserCompletion::SelectedFileInfo> selected_files(
2955 files.size());
2956 for (size_t i = 0; i < files.size(); ++i) {
2957 WebFileChooserCompletion::SelectedFileInfo selected_file;
hirono570357bd2014-10-08 12:39:272958 selected_file.path = files[i].file_path.AsUTF16Unsafe();
[email protected]728c2ee2013-06-25 04:01:072959 selected_file.displayName =
2960 base::FilePath(files[i].display_name).AsUTF16Unsafe();
hironoe9f2732b2014-10-22 08:06:412961 if (files[i].file_system_url.is_valid()) {
2962 selected_file.fileSystemURL = files[i].file_system_url;
2963 selected_file.length = files[i].length;
2964 selected_file.modificationTime = files[i].modification_time.ToDoubleT();
2965 selected_file.isDirectory = files[i].is_directory;
2966 }
[email protected]b5188522012-03-15 00:18:042967 selected_files[i] = selected_file;
2968 }
[email protected]a1128322009-10-06 18:38:462969
[email protected]cdaf8d02010-03-30 19:52:472970 if (file_chooser_completions_.front()->completion)
[email protected]b5188522012-03-15 00:18:042971 file_chooser_completions_.front()->completion->didChooseFile(
2972 selected_files);
[email protected]cdaf8d02010-03-30 19:52:472973 file_chooser_completions_.pop_front();
2974
2975 // If there are more pending file chooser requests, schedule one now.
2976 if (!file_chooser_completions_.empty()) {
2977 Send(new ViewHostMsg_RunFileChooser(routing_id_,
2978 file_chooser_completions_.front()->params));
2979 }
initial.commit09911bf2008-07-26 23:55:292980}
2981
[email protected]244ac1892011-12-02 17:04:472982void RenderViewImpl::OnEnableAutoResize(const gfx::Size& min_size,
2983 const gfx::Size& max_size) {
2984 DCHECK(disable_scrollbars_size_limit_.IsEmpty());
2985 if (!webview())
2986 return;
[email protected]97e1bf72013-03-06 14:06:052987 auto_resize_mode_ = true;
[email protected]61e2b3cc2012-03-02 16:13:342988 webview()->enableAutoResizeMode(min_size, max_size);
2989}
2990
2991void RenderViewImpl::OnDisableAutoResize(const gfx::Size& new_size) {
2992 DCHECK(disable_scrollbars_size_limit_.IsEmpty());
2993 if (!webview())
2994 return;
[email protected]97e1bf72013-03-06 14:06:052995 auto_resize_mode_ = false;
[email protected]61e2b3cc2012-03-02 16:13:342996 webview()->disableAutoResizeMode();
2997
[email protected]eac2b362013-05-22 07:01:452998 if (!new_size.IsEmpty()) {
2999 Resize(new_size,
3000 physical_backing_size_,
dtrainorcb7779b82014-12-04 01:08:023001 top_controls_shrink_blink_size_,
3002 top_controls_height_,
[email protected]bb6378fe2014-04-28 21:19:443003 visible_viewport_size_,
[email protected]eac2b362013-05-22 07:01:453004 resizer_rect_,
3005 is_fullscreen_,
3006 NO_RESIZE_ACK);
3007 }
[email protected]244ac1892011-12-02 17:04:473008}
3009
[email protected]2bf834f2011-11-17 20:02:213010void RenderViewImpl::OnEnablePreferredSizeChangedMode() {
[email protected]9fb325e2010-05-06 18:23:243011 if (send_preferred_size_changes_)
3012 return;
[email protected]9fb325e2010-05-06 18:23:243013 send_preferred_size_changes_ = true;
[email protected]770dd8b2010-05-24 18:11:393014
[email protected]d812fd12011-05-27 23:05:073015 // Start off with an initial preferred size notification (in case
3016 // |didUpdateLayout| was already called).
[email protected]169d4282011-11-30 19:33:593017 didUpdateLayout();
[email protected]0666aef2009-05-13 19:48:083018}
3019
[email protected]310ebd6302011-10-10 19:06:283020void RenderViewImpl::OnDisableScrollbarsForSmallWindows(
[email protected]cda45c02010-02-25 19:28:103021 const gfx::Size& disable_scrollbar_size_limit) {
3022 disable_scrollbars_size_limit_ = disable_scrollbar_size_limit;
3023}
3024
[email protected]310ebd6302011-10-10 19:06:283025void RenderViewImpl::OnSetRendererPrefs(
[email protected]e9ff79c2012-10-19 21:31:263026 const RendererPreferences& renderer_prefs) {
[email protected]d051d9a2011-12-10 02:02:503027 double old_zoom_level = renderer_preferences_.default_zoom_level;
[email protected]ebd5ea52014-05-28 14:51:153028 std::string old_accept_languages = renderer_preferences_.accept_languages;
3029
[email protected]80d96fa2009-06-10 22:34:513030 renderer_preferences_ = renderer_prefs;
[email protected]6e282c92009-07-24 01:19:373031 UpdateFontRenderingFromRendererPrefs();
[email protected]38a85712013-01-02 22:45:023032
[email protected]dcc297772014-04-10 22:20:523033#if defined(USE_DEFAULT_RENDER_THEME)
[email protected]1596efb2013-01-17 22:13:013034 if (renderer_prefs.use_custom_colors) {
[email protected]180ef242013-11-07 06:50:463035 WebColorName name = blink::WebColorWebkitFocusRingColor;
3036 blink::setNamedColors(&name, &renderer_prefs.focus_ring_color, 1);
3037 blink::setCaretBlinkInterval(renderer_prefs.caret_blink_interval);
[email protected]1596efb2013-01-17 22:13:013038
3039 if (webview()) {
[email protected]1596efb2013-01-17 22:13:013040 webview()->setSelectionColors(
3041 renderer_prefs.active_selection_bg_color,
3042 renderer_prefs.active_selection_fg_color,
3043 renderer_prefs.inactive_selection_bg_color,
3044 renderer_prefs.inactive_selection_fg_color);
3045 webview()->themeChanged();
3046 }
[email protected]644d77e2010-01-27 01:03:103047 }
[email protected]c997bc42014-04-11 18:25:583048#endif // defined(USE_DEFAULT_RENDER_THEME)
[email protected]d299d972012-03-23 02:26:553049
[email protected]d051d9a2011-12-10 02:02:503050 // If the zoom level for this page matches the old zoom default, and this
3051 // is not a plugin, update the zoom level to match the new default.
[email protected]82307f6b2014-08-07 03:30:123052 if (webview() && webview()->mainFrame()->isWebLocalFrame() &&
3053 !webview()->mainFrame()->document().isPluginDocument() &&
[email protected]cbe55d22013-02-14 17:04:333054 !ZoomValuesEqual(old_zoom_level,
3055 renderer_preferences_.default_zoom_level) &&
[email protected]e9ff79c2012-10-19 21:31:263056 ZoomValuesEqual(webview()->zoomLevel(), old_zoom_level)) {
[email protected]91219702013-09-18 07:33:513057 webview()->setZoomLevel(renderer_preferences_.default_zoom_level);
[email protected]d051d9a2011-12-10 02:02:503058 zoomLevelChanged();
3059 }
[email protected]ebd5ea52014-05-28 14:51:153060
3061 if (webview() &&
3062 old_accept_languages != renderer_preferences_.accept_languages) {
3063 webview()->acceptLanguagesChanged();
3064 }
[email protected]80d96fa2009-06-10 22:34:513065}
3066
[email protected]310ebd6302011-10-10 19:06:283067void RenderViewImpl::OnMediaPlayerActionAt(const gfx::Point& location,
3068 const WebMediaPlayerAction& action) {
[email protected]952cb702009-10-07 05:50:283069 if (webview())
3070 webview()->performMediaPlayerAction(action, location);
[email protected]581b87eb2009-07-23 23:06:563071}
3072
[email protected]fcdc5642014-05-09 14:32:243073void RenderViewImpl::OnOrientationChange() {
dchenged9f6c1c2014-09-23 06:13:133074 webview()->mainFrame()->toWebLocalFrame()->sendOrientationChangeEvent();
[email protected]77829642012-05-15 14:47:173075}
3076
[email protected]81375e872012-01-11 21:40:363077void RenderViewImpl::OnPluginActionAt(const gfx::Point& location,
3078 const WebPluginAction& action) {
3079 if (webview())
3080 webview()->performPluginAction(action, location);
3081}
3082
[email protected]310ebd6302011-10-10 19:06:283083void RenderViewImpl::OnGetAllSavableResourceLinksForCurrentPage(
[email protected]18d5be92011-07-25 18:00:193084 const GURL& page_url) {
3085 // Prepare list to storage all savable resource links.
3086 std::vector<GURL> resources_list;
[email protected]c2d986512012-05-12 00:22:463087 std::vector<GURL> referrer_urls_list;
[email protected]180ef242013-11-07 06:50:463088 std::vector<blink::WebReferrerPolicy> referrer_policies_list;
[email protected]18d5be92011-07-25 18:00:193089 std::vector<GURL> frames_list;
[email protected]12a936d2013-05-15 04:55:493090 SavableResourcesResult result(&resources_list,
3091 &referrer_urls_list,
3092 &referrer_policies_list,
3093 &frames_list);
[email protected]18d5be92011-07-25 18:00:193094
[email protected]e9ff79c2012-10-19 21:31:263095 // webkit/ doesn't know about Referrer.
[email protected]12a936d2013-05-15 04:55:493096 if (!GetAllSavableResourceLinksForCurrentPage(
[email protected]18d5be92011-07-25 18:00:193097 webview(),
3098 page_url,
3099 &result,
[email protected]e9ff79c2012-10-19 21:31:263100 const_cast<const char**>(GetSavableSchemes()))) {
[email protected]18d5be92011-07-25 18:00:193101 // If something is wrong when collecting all savable resource links,
3102 // send empty list to embedder(browser) to tell it failed.
[email protected]c2d986512012-05-12 00:22:463103 referrer_urls_list.clear();
3104 referrer_policies_list.clear();
[email protected]18d5be92011-07-25 18:00:193105 resources_list.clear();
3106 frames_list.clear();
3107 }
3108
[email protected]e9ff79c2012-10-19 21:31:263109 std::vector<Referrer> referrers_list;
[email protected]c2d986512012-05-12 00:22:463110 CHECK_EQ(referrer_urls_list.size(), referrer_policies_list.size());
3111 for (unsigned i = 0; i < referrer_urls_list.size(); ++i) {
3112 referrers_list.push_back(
[email protected]e9ff79c2012-10-19 21:31:263113 Referrer(referrer_urls_list[i], referrer_policies_list[i]));
[email protected]c2d986512012-05-12 00:22:463114 }
3115
[email protected]18d5be92011-07-25 18:00:193116 // Send result of all savable resource links to embedder.
3117 Send(new ViewHostMsg_SendCurrentPageAllSavableResourceLinks(routing_id(),
3118 resources_list,
3119 referrers_list,
3120 frames_list));
3121}
3122
[email protected]310ebd6302011-10-10 19:06:283123void RenderViewImpl::OnGetSerializedHtmlDataForCurrentPageWithLocalLinks(
[email protected]18d5be92011-07-25 18:00:193124 const std::vector<GURL>& links,
[email protected]c42de732013-02-16 06:26:313125 const std::vector<base::FilePath>& local_paths,
3126 const base::FilePath& local_directory_name) {
[email protected]18d5be92011-07-25 18:00:193127
3128 // Convert std::vector of GURLs to WebVector<WebURL>
3129 WebVector<WebURL> weburl_links(links);
3130
[email protected]728c2ee2013-06-25 04:01:073131 // Convert std::vector of base::FilePath to WebVector<WebString>
[email protected]18d5be92011-07-25 18:00:193132 WebVector<WebString> webstring_paths(local_paths.size());
3133 for (size_t i = 0; i < local_paths.size(); i++)
[email protected]728c2ee2013-06-25 04:01:073134 webstring_paths[i] = local_paths[i].AsUTF16Unsafe();
[email protected]18d5be92011-07-25 18:00:193135
[email protected]35b2a972014-04-04 15:50:223136 WebPageSerializer::serialize(webview()->mainFrame()->toWebLocalFrame(),
3137 true,
3138 this,
3139 weburl_links,
[email protected]18d5be92011-07-25 18:00:193140 webstring_paths,
[email protected]728c2ee2013-06-25 04:01:073141 local_directory_name.AsUTF16Unsafe());
[email protected]18d5be92011-07-25 18:00:193142}
3143
[email protected]88f10a22013-11-06 21:22:123144void RenderViewImpl::OnSuppressDialogsUntilSwapOut() {
3145 // Don't show any more dialogs until we finish OnSwapOut.
3146 suppress_dialogs_until_swap_out_ = true;
3147}
3148
[email protected]310ebd6302011-10-10 19:06:283149void RenderViewImpl::OnClosePage() {
[email protected]77fc9b92011-10-15 16:20:373150 FOR_EACH_OBSERVER(RenderViewObserver, observers_, ClosePage());
initial.commit09911bf2008-07-26 23:55:293151 // TODO(creis): We'd rather use webview()->Close() here, but that currently
3152 // sets the WebView's delegate_ to NULL, preventing any JavaScript dialogs
3153 // in the onunload handler from appearing. For now, we're bypassing that and
3154 // calling the FrameLoader's CloseURL method directly. This should be
3155 // revisited to avoid having two ways to close a page. Having a single way
3156 // to close that can run onunload is also useful for fixing
3157 // http://b/issue?id=753080.
[email protected]11fd5db2014-04-02 03:49:463158 webview()->mainFrame()->dispatchUnloadEvent();
initial.commit09911bf2008-07-26 23:55:293159
[email protected]992db4c2011-05-12 15:37:153160 Send(new ViewHostMsg_ClosePage_ACK(routing_id_));
initial.commit09911bf2008-07-26 23:55:293161}
3162
[email protected]310ebd6302011-10-10 19:06:283163void RenderViewImpl::OnThemeChanged() {
[email protected]e8d6b9f2011-10-10 22:21:023164#if defined(USE_AURA)
3165 // Aura doesn't care if we switch themes.
3166#elif defined(OS_WIN)
[email protected]f78452f2012-05-15 02:07:523167 ui::NativeThemeWin::instance()->CloseHandles();
[email protected]f98d7e3c2010-09-13 22:30:463168 if (webview())
3169 webview()->themeChanged();
[email protected]6c8afae52009-01-22 02:24:573170#else // defined(OS_WIN)
3171 // TODO(port): we don't support theming on non-Windows platforms yet
3172 NOTIMPLEMENTED();
3173#endif
initial.commit09911bf2008-07-26 23:55:293174}
3175
[email protected]310ebd6302011-10-10 19:06:283176void RenderViewImpl::OnMoveOrResizeStarted() {
[email protected]30f75e62009-02-25 22:01:003177 if (webview())
[email protected]a72a1fa2010-05-03 22:18:473178 webview()->hidePopups();
[email protected]30f75e62009-02-25 22:01:003179}
3180
[email protected]0fdd5012013-05-29 08:05:563181void RenderViewImpl::OnResize(const ViewMsg_Resize_Params& params) {
[email protected]189a8862014-07-18 00:27:533182 TRACE_EVENT0("renderer", "RenderViewImpl::OnResize");
[email protected]cda45c02010-02-25 19:28:103183 if (webview()) {
[email protected]a72a1fa2010-05-03 22:18:473184 webview()->hidePopups();
[email protected]cda45c02010-02-25 19:28:103185 if (send_preferred_size_changes_) {
[email protected]7339cd22010-10-27 00:11:203186 webview()->mainFrame()->setCanHaveScrollbars(
[email protected]0fdd5012013-05-29 08:05:563187 ShouldDisplayScrollbars(params.new_size.width(),
3188 params.new_size.height()));
[email protected]cda45c02010-02-25 19:28:103189 }
3190 }
3191
[email protected]cbbdeef2014-05-26 15:57:363192 gfx::Size old_visible_viewport_size = visible_viewport_size_;
3193
[email protected]0fdd5012013-05-29 08:05:563194 RenderWidget::OnResize(params);
[email protected]cbbdeef2014-05-26 15:57:363195
3196 if (old_visible_viewport_size != visible_viewport_size_)
3197 has_scrolled_focused_editable_node_into_rect_ = false;
[email protected]30f75e62009-02-25 22:01:003198}
[email protected]0aa477bd2009-03-23 22:21:433199
[email protected]310ebd6302011-10-10 19:06:283200void RenderViewImpl::DidInitiatePaint() {
[email protected]ea2fb972013-08-07 05:44:263201#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573202 // Notify all instances that we painted. The same caveats apply as for
3203 // ViewFlushedPaint regarding instances closing themselves, so we take
3204 // similar precautions.
3205 PepperPluginSet plugins = active_pepper_instances_;
3206 for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) {
3207 if (active_pepper_instances_.find(*i) != active_pepper_instances_.end())
3208 (*i)->ViewInitiatedPaint();
3209 }
[email protected]ea2fb972013-08-07 05:44:263210#endif
[email protected]00c39612010-03-06 02:53:283211}
3212
[email protected]310ebd6302011-10-10 19:06:283213void RenderViewImpl::DidFlushPaint() {
[email protected]5b1dec8c2012-02-07 04:35:383214 // If the RenderWidget is closing down then early-exit, otherwise we'll crash.
3215 // See crbug.com/112921.
3216 if (!webview())
3217 return;
3218
[email protected]00c39612010-03-06 02:53:283219 WebFrame* main_frame = webview()->mainFrame();
[email protected]82307f6b2014-08-07 03:30:123220 for (WebFrame* frame = main_frame; frame;
3221 frame = frame->traverseNext(false)) {
pmeenandcc725b2014-10-22 18:04:113222 // TODO(nasko): This is a hack for the case in which the top-level
3223 // frame is being rendered in another process. It will not
3224 // behave correctly for out of process iframes.
3225 if (frame->isWebLocalFrame()) {
[email protected]82307f6b2014-08-07 03:30:123226 main_frame = frame;
pmeenandcc725b2014-10-22 18:04:113227 break;
3228 }
[email protected]82307f6b2014-08-07 03:30:123229 }
[email protected]00c39612010-03-06 02:53:283230
3231 // If we have a provisional frame we are between the start and commit stages
3232 // of loading and we don't want to save stats.
3233 if (!main_frame->provisionalDataSource()) {
3234 WebDataSource* ds = main_frame->dataSource();
[email protected]007733c2011-11-17 00:34:073235 DocumentState* document_state = DocumentState::FromDataSource(ds);
[email protected]92d457802013-04-01 19:18:493236
[email protected]05c8e502010-08-15 15:13:523237 // TODO(jar): The following code should all be inside a method, probably in
3238 // NavigatorState.
[email protected]00c39612010-03-06 02:53:283239 Time now = Time::Now();
[email protected]007733c2011-11-17 00:34:073240 if (document_state->first_paint_time().is_null()) {
3241 document_state->set_first_paint_time(now);
[email protected]00c39612010-03-06 02:53:283242 }
[email protected]007733c2011-11-17 00:34:073243 if (document_state->first_paint_after_load_time().is_null() &&
3244 !document_state->finish_load_time().is_null()) {
3245 document_state->set_first_paint_after_load_time(now);
[email protected]00c39612010-03-06 02:53:283246 }
3247 }
3248}
3249
[email protected]ceb36f7d2012-10-31 18:33:243250gfx::Vector2d RenderViewImpl::GetScrollOffset() {
[email protected]82307f6b2014-08-07 03:30:123251 WebFrame* main_frame = webview()->mainFrame();
3252 for (WebFrame* frame = main_frame; frame;
3253 frame = frame->traverseNext(false)) {
3254 // TODO(nasko): This is a hack for the case in which the top-level
3255 // frame is being rendered in another process. It will not
3256 // behave correctly for out of process iframes.
3257 if (frame->isWebLocalFrame()) {
3258 main_frame = frame;
3259 break;
3260 }
3261 }
3262
3263 WebSize scroll_offset = main_frame->scrollOffset();
[email protected]ceb36f7d2012-10-31 18:33:243264 return gfx::Vector2d(scroll_offset.width, scroll_offset.height);
[email protected]d54169e92011-01-21 09:19:523265}
3266
[email protected]ab6c9112014-02-27 00:20:583267void RenderViewImpl::OnClearFocusedElement() {
[email protected]05d478752009-04-08 23:38:163268 if (webview())
[email protected]ab6c9112014-02-27 00:20:583269 webview()->clearFocusedElement();
[email protected]05d478752009-04-08 23:38:163270}
3271
[email protected]61f91832014-05-13 01:24:423272void RenderViewImpl::OnSetBackgroundOpaque(bool opaque) {
[email protected]699ab0d2009-04-23 23:19:143273 if (webview())
[email protected]61f91832014-05-13 01:24:423274 webview()->setIsTransparent(!opaque);
[email protected]ba91a792013-02-06 09:48:283275 if (compositor_)
[email protected]61f91832014-05-13 01:24:423276 compositor_->setHasTransparentBackground(!opaque);
[email protected]699ab0d2009-04-23 23:19:143277}
3278
[email protected]310ebd6302011-10-10 19:06:283279void RenderViewImpl::OnSetActive(bool active) {
[email protected]8c66c5a2009-07-22 17:26:343280 if (webview())
[email protected]b4bb2502009-10-01 22:35:273281 webview()->setIsActive(active);
[email protected]d8fd6fa2010-02-01 15:54:263282
[email protected]a80af12e2013-08-07 23:36:133283#if defined(ENABLE_PLUGINS) && defined(OS_MACOSX)
[email protected]d8fd6fa2010-02-01 15:54:263284 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3285 for (plugin_it = plugin_delegates_.begin();
3286 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3287 (*plugin_it)->SetWindowFocus(active);
3288 }
3289#endif
[email protected]8c66c5a2009-07-22 17:26:343290}
3291
[email protected]6ce7abc52010-02-02 18:40:143292#if defined(OS_MACOSX)
[email protected]310ebd6302011-10-10 19:06:283293void RenderViewImpl::OnSetWindowVisibility(bool visible) {
[email protected]a80af12e2013-08-07 23:36:133294#if defined(ENABLE_PLUGINS)
[email protected]6ce7abc52010-02-02 18:40:143295 // Inform plugins that their container has changed visibility.
3296 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3297 for (plugin_it = plugin_delegates_.begin();
3298 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3299 (*plugin_it)->SetContainerVisibility(visible);
3300 }
[email protected]a80af12e2013-08-07 23:36:133301#endif
[email protected]6ce7abc52010-02-02 18:40:143302}
[email protected]1e6e3c992010-02-08 15:52:133303
[email protected]310ebd6302011-10-10 19:06:283304void RenderViewImpl::OnWindowFrameChanged(const gfx::Rect& window_frame,
3305 const gfx::Rect& view_frame) {
[email protected]a80af12e2013-08-07 23:36:133306#if defined(ENABLE_PLUGINS)
[email protected]1e6e3c992010-02-08 15:52:133307 // Inform plugins that their window's frame has changed.
3308 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3309 for (plugin_it = plugin_delegates_.begin();
3310 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3311 (*plugin_it)->WindowFrameChanged(window_frame, view_frame);
3312 }
[email protected]a80af12e2013-08-07 23:36:133313#endif
[email protected]1e6e3c992010-02-08 15:52:133314}
[email protected]935d63d2010-10-15 23:31:553315
[email protected]fcf75d42013-12-03 20:11:263316void RenderViewImpl::OnPluginImeCompositionCompleted(const base::string16& text,
[email protected]310ebd6302011-10-10 19:06:283317 int plugin_id) {
[email protected]b7f75862011-01-21 21:15:133318 // WebPluginDelegateProxy is responsible for figuring out if this event
[email protected]935d63d2010-10-15 23:31:553319 // applies to it or not, so inform all the delegates.
3320 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3321 for (plugin_it = plugin_delegates_.begin();
3322 plugin_it != plugin_delegates_.end(); ++plugin_it) {
[email protected]b7f75862011-01-21 21:15:133323 (*plugin_it)->ImeCompositionCompleted(text, plugin_id);
[email protected]935d63d2010-10-15 23:31:553324 }
3325}
[email protected]6ce7abc52010-02-02 18:40:143326#endif // OS_MACOSX
3327
[email protected]6de7fc482014-06-06 10:46:443328void RenderViewImpl::OnClose() {
3329 if (closing_)
3330 RenderThread::Get()->Send(new ViewHostMsg_Close_ACK(routing_id_));
3331 RenderWidget::OnClose();
3332}
3333
[email protected]310ebd6302011-10-10 19:06:283334void RenderViewImpl::Close() {
[email protected]60c42a8c72009-10-09 04:08:593335 // We need to grab a pointer to the doomed WebView before we destroy it.
3336 WebView* doomed = webview();
3337 RenderWidget::Close();
[email protected]625332e02010-12-14 07:48:493338 g_view_map.Get().erase(doomed);
[email protected]058561b2012-12-03 06:48:223339 g_routing_id_view_map.Get().erase(routing_id_);
[email protected]6de7fc482014-06-06 10:46:443340 RenderThread::Get()->Send(new ViewHostMsg_Close_ACK(routing_id_));
[email protected]60c42a8c72009-10-09 04:08:593341}
3342
[email protected]310ebd6302011-10-10 19:06:283343void RenderViewImpl::DidHandleKeyEvent() {
[email protected]b2324b092012-11-01 10:34:113344 ClearEditCommands();
[email protected]446705872009-09-10 07:22:483345}
3346
[email protected]180ef242013-11-07 06:50:463347bool RenderViewImpl::WillHandleMouseEvent(const blink::WebMouseEvent& event) {
[email protected]41d86852012-11-07 12:23:243348 possible_drag_event_info_.event_source =
3349 ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE;
3350 possible_drag_event_info_.event_location =
3351 gfx::Point(event.globalX, event.globalY);
[email protected]ea2fb972013-08-07 05:44:263352
3353#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573354 // This method is called for every mouse event that the render view receives.
3355 // And then the mouse event is forwarded to WebKit, which dispatches it to the
3356 // event target. Potentially a Pepper plugin will receive the event.
3357 // In order to tell whether a plugin gets the last mouse event and which it
3358 // is, we set |pepper_last_mouse_event_target_| to NULL here. If a plugin gets
3359 // the event, it will notify us via DidReceiveMouseEvent() and set itself as
3360 // |pepper_last_mouse_event_target_|.
3361 pepper_last_mouse_event_target_ = NULL;
[email protected]ea2fb972013-08-07 05:44:263362#endif
[email protected]217690d2012-01-27 07:33:113363
3364 // If the mouse is locked, only the current owner of the mouse lock can
3365 // process mouse events.
3366 return mouse_lock_dispatcher_->WillHandleMouseEvent(event);
[email protected]67bfb83f2011-09-22 03:36:373367}
3368
[email protected]41d86852012-11-07 12:23:243369bool RenderViewImpl::WillHandleGestureEvent(
[email protected]180ef242013-11-07 06:50:463370 const blink::WebGestureEvent& event) {
[email protected]41d86852012-11-07 12:23:243371 possible_drag_event_info_.event_source =
3372 ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH;
3373 possible_drag_event_info_.event_location =
3374 gfx::Point(event.globalX, event.globalY);
3375 return false;
3376}
3377
[email protected]2b942c332012-04-25 16:26:263378void RenderViewImpl::DidHandleMouseEvent(const WebMouseEvent& event) {
[email protected]676126f72011-01-15 00:03:513379 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleMouseEvent(event));
[email protected]6a8ddba52010-09-05 04:38:063380}
3381
[email protected]310ebd6302011-10-10 19:06:283382void RenderViewImpl::DidHandleTouchEvent(const WebTouchEvent& event) {
[email protected]2d0f2e92011-10-03 09:02:243383 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleTouchEvent(event));
3384}
3385
[email protected]3d5c243b2012-11-30 00:26:013386bool RenderViewImpl::HasTouchEventHandlersAt(const gfx::Point& point) const {
3387 if (!webview())
3388 return false;
3389 return webview()->hasTouchEventHandlersAt(point);
3390}
3391
[email protected]310ebd6302011-10-10 19:06:283392void RenderViewImpl::OnWasHidden() {
[email protected]941e4552010-02-01 21:23:433393 RenderWidget::OnWasHidden();
3394
[email protected]68877c282013-09-20 05:52:423395#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
[email protected]6392d982013-04-16 16:59:223396 RenderThreadImpl::current()->video_capture_impl_manager()->
3397 SuspendDevices(true);
[email protected]e976c3c52014-07-24 17:41:553398 if (speech_recognition_dispatcher_)
3399 speech_recognition_dispatcher_->AbortAllRecognitions();
[email protected]6392d982013-04-16 16:59:223400#endif
[email protected]2d7b82c2012-06-01 05:57:503401
[email protected]8869d392013-05-07 15:34:263402 if (webview())
[email protected]f59203a2011-06-07 10:01:443403 webview()->setVisibilityState(visibilityState(), false);
[email protected]a6939ca42011-02-18 17:58:073404
[email protected]ea2fb972013-08-07 05:44:263405#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573406 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3407 i != active_pepper_instances_.end(); ++i)
3408 (*i)->PageVisibilityChanged(false);
[email protected]204f1df2012-01-04 20:21:133409
[email protected]a6939ca42011-02-18 17:58:073410#if defined(OS_MACOSX)
[email protected]204f1df2012-01-04 20:21:133411 // Inform NPAPI plugins that their container is no longer visible.
[email protected]941e4552010-02-01 21:23:433412 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3413 for (plugin_it = plugin_delegates_.begin();
3414 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3415 (*plugin_it)->SetContainerVisibility(false);
3416 }
[email protected]a6939ca42011-02-18 17:58:073417#endif // OS_MACOSX
[email protected]a80af12e2013-08-07 23:36:133418#endif // ENABLE_PLUGINS
[email protected]941e4552010-02-01 21:23:433419}
3420
[email protected]3399dd822014-08-09 11:14:243421void RenderViewImpl::OnWasShown(bool needs_repainting,
3422 const ui::LatencyInfo& latency_info) {
3423 RenderWidget::OnWasShown(needs_repainting, latency_info);
[email protected]941e4552010-02-01 21:23:433424
[email protected]6392d982013-04-16 16:59:223425#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
3426 RenderThreadImpl::current()->video_capture_impl_manager()->
3427 SuspendDevices(false);
3428#endif
3429
[email protected]8869d392013-05-07 15:34:263430 if (webview())
[email protected]f59203a2011-06-07 10:01:443431 webview()->setVisibilityState(visibilityState(), false);
[email protected]a6939ca42011-02-18 17:58:073432
[email protected]ea2fb972013-08-07 05:44:263433#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573434 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3435 i != active_pepper_instances_.end(); ++i)
3436 (*i)->PageVisibilityChanged(true);
[email protected]204f1df2012-01-04 20:21:133437
[email protected]a6939ca42011-02-18 17:58:073438#if defined(OS_MACOSX)
[email protected]204f1df2012-01-04 20:21:133439 // Inform NPAPI plugins that their container is now visible.
[email protected]941e4552010-02-01 21:23:433440 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3441 for (plugin_it = plugin_delegates_.begin();
3442 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3443 (*plugin_it)->SetContainerVisibility(true);
3444 }
[email protected]784ea1ab2010-09-18 00:02:343445#endif // OS_MACOSX
[email protected]a80af12e2013-08-07 23:36:133446#endif // ENABLE_PLUGINS
[email protected]a6939ca42011-02-18 17:58:073447}
[email protected]1e6e3c992010-02-08 15:52:133448
[email protected]ed7defa2013-03-12 21:29:593449GURL RenderViewImpl::GetURLForGraphicsContext3D() {
3450 DCHECK(webview());
[email protected]82307f6b2014-08-07 03:30:123451 if (webview()->mainFrame()->isWebLocalFrame())
[email protected]ed7defa2013-03-12 21:29:593452 return GURL(webview()->mainFrame()->document().url());
3453 else
3454 return GURL("chrome://gpu/RenderViewImpl::CreateGraphicsContext3D");
[email protected]65225772011-05-12 21:10:243455}
3456
[email protected]310ebd6302011-10-10 19:06:283457void RenderViewImpl::OnSetFocus(bool enable) {
[email protected]1e6e3c992010-02-08 15:52:133458 RenderWidget::OnSetFocus(enable);
3459
[email protected]a80af12e2013-08-07 23:36:133460#if defined(ENABLE_PLUGINS)
[email protected]7d3c02c2010-05-05 23:10:313461 if (webview() && webview()->isActive()) {
[email protected]589621b2010-09-23 22:01:073462 // Notify all NPAPI plugins.
[email protected]1e6e3c992010-02-08 15:52:133463 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3464 for (plugin_it = plugin_delegates_.begin();
3465 plugin_it != plugin_delegates_.end(); ++plugin_it) {
[email protected]784ea1ab2010-09-18 00:02:343466#if defined(OS_MACOSX)
[email protected]7d3c02c2010-05-05 23:10:313467 // RenderWidget's call to setFocus can cause the underlying webview's
3468 // activation state to change just like a call to setIsActive.
3469 if (enable)
3470 (*plugin_it)->SetWindowFocus(true);
[email protected]784ea1ab2010-09-18 00:02:343471#endif
[email protected]7d3c02c2010-05-05 23:10:313472 (*plugin_it)->SetContentAreaFocus(enable);
[email protected]1e6e3c992010-02-08 15:52:133473 }
3474 }
[email protected]a99a38802014-01-14 15:46:573475 // Notify all Pepper plugins.
3476 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3477 i != active_pepper_instances_.end(); ++i)
3478 (*i)->SetContentAreaFocus(enable);
[email protected]ea2fb972013-08-07 05:44:263479#endif
[email protected]321032992012-11-08 01:01:273480 // Notify all BrowserPlugins of the RenderView's focus state.
fsamuel6c1dfeb2014-12-18 19:21:333481 if (BrowserPluginManager::Get())
3482 BrowserPluginManager::Get()->UpdateFocusState();
[email protected]1e6e3c992010-02-08 15:52:133483}
[email protected]941e4552010-02-01 21:23:433484
[email protected]310ebd6302011-10-10 19:06:283485void RenderViewImpl::OnImeSetComposition(
[email protected]fcf75d42013-12-03 20:11:263486 const base::string16& text,
[email protected]180ef242013-11-07 06:50:463487 const std::vector<blink::WebCompositionUnderline>& underlines,
[email protected]56ea1a62011-05-30 07:05:573488 int selection_start,
3489 int selection_end) {
[email protected]ea2fb972013-08-07 05:44:263490#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083491 if (focused_pepper_plugin_) {
3492 focused_pepper_plugin_->render_frame()->OnImeSetComposition(
[email protected]7a4e2532013-12-02 21:30:023493 text, underlines, selection_start, selection_end);
[email protected]ea2fb972013-08-07 05:44:263494 return;
[email protected]56ea1a62011-05-30 07:05:573495 }
[email protected]ea2fb972013-08-07 05:44:263496
3497#if defined(OS_WIN)
3498 // When a plug-in has focus, we create platform-specific IME data used by
3499 // our IME emulator and send it directly to the focused plug-in, i.e. we
3500 // bypass WebKit. (WebPluginDelegate dispatches this IME data only when its
3501 // instance ID is the same one as the specified ID.)
3502 if (focused_plugin_id_ >= 0) {
3503 std::vector<int> clauses;
3504 std::vector<int> target;
3505 for (size_t i = 0; i < underlines.size(); ++i) {
3506 clauses.push_back(underlines[i].startOffset);
3507 clauses.push_back(underlines[i].endOffset);
3508 if (underlines[i].thick) {
3509 target.clear();
3510 target.push_back(underlines[i].startOffset);
3511 target.push_back(underlines[i].endOffset);
3512 }
3513 }
3514 std::set<WebPluginDelegateProxy*>::iterator it;
3515 for (it = plugin_delegates_.begin(); it != plugin_delegates_.end(); ++it) {
3516 (*it)->ImeCompositionUpdated(text, clauses, target, selection_end,
3517 focused_plugin_id_);
3518 }
3519 return;
3520 }
[email protected]a80af12e2013-08-07 23:36:133521#endif // OS_WIN
3522#endif // ENABLE_PLUGINS
[email protected]ea2fb972013-08-07 05:44:263523 RenderWidget::OnImeSetComposition(text,
3524 underlines,
3525 selection_start,
3526 selection_end);
[email protected]56ea1a62011-05-30 07:05:573527}
3528
[email protected]db4fc1e2013-09-06 20:01:513529void RenderViewImpl::OnImeConfirmComposition(
[email protected]fcf75d42013-12-03 20:11:263530 const base::string16& text,
[email protected]db4fc1e2013-09-06 20:01:513531 const gfx::Range& replacement_range,
3532 bool keep_selection) {
[email protected]ea2fb972013-08-07 05:44:263533#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083534 if (focused_pepper_plugin_) {
3535 focused_pepper_plugin_->render_frame()->OnImeConfirmComposition(
[email protected]7a4e2532013-12-02 21:30:023536 text, replacement_range, keep_selection);
[email protected]ea2fb972013-08-07 05:44:263537 return;
[email protected]56ea1a62011-05-30 07:05:573538 }
[email protected]ea2fb972013-08-07 05:44:263539#if defined(OS_WIN)
3540 // Same as OnImeSetComposition(), we send the text from IMEs directly to
3541 // plug-ins. When we send IME text directly to plug-ins, we should not send
3542 // it to WebKit to prevent WebKit from controlling IMEs.
3543 // TODO(thakis): Honor |replacement_range| for plugins?
3544 if (focused_plugin_id_ >= 0) {
3545 std::set<WebPluginDelegateProxy*>::iterator it;
3546 for (it = plugin_delegates_.begin();
3547 it != plugin_delegates_.end(); ++it) {
3548 (*it)->ImeCompositionCompleted(text, focused_plugin_id_);
3549 }
3550 return;
3551 }
[email protected]a80af12e2013-08-07 23:36:133552#endif // OS_WIN
3553#endif // ENABLE_PLUGINS
[email protected]ea2fb972013-08-07 05:44:263554 if (replacement_range.IsValid() && webview()) {
3555 // Select the text in |replacement_range|, it will then be replaced by
3556 // text added by the call to RenderWidget::OnImeConfirmComposition().
[email protected]35b2a972014-04-04 15:50:223557 if (WebLocalFrame* frame = webview()->focusedFrame()->toWebLocalFrame()) {
[email protected]ea2fb972013-08-07 05:44:263558 WebRange webrange = WebRange::fromDocumentRange(
3559 frame, replacement_range.start(), replacement_range.length());
3560 if (!webrange.isNull())
3561 frame->selectRange(webrange);
3562 }
3563 }
3564 RenderWidget::OnImeConfirmComposition(text,
3565 replacement_range,
3566 keep_selection);
[email protected]56ea1a62011-05-30 07:05:573567}
3568
[email protected]468ac582012-11-20 00:53:193569void RenderViewImpl::SetDeviceScaleFactor(float device_scale_factor) {
3570 RenderWidget::SetDeviceScaleFactor(device_scale_factor);
[email protected]fb854192013-02-06 01:30:043571 if (webview()) {
[email protected]dea5e7682012-06-14 05:21:243572 webview()->setDeviceScaleFactor(device_scale_factor);
[email protected]b8ec1112014-08-17 20:09:103573 webview()->settings()->setPreferCompositingToLCDTextEnabled(
danakj6e3bf8012014-12-16 18:27:533574 PreferCompositingToLCDText(compositor_deps_, device_scale_factor_));
[email protected]fb854192013-02-06 01:30:043575 }
[email protected]3a1c8a8032013-03-18 22:35:323576 if (auto_resize_mode_)
3577 AutoResizeCompositor();
[email protected]caaf2482013-05-01 20:33:323578
fsamuel6c1dfeb2014-12-18 19:21:333579 if (BrowserPluginManager::Get())
3580 BrowserPluginManager::Get()->UpdateDeviceScaleFactor();
[email protected]dea5e7682012-06-14 05:21:243581}
3582
[email protected]28ed6b32014-06-08 02:16:273583bool RenderViewImpl::SetDeviceColorProfile(
3584 const std::vector<char>& profile) {
3585 bool changed = RenderWidget::SetDeviceColorProfile(profile);
3586 if (changed && webview()) {
noelc76aa4c2014-09-25 01:08:563587 WebVector<char> colorProfile = profile;
3588 webview()->setDeviceColorProfile(colorProfile);
[email protected]28ed6b32014-06-08 02:16:273589 }
3590 return changed;
3591}
3592
noeldb4df152014-09-16 17:45:203593void RenderViewImpl::ResetDeviceColorProfileForTesting() {
3594 RenderWidget::ResetDeviceColorProfileForTesting();
3595 if (webview())
3596 webview()->resetDeviceColorProfile();
3597}
3598
[email protected]310ebd6302011-10-10 19:06:283599ui::TextInputType RenderViewImpl::GetTextInputType() {
[email protected]ea2fb972013-08-07 05:44:263600#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083601 if (focused_pepper_plugin_)
3602 return focused_pepper_plugin_->text_input_type();
[email protected]ea2fb972013-08-07 05:44:263603#endif
3604 return RenderWidget::GetTextInputType();
[email protected]73bf95812011-10-12 11:38:323605}
3606
[email protected]3f783362011-10-21 22:40:503607void RenderViewImpl::GetSelectionBounds(gfx::Rect* start, gfx::Rect* end) {
[email protected]ea2fb972013-08-07 05:44:263608#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083609 if (focused_pepper_plugin_) {
[email protected]3f783362011-10-21 22:40:503610 // TODO(kinaba) http://crbug.com/101101
3611 // Current Pepper IME API does not handle selection bounds. So we simply
3612 // use the caret position as an empty range for now. It will be updated
3613 // after Pepper API equips features related to surrounding text retrieval.
[email protected]e16c7a12013-12-05 16:30:083614 gfx::Rect caret = focused_pepper_plugin_->GetCaretBounds();
[email protected]3f783362011-10-21 22:40:503615 *start = caret;
3616 *end = caret;
3617 return;
3618 }
[email protected]ea2fb972013-08-07 05:44:263619#endif
[email protected]3f783362011-10-21 22:40:503620 RenderWidget::GetSelectionBounds(start, end);
[email protected]ad26ef42011-06-17 07:59:453621}
3622
rouslanf7ebd8832015-01-22 01:54:143623void RenderViewImpl::FocusChangeComplete() {
3624 RenderWidget::FocusChangeComplete();
3625 FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusChangeComplete());
3626}
3627
[email protected]58b48a0d2012-06-13 07:01:353628void RenderViewImpl::GetCompositionCharacterBounds(
3629 std::vector<gfx::Rect>* bounds) {
3630 DCHECK(bounds);
3631 bounds->clear();
3632
[email protected]ea2fb972013-08-07 05:44:263633#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083634 if (focused_pepper_plugin_) {
[email protected]88dbe32f2013-06-20 23:31:363635 return;
3636 }
[email protected]ea2fb972013-08-07 05:44:263637#endif
3638
[email protected]58b48a0d2012-06-13 07:01:353639 if (!webview())
3640 return;
3641 size_t start_offset = 0;
3642 size_t character_count = 0;
3643 if (!webview()->compositionRange(&start_offset, &character_count))
3644 return;
3645 if (character_count == 0)
3646 return;
3647
[email protected]180ef242013-11-07 06:50:463648 blink::WebFrame* frame = webview()->focusedFrame();
[email protected]58b48a0d2012-06-13 07:01:353649 if (!frame)
3650 return;
3651
3652 bounds->reserve(character_count);
[email protected]180ef242013-11-07 06:50:463653 blink::WebRect webrect;
[email protected]58b48a0d2012-06-13 07:01:353654 for (size_t i = 0; i < character_count; ++i) {
3655 if (!frame->firstRectForCharacterRange(start_offset + i, 1, webrect)) {
3656 DLOG(ERROR) << "Could not retrieve character rectangle at " << i;
3657 bounds->clear();
3658 return;
3659 }
3660 bounds->push_back(webrect);
3661 }
3662}
3663
[email protected]db4fc1e2013-09-06 20:01:513664void RenderViewImpl::GetCompositionRange(gfx::Range* range) {
[email protected]ea2fb972013-08-07 05:44:263665#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083666 if (focused_pepper_plugin_) {
[email protected]88dbe32f2013-06-20 23:31:363667 return;
3668 }
[email protected]ea2fb972013-08-07 05:44:263669#endif
[email protected]88dbe32f2013-06-20 23:31:363670 RenderWidget::GetCompositionRange(range);
3671}
3672
[email protected]310ebd6302011-10-10 19:06:283673bool RenderViewImpl::CanComposeInline() {
[email protected]ea2fb972013-08-07 05:44:263674#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083675 if (focused_pepper_plugin_)
3676 return focused_pepper_plugin_->IsPluginAcceptingCompositionEvents();
[email protected]ea2fb972013-08-07 05:44:263677#endif
3678 return true;
[email protected]56ea1a62011-05-30 07:05:573679}
3680
[email protected]33004772013-11-12 09:49:233681void RenderViewImpl::InstrumentWillBeginFrame(int frame_id) {
[email protected]35134e12013-02-22 20:07:403682 if (!webview())
3683 return;
3684 if (!webview()->devToolsAgent())
3685 return;
[email protected]33004772013-11-12 09:49:233686 webview()->devToolsAgent()->didBeginFrame(frame_id);
[email protected]35134e12013-02-22 20:07:403687}
3688
3689void RenderViewImpl::InstrumentDidBeginFrame() {
3690 if (!webview())
3691 return;
3692 if (!webview()->devToolsAgent())
3693 return;
3694 // TODO(jamesr/caseq): Decide if this needs to be renamed.
3695 webview()->devToolsAgent()->didComposite();
3696}
3697
3698void RenderViewImpl::InstrumentDidCancelFrame() {
3699 if (!webview())
3700 return;
3701 if (!webview()->devToolsAgent())
3702 return;
3703 webview()->devToolsAgent()->didCancelFrame();
3704}
3705
3706void RenderViewImpl::InstrumentWillComposite() {
3707 if (!webview())
3708 return;
3709 if (!webview()->devToolsAgent())
3710 return;
3711 webview()->devToolsAgent()->willComposite();
3712}
3713
rouslanf7ebd8832015-01-22 01:54:143714void RenderViewImpl::DidCompletePageScaleAnimation() {
3715 FocusChangeComplete();
3716}
3717
[email protected]b2e4c70132013-10-03 02:07:513718void RenderViewImpl::SetScreenMetricsEmulationParameters(
[email protected]7f99fc22013-11-08 14:05:583719 float device_scale_factor,
3720 const gfx::Point& root_layer_offset,
3721 float root_layer_scale) {
[email protected]404630b2014-07-03 19:33:033722 if (webview() && compositor()) {
[email protected]b2e4c70132013-10-03 02:07:513723 webview()->setCompositorDeviceScaleFactorOverride(device_scale_factor);
[email protected]7f99fc22013-11-08 14:05:583724 webview()->setRootLayerTransform(
3725 blink::WebSize(root_layer_offset.x(), root_layer_offset.y()),
3726 root_layer_scale);
[email protected]b2e4c70132013-10-03 02:07:513727 }
3728}
3729
[email protected]310ebd6302011-10-10 19:06:283730bool RenderViewImpl::ScheduleFileChooser(
[email protected]e9ff79c2012-10-19 21:31:263731 const FileChooserParams& params,
[email protected]cdaf8d02010-03-30 19:52:473732 WebFileChooserCompletion* completion) {
3733 static const size_t kMaximumPendingFileChooseRequests = 4;
3734 if (file_chooser_completions_.size() > kMaximumPendingFileChooseRequests) {
3735 // This sanity check prevents too many file choose requests from getting
3736 // queued which could DoS the user. Getting these is most likely a
3737 // programming error (there are many ways to DoS the user so it's not
3738 // considered a "real" security check), either in JS requesting many file
3739 // choosers to pop up, or in a plugin.
3740 //
3741 // TODO(brettw) we might possibly want to require a user gesture to open
3742 // a file picker, which will address this issue in a better way.
3743 return false;
3744 }
3745
3746 file_chooser_completions_.push_back(linked_ptr<PendingFileChooser>(
3747 new PendingFileChooser(params, completion)));
3748 if (file_chooser_completions_.size() == 1) {
3749 // Actually show the browse dialog when this is the first request.
3750 Send(new ViewHostMsg_RunFileChooser(routing_id_, params));
3751 }
3752 return true;
3753}
3754
[email protected]180ef242013-11-07 06:50:463755blink::WebSpeechRecognizer* RenderViewImpl::speechRecognizer() {
[email protected]64d09222012-05-25 10:10:343756 if (!speech_recognition_dispatcher_)
3757 speech_recognition_dispatcher_ = new SpeechRecognitionDispatcher(this);
[email protected]64d09222012-05-25 10:10:343758 return speech_recognition_dispatcher_;
3759}
3760
[email protected]310ebd6302011-10-10 19:06:283761void RenderViewImpl::zoomLimitsChanged(double minimum_level,
3762 double maximum_level) {
[email protected]b75b8292010-10-01 07:28:253763 int minimum_percent = static_cast<int>(
[email protected]7940b8e2013-07-25 23:08:493764 ZoomLevelToZoomFactor(minimum_level) * 100);
[email protected]b75b8292010-10-01 07:28:253765 int maximum_percent = static_cast<int>(
[email protected]7940b8e2013-07-25 23:08:493766 ZoomLevelToZoomFactor(maximum_level) * 100);
[email protected]b75b8292010-10-01 07:28:253767
3768 Send(new ViewHostMsg_UpdateZoomLimits(
[email protected]fce823222014-05-30 16:24:303769 routing_id_, minimum_percent, maximum_percent));
[email protected]b75b8292010-10-01 07:28:253770}
3771
[email protected]310ebd6302011-10-10 19:06:283772void RenderViewImpl::zoomLevelChanged() {
[email protected]54b8e182014-05-02 18:08:293773 double zoom_level = webview()->zoomLevel();
[email protected]2b942c332012-04-25 16:26:263774
[email protected]54b8e182014-05-02 18:08:293775 // Do not send empty URLs to the browser when we are just setting the default
3776 // zoom level (from RendererPreferences) before the first navigation.
3777 if (!webview()->mainFrame()->document().url().isEmpty()) {
3778 // Tell the browser which url got zoomed so it can update the menu and the
3779 // saved values if necessary
3780 Send(new ViewHostMsg_DidZoomURL(
[email protected]fce823222014-05-30 16:24:303781 routing_id_, zoom_level,
[email protected]54b8e182014-05-02 18:08:293782 GURL(webview()->mainFrame()->document().url())));
3783 }
[email protected]b75b8292010-10-01 07:28:253784}
3785
[email protected]7940b8e2013-07-25 23:08:493786double RenderViewImpl::zoomLevelToZoomFactor(double zoom_level) const {
3787 return ZoomLevelToZoomFactor(zoom_level);
3788}
3789
3790double RenderViewImpl::zoomFactorToZoomLevel(double factor) const {
3791 return ZoomFactorToZoomLevel(factor);
3792}
3793
[email protected]f29bc5e2014-08-22 10:34:063794void RenderViewImpl::registerProtocolHandler(const WebString& scheme,
3795 const WebURL& url,
3796 const WebString& title) {
3797 bool user_gesture = WebUserGestureIndicator::isProcessingUserGesture();
3798 Send(new ViewHostMsg_RegisterProtocolHandler(routing_id_,
3799 base::UTF16ToUTF8(scheme),
3800 url,
3801 title,
3802 user_gesture));
3803}
3804
3805void RenderViewImpl::unregisterProtocolHandler(const WebString& scheme,
3806 const WebURL& url) {
3807 bool user_gesture = WebUserGestureIndicator::isProcessingUserGesture();
3808 Send(new ViewHostMsg_UnregisterProtocolHandler(routing_id_,
3809 base::UTF16ToUTF8(scheme),
3810 url,
3811 user_gesture));
3812}
3813
[email protected]180ef242013-11-07 06:50:463814blink::WebPageVisibilityState RenderViewImpl::visibilityState() const {
3815 blink::WebPageVisibilityState current_state = is_hidden() ?
3816 blink::WebPageVisibilityStateHidden :
3817 blink::WebPageVisibilityStateVisible;
3818 blink::WebPageVisibilityState override_state = current_state;
[email protected]b849847b2013-12-10 21:57:583819 // TODO(jam): move this method to WebFrameClient.
[email protected]e9ff79c2012-10-19 21:31:263820 if (GetContentClient()->renderer()->
[email protected]b849847b2013-12-10 21:57:583821 ShouldOverridePageVisibilityState(main_render_frame_.get(),
[email protected]f59203a2011-06-07 10:01:443822 &override_state))
3823 return override_state;
3824 return current_state;
[email protected]94dec932011-05-26 20:04:213825}
3826
[email protected]a0629af92012-08-08 00:39:373827void RenderViewImpl::draggableRegionsChanged() {
3828 FOR_EACH_OBSERVER(
3829 RenderViewObserver,
3830 observers_,
3831 DraggableRegionsChanged(webview()->mainFrame()));
3832}
3833
[email protected]20657a82012-08-21 20:23:033834#if defined(OS_ANDROID)
3835WebContentDetectionResult RenderViewImpl::detectContentAround(
3836 const WebHitTestResult& touch_hit) {
[email protected]20657a82012-08-21 20:23:033837 DCHECK(touch_hit.node().isTextNode());
3838
3839 // Process the position with all the registered content detectors until
3840 // a match is found. Priority is provided by their relative order.
3841 for (ContentDetectorList::const_iterator it = content_detectors_.begin();
3842 it != content_detectors_.end(); ++it) {
3843 ContentDetector::Result content = (*it)->FindTappedContent(touch_hit);
3844 if (content.valid) {
3845 return WebContentDetectionResult(content.content_boundaries,
[email protected]32956122013-12-25 07:29:243846 base::UTF8ToUTF16(content.text), content.intent_url);
[email protected]20657a82012-08-21 20:23:033847 }
3848 }
3849 return WebContentDetectionResult();
3850}
3851
3852void RenderViewImpl::scheduleContentIntent(const WebURL& intent) {
3853 // Introduce a short delay so that the user can notice the content.
[email protected]dd32b1272013-05-04 14:17:113854 base::MessageLoop::current()->PostDelayedTask(
[email protected]20657a82012-08-21 20:23:033855 FROM_HERE,
[email protected]dd32b1272013-05-04 14:17:113856 base::Bind(&RenderViewImpl::LaunchAndroidContentIntent,
3857 AsWeakPtr(),
3858 intent,
3859 expected_content_intent_id_),
[email protected]20657a82012-08-21 20:23:033860 base::TimeDelta::FromMilliseconds(kContentIntentDelayMilliseconds));
3861}
3862
3863void RenderViewImpl::cancelScheduledContentIntents() {
3864 ++expected_content_intent_id_;
3865}
3866
3867void RenderViewImpl::LaunchAndroidContentIntent(const GURL& intent,
3868 size_t request_id) {
3869 if (request_id != expected_content_intent_id_)
qinmin0d5560df2014-11-12 19:03:393870 return;
[email protected]20657a82012-08-21 20:23:033871
3872 // Remove the content highlighting if any.
[email protected]8b9e52b2014-01-17 16:35:313873 scheduleComposite();
[email protected]20657a82012-08-21 20:23:033874
3875 if (!intent.is_empty())
3876 Send(new ViewHostMsg_StartContentIntent(routing_id_, intent));
3877}
[email protected]b18583c2012-12-18 06:55:273878
3879bool RenderViewImpl::openDateTimeChooser(
[email protected]180ef242013-11-07 06:50:463880 const blink::WebDateTimeChooserParams& params,
3881 blink::WebDateTimeChooserCompletion* completion) {
[email protected]e8072562013-12-04 06:04:133882 // JavaScript may try to open a date time chooser while one is already open.
3883 if (date_time_picker_client_)
3884 return false;
[email protected]b18583c2012-12-18 06:55:273885 date_time_picker_client_.reset(
3886 new RendererDateTimePicker(this, params, completion));
3887 return date_time_picker_client_->Open();
3888}
3889
[email protected]e8072562013-12-04 06:04:133890void RenderViewImpl::DismissDateTimeDialog() {
3891 DCHECK(date_time_picker_client_);
3892 date_time_picker_client_.reset(NULL);
3893}
[email protected]e8072562013-12-04 06:04:133894
[email protected]6d17f6392012-12-05 05:24:543895#endif // defined(OS_ANDROID)
[email protected]20657a82012-08-21 20:23:033896
[email protected]be1af0662014-07-29 19:55:513897void RenderViewImpl::OnShowContextMenu(
3898 ui::MenuSourceType source_type, const gfx::Point& location) {
3899 context_menu_source_type_ = source_type;
3900 has_host_context_menu_location_ = true;
3901 host_context_menu_location_ = location;
[email protected]47822262013-04-23 17:22:363902 if (webview())
3903 webview()->showContextMenu();
[email protected]be1af0662014-07-29 19:55:513904 has_host_context_menu_location_ = false;
[email protected]47822262013-04-23 17:22:363905}
3906
[email protected]310ebd6302011-10-10 19:06:283907void RenderViewImpl::OnEnableViewSourceMode() {
[email protected]5a7b15a2011-08-22 22:48:183908 if (!webview())
3909 return;
3910 WebFrame* main_frame = webview()->mainFrame();
3911 if (!main_frame)
3912 return;
3913 main_frame->enableViewSourceMode(true);
3914}
[email protected]67bfb83f2011-09-22 03:36:373915
lukenb171b532014-09-24 05:50:383916#if defined(OS_ANDROID) || defined(TOOLKIT_VIEWS)
[email protected]f9526d12012-10-18 01:55:033917bool RenderViewImpl::didTapMultipleTargets(
timav29a8d0f62014-09-25 20:45:533918 const WebSize& inner_viewport_offset,
3919 const WebRect& touch_rect,
[email protected]f9526d12012-10-18 01:55:033920 const WebVector<WebRect>& target_rects) {
lukene23094a2014-11-23 14:12:313921 if (!switches::IsLinkDisambiguationPopupEnabled())
3922 return false;
3923
[email protected]8d3dfee62013-06-19 05:50:333924 // Never show a disambiguation popup when accessibility is enabled,
3925 // as this interferes with "touch exploration".
[email protected]95640212014-07-26 18:14:303926 AccessibilityMode accessibility_mode =
mostynbc33353232014-09-12 09:38:313927 GetMainRenderFrame()->accessibility_mode();
[email protected]95640212014-07-26 18:14:303928 bool matches_accessibility_mode_complete =
3929 (accessibility_mode & AccessibilityModeComplete) ==
3930 AccessibilityModeComplete;
3931 if (matches_accessibility_mode_complete)
[email protected]8d3dfee62013-06-19 05:50:333932 return false;
3933
timav29a8d0f62014-09-25 20:45:533934 // The touch_rect, target_rects and zoom_rect are in the outer viewport
3935 // reference frame.
[email protected]f9526d12012-10-18 01:55:033936 gfx::Rect zoom_rect;
[email protected]70221f02013-01-31 22:17:073937 float new_total_scale =
3938 DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor(
timav29a8d0f62014-09-25 20:45:533939 touch_rect, target_rects, GetSize(),
[email protected]70221f02013-01-31 22:17:073940 gfx::Rect(webview()->mainFrame()->visibleContentRect()).size(),
3941 device_scale_factor_ * webview()->pageScaleFactor(), &zoom_rect);
3942 if (!new_total_scale)
[email protected]f9526d12012-10-18 01:55:033943 return false;
3944
[email protected]4ded1dbf2013-08-28 21:11:033945 bool handled = false;
3946 switch (renderer_preferences_.tap_multiple_targets_strategy) {
3947 case TAP_MULTIPLE_TARGETS_STRATEGY_ZOOM:
3948 handled = webview()->zoomToMultipleTargetsRect(zoom_rect);
3949 break;
3950 case TAP_MULTIPLE_TARGETS_STRATEGY_POPUP: {
[email protected]bc2804d2013-08-06 07:45:493951 gfx::Size canvas_size =
3952 gfx::ToCeiledSize(gfx::ScaleSize(zoom_rect.size(), new_total_scale));
[email protected]cb189e062014-04-23 00:57:013953 cc::SharedBitmapManager* manager =
3954 RenderThreadImpl::current()->shared_bitmap_manager();
3955 scoped_ptr<cc::SharedBitmap> shared_bitmap =
3956 manager->AllocateSharedBitmap(canvas_size);
[email protected]bc2804d2013-08-06 07:45:493957 {
[email protected]cb189e062014-04-23 00:57:013958 SkBitmap bitmap;
3959 SkImageInfo info = SkImageInfo::MakeN32Premul(canvas_size.width(),
3960 canvas_size.height());
3961 bitmap.installPixels(info, shared_bitmap->pixels(), info.minRowBytes());
3962 SkCanvas canvas(bitmap);
[email protected]f9526d12012-10-18 01:55:033963
[email protected]bc2804d2013-08-06 07:45:493964 // TODO(trchen): Cleanup the device scale factor mess.
3965 // device scale will be applied in WebKit
3966 // --> zoom_rect doesn't include device scale,
3967 // but WebKit will still draw on zoom_rect * device_scale_factor_
[email protected]cb189e062014-04-23 00:57:013968 canvas.scale(new_total_scale / device_scale_factor_,
3969 new_total_scale / device_scale_factor_);
3970 canvas.translate(-zoom_rect.x() * device_scale_factor_,
3971 -zoom_rect.y() * device_scale_factor_);
[email protected]f9526d12012-10-18 01:55:033972
[email protected]bcb1f022014-05-06 01:54:173973 DCHECK(webwidget_->isAcceleratedCompositingActive());
3974 // TODO(aelias): The disambiguation popup should be composited so we
3975 // don't have to call this method.
3976 webwidget_->paintCompositedDeprecated(&canvas, zoom_rect);
[email protected]bc2804d2013-08-06 07:45:493977 }
3978
timav29a8d0f62014-09-25 20:45:533979 gfx::Rect zoom_rect_in_screen =
3980 zoom_rect - gfx::Vector2d(inner_viewport_offset.width,
3981 inner_viewport_offset.height);
3982
[email protected]bc2804d2013-08-06 07:45:493983 gfx::Rect physical_window_zoom_rect = gfx::ToEnclosingRect(
timav29a8d0f62014-09-25 20:45:533984 ClientRectToPhysicalWindowRect(gfx::RectF(zoom_rect_in_screen)));
3985
[email protected]bc2804d2013-08-06 07:45:493986 Send(new ViewHostMsg_ShowDisambiguationPopup(routing_id_,
3987 physical_window_zoom_rect,
3988 canvas_size,
[email protected]cb189e062014-04-23 00:57:013989 shared_bitmap->id()));
3990 cc::SharedBitmapId id = shared_bitmap->id();
3991 disambiguation_bitmaps_[id] = shared_bitmap.release();
[email protected]4ded1dbf2013-08-28 21:11:033992 handled = true;
3993 break;
3994 }
3995 case TAP_MULTIPLE_TARGETS_STRATEGY_NONE:
3996 // No-op.
3997 break;
[email protected]f9526d12012-10-18 01:55:033998 }
[email protected]70221f02013-01-31 22:17:073999
[email protected]4ded1dbf2013-08-28 21:11:034000 return handled;
[email protected]f9526d12012-10-18 01:55:034001}
lukenb171b532014-09-24 05:50:384002#endif // defined(OS_ANDROID) || defined(TOOLKIT_VIEWS)
[email protected]f9526d12012-10-18 01:55:034003
[email protected]b283d292013-02-21 08:40:344004unsigned RenderViewImpl::GetLocalSessionHistoryLengthForTesting() const {
4005 return history_list_length_;
4006}
4007
[email protected]cc290f902013-03-04 20:06:024008void RenderViewImpl::SetFocusAndActivateForTesting(bool enable) {
4009 if (enable) {
4010 if (has_focus())
4011 return;
4012 OnSetActive(true);
4013 OnSetFocus(true);
4014 } else {
4015 if (!has_focus())
4016 return;
4017 OnSetFocus(false);
4018 OnSetActive(false);
4019 }
4020}
4021
[email protected]3a1c8a8032013-03-18 22:35:324022void RenderViewImpl::SetDeviceScaleFactorForTesting(float factor) {
[email protected]b54fe452013-06-07 14:01:534023 ViewMsg_Resize_Params params;
4024 params.screen_info = screen_info_;
4025 params.screen_info.deviceScaleFactor = factor;
4026 params.new_size = size();
bokanf0fd2412014-10-30 15:28:554027 params.visible_viewport_size = visible_viewport_size_;
[email protected]b54fe452013-06-07 14:01:534028 params.physical_backing_size =
4029 gfx::ToCeiledSize(gfx::ScaleSize(size(), factor));
dtrainorcb7779b82014-12-04 01:08:024030 params.top_controls_shrink_blink_size = false;
4031 params.top_controls_height = 0.f;
[email protected]b54fe452013-06-07 14:01:534032 params.resizer_rect = WebRect();
4033 params.is_fullscreen = is_fullscreen();
4034 OnResize(params);
[email protected]3a1c8a8032013-03-18 22:35:324035}
4036
[email protected]71e652302014-05-09 14:20:134037void RenderViewImpl::SetDeviceColorProfileForTesting(
4038 const std::vector<char>& color_profile) {
[email protected]28ed6b32014-06-08 02:16:274039 SetDeviceColorProfile(color_profile);
[email protected]71e652302014-05-09 14:20:134040}
4041
[email protected]92650162013-10-30 03:31:024042void RenderViewImpl::ForceResizeForTesting(const gfx::Size& new_size) {
4043 gfx::Rect new_position(rootWindowRect().x,
4044 rootWindowRect().y,
4045 new_size.width(),
4046 new_size.height());
bokanf0fd2412014-10-30 15:28:554047 ResizeSynchronously(new_position, new_size);
[email protected]92650162013-10-30 03:31:024048}
4049
[email protected]5b45ad42013-10-25 00:42:044050void RenderViewImpl::UseSynchronousResizeModeForTesting(bool enable) {
4051 resizing_mode_selector_->set_is_synchronous_mode(enable);
4052}
4053
[email protected]eac2b362013-05-22 07:01:454054void RenderViewImpl::EnableAutoResizeForTesting(const gfx::Size& min_size,
4055 const gfx::Size& max_size) {
4056 OnEnableAutoResize(min_size, max_size);
4057}
4058
4059void RenderViewImpl::DisableAutoResizeForTesting(const gfx::Size& new_size) {
4060 OnDisableAutoResize(new_size);
4061}
4062
[email protected]cb189e062014-04-23 00:57:014063void RenderViewImpl::OnReleaseDisambiguationPopupBitmap(
4064 const cc::SharedBitmapId& id) {
4065 BitmapMap::iterator it = disambiguation_bitmaps_.find(id);
4066 DCHECK(it != disambiguation_bitmaps_.end());
4067 delete it->second;
4068 disambiguation_bitmaps_.erase(it);
[email protected]f9526d12012-10-18 01:55:034069}
[email protected]e9ff79c2012-10-19 21:31:264070
[email protected]6fceb912013-02-15 06:24:154071void RenderViewImpl::DidCommitCompositorFrame() {
4072 RenderWidget::DidCommitCompositorFrame();
fsamuel6c1dfeb2014-12-18 19:21:334073 if (BrowserPluginManager::Get())
4074 BrowserPluginManager::Get()->DidCommitCompositorFrame(GetRoutingID());
[email protected]6fceb912013-02-15 06:24:154075 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidCommitCompositorFrame());
4076}
4077
[email protected]41225fe2013-03-29 05:32:024078void RenderViewImpl::SendUpdateFaviconURL(const std::vector<FaviconURL>& urls) {
4079 if (!urls.empty())
[email protected]50279492014-05-05 23:24:294080 Send(new ViewHostMsg_UpdateFaviconURL(routing_id_, urls));
[email protected]41225fe2013-03-29 05:32:024081}
4082
4083void RenderViewImpl::DidStopLoadingIcons() {
4084 int icon_types = WebIconURL::TypeFavicon;
4085 if (TouchEnabled())
4086 icon_types |= WebIconURL::TypeTouchPrecomposed | WebIconURL::TypeTouch;
4087
nasko2411ba372014-10-13 17:45:414088 // Favicons matter only for the top-level frame. If it is a WebRemoteFrame,
4089 // just return early.
4090 if (webview()->mainFrame()->isWebRemoteFrame())
4091 return;
4092
[email protected]41225fe2013-03-29 05:32:024093 WebVector<WebIconURL> icon_urls =
4094 webview()->mainFrame()->iconURLs(icon_types);
4095
4096 std::vector<FaviconURL> urls;
4097 for (size_t i = 0; i < icon_urls.size(); i++) {
4098 WebURL url = icon_urls[i].iconURL();
[email protected]2bd262b2014-04-16 05:31:234099 std::vector<gfx::Size> sizes;
[email protected]f34ac132014-03-20 23:02:054100 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes);
[email protected]41225fe2013-03-29 05:32:024101 if (!url.isEmpty())
[email protected]f34ac132014-03-20 23:02:054102 urls.push_back(
4103 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes));
[email protected]41225fe2013-03-29 05:32:024104 }
4105 SendUpdateFaviconURL(urls);
4106}
4107
[email protected]e9ff79c2012-10-19 21:31:264108} // namespace content