blob: f5f66e04b6f36589f5568b244eb2c08ccc2e1b65 [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]728c2ee2013-06-25 04:01:0716#include "base/files/file_path.h"
[email protected]edc3af82013-12-12 21:24:0717#include "base/i18n/rtl.h"
[email protected]b1cf3372011-04-20 21:28:1018#include "base/json/json_writer.h"
[email protected]625332e02010-12-14 07:48:4919#include "base/lazy_instance.h"
[email protected]cffd7522012-10-23 19:10:5820#include "base/memory/scoped_ptr.h"
[email protected]f29efe6b2014-06-09 05:01:5121#include "base/metrics/field_trial.h"
[email protected]835d7c82010-10-14 04:38:3822#include "base/metrics/histogram.h"
[email protected]d3b4ee22013-07-24 22:50:0623#include "base/process/kill.h"
[email protected]7d08a9352013-10-15 08:24:5624#include "base/process/process.h"
[email protected]21aa99682013-06-11 07:17:0125#include "base/strings/string_number_conversions.h"
[email protected]b9e7c479f2013-04-12 04:33:2426#include "base/strings/string_piece.h"
[email protected]27c05732013-02-15 21:55:4927#include "base/strings/string_split.h"
[email protected]21aa99682013-06-11 07:17:0128#include "base/strings/string_util.h"
[email protected]40d11e02013-03-28 17:43:1429#include "base/strings/sys_string_conversions.h"
[email protected]74ebfb12013-06-07 20:48:0030#include "base/strings/utf_string_conversions.h"
[email protected]abb522162013-06-28 01:54:1631#include "base/time/time.h"
primiano9e38d552015-01-28 04:18:0132#include "base/trace_event/trace_event.h"
avi1023d012015-12-25 02:39:1433#include "build/build_config.h"
[email protected]a8cb3b73b2013-08-12 05:50:5034#include "content/child/appcache/appcache_dispatcher.h"
35#include "content/child/appcache/web_application_cache_host_impl.h"
[email protected]cb189e062014-04-23 00:57:0136#include "content/child/child_shared_bitmap_manager.h"
[email protected]29e2fb42013-07-19 01:13:4737#include "content/child/npapi/webplugin_delegate_impl.h"
[email protected]541b7b02013-06-07 00:59:3438#include "content/child/request_extra_data.h"
mek87e0ab52015-02-13 01:18:2639#include "content/child/v8_value_converter_impl.h"
[email protected]10208ea2013-06-06 20:08:0340#include "content/child/webmessageportchannel_impl.h"
jinho.bang632a1a722014-09-18 03:02:5641#include "content/common/content_constants_internal.h"
oshima750cb4342015-10-31 00:59:0142#include "content/common/content_switches_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"
nickac60e75472015-07-31 00:44:3551#include "content/common/site_isolation_policy.h"
[email protected]e4495212012-12-06 03:09:1252#include "content/common/ssl_status_serialization.h"
[email protected]778574e2011-03-21 22:03:5053#include "content/common/view_messages.h"
[email protected]e091df82011-10-11 18:13:2154#include "content/public/common/bindings_policy.h"
[email protected]744c2a22012-03-15 18:42:0455#include "content/public/common/content_client.h"
[email protected]54087fe2011-10-28 22:02:4856#include "content/public/common/content_constants.h"
[email protected]c08950d22011-10-13 22:20:2957#include "content/public/common/content_switches.h"
[email protected]dc293a72013-07-01 11:11:2258#include "content/public/common/drop_data.h"
[email protected]41225fe2013-03-29 05:32:0259#include "content/public/common/favicon_url.h"
hirono570357bd2014-10-08 12:39:2760#include "content/public/common/file_chooser_file_info.h"
[email protected]8caadeb2011-11-22 02:45:2361#include "content/public/common/file_chooser_params.h"
kouhei40f03cb2015-09-24 07:47:0162#include "content/public/common/page_importance_signals.h"
clamyda97e8322014-10-07 21:57:2563#include "content/public/common/page_state.h"
[email protected]7940b8e2013-07-25 23:08:4964#include "content/public/common/page_zoom.h"
[email protected]e4495212012-12-06 03:09:1265#include "content/public/common/ssl_status.h"
[email protected]818915cd2012-11-20 13:14:1166#include "content/public/common/three_d_api_types.h"
[email protected]a1d29162011-10-14 17:14:0367#include "content/public/common/url_constants.h"
[email protected]b3a97b52014-07-09 06:25:0568#include "content/public/common/web_preferences.h"
[email protected]d344114c2011-10-01 01:24:3469#include "content/public/renderer/content_renderer_client.h"
[email protected]007733c2011-11-17 00:34:0770#include "content/public/renderer/document_state.h"
[email protected]82ddba1c2011-10-04 00:15:3271#include "content/public/renderer/navigation_state.h"
[email protected]3a034ebb2011-10-03 19:19:4472#include "content/public/renderer/render_view_observer.h"
[email protected]64ffa0442011-10-03 22:08:3673#include "content/public/renderer/render_view_visitor.h"
[email protected]e6e56752012-08-10 00:46:0674#include "content/renderer/browser_plugin/browser_plugin.h"
75#include "content/renderer/browser_plugin/browser_plugin_manager.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"
[email protected]ba91a792013-02-06 09:48:2879#include "content/renderer/gpu/render_widget_compositor.h"
[email protected]d4734982014-04-15 02:05:5580#include "content/renderer/history_controller.h"
[email protected]dc064352014-04-25 08:36:3881#include "content/renderer/history_serialization.h"
[email protected]1784b2f2011-11-24 10:53:4882#include "content/renderer/idle_user_detector.h"
[email protected]66fca5bc2013-05-23 06:58:2983#include "content/renderer/ime_event_guard.h"
[email protected]7a72d452013-12-13 10:01:1384#include "content/renderer/input/input_handler_manager.h"
[email protected]92d457802013-04-01 19:18:4985#include "content/renderer/internal_document_state_data.h"
[email protected]4a914882013-01-10 00:43:4886#include "content/renderer/media/audio_device_factory.h"
[email protected]6392d982013-04-16 16:59:2287#include "content/renderer/media/video_capture_impl_manager.h"
clamy5f342202015-03-18 13:47:5688#include "content/renderer/navigation_state_impl.h"
[email protected]227692c52013-05-31 22:43:0489#include "content/renderer/render_frame_impl.h"
[email protected]5a7100d2014-05-19 01:29:0490#include "content/renderer/render_frame_proxy.h"
[email protected]8704f89b2011-04-15 00:30:0591#include "content/renderer/render_process.h"
[email protected]f1a29a02011-10-06 23:08:4492#include "content/renderer/render_thread_impl.h"
[email protected]89054502012-06-03 10:29:2493#include "content/renderer/render_view_mouse_lock_dispatcher.h"
[email protected]2cff0052011-03-18 16:51:4494#include "content/renderer/render_widget_fullscreen_pepper.h"
[email protected]663bd9e2011-03-21 01:07:0195#include "content/renderer/renderer_webapplicationcachehost_impl.h"
[email protected]5b45ad42013-10-25 00:42:0496#include "content/renderer/resizing_mode_selector.h"
[email protected]12a936d2013-05-15 04:55:4997#include "content/renderer/savable_resources.h"
[email protected]64d09222012-05-25 10:10:3498#include "content/renderer/speech_recognition_dispatcher.h"
[email protected]86a7d3c2011-09-12 16:45:3299#include "content/renderer/text_input_client_observer.h"
[email protected]940ed1d2012-11-27 21:03:21100#include "content/renderer/web_ui_extension_data.h"
[email protected]6f516082011-03-17 19:15:35101#include "content/renderer/websharedworker_proxy.h"
[email protected]f5961142013-04-17 23:09:42102#include "media/audio/audio_output_device.h"
[email protected]ee68378a2010-08-10 01:05:41103#include "media/base/media_switches.h"
servolkf54f5c8f2015-02-24 20:32:39104#include "media/renderers/audio_renderer_impl.h"
servolk8b3b39b2015-03-03 19:08:18105#include "media/renderers/gpu_video_accelerator_factories.h"
[email protected]d1ef81d2012-07-24 11:39:36106#include "net/base/data_url.h"
initial.commit09911bf2008-07-26 23:55:29107#include "net/base/escape.h"
108#include "net/base/net_errors.h"
[email protected]18fb7a772012-09-20 19:25:09109#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
[email protected]52c68652010-12-07 17:47:04110#include "net/http/http_util.h"
lukenb171b532014-09-24 05:50:38111#include "skia/ext/platform_canvas.h"
[email protected]d0fcff72013-07-23 02:45:43112#include "third_party/WebKit/public/platform/WebCString.h"
[email protected]b3a97b52014-07-09 06:25:05113#include "third_party/WebKit/public/platform/WebConnectionType.h"
[email protected]d0fcff72013-07-23 02:45:43114#include "third_party/WebKit/public/platform/WebDragData.h"
[email protected]d0fcff72013-07-23 02:45:43115#include "third_party/WebKit/public/platform/WebHTTPBody.h"
116#include "third_party/WebKit/public/platform/WebImage.h"
117#include "third_party/WebKit/public/platform/WebMessagePortChannel.h"
118#include "third_party/WebKit/public/platform/WebPoint.h"
119#include "third_party/WebKit/public/platform/WebRect.h"
120#include "third_party/WebKit/public/platform/WebSize.h"
[email protected]ec173b522013-11-14 11:01:18121#include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h"
[email protected]d0fcff72013-07-23 02:45:43122#include "third_party/WebKit/public/platform/WebString.h"
123#include "third_party/WebKit/public/platform/WebURL.h"
124#include "third_party/WebKit/public/platform/WebURLError.h"
125#include "third_party/WebKit/public/platform/WebURLRequest.h"
126#include "third_party/WebKit/public/platform/WebURLResponse.h"
127#include "third_party/WebKit/public/platform/WebVector.h"
[email protected]10760e4a2013-09-04 23:32:20128#include "third_party/WebKit/public/web/WebAXObject.h"
[email protected]8bc5ff02013-11-29 06:34:03129#include "third_party/WebKit/public/web/WebColorSuggestion.h"
[email protected]2255a9332013-06-17 05:12:31130#include "third_party/WebKit/public/web/WebDOMEvent.h"
131#include "third_party/WebKit/public/web/WebDOMMessageEvent.h"
132#include "third_party/WebKit/public/web/WebDataSource.h"
133#include "third_party/WebKit/public/web/WebDateTimeChooserCompletion.h"
134#include "third_party/WebKit/public/web/WebDateTimeChooserParams.h"
[email protected]2255a9332013-06-17 05:12:31135#include "third_party/WebKit/public/web/WebDocument.h"
136#include "third_party/WebKit/public/web/WebElement.h"
137#include "third_party/WebKit/public/web/WebFileChooserParams.h"
[email protected]2255a9332013-06-17 05:12:31138#include "third_party/WebKit/public/web/WebFindOptions.h"
139#include "third_party/WebKit/public/web/WebFormControlElement.h"
140#include "third_party/WebKit/public/web/WebFormElement.h"
141#include "third_party/WebKit/public/web/WebFrame.h"
[email protected]2255a9332013-06-17 05:12:31142#include "third_party/WebKit/public/web/WebHistoryItem.h"
[email protected]91dcc6d32014-07-30 00:01:33143#include "third_party/WebKit/public/web/WebHitTestResult.h"
[email protected]2255a9332013-06-17 05:12:31144#include "third_party/WebKit/public/web/WebInputElement.h"
145#include "third_party/WebKit/public/web/WebInputEvent.h"
[email protected]35b2a972014-04-04 15:50:22146#include "third_party/WebKit/public/web/WebLocalFrame.h"
[email protected]2255a9332013-06-17 05:12:31147#include "third_party/WebKit/public/web/WebMediaPlayerAction.h"
148#include "third_party/WebKit/public/web/WebNavigationPolicy.h"
kouhei40f03cb2015-09-24 07:47:01149#include "third_party/WebKit/public/web/WebPageImportanceSignals.h"
[email protected]2255a9332013-06-17 05:12:31150#include "third_party/WebKit/public/web/WebPlugin.h"
151#include "third_party/WebKit/public/web/WebPluginAction.h"
152#include "third_party/WebKit/public/web/WebPluginContainer.h"
153#include "third_party/WebKit/public/web/WebPluginDocument.h"
[email protected]2255a9332013-06-17 05:12:31154#include "third_party/WebKit/public/web/WebRange.h"
[email protected]b3a97b52014-07-09 06:25:05155#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
[email protected]2255a9332013-06-17 05:12:31156#include "third_party/WebKit/public/web/WebScriptSource.h"
157#include "third_party/WebKit/public/web/WebSearchableFormData.h"
158#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
159#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
[email protected]2255a9332013-06-17 05:12:31160#include "third_party/WebKit/public/web/WebSettings.h"
[email protected]2255a9332013-06-17 05:12:31161#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
[email protected]2255a9332013-06-17 05:12:31162#include "third_party/WebKit/public/web/WebView.h"
163#include "third_party/WebKit/public/web/WebWindowFeatures.h"
164#include "third_party/WebKit/public/web/default/WebRenderTheme.h"
[email protected]b3a97b52014-07-09 06:25:05165#include "third_party/icu/source/common/unicode/uchar.h"
166#include "third_party/icu/source/common/unicode/uscript.h"
[email protected]4ee64622014-03-21 22:34:15167#include "ui/base/clipboard/clipboard.h"
[email protected]1400e6dc2013-04-27 02:36:27168#include "ui/base/ui_base_switches_util.h"
[email protected]7d08a9352013-10-15 08:24:56169#include "ui/events/latency_info.h"
tfarina655f81d2014-12-23 02:38:50170#include "ui/gfx/geometry/point.h"
tfarina3b0452d2014-12-31 15:20:09171#include "ui/gfx/geometry/rect.h"
172#include "ui/gfx/geometry/rect_conversions.h"
tfarinaebe974f02015-01-03 04:25:32173#include "ui/gfx/geometry/size_conversions.h"
[email protected]08397d52011-02-05 01:53:38174#include "ui/gfx/native_widget_types.h"
[email protected]c4a9e932011-03-05 04:05:55175#include "v8/include/v8.h"
initial.commit09911bf2008-07-26 23:55:29176
[email protected]25fb9b32012-04-27 03:21:55177#if defined(OS_ANDROID)
[email protected]befe54782013-04-23 00:49:25178#include <cpu-features.h>
179
[email protected]20657a82012-08-21 20:23:03180#include "content/renderer/android/address_detector.h"
181#include "content/renderer/android/content_detector.h"
182#include "content/renderer/android/email_detector.h"
183#include "content/renderer/android/phone_number_detector.h"
[email protected]5c30b5e02013-05-30 03:46:08184#include "third_party/WebKit/public/platform/WebFloatPoint.h"
185#include "third_party/WebKit/public/platform/WebFloatRect.h"
tfarina3b0452d2014-12-31 15:20:09186#include "ui/gfx/geometry/rect_f.h"
[email protected]e69bb062013-06-03 13:05:40187
[email protected]25fb9b32012-04-27 03:21:55188#elif defined(OS_WIN)
[email protected]6c8afae52009-01-22 02:24:57189// TODO(port): these files are currently Windows only because they concern:
[email protected]6c8afae52009-01-22 02:24:57190// * theming
[email protected]990e6222012-11-16 13:31:18191#include "ui/native_theme/native_theme_win.h"
[email protected]6981f7f2010-03-09 00:53:03192#elif defined(USE_X11)
[email protected]990e6222012-11-16 13:31:18193#include "ui/native_theme/native_theme.h"
[email protected]78043bdd2010-04-05 18:45:33194#elif defined(OS_MACOSX)
195#include "skia/ext/skia_utils_mac.h"
[email protected]6c8afae52009-01-22 02:24:57196#endif
197
[email protected]ea2fb972013-08-07 05:44:26198#if defined(ENABLE_PLUGINS)
[email protected]a80af12e2013-08-07 23:36:13199#include "content/renderer/npapi/webplugin_delegate_proxy.h"
[email protected]ea2fb972013-08-07 05:44:26200#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
201#include "content/renderer/pepper/pepper_plugin_registry.h"
[email protected]ea2fb972013-08-07 05:44:26202#endif
203
[email protected]9ac667e2013-09-09 12:49:21204#if defined(ENABLE_WEBRTC)
205#include "content/renderer/media/rtc_peer_connection_handler.h"
[email protected]22fe91d2014-08-12 17:07:12206#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
[email protected]9ac667e2013-09-09 12:49:21207#endif
208
[email protected]180ef242013-11-07 06:50:46209using blink::WebAXObject;
210using blink::WebApplicationCacheHost;
211using blink::WebApplicationCacheHostClient;
212using blink::WebCString;
213using blink::WebColor;
[email protected]180ef242013-11-07 06:50:46214using blink::WebConsoleMessage;
[email protected]180ef242013-11-07 06:50:46215using blink::WebData;
216using blink::WebDataSource;
217using blink::WebDocument;
[email protected]180ef242013-11-07 06:50:46218using blink::WebDragData;
219using blink::WebDragOperation;
220using blink::WebDragOperationsMask;
221using blink::WebElement;
[email protected]180ef242013-11-07 06:50:46222using blink::WebFileChooserCompletion;
223using blink::WebFindOptions;
224using blink::WebFormControlElement;
225using blink::WebFormElement;
226using blink::WebFrame;
227using blink::WebGestureEvent;
228using blink::WebHistoryItem;
229using blink::WebHTTPBody;
230using blink::WebIconURL;
231using blink::WebImage;
232using blink::WebInputElement;
233using blink::WebInputEvent;
[email protected]35b2a972014-04-04 15:50:22234using blink::WebLocalFrame;
[email protected]180ef242013-11-07 06:50:46235using blink::WebMediaPlayerAction;
[email protected]180ef242013-11-07 06:50:46236using blink::WebMouseEvent;
237using blink::WebNavigationPolicy;
238using blink::WebNavigationType;
239using blink::WebNode;
[email protected]180ef242013-11-07 06:50:46240using blink::WebPeerConnection00Handler;
241using blink::WebPeerConnection00HandlerClient;
242using blink::WebPeerConnectionHandler;
243using blink::WebPeerConnectionHandlerClient;
244using blink::WebPluginAction;
245using blink::WebPluginContainer;
246using blink::WebPluginDocument;
[email protected]180ef242013-11-07 06:50:46247using blink::WebPoint;
[email protected]180ef242013-11-07 06:50:46248using blink::WebRange;
249using blink::WebRect;
250using blink::WebReferrerPolicy;
[email protected]180ef242013-11-07 06:50:46251using blink::WebScriptSource;
252using blink::WebSearchableFormData;
253using blink::WebSecurityOrigin;
254using blink::WebSecurityPolicy;
[email protected]180ef242013-11-07 06:50:46255using blink::WebSettings;
256using blink::WebSize;
[email protected]180ef242013-11-07 06:50:46257using blink::WebStorageNamespace;
258using blink::WebStorageQuotaCallbacks;
259using blink::WebStorageQuotaError;
260using blink::WebStorageQuotaType;
261using blink::WebString;
[email protected]180ef242013-11-07 06:50:46262using blink::WebTextDirection;
263using blink::WebTouchEvent;
264using blink::WebURL;
265using blink::WebURLError;
266using blink::WebURLRequest;
267using blink::WebURLResponse;
268using blink::WebUserGestureIndicator;
269using blink::WebVector;
270using blink::WebView;
271using blink::WebWidget;
272using blink::WebWindowFeatures;
[email protected]b3a97b52014-07-09 06:25:05273using blink::WebRuntimeFeatures;
[email protected]6fdd4182010-10-14 23:59:26274using base::Time;
275using base::TimeDelta;
[email protected]e1acf6f2008-10-27 20:43:33276
[email protected]20657a82012-08-21 20:23:03277#if defined(OS_ANDROID)
[email protected]180ef242013-11-07 06:50:46278using blink::WebContentDetectionResult;
279using blink::WebFloatPoint;
280using blink::WebFloatRect;
281using blink::WebHitTestResult;
[email protected]20657a82012-08-21 20:23:03282#endif
283
[email protected]e9ff79c2012-10-19 21:31:26284namespace content {
285
initial.commit09911bf2008-07-26 23:55:29286//-----------------------------------------------------------------------------
287
[email protected]180ef242013-11-07 06:50:46288typedef std::map<blink::WebView*, RenderViewImpl*> ViewMap;
[email protected]6de0fd1d2011-11-15 13:31:49289static base::LazyInstance<ViewMap> g_view_map = LAZY_INSTANCE_INITIALIZER;
avi1023d012015-12-25 02:39:14290typedef std::map<int32_t, RenderViewImpl*> RoutingIDViewMap;
[email protected]058561b2012-12-03 06:48:22291static base::LazyInstance<RoutingIDViewMap> g_routing_id_view_map =
292 LAZY_INSTANCE_INITIALIZER;
[email protected]3354d3e2010-06-10 19:53:02293
[email protected]882daa92009-11-05 16:31:31294// Time, in seconds, we delay before sending content state changes (such as form
295// state and scroll position) to the browser. We delay sending changes to avoid
296// spamming the browser.
297// To avoid having tab/session restore require sending a message to get the
298// current content state during tab closing we use a shorter timeout for the
299// foreground renderer. This means there is a small window of time from which
300// content state is modified and not sent to session restore, but this is
301// better than having to wake up all renderers during shutdown.
avif937e1d2014-11-02 18:13:07302const int kDelaySecondsForContentStateSyncHidden = 5;
303const int kDelaySecondsForContentStateSync = 1;
initial.commit09911bf2008-07-26 23:55:29304
[email protected]20657a82012-08-21 20:23:03305#if defined(OS_ANDROID)
306// Delay between tapping in content and launching the associated android intent.
307// Used to allow users see what has been recognized as content.
[email protected]9afc14e22013-09-25 22:34:14308const size_t kContentIntentDelayMilliseconds = 700;
[email protected]20657a82012-08-21 20:23:03309#endif
310
dcheng35d31c112015-07-22 00:17:36311static RenderViewImpl* (*g_create_render_view_impl)(
312 CompositorDependencies* compositor_deps,
313 const ViewMsg_New_Params&) = nullptr;
[email protected]8d41d7612012-11-14 20:32:19314
[email protected]c6bc20332014-02-28 18:30:39315// static
[email protected]e507045d2013-07-24 15:23:44316Referrer RenderViewImpl::GetReferrerFromRequest(
[email protected]44e55b012013-07-23 14:21:56317 WebFrame* frame,
318 const WebURLRequest& request) {
319 return Referrer(GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))),
[email protected]cacbd7a2014-02-04 01:26:02320 request.referrerPolicy());
[email protected]44e55b012013-07-23 14:21:56321}
322
[email protected]c6bc20332014-02-28 18:30:39323// static
[email protected]65920f332014-03-04 21:14:18324WindowOpenDisposition RenderViewImpl::NavigationPolicyToDisposition(
[email protected]48861e22013-01-09 00:27:32325 WebNavigationPolicy policy) {
326 switch (policy) {
[email protected]180ef242013-11-07 06:50:46327 case blink::WebNavigationPolicyIgnore:
[email protected]48861e22013-01-09 00:27:32328 return IGNORE_ACTION;
[email protected]180ef242013-11-07 06:50:46329 case blink::WebNavigationPolicyDownload:
[email protected]48861e22013-01-09 00:27:32330 return SAVE_TO_DISK;
[email protected]180ef242013-11-07 06:50:46331 case blink::WebNavigationPolicyCurrentTab:
[email protected]48861e22013-01-09 00:27:32332 return CURRENT_TAB;
[email protected]180ef242013-11-07 06:50:46333 case blink::WebNavigationPolicyNewBackgroundTab:
[email protected]48861e22013-01-09 00:27:32334 return NEW_BACKGROUND_TAB;
[email protected]180ef242013-11-07 06:50:46335 case blink::WebNavigationPolicyNewForegroundTab:
[email protected]48861e22013-01-09 00:27:32336 return NEW_FOREGROUND_TAB;
[email protected]180ef242013-11-07 06:50:46337 case blink::WebNavigationPolicyNewWindow:
[email protected]48861e22013-01-09 00:27:32338 return NEW_WINDOW;
[email protected]180ef242013-11-07 06:50:46339 case blink::WebNavigationPolicyNewPopup:
[email protected]48861e22013-01-09 00:27:32340 return NEW_POPUP;
341 default:
342 NOTREACHED() << "Unexpected WebNavigationPolicy";
343 return IGNORE_ACTION;
344 }
345}
346
[email protected]d8221b22013-05-23 05:35:43347// Returns true if the device scale is high enough that losing subpixel
348// antialiasing won't have a noticeable effect on text quality.
349static bool DeviceScaleEnsuresTextQuality(float device_scale_factor) {
350#if defined(OS_ANDROID)
351 // On Android, we never have subpixel antialiasing.
352 return true;
353#else
jdduke7d452b4a2015-08-19 21:25:21354 // 1.5 is a common touchscreen tablet device scale factor. For such
355 // devices main thread antialiasing is a heavy burden.
356 return device_scale_factor >= 1.5f;
[email protected]d8221b22013-05-23 05:35:43357#endif
[email protected]d8221b22013-05-23 05:35:43358}
359
danakj6e3bf8012014-12-16 18:27:53360static bool PreferCompositingToLCDText(CompositorDependencies* compositor_deps,
361 float device_scale_factor) {
avi83883c82014-12-23 00:08:49362 const base::CommandLine& command_line =
363 *base::CommandLine::ForCurrentProcess();
[email protected]b8ec1112014-08-17 20:09:10364 if (command_line.HasSwitch(switches::kDisablePreferCompositingToLCDText))
[email protected]fb854192013-02-06 01:30:04365 return false;
[email protected]b8ec1112014-08-17 20:09:10366 if (command_line.HasSwitch(switches::kEnablePreferCompositingToLCDText))
[email protected]fb854192013-02-06 01:30:04367 return true;
danakj6e3bf8012014-12-16 18:27:53368 if (!compositor_deps->IsLcdTextEnabled())
[email protected]10c19732014-08-18 19:39:23369 return true;
[email protected]d8221b22013-05-23 05:35:43370 return DeviceScaleEnsuresTextQuality(device_scale_factor);
371}
372
[email protected]180ef242013-11-07 06:50:46373static FaviconURL::IconType ToFaviconType(blink::WebIconURL::Type type) {
[email protected]41225fe2013-03-29 05:32:02374 switch (type) {
[email protected]180ef242013-11-07 06:50:46375 case blink::WebIconURL::TypeFavicon:
[email protected]41225fe2013-03-29 05:32:02376 return FaviconURL::FAVICON;
[email protected]180ef242013-11-07 06:50:46377 case blink::WebIconURL::TypeTouch:
[email protected]41225fe2013-03-29 05:32:02378 return FaviconURL::TOUCH_ICON;
[email protected]180ef242013-11-07 06:50:46379 case blink::WebIconURL::TypeTouchPrecomposed:
[email protected]41225fe2013-03-29 05:32:02380 return FaviconURL::TOUCH_PRECOMPOSED_ICON;
[email protected]180ef242013-11-07 06:50:46381 case blink::WebIconURL::TypeInvalid:
[email protected]41225fe2013-03-29 05:32:02382 return FaviconURL::INVALID_ICON;
383 }
384 return FaviconURL::INVALID_ICON;
385}
386
[email protected]f34ac132014-03-20 23:02:05387static void ConvertToFaviconSizes(
388 const blink::WebVector<blink::WebSize>& web_sizes,
389 std::vector<gfx::Size>* sizes) {
[email protected]2bd262b2014-04-16 05:31:23390 DCHECK(sizes->empty());
391 sizes->reserve(web_sizes.size());
[email protected]f34ac132014-03-20 23:02:05392 for (size_t i = 0; i < web_sizes.size(); ++i)
393 sizes->push_back(gfx::Size(web_sizes[i]));
394}
395
initial.commit09911bf2008-07-26 23:55:29396///////////////////////////////////////////////////////////////////////////////
397
[email protected]310ebd6302011-10-10 19:06:28398struct RenderViewImpl::PendingFileChooser {
[email protected]e9ff79c2012-10-19 21:31:26399 PendingFileChooser(const FileChooserParams& p, WebFileChooserCompletion* c)
[email protected]cdaf8d02010-03-30 19:52:47400 : params(p),
401 completion(c) {
402 }
[email protected]e9ff79c2012-10-19 21:31:26403 FileChooserParams params;
[email protected]cdaf8d02010-03-30 19:52:47404 WebFileChooserCompletion* completion; // MAY BE NULL to skip callback.
405};
406
[email protected]217690d2012-01-27 07:33:11407namespace {
408
409class WebWidgetLockTarget : public MouseLockDispatcher::LockTarget {
410 public:
[email protected]180ef242013-11-07 06:50:46411 explicit WebWidgetLockTarget(blink::WebWidget* webwidget)
[email protected]217690d2012-01-27 07:33:11412 : webwidget_(webwidget) {}
413
dcheng6d18e402014-10-21 12:32:52414 void OnLockMouseACK(bool succeeded) override {
[email protected]217690d2012-01-27 07:33:11415 if (succeeded)
416 webwidget_->didAcquirePointerLock();
417 else
418 webwidget_->didNotAcquirePointerLock();
419 }
420
dcheng6d18e402014-10-21 12:32:52421 void OnMouseLockLost() override { webwidget_->didLosePointerLock(); }
[email protected]217690d2012-01-27 07:33:11422
dcheng6d18e402014-10-21 12:32:52423 bool HandleMouseLockedInputEvent(const blink::WebMouseEvent& event) override {
[email protected]217690d2012-01-27 07:33:11424 // The WebWidget handles mouse lock in WebKit's handleInputEvent().
425 return false;
426 }
427
428 private:
[email protected]180ef242013-11-07 06:50:46429 blink::WebWidget* webwidget_;
[email protected]217690d2012-01-27 07:33:11430};
431
[email protected]dc293a72013-07-01 11:11:22432WebDragData DropDataToWebDragData(const DropData& drop_data) {
[email protected]c10680312013-05-31 15:22:05433 std::vector<WebDragData::Item> item_list;
434
435 // These fields are currently unused when dragging into WebKit.
436 DCHECK(drop_data.download_metadata.empty());
437 DCHECK(drop_data.file_contents.empty());
438 DCHECK(drop_data.file_description_filename.empty());
439
440 if (!drop_data.text.is_null()) {
441 WebDragData::Item item;
442 item.storageType = WebDragData::Item::StorageTypeString;
443 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeText);
444 item.stringData = drop_data.text.string();
445 item_list.push_back(item);
446 }
447
448 // TODO(dcheng): Do we need to distinguish between null and empty URLs? Is it
449 // meaningful to write an empty URL to the clipboard?
450 if (!drop_data.url.is_empty()) {
451 WebDragData::Item item;
452 item.storageType = WebDragData::Item::StorageTypeString;
453 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeURIList);
454 item.stringData = WebString::fromUTF8(drop_data.url.spec());
455 item.title = drop_data.url_title;
456 item_list.push_back(item);
457 }
458
459 if (!drop_data.html.is_null()) {
460 WebDragData::Item item;
461 item.storageType = WebDragData::Item::StorageTypeString;
462 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeHTML);
463 item.stringData = drop_data.html.string();
464 item.baseURL = drop_data.html_base_url;
465 item_list.push_back(item);
466 }
467
[email protected]17ea0ae22014-03-28 21:54:46468 for (std::vector<ui::FileInfo>::const_iterator it =
[email protected]c10680312013-05-31 15:22:05469 drop_data.filenames.begin();
470 it != drop_data.filenames.end();
471 ++it) {
472 WebDragData::Item item;
473 item.storageType = WebDragData::Item::StorageTypeFilename;
[email protected]17ea0ae22014-03-28 21:54:46474 item.filenameData = it->path.AsUTF16Unsafe();
475 item.displayNameData = it->display_name.AsUTF16Unsafe();
[email protected]c10680312013-05-31 15:22:05476 item_list.push_back(item);
477 }
478
[email protected]60ed95f2014-04-23 12:19:48479 for (std::vector<DropData::FileSystemFileInfo>::const_iterator it =
480 drop_data.file_system_files.begin();
481 it != drop_data.file_system_files.end();
482 ++it) {
483 WebDragData::Item item;
484 item.storageType = WebDragData::Item::StorageTypeFileSystemFile;
485 item.fileSystemURL = it->url;
486 item.fileSystemFileSize = it->size;
487 item_list.push_back(item);
488 }
489
[email protected]c10680312013-05-31 15:22:05490 for (std::map<base::string16, base::string16>::const_iterator it =
491 drop_data.custom_data.begin();
492 it != drop_data.custom_data.end();
493 ++it) {
494 WebDragData::Item item;
495 item.storageType = WebDragData::Item::StorageTypeString;
496 item.stringType = it->first;
497 item.stringData = it->second;
498 item_list.push_back(item);
499 }
500
501 WebDragData result;
502 result.initialize();
503 result.setItems(item_list);
504 result.setFilesystemId(drop_data.filesystem_id);
505 return result;
506}
507
[email protected]b3a97b52014-07-09 06:25:05508typedef void (*SetFontFamilyWrapper)(blink::WebSettings*,
509 const base::string16&,
510 UScriptCode);
511
512void SetStandardFontFamilyWrapper(WebSettings* settings,
513 const base::string16& font,
514 UScriptCode script) {
515 settings->setStandardFontFamily(font, script);
516}
517
518void SetFixedFontFamilyWrapper(WebSettings* settings,
519 const base::string16& font,
520 UScriptCode script) {
521 settings->setFixedFontFamily(font, script);
522}
523
524void SetSerifFontFamilyWrapper(WebSettings* settings,
525 const base::string16& font,
526 UScriptCode script) {
527 settings->setSerifFontFamily(font, script);
528}
529
530void SetSansSerifFontFamilyWrapper(WebSettings* settings,
531 const base::string16& font,
532 UScriptCode script) {
533 settings->setSansSerifFontFamily(font, script);
534}
535
536void SetCursiveFontFamilyWrapper(WebSettings* settings,
537 const base::string16& font,
538 UScriptCode script) {
539 settings->setCursiveFontFamily(font, script);
540}
541
542void SetFantasyFontFamilyWrapper(WebSettings* settings,
543 const base::string16& font,
544 UScriptCode script) {
545 settings->setFantasyFontFamily(font, script);
546}
547
548void SetPictographFontFamilyWrapper(WebSettings* settings,
549 const base::string16& font,
550 UScriptCode script) {
551 settings->setPictographFontFamily(font, script);
552}
553
554// If |scriptCode| is a member of a family of "similar" script codes, returns
555// the script code in that family that is used by WebKit for font selection
556// purposes. For example, USCRIPT_KATAKANA_OR_HIRAGANA and USCRIPT_JAPANESE are
557// considered equivalent for the purposes of font selection. WebKit uses the
558// script code USCRIPT_KATAKANA_OR_HIRAGANA. So, if |scriptCode| is
559// USCRIPT_JAPANESE, the function returns USCRIPT_KATAKANA_OR_HIRAGANA. WebKit
560// uses different scripts than the ones in Chrome pref names because the version
561// of ICU included on certain ports does not have some of the newer scripts. If
562// |scriptCode| is not a member of such a family, returns |scriptCode|.
563UScriptCode GetScriptForWebSettings(UScriptCode scriptCode) {
564 switch (scriptCode) {
565 case USCRIPT_HIRAGANA:
566 case USCRIPT_KATAKANA:
567 case USCRIPT_JAPANESE:
568 return USCRIPT_KATAKANA_OR_HIRAGANA;
569 case USCRIPT_KOREAN:
570 return USCRIPT_HANGUL;
571 default:
572 return scriptCode;
573 }
574}
575
576void ApplyFontsFromMap(const ScriptFontFamilyMap& map,
577 SetFontFamilyWrapper setter,
578 WebSettings* settings) {
579 for (ScriptFontFamilyMap::const_iterator it = map.begin(); it != map.end();
580 ++it) {
avi1023d012015-12-25 02:39:14581 int32_t script = u_getPropertyValueEnum(UCHAR_SCRIPT, (it->first).c_str());
[email protected]b3a97b52014-07-09 06:25:05582 if (script >= 0 && script < USCRIPT_CODE_LIMIT) {
583 UScriptCode code = static_cast<UScriptCode>(script);
584 (*setter)(settings, it->second, GetScriptForWebSettings(code));
585 }
586 }
587}
588
wangxianzhu3bf39be52015-04-10 23:56:41589void ApplyBlinkSettings(const base::CommandLine& command_line,
590 WebSettings* settings) {
591 if (!command_line.HasSwitch(switches::kBlinkSettings))
592 return;
593
brettw26dab8f02015-08-08 00:28:47594 std::vector<std::string> blink_settings = base::SplitString(
595 command_line.GetSwitchValueASCII(switches::kBlinkSettings),
596 ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
wangxianzhu3bf39be52015-04-10 23:56:41597 for (const std::string& setting : blink_settings) {
598 size_t pos = setting.find('=');
599 settings->setFromStrings(
600 blink::WebString::fromLatin1(setting.substr(0, pos)),
601 blink::WebString::fromLatin1(
602 pos == std::string::npos ? "" : setting.substr(pos + 1)));
603 }
604}
605
[email protected]217690d2012-01-27 07:33:11606} // namespace
607
dcheng35d31c112015-07-22 00:17:36608RenderViewImpl::RenderViewImpl(CompositorDependencies* compositor_deps,
609 const ViewMsg_New_Params& params)
610 : RenderWidget(compositor_deps,
611 blink::WebPopupTypeNone,
naskobd911332014-11-25 01:13:36612 params.initial_size.screen_info,
613 params.swapped_out,
614 params.hidden,
615 params.never_visible),
616 webkit_preferences_(params.web_preferences),
avif937e1d2014-11-02 18:13:07617 send_content_state_immediately_(false),
[email protected]81e63782009-02-27 19:35:09618 enabled_bindings_(0),
[email protected]3354d3e2010-06-10 19:53:02619 send_preferred_size_changes_(false),
[email protected]e75cb49e2009-01-05 23:13:21620 navigation_gesture_(NavigationGestureUnknown),
[email protected]3354d3e2010-06-10 19:53:02621 opened_by_user_gesture_(true),
622 opener_suppressed_(false),
[email protected]88f10a22013-11-06 21:22:12623 suppress_dialogs_until_swap_out_(false),
[email protected]81a34412009-01-05 19:17:24624 page_id_(-1),
naskobd911332014-11-25 01:13:36625 next_page_id_(params.next_page_id),
[email protected]3cc72b12010-03-18 23:03:00626 history_list_offset_(-1),
627 history_list_length_(0),
[email protected]7e9523b2014-03-25 03:02:42628 frames_in_progress_(0),
[email protected]3354d3e2010-06-10 19:53:02629 target_url_status_(TARGET_NONE),
[email protected]d42bf472014-06-14 01:49:38630 uses_temporary_zoom_level_(false),
[email protected]bbc8856d2013-06-14 10:37:04631#if defined(OS_ANDROID)
majidvpfb80e432015-02-23 14:15:50632 top_controls_constraints_(TOP_CONTROLS_STATE_BOTH),
[email protected]bbc8856d2013-06-14 10:37:04633#endif
alexmos7fac9aeb2015-10-16 22:39:49634 has_focus_(false),
[email protected]1875bc02014-03-14 06:33:59635 has_scrolled_focused_editable_node_into_rect_(false),
nasko4c0feb62015-06-05 18:37:06636 main_render_frame_(nullptr),
dcheng3ce04b62015-10-26 23:30:55637 frame_widget_(nullptr),
[email protected]64d09222012-05-25 10:10:34638 speech_recognition_dispatcher_(NULL),
[email protected]217690d2012-01-27 07:33:11639 mouse_lock_dispatcher_(NULL),
[email protected]20657a82012-08-21 20:23:03640#if defined(OS_ANDROID)
641 expected_content_intent_id_(0),
[email protected]a7564272013-04-19 14:24:46642#endif
643#if defined(OS_WIN)
644 focused_plugin_id_(-1),
645#endif
[email protected]e16c7a12013-12-05 16:30:08646#if defined(ENABLE_PLUGINS)
[email protected]54ea9ff2014-03-20 00:27:54647 plugin_find_handler_(NULL),
[email protected]e16c7a12013-12-05 16:30:08648 focused_pepper_plugin_(NULL),
649 pepper_last_mouse_event_target_(NULL),
650#endif
[email protected]8a67aa352013-02-20 02:58:29651 enumeration_completion_id_(0),
mcnee432e47d2015-11-09 19:37:46652 session_storage_namespace_id_(params.session_storage_namespace_id) {
[email protected]075366912013-02-18 07:13:24653}
654
danakj6e3bf8012014-12-16 18:27:53655void RenderViewImpl::Initialize(const ViewMsg_New_Params& params,
danakj6e3bf8012014-12-16 18:27:53656 bool was_created_by_renderer) {
fsamuele8326c742016-01-12 00:49:39657 SetRoutingID(params.view_id);
alexmos5ac402d2015-07-09 07:51:10658
659 int opener_view_routing_id;
alexmos95733002015-08-24 16:38:09660 WebFrame* opener_frame = RenderFrameImpl::ResolveOpener(
661 params.opener_frame_route_id, &opener_view_routing_id);
alexmos5ac402d2015-07-09 07:51:10662 if (opener_view_routing_id != MSG_ROUTING_NONE && was_created_by_renderer)
663 opener_id_ = opener_view_routing_id;
664
thestig6057a6b22015-11-12 23:01:33665 display_mode_ = params.initial_size.display_mode;
[email protected]676126f72011-01-15 00:03:51666
[email protected]74ce1ad2011-12-16 21:51:46667 // Ensure we start with a valid next_page_id_ from the browser.
668 DCHECK_GE(next_page_id_, 0);
669
[email protected]11fee2332011-03-29 20:36:35670 webwidget_ = WebView::create(this);
[email protected]217690d2012-01-27 07:33:11671 webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_));
[email protected]11fee2332011-03-29 20:36:35672
nasko4c0feb62015-06-05 18:37:06673 g_view_map.Get().insert(std::make_pair(webview(), this));
fsamuele8326c742016-01-12 00:49:39674 g_routing_id_view_map.Get().insert(std::make_pair(routing_id(), this));
nasko4c0feb62015-06-05 18:37:06675
avi83883c82014-12-23 00:08:49676 const base::CommandLine& command_line =
677 *base::CommandLine::ForCurrentProcess();
[email protected]20657a82012-08-21 20:23:03678
[email protected]27c521a2013-05-29 20:44:32679 if (command_line.HasSwitch(switches::kStatsCollectionController))
680 stats_collection_observer_.reset(new StatsCollectionObserver(this));
681
dchengc5ef1a52015-08-26 20:58:30682 if (params.main_frame_routing_id != MSG_ROUTING_NONE) {
dcheng3ce04b62015-10-26 23:30:55683 main_render_frame_ = RenderFrameImpl::CreateMainFrame(
684 this, params.main_frame_routing_id, params.main_frame_widget_routing_id,
685 params.hidden, screen_info(), compositor_deps_);
dchengc5ef1a52015-08-26 20:58:30686 }
687
nasko4c0feb62015-06-05 18:37:06688 if (params.proxy_routing_id != MSG_ROUTING_NONE) {
689 CHECK(params.swapped_out);
690 if (main_render_frame_) {
dchengc5ef1a52015-08-26 20:58:30691 DCHECK(!SiteIsolationPolicy::IsSwappedOutStateForbidden());
692 RenderFrameProxy* proxy = RenderFrameProxy::CreateProxyToReplaceFrame(
nasko4c0feb62015-06-05 18:37:06693 main_render_frame_, params.proxy_routing_id,
694 blink::WebTreeScopeType::Document);
695 main_render_frame_->set_render_frame_proxy(proxy);
696 } else {
dchengc5ef1a52015-08-26 20:58:30697 DCHECK(SiteIsolationPolicy::IsSwappedOutStateForbidden());
alexmosa181efc2015-09-03 00:39:04698 // Pass MSG_ROUTING_NONE for opener, since actual opener (if any) will be
699 // set separately below.
fsamuele8326c742016-01-12 00:49:39700 RenderFrameProxy::CreateFrameProxy(params.proxy_routing_id, routing_id(),
alexmosa181efc2015-09-03 00:39:04701 MSG_ROUTING_NONE, MSG_ROUTING_NONE,
dchengc5ef1a52015-08-26 20:58:30702 params.replicated_frame_state);
nasko4c0feb62015-06-05 18:37:06703 }
704 }
705
nasko4c0feb62015-06-05 18:37:06706 if (main_render_frame_)
707 main_render_frame_->Initialize();
708
[email protected]20657a82012-08-21 20:23:03709#if defined(OS_ANDROID)
limasdf81d962e2015-11-20 08:39:18710 content_detectors_.push_back(make_scoped_ptr(new AddressDetector()));
qinminc6a739f92015-03-31 17:46:11711 const std::string& contry_iso =
712 params.renderer_preferences.network_contry_iso;
713 if (!contry_iso.empty()) {
limasdf81d962e2015-11-20 08:39:18714 content_detectors_.push_back(
715 make_scoped_ptr(new PhoneNumberDetector(contry_iso)));
qinmin0d5560df2014-11-12 19:03:39716 }
limasdf81d962e2015-11-20 08:39:18717 content_detectors_.push_back(make_scoped_ptr(new EmailDetector()));
[email protected]20657a82012-08-21 20:23:03718#endif
719
fsamuele8326c742016-01-12 00:49:39720 RenderThread::Get()->AddRoute(routing_id(), this);
[email protected]676126f72011-01-15 00:03:51721 // Take a reference on behalf of the RenderThread. This will be balanced
lfge208fa42015-04-17 20:29:18722 // when we receive ViewMsg_Close in the RenderWidget (which RenderView
723 // inherits from).
[email protected]676126f72011-01-15 00:03:51724 AddRef();
[email protected]b2db9272014-01-10 17:42:00725 if (RenderThreadImpl::current()) {
726 RenderThreadImpl::current()->WidgetCreated();
727 if (is_hidden_)
728 RenderThreadImpl::current()->WidgetHidden();
729 }
[email protected]676126f72011-01-15 00:03:51730
731 // If this is a popup, we must wait for the CreatingNew_ACK message before
732 // completing initialization. Otherwise, we can finish it now.
pimanc4af3072015-10-02 03:45:59733 if (opener_id_ == MSG_ROUTING_NONE)
[email protected]676126f72011-01-15 00:03:51734 did_show_ = true;
oshimad5279032015-12-16 18:22:33735 UpdateWebViewWithDeviceScaleFactor();
mikhail.pozdnyakovc0e251b2015-04-15 06:51:12736 webview()->setDisplayMode(display_mode_);
[email protected]b8ec1112014-08-17 20:09:10737 webview()->settings()->setPreferCompositingToLCDTextEnabled(
danakj6e3bf8012014-12-16 18:27:53738 PreferCompositingToLCDText(compositor_deps_, device_scale_factor_));
jdduke2eee6cb2014-09-25 17:02:21739 webview()->settings()->setThreadedScrollingEnabled(
740 !command_line.HasSwitch(switches::kDisableThreadedScrolling));
skobes92ed7d462014-11-05 22:05:23741 webview()->settings()->setRootLayerScrolls(
742 command_line.HasSwitch(switches::kRootLayerScrolls));
[email protected]fb854192013-02-06 01:30:04743
sataya.mf405d0e2015-07-07 16:51:11744 ApplyWebPreferencesInternal(webkit_preferences_, webview(), compositor_deps_);
[email protected]9b159a52013-10-03 17:24:55745
[email protected]1400e6dc2013-04-27 02:36:27746 if (switches::IsTouchDragDropEnabled())
[email protected]edbea622012-11-28 20:39:38747 webview()->settings()->setTouchDragDropEnabled(true);
748
mfomitchev5ad034ec2015-04-24 21:57:27749 WebSettings::SelectionStrategyType selection_strategy =
jdduke9a6cbec2015-05-13 22:00:03750 WebSettings::SelectionStrategyType::Character;
mfomitchev5ad034ec2015-04-24 21:57:27751 const std::string selection_strategy_str =
752 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
753 switches::kTouchTextSelectionStrategy);
jdduke9a6cbec2015-05-13 22:00:03754 if (selection_strategy_str == "direction")
mfomitchev5ad034ec2015-04-24 21:57:27755 selection_strategy = WebSettings::SelectionStrategyType::Direction;
756 webview()->settings()->setSelectionStrategy(selection_strategy);
757
alexmos35799be2015-07-02 08:59:50758 // Set the main frame's name. Only needs to be done for WebLocalFrames,
759 // since the remote case was handled as part of SetReplicatedState on the
760 // proxy above.
761 if (!params.replicated_frame_state.name.empty() &&
762 webview()->mainFrame()->isWebLocalFrame()) {
alexmos3448b552015-06-26 07:49:13763 webview()->mainFrame()->setName(
764 blink::WebString::fromUTF8(params.replicated_frame_state.name));
765 }
[email protected]34c61bd52011-05-02 19:38:33766
[email protected]c7c0d822014-04-16 20:19:49767 // TODO(davidben): Move this state from Blink into content.
naskobd911332014-11-25 01:13:36768 if (params.window_was_created_with_opener)
[email protected]c7c0d822014-04-16 20:19:49769 webview()->setOpenedByDOM();
770
naskobd911332014-11-25 01:13:36771 OnSetRendererPrefs(params.renderer_preferences);
[email protected]34c61bd52011-05-02 19:38:33772
wangxianzhu3bf39be52015-04-10 23:56:41773 ApplyBlinkSettings(command_line, webview()->settings());
774
naskobd911332014-11-25 01:13:36775 if (!params.enable_auto_resize) {
776 OnResize(params.initial_size);
mkosiba58fa72f02014-11-12 01:21:36777 } else {
naskobd911332014-11-25 01:13:36778 OnEnableAutoResize(params.min_size, params.max_size);
mkosiba58fa72f02014-11-12 01:21:36779 }
780
[email protected]86a7d3c2011-09-12 16:45:32781#if defined(OS_MACOSX)
782 new TextInputClientObserver(this);
783#endif // defined(OS_MACOSX)
[email protected]8f6a3b852011-07-19 16:48:56784
dgozman358ba322015-03-26 15:05:30785 // The next group of objects all implement RenderViewObserver, so are deleted
786 // along with the RenderView automatically.
[email protected]89054502012-06-03 10:29:24787 mouse_lock_dispatcher_ = new RenderViewMouseLockDispatcher(this);
[email protected]063afcb2011-09-29 07:54:32788
creis8eb8ef22015-11-04 22:51:38789 // We don't use HistoryController in OOPIF-enabled modes.
790 if (!SiteIsolationPolicy::UseSubframeNavigationEntries())
791 history_controller_.reset(new HistoryController(this));
[email protected]d4734982014-04-15 02:05:55792
[email protected]1784b2f2011-11-24 10:53:48793 new IdleUserDetector(this);
794
[email protected]766a7082012-02-03 23:39:15795 if (command_line.HasSwitch(switches::kDomAutomationController))
[email protected]e9ff79c2012-10-19 21:31:26796 enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION;
[email protected]27c521a2013-05-29 20:44:32797 if (command_line.HasSwitch(switches::kStatsCollectionController))
798 enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION;
[email protected]766a7082012-02-03 23:39:15799
[email protected]e9ff79c2012-10-19 21:31:26800 GetContentClient()->renderer()->RenderViewCreated(this);
[email protected]14392a52012-05-02 20:28:44801
alexmos5ac402d2015-07-09 07:51:10802 // If we have an opener_frame but we weren't created by a renderer, then it's
803 // the browser asking us to set our opener to another frame.
804 if (opener_frame && !was_created_by_renderer)
805 webview()->mainFrame()->setOpener(opener_frame);
[email protected]14392a52012-05-02 20:28:44806
807 // If we are initially swapped out, navigate to kSwappedOutURL.
808 // This ensures we are in a unique origin that others cannot script.
[email protected]82307f6b2014-08-07 03:30:12809 if (is_swapped_out_ && webview()->mainFrame()->isWebLocalFrame())
nasko78f06bc2014-11-18 18:18:57810 main_render_frame_->NavigateToSwappedOutURL();
initial.commit09911bf2008-07-26 23:55:29811}
812
[email protected]310ebd6302011-10-10 19:06:28813RenderViewImpl::~RenderViewImpl() {
dcheng3ce04b62015-10-26 23:30:55814 DCHECK(!frame_widget_);
815
[email protected]cb189e062014-04-23 00:57:01816 for (BitmapMap::iterator it = disambiguation_bitmaps_.begin();
817 it != disambiguation_bitmaps_.end();
818 ++it)
819 delete it->second;
[email protected]91a2aea2013-07-08 23:14:39820
[email protected]a1128322009-10-06 18:38:46821 // If file chooser is still waiting for answer, dispatch empty answer.
[email protected]cdaf8d02010-03-30 19:52:47822 while (!file_chooser_completions_.empty()) {
823 if (file_chooser_completions_.front()->completion) {
824 file_chooser_completions_.front()->completion->didChooseFile(
825 WebVector<WebString>());
826 }
827 file_chooser_completions_.pop_front();
828 }
[email protected]a1128322009-10-06 18:38:46829
[email protected]8ed1d3f2013-02-20 11:45:55830#if defined(OS_ANDROID)
831 // The date/time picker client is both a scoped_ptr member of this class and
832 // a RenderViewObserver. Reset it to prevent double deletion.
833 date_time_picker_client_.reset();
834#endif
835
[email protected]60c42a8c72009-10-09 04:08:59836#ifndef NDEBUG
[email protected]058561b2012-12-03 06:48:22837 // Make sure we are no longer referenced by the ViewMap or RoutingIDViewMap.
[email protected]625332e02010-12-14 07:48:49838 ViewMap* views = g_view_map.Pointer();
[email protected]60c42a8c72009-10-09 04:08:59839 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it)
840 DCHECK_NE(this, it->second) << "Failed to call Close?";
[email protected]058561b2012-12-03 06:48:22841 RoutingIDViewMap* routing_id_views = g_routing_id_view_map.Pointer();
842 for (RoutingIDViewMap::iterator it = routing_id_views->begin();
843 it != routing_id_views->end(); ++it)
844 DCHECK_NE(this, it->second) << "Failed to call Close?";
[email protected]60c42a8c72009-10-09 04:08:59845#endif
[email protected]676126f72011-01-15 00:03:51846
[email protected]310ebd6302011-10-10 19:06:28847 FOR_EACH_OBSERVER(RenderViewObserver, observers_, RenderViewGone());
[email protected]676126f72011-01-15 00:03:51848 FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct());
[email protected]60c42a8c72009-10-09 04:08:59849}
850
851/*static*/
[email protected]310ebd6302011-10-10 19:06:28852RenderViewImpl* RenderViewImpl::FromWebView(WebView* webview) {
[email protected]a2ef54c2011-10-10 16:20:31853 ViewMap* views = g_view_map.Pointer();
854 ViewMap::iterator it = views->find(webview);
855 return it == views->end() ? NULL : it->second;
856}
857
858/*static*/
[email protected]180ef242013-11-07 06:50:46859RenderView* RenderView::FromWebView(blink::WebView* webview) {
[email protected]310ebd6302011-10-10 19:06:28860 return RenderViewImpl::FromWebView(webview);
[email protected]a2ef54c2011-10-10 16:20:31861}
862
863/*static*/
avi1023d012015-12-25 02:39:14864RenderViewImpl* RenderViewImpl::FromRoutingID(int32_t routing_id) {
[email protected]640e303c2012-12-05 01:36:07865 RoutingIDViewMap* views = g_routing_id_view_map.Pointer();
866 RoutingIDViewMap::iterator it = views->find(routing_id);
867 return it == views->end() ? NULL : it->second;
868}
869
870/*static*/
871RenderView* RenderView::FromRoutingID(int routing_id) {
872 return RenderViewImpl::FromRoutingID(routing_id);
873}
874
[email protected]f3a95312014-06-12 16:46:58875/* static */
jochen9c7b8f242015-06-01 15:32:02876size_t RenderView::GetRenderViewCount() {
[email protected]f3a95312014-06-12 16:46:58877 return g_view_map.Get().size();
878}
879
[email protected]640e303c2012-12-05 01:36:07880/*static*/
[email protected]e9ff79c2012-10-19 21:31:26881void RenderView::ForEach(RenderViewVisitor* visitor) {
[email protected]625332e02010-12-14 07:48:49882 ViewMap* views = g_view_map.Pointer();
[email protected]60c42a8c72009-10-09 04:08:59883 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) {
884 if (!visitor->Visit(it->second))
885 return;
886 }
887}
888
889/*static*/
[email protected]b3a97b52014-07-09 06:25:05890void RenderView::ApplyWebPreferences(const WebPreferences& prefs,
891 WebView* web_view) {
892 WebSettings* settings = web_view->settings();
893 ApplyFontsFromMap(prefs.standard_font_family_map,
894 SetStandardFontFamilyWrapper, settings);
895 ApplyFontsFromMap(prefs.fixed_font_family_map,
896 SetFixedFontFamilyWrapper, settings);
897 ApplyFontsFromMap(prefs.serif_font_family_map,
898 SetSerifFontFamilyWrapper, settings);
899 ApplyFontsFromMap(prefs.sans_serif_font_family_map,
900 SetSansSerifFontFamilyWrapper, settings);
901 ApplyFontsFromMap(prefs.cursive_font_family_map,
902 SetCursiveFontFamilyWrapper, settings);
903 ApplyFontsFromMap(prefs.fantasy_font_family_map,
904 SetFantasyFontFamilyWrapper, settings);
905 ApplyFontsFromMap(prefs.pictograph_font_family_map,
906 SetPictographFontFamilyWrapper, settings);
907 settings->setDefaultFontSize(prefs.default_font_size);
908 settings->setDefaultFixedFontSize(prefs.default_fixed_font_size);
909 settings->setMinimumFontSize(prefs.minimum_font_size);
910 settings->setMinimumLogicalFontSize(prefs.minimum_logical_font_size);
911 settings->setDefaultTextEncodingName(
912 base::ASCIIToUTF16(prefs.default_encoding));
913 settings->setJavaScriptEnabled(prefs.javascript_enabled);
914 settings->setWebSecurityEnabled(prefs.web_security_enabled);
915 settings->setJavaScriptCanOpenWindowsAutomatically(
916 prefs.javascript_can_open_windows_automatically);
917 settings->setLoadsImagesAutomatically(prefs.loads_images_automatically);
918 settings->setImagesEnabled(prefs.images_enabled);
919 settings->setPluginsEnabled(prefs.plugins_enabled);
920 settings->setDOMPasteAllowed(prefs.dom_paste_enabled);
[email protected]b3a97b52014-07-09 06:25:05921 settings->setUsesEncodingDetector(prefs.uses_universal_detector);
922 settings->setTextAreasAreResizable(prefs.text_areas_are_resizable);
923 settings->setAllowScriptsToCloseWindows(prefs.allow_scripts_to_close_windows);
924 settings->setDownloadableBinaryFontsEnabled(prefs.remote_fonts_enabled);
925 settings->setJavaScriptCanAccessClipboard(
926 prefs.javascript_can_access_clipboard);
927 WebRuntimeFeatures::enableXSLT(prefs.xslt_enabled);
928 settings->setXSSAuditorEnabled(prefs.xss_auditor_enabled);
929 settings->setDNSPrefetchingEnabled(prefs.dns_prefetching_enabled);
Ben Greenstein49878f52015-12-18 19:13:21930 settings->setDataSaverEnabled(prefs.data_saver_enabled);
[email protected]b3a97b52014-07-09 06:25:05931 settings->setLocalStorageEnabled(prefs.local_storage_enabled);
932 settings->setSyncXHRInDocumentsEnabled(prefs.sync_xhr_in_documents_enabled);
933 WebRuntimeFeatures::enableDatabase(prefs.databases_enabled);
934 settings->setOfflineWebApplicationCacheEnabled(
935 prefs.application_cache_enabled);
936 settings->setCaretBrowsingEnabled(prefs.caret_browsing_enabled);
937 settings->setHyperlinkAuditingEnabled(prefs.hyperlink_auditing_enabled);
938 settings->setCookieEnabled(prefs.cookie_enabled);
939 settings->setNavigateOnDragDrop(prefs.navigate_on_drag_drop);
940
[email protected]b3a97b52014-07-09 06:25:05941 // By default, allow_universal_access_from_file_urls is set to false and thus
942 // we mitigate attacks from local HTML files by not granting file:// URLs
943 // universal access. Only test shell will enable this.
944 settings->setAllowUniversalAccessFromFileURLs(
945 prefs.allow_universal_access_from_file_urls);
946 settings->setAllowFileAccessFromFileURLs(
947 prefs.allow_file_access_from_file_urls);
948
949 // Enable the web audio API if requested on the command line.
950 settings->setWebAudioEnabled(prefs.webaudio_enabled);
951
952 // Enable experimental WebGL support if requested on command line
953 // and support is compiled in.
954 settings->setExperimentalWebGLEnabled(prefs.experimental_webgl_enabled);
955
956 // Disable GL multisampling if requested on command line.
957 settings->setOpenGLMultisamplingEnabled(prefs.gl_multisampling_enabled);
958
959 // Enable WebGL errors to the JS console if requested.
960 settings->setWebGLErrorsToConsoleEnabled(
961 prefs.webgl_errors_to_console_enabled);
962
963 // Uses the mock theme engine for scrollbars.
964 settings->setMockScrollbarsEnabled(prefs.mock_scrollbars_enabled);
965
[email protected]b3a97b52014-07-09 06:25:05966 // Enable gpu-accelerated 2d canvas if requested on the command line.
967 settings->setAccelerated2dCanvasEnabled(prefs.accelerated_2d_canvas_enabled);
968
969 settings->setMinimumAccelerated2dCanvasSize(
970 prefs.minimum_accelerated_2d_canvas_size);
971
972 // Disable antialiasing for 2d canvas if requested on the command line.
973 settings->setAntialiased2dCanvasEnabled(
974 !prefs.antialiased_2d_canvas_disabled);
975
robertphillipse25137b2014-10-20 13:44:34976 // Enabled antialiasing of clips for 2d canvas if requested on the command
977 // line.
978 settings->setAntialiasedClips2dCanvasEnabled(
979 prefs.antialiased_clips_2d_canvas_enabled);
980
[email protected]b3a97b52014-07-09 06:25:05981 // Set MSAA sample count for 2d canvas if requested on the command line (or
982 // default value if not).
983 settings->setAccelerated2dCanvasMSAASampleCount(
984 prefs.accelerated_2d_canvas_msaa_sample_count);
985
[email protected]b3a97b52014-07-09 06:25:05986 settings->setUnifiedTextCheckerEnabled(prefs.unified_textchecker_enabled);
987
[email protected]b3a97b52014-07-09 06:25:05988 // Tabs to link is not part of the settings. WebCore calls
989 // ChromeClient::tabsToLinks which is part of the glue code.
990 web_view->setTabsToLinks(prefs.tabs_to_links);
991
992 settings->setAllowDisplayOfInsecureContent(
993 prefs.allow_displaying_insecure_content);
994 settings->setAllowRunningOfInsecureContent(
995 prefs.allow_running_insecure_content);
mkwst772ce8142015-01-16 13:28:07996 settings->setDisableReadingFromCanvas(prefs.disable_reading_from_canvas);
mkwst2fc2c4f2015-01-08 08:29:18997 settings->setStrictMixedContentChecking(prefs.strict_mixed_content_checking);
mkwst2384c8222015-07-30 07:26:47998
999 settings->setStrictlyBlockBlockableMixedContent(
1000 prefs.strictly_block_blockable_mixed_content);
1001
mkwst0d233e52015-08-10 09:33:141002 settings->setStrictMixedContentCheckingForPlugin(
1003 prefs.block_mixed_plugin_content);
1004
mkwst673a452f2015-01-10 14:41:501005 settings->setStrictPowerfulFeatureRestrictions(
1006 prefs.strict_powerful_feature_restrictions);
jww9d4ca2d2016-01-19 20:58:591007 settings->setAllowGeolocationOnInsecureOrigins(
1008 prefs.allow_geolocation_on_insecure_origins);
[email protected]b3a97b52014-07-09 06:25:051009 settings->setPasswordEchoEnabled(prefs.password_echo_enabled);
1010 settings->setShouldPrintBackgrounds(prefs.should_print_backgrounds);
1011 settings->setShouldClearDocumentBackground(
1012 prefs.should_clear_document_background);
1013 settings->setEnableScrollAnimator(prefs.enable_scroll_animator);
1014
[email protected]b3a97b52014-07-09 06:25:051015 WebRuntimeFeatures::enableTouch(prefs.touch_enabled);
1016 settings->setMaxTouchPoints(prefs.pointer_events_max_touch_points);
mustaq29eb7092014-11-14 00:32:121017 settings->setAvailablePointerTypes(prefs.available_pointer_types);
1018 settings->setPrimaryPointerType(
nzolghadrc0d1663c2015-11-26 21:15:241019 static_cast<blink::PointerType>(prefs.primary_pointer_type));
mustaq29eb7092014-11-14 00:32:121020 settings->setAvailableHoverTypes(prefs.available_hover_types);
1021 settings->setPrimaryHoverType(
nzolghadrc0d1663c2015-11-26 21:15:241022 static_cast<blink::HoverType>(prefs.primary_hover_type));
[email protected]b3a97b52014-07-09 06:25:051023 settings->setDeviceSupportsTouch(prefs.device_supports_touch);
1024 settings->setDeviceSupportsMouse(prefs.device_supports_mouse);
1025 settings->setEnableTouchAdjustment(prefs.touch_adjustment_enabled);
mustaq35bb250b2015-05-06 21:22:391026 settings->setMultiTargetTapNotificationEnabled(
1027 switches::IsLinkDisambiguationPopupEnabled());
[email protected]b3a97b52014-07-09 06:25:051028
noelf552c5172014-11-05 22:53:211029 WebRuntimeFeatures::enableImageColorProfiles(
1030 prefs.image_color_profiles_enabled);
[email protected]b3a97b52014-07-09 06:25:051031 settings->setShouldRespectImageOrientation(
1032 prefs.should_respect_image_orientation);
1033
1034 settings->setUnsafePluginPastingEnabled(false);
1035 settings->setEditingBehavior(
1036 static_cast<WebSettings::EditingBehavior>(prefs.editing_behavior));
1037
1038 settings->setSupportsMultipleWindows(prefs.supports_multiple_windows);
1039
[email protected]b3a97b52014-07-09 06:25:051040 settings->setSmartInsertDeleteEnabled(prefs.smart_insert_delete_enabled);
1041
1042 settings->setSpatialNavigationEnabled(prefs.spatial_navigation_enabled);
1043
1044 settings->setSelectionIncludesAltImageText(true);
1045
[email protected]35103c02014-08-12 15:08:471046 settings->setV8CacheOptions(
1047 static_cast<WebSettings::V8CacheOptions>(prefs.v8_cache_options));
1048
je_julie.kim7fbb5a1a2015-02-09 17:26:051049 settings->setImageAnimationPolicy(
1050 static_cast<WebSettings::ImageAnimationPolicy>(prefs.animation_policy));
1051
dcheng5ae8ca362015-02-05 04:03:471052 // Needs to happen before setIgnoreVIewportTagScaleLimits below.
1053 web_view->setDefaultPageScaleLimits(
1054 prefs.default_minimum_page_scale_factor,
1055 prefs.default_maximum_page_scale_factor);
1056
[email protected]b3a97b52014-07-09 06:25:051057#if defined(OS_ANDROID)
1058 settings->setAllowCustomScrollbarInMainFrame(false);
1059 settings->setTextAutosizingEnabled(prefs.text_autosizing_enabled);
1060 settings->setAccessibilityFontScaleFactor(prefs.font_scale_factor);
1061 settings->setDeviceScaleAdjustment(prefs.device_scale_adjustment);
[email protected]023fed312014-08-11 16:13:051062 settings->setFullscreenSupported(prefs.fullscreen_supported);
[email protected]b3a97b52014-07-09 06:25:051063 web_view->setIgnoreViewportTagScaleLimits(prefs.force_enable_zoom);
1064 settings->setAutoZoomFocusedNodeToLegibleScale(true);
1065 settings->setDoubleTapToZoomEnabled(prefs.double_tap_to_zoom_enabled);
1066 settings->setMediaControlsOverlayPlayButtonEnabled(true);
1067 settings->setMediaPlaybackRequiresUserGesture(
1068 prefs.user_gesture_required_for_media_playback);
1069 settings->setDefaultVideoPosterURL(
1070 base::ASCIIToUTF16(prefs.default_video_poster_url.spec()));
1071 settings->setSupportDeprecatedTargetDensityDPI(
1072 prefs.support_deprecated_target_density_dpi);
1073 settings->setUseLegacyBackgroundSizeShorthandBehavior(
1074 prefs.use_legacy_background_size_shorthand_behavior);
1075 settings->setWideViewportQuirkEnabled(prefs.wide_viewport_quirk);
1076 settings->setUseWideViewport(prefs.use_wide_viewport);
[email protected]9954ea92014-08-12 15:48:451077 settings->setForceZeroLayoutHeight(prefs.force_zero_layout_height);
[email protected]b3a97b52014-07-09 06:25:051078 settings->setViewportMetaLayoutSizeQuirk(
1079 prefs.viewport_meta_layout_size_quirk);
1080 settings->setViewportMetaMergeContentQuirk(
1081 prefs.viewport_meta_merge_content_quirk);
1082 settings->setViewportMetaNonUserScalableQuirk(
1083 prefs.viewport_meta_non_user_scalable_quirk);
1084 settings->setViewportMetaZeroValuesQuirk(
1085 prefs.viewport_meta_zero_values_quirk);
1086 settings->setClobberUserAgentInitialScaleQuirk(
1087 prefs.clobber_user_agent_initial_scale_quirk);
1088 settings->setIgnoreMainFrameOverflowHiddenQuirk(
1089 prefs.ignore_main_frame_overflow_hidden_quirk);
1090 settings->setReportScreenSizeInPhysicalPixelsQuirk(
1091 prefs.report_screen_size_in_physical_pixels_quirk);
liberato2f1a7e02015-08-10 16:01:411092 settings->setPreferHiddenVolumeControls(true);
boliu15ca2652015-09-04 23:33:401093 settings->setMainFrameClipsContent(!prefs.record_whole_document);
[email protected]b3a97b52014-07-09 06:25:051094 settings->setShrinksViewportContentToFit(true);
runed1677fd2015-03-12 09:01:531095 settings->setUseMobileViewportStyle(true);
liberato6524fa42015-09-14 23:26:081096 settings->setAutoplayExperimentMode(
1097 blink::WebString::fromUTF8(prefs.autoplay_experiment_mode));
[email protected]b3a97b52014-07-09 06:25:051098#endif
1099
yoava1a508b42015-10-20 12:03:211100 settings->setViewportEnabled(prefs.viewport_enabled);
1101 settings->setLoadWithOverviewMode(prefs.initialize_at_minimum_page_scale);
1102 settings->setViewportMetaEnabled(prefs.viewport_meta_enabled);
1103 settings->setMainFrameResizesAreOrientationChanges(
1104 prefs.main_frame_resizes_are_orientation_changes);
1105
[email protected]b3a97b52014-07-09 06:25:051106 settings->setPinchOverlayScrollbarThickness(
1107 prefs.pinch_overlay_scrollbar_thickness);
1108 settings->setUseSolidColorScrollbars(prefs.use_solid_color_scrollbars);
jinho.bang8f11ffa2014-12-04 06:03:031109
arjanl98804912015-03-04 09:23:041110 settings->setShowContextMenuOnMouseUp(prefs.context_menu_on_mouse_up);
ccameron2fd70de72015-02-19 00:40:401111
1112#if defined(OS_MACOSX)
1113 settings->setDoubleTapToZoomEnabled(true);
ccameronf29a7802015-02-20 22:11:251114 web_view->setMaximumLegibleScale(prefs.default_maximum_page_scale_factor);
ccameron2fd70de72015-02-19 00:40:401115#endif
[email protected]b3a97b52014-07-09 06:25:051116}
1117
1118/*static*/
dcheng35d31c112015-07-22 00:17:361119RenderViewImpl* RenderViewImpl::Create(CompositorDependencies* compositor_deps,
1120 const ViewMsg_New_Params& params,
danakj6e3bf8012014-12-16 18:27:531121 bool was_created_by_renderer) {
naskobd911332014-11-25 01:13:361122 DCHECK(params.view_id != MSG_ROUTING_NONE);
[email protected]075366912013-02-18 07:13:241123 RenderViewImpl* render_view = NULL;
[email protected]8d41d7612012-11-14 20:32:191124 if (g_create_render_view_impl)
dcheng35d31c112015-07-22 00:17:361125 render_view = g_create_render_view_impl(compositor_deps, params);
[email protected]075366912013-02-18 07:13:241126 else
dcheng35d31c112015-07-22 00:17:361127 render_view = new RenderViewImpl(compositor_deps, params);
[email protected]0287e762014-04-11 13:07:581128
dcheng35d31c112015-07-22 00:17:361129 render_view->Initialize(params, was_created_by_renderer);
[email protected]075366912013-02-18 07:13:241130 return render_view;
[email protected]8d41d7612012-11-14 20:32:191131}
1132
1133// static
dcheng35d31c112015-07-22 00:17:361134void RenderViewImpl::InstallCreateHook(RenderViewImpl* (
1135 *create_render_view_impl)(CompositorDependencies* compositor_deps,
1136 const ViewMsg_New_Params&)) {
[email protected]8d41d7612012-11-14 20:32:191137 CHECK(!g_create_render_view_impl);
1138 g_create_render_view_impl = create_render_view_impl;
initial.commit09911bf2008-07-26 23:55:291139}
1140
[email protected]310ebd6302011-10-10 19:06:281141void RenderViewImpl::AddObserver(RenderViewObserver* observer) {
[email protected]676126f72011-01-15 00:03:511142 observers_.AddObserver(observer);
1143}
1144
[email protected]310ebd6302011-10-10 19:06:281145void RenderViewImpl::RemoveObserver(RenderViewObserver* observer) {
1146 observer->RenderViewGone();
[email protected]676126f72011-01-15 00:03:511147 observers_.RemoveObserver(observer);
1148}
1149
[email protected]180ef242013-11-07 06:50:461150blink::WebView* RenderViewImpl::webview() const {
1151 return static_cast<blink::WebView*>(webwidget());
[email protected]4d51d5bf2010-07-26 18:48:261152}
1153
[email protected]ea2fb972013-08-07 05:44:261154#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:571155void RenderViewImpl::PepperInstanceCreated(
1156 PepperPluginInstanceImpl* instance) {
1157 active_pepper_instances_.insert(instance);
emaxxe70f5e12015-05-29 11:26:001158
1159 RenderFrameImpl* const render_frame = instance->render_frame();
1160 render_frame->Send(
1161 new FrameHostMsg_PepperInstanceCreated(render_frame->GetRoutingID()));
[email protected]a99a38802014-01-14 15:46:571162}
1163
1164void RenderViewImpl::PepperInstanceDeleted(
1165 PepperPluginInstanceImpl* instance) {
1166 active_pepper_instances_.erase(instance);
1167
1168 if (pepper_last_mouse_event_target_ == instance)
1169 pepper_last_mouse_event_target_ = NULL;
1170 if (focused_pepper_plugin_ == instance)
1171 PepperFocusChanged(instance, false);
emaxxe70f5e12015-05-29 11:26:001172
1173 RenderFrameImpl* const render_frame = instance->render_frame();
1174 if (render_frame)
1175 render_frame->Send(
1176 new FrameHostMsg_PepperInstanceDeleted(render_frame->GetRoutingID()));
[email protected]a99a38802014-01-14 15:46:571177}
1178
1179void RenderViewImpl::PepperFocusChanged(PepperPluginInstanceImpl* instance,
1180 bool focused) {
1181 if (focused)
1182 focused_pepper_plugin_ = instance;
1183 else if (focused_pepper_plugin_ == instance)
1184 focused_pepper_plugin_ = NULL;
1185
fsamuel72464894f2015-12-15 06:59:311186 UpdateTextInputState(ShowIme::HIDE_IME, ChangeSource::FROM_NON_IME);
[email protected]a99a38802014-01-14 15:46:571187 UpdateSelectionBounds();
1188}
1189
[email protected]310ebd6302011-10-10 19:06:281190void RenderViewImpl::RegisterPluginDelegate(WebPluginDelegateProxy* delegate) {
[email protected]d8fd6fa2010-02-01 15:54:261191 plugin_delegates_.insert(delegate);
[email protected]49232292010-09-03 19:07:301192 // If the renderer is visible, set initial visibility and focus state.
1193 if (!is_hidden()) {
[email protected]784ea1ab2010-09-18 00:02:341194#if defined(OS_MACOSX)
[email protected]49232292010-09-03 19:07:301195 delegate->SetContainerVisibility(true);
1196 if (webview() && webview()->isActive())
1197 delegate->SetWindowFocus(true);
[email protected]784ea1ab2010-09-18 00:02:341198#endif
[email protected]49232292010-09-03 19:07:301199 }
[email protected]784ea1ab2010-09-18 00:02:341200 // Plugins start assuming the content has focus (so that they work in
1201 // environments where RenderView isn't hosting them), so we always have to
1202 // set the initial state. See webplugin_delegate_impl.h for details.
1203 delegate->SetContentAreaFocus(has_focus());
[email protected]d8fd6fa2010-02-01 15:54:261204}
1205
[email protected]310ebd6302011-10-10 19:06:281206void RenderViewImpl::UnregisterPluginDelegate(
1207 WebPluginDelegateProxy* delegate) {
[email protected]d8fd6fa2010-02-01 15:54:261208 plugin_delegates_.erase(delegate);
1209}
[email protected]d8fd6fa2010-02-01 15:54:261210
[email protected]a80af12e2013-08-07 23:36:131211#if defined(OS_WIN)
1212void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
1213 if (focused)
1214 focused_plugin_id_ = plugin_id;
1215 else
1216 focused_plugin_id_ = -1;
1217}
1218#endif
1219
1220#if defined(OS_MACOSX)
1221void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
1222 Send(new ViewHostMsg_PluginFocusChanged(routing_id(), focused, plugin_id));
1223}
1224
[email protected]7411a3c2014-08-15 05:20:191225void RenderViewImpl::OnGetRenderedText() {
1226 if (!webview())
1227 return;
1228 // Get rendered text from WebLocalFrame.
1229 // TODO: Currently IPC truncates any data that has a
1230 // size > kMaximumMessageSize. May be split the text into smaller chunks and
1231 // send back using multiple IPC. See http://crbug.com/393444.
1232 static const size_t kMaximumMessageSize = 8 * 1024 * 1024;
1233 std::string text = webview()->mainFrame()->contentAsText(
1234 kMaximumMessageSize).utf8();
1235
1236 Send(new ViewMsg_GetRenderedTextCompleted(routing_id(), text));
1237}
1238
[email protected]a80af12e2013-08-07 23:36:131239void RenderViewImpl::StartPluginIme() {
1240 IPC::Message* msg = new ViewHostMsg_StartPluginIme(routing_id());
1241 // This message can be sent during event-handling, and needs to be delivered
1242 // within that context.
1243 msg->set_unblock(true);
1244 Send(msg);
1245}
1246#endif // defined(OS_MACOSX)
1247
1248#endif // ENABLE_PLUGINS
1249
[email protected]7a1ec28a2012-03-28 21:10:241250void RenderViewImpl::TransferActiveWheelFlingAnimation(
[email protected]180ef242013-11-07 06:50:461251 const blink::WebActiveWheelFlingParameters& params) {
[email protected]7a1ec28a2012-03-28 21:10:241252 if (webview())
1253 webview()->transferActiveWheelFlingAnimation(params);
1254}
1255
fsamuel72464894f2015-12-15 06:59:311256// RenderWidgetInputHandlerDelegate -----------------------------------------
1257
1258void RenderViewImpl::FocusChangeComplete() {
1259 RenderWidget::FocusChangeComplete();
1260 FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusChangeComplete());
1261}
1262
1263bool RenderViewImpl::HasTouchEventHandlersAt(const gfx::Point& point) const {
1264 if (!webview())
1265 return false;
1266 return webview()->hasTouchEventHandlersAt(point);
1267}
1268
1269void RenderViewImpl::OnDidHandleKeyEvent() {
1270 ClearEditCommands();
1271}
1272
1273bool RenderViewImpl::WillHandleGestureEvent(
1274 const blink::WebGestureEvent& event) {
1275 possible_drag_event_info_.event_source =
1276 ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH;
1277 possible_drag_event_info_.event_location =
1278 gfx::Point(event.globalX, event.globalY);
1279 return false;
1280}
1281
1282bool RenderViewImpl::WillHandleMouseEvent(const blink::WebMouseEvent& event) {
1283 possible_drag_event_info_.event_source =
1284 ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE;
1285 possible_drag_event_info_.event_location =
1286 gfx::Point(event.globalX, event.globalY);
1287
1288#if defined(ENABLE_PLUGINS)
1289 // This method is called for every mouse event that the render view receives.
1290 // And then the mouse event is forwarded to WebKit, which dispatches it to the
1291 // event target. Potentially a Pepper plugin will receive the event.
1292 // In order to tell whether a plugin gets the last mouse event and which it
1293 // is, we set |pepper_last_mouse_event_target_| to NULL here. If a plugin gets
1294 // the event, it will notify us via DidReceiveMouseEvent() and set itself as
1295 // |pepper_last_mouse_event_target_|.
1296 pepper_last_mouse_event_target_ = NULL;
1297#endif
1298
1299 // If the mouse is locked, only the current owner of the mouse lock can
1300 // process mouse events.
1301 return mouse_lock_dispatcher_->WillHandleMouseEvent(event);
1302}
1303
1304// IPC::Listener implementation ----------------------------------------------
1305
[email protected]310ebd6302011-10-10 19:06:281306bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
[email protected]26aa0482009-09-30 16:55:271307 WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL;
[email protected]82307f6b2014-08-07 03:30:121308 if (main_frame && main_frame->isWebLocalFrame())
[email protected]e9ff79c2012-10-19 21:31:261309 GetContentClient()->SetActiveURL(main_frame->document().url());
[email protected]f8b6b6f2009-03-10 16:48:261310
naskoc6edf7e2015-10-16 01:48:451311 // Input IPC messages must not be processed if the RenderView is in
1312 // swapped out state.
1313 if (is_swapped_out_ && IPC_MESSAGE_ID_CLASS(message.type()) == InputMsgStart)
1314 return false;
1315
brettw5a1613dc2015-06-02 05:34:431316 base::ObserverListBase<RenderViewObserver>::Iterator it(&observers_);
[email protected]676126f72011-01-15 00:03:511317 RenderViewObserver* observer;
1318 while ((observer = it.GetNext()) != NULL)
1319 if (observer->OnMessageReceived(message))
1320 return true;
[email protected]b2abac72009-02-26 12:39:281321
[email protected]a95986a82010-12-24 06:19:281322 bool handled = true;
[email protected]e44d1342014-05-16 21:29:331323 IPC_BEGIN_MESSAGE_MAP(RenderViewImpl, message)
[email protected]c084330e02013-04-27 01:08:151324 IPC_MESSAGE_HANDLER(InputMsg_ExecuteEditCommand, OnExecuteEditCommand)
1325 IPC_MESSAGE_HANDLER(InputMsg_MoveCaret, OnMoveCaret)
[email protected]c084330e02013-04-27 01:08:151326 IPC_MESSAGE_HANDLER(InputMsg_ScrollFocusedEditableNodeIntoRect,
1327 OnScrollFocusedEditableNodeIntoRect)
[email protected]c084330e02013-04-27 01:08:151328 IPC_MESSAGE_HANDLER(InputMsg_SetEditCommandsForNextKeyEvent,
1329 OnSetEditCommandsForNextKeyEvent)
initial.commit09911bf2008-07-26 23:55:291330 IPC_MESSAGE_HANDLER(ViewMsg_CopyImageAt, OnCopyImageAt)
[email protected]6a6fa3e2014-05-09 06:57:181331 IPC_MESSAGE_HANDLER(ViewMsg_SaveImageAt, OnSaveImageAt)
initial.commit09911bf2008-07-26 23:55:291332 IPC_MESSAGE_HANDLER(ViewMsg_Find, OnFind)
[email protected]24a7f3c2010-03-25 08:26:491333 IPC_MESSAGE_HANDLER(ViewMsg_StopFinding, OnStopFinding)
mcnee432e47d2015-11-09 19:37:461334 IPC_MESSAGE_HANDLER(ViewMsg_SetPageScale, OnSetPageScale)
[email protected]630e26b2008-10-14 22:55:171335 IPC_MESSAGE_HANDLER(ViewMsg_Zoom, OnZoom)
[email protected]9d797f32010-04-23 07:17:541336 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForLoadingURL,
1337 OnSetZoomLevelForLoadingURL)
[email protected]d42bf472014-06-14 01:49:381338 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForView,
1339 OnSetZoomLevelForView)
initial.commit09911bf2008-07-26 23:55:291340 IPC_MESSAGE_HANDLER(ViewMsg_SetPageEncoding, OnSetPageEncoding)
[email protected]a697f4c2009-09-14 22:30:181341 IPC_MESSAGE_HANDLER(ViewMsg_ResetPageEncodingToDefault,
1342 OnResetPageEncodingToDefault)
[email protected]59f4f2fa2011-03-23 01:00:551343 IPC_MESSAGE_HANDLER(DragMsg_TargetDragEnter, OnDragTargetDragEnter)
1344 IPC_MESSAGE_HANDLER(DragMsg_TargetDragOver, OnDragTargetDragOver)
1345 IPC_MESSAGE_HANDLER(DragMsg_TargetDragLeave, OnDragTargetDragLeave)
1346 IPC_MESSAGE_HANDLER(DragMsg_TargetDrop, OnDragTargetDrop)
[email protected]7a6d773f2014-04-04 01:25:091347 IPC_MESSAGE_HANDLER(DragMsg_SourceEnded, OnDragSourceEnded)
[email protected]59f4f2fa2011-03-23 01:00:551348 IPC_MESSAGE_HANDLER(DragMsg_SourceSystemDragEnded,
1349 OnDragSourceSystemDragEnded)
[email protected]18cb2572008-08-21 20:34:451350 IPC_MESSAGE_HANDLER(ViewMsg_AllowBindings, OnAllowBindings)
initial.commit09911bf2008-07-26 23:55:291351 IPC_MESSAGE_HANDLER(ViewMsg_SetInitialFocus, OnSetInitialFocus)
initial.commit09911bf2008-07-26 23:55:291352 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTargetURL_ACK, OnUpdateTargetURLAck)
1353 IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences)
[email protected]600ea402011-04-12 00:01:511354 IPC_MESSAGE_HANDLER(ViewMsg_EnumerateDirectoryResponse,
1355 OnEnumerateDirectoryResponse)
initial.commit09911bf2008-07-26 23:55:291356 IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse)
[email protected]88f10a22013-11-06 21:22:121357 IPC_MESSAGE_HANDLER(ViewMsg_SuppressDialogsUntilSwapOut,
1358 OnSuppressDialogsUntilSwapOut)
initial.commit09911bf2008-07-26 23:55:291359 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage)
1360 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged)
[email protected]30f75e62009-02-25 22:01:001361 IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
[email protected]ab6c9112014-02-27 00:20:581362 IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedElement, OnClearFocusedElement)
[email protected]61f91832014-05-13 01:24:421363 IPC_MESSAGE_HANDLER(ViewMsg_SetBackgroundOpaque, OnSetBackgroundOpaque)
[email protected]ab32b16c2009-10-16 14:57:251364 IPC_MESSAGE_HANDLER(ViewMsg_EnablePreferredSizeChangedMode,
1365 OnEnablePreferredSizeChangedMode)
[email protected]244ac1892011-12-02 17:04:471366 IPC_MESSAGE_HANDLER(ViewMsg_EnableAutoResize, OnEnableAutoResize)
[email protected]61e2b3cc2012-03-02 16:13:341367 IPC_MESSAGE_HANDLER(ViewMsg_DisableAutoResize, OnDisableAutoResize)
[email protected]cda45c02010-02-25 19:28:101368 IPC_MESSAGE_HANDLER(ViewMsg_DisableScrollbarsForSmallWindows,
1369 OnDisableScrollbarsForSmallWindows)
[email protected]80d96fa2009-06-10 22:34:511370 IPC_MESSAGE_HANDLER(ViewMsg_SetRendererPrefs, OnSetRendererPrefs)
[email protected]581b87eb2009-07-23 23:06:561371 IPC_MESSAGE_HANDLER(ViewMsg_MediaPlayerActionAt, OnMediaPlayerActionAt)
[email protected]81375e872012-01-11 21:40:361372 IPC_MESSAGE_HANDLER(ViewMsg_PluginActionAt, OnPluginActionAt)
[email protected]8c66c5a2009-07-22 17:26:341373 IPC_MESSAGE_HANDLER(ViewMsg_SetActive, OnSetActive)
[email protected]47822262013-04-23 17:22:361374 IPC_MESSAGE_HANDLER(ViewMsg_ShowContextMenu, OnShowContextMenu)
[email protected]f0557932011-01-25 20:20:511375 // TODO(viettrungluu): Move to a separate message filter.
avi2b177592014-12-10 02:08:021376 IPC_MESSAGE_HANDLER(ViewMsg_SetHistoryOffsetAndLength,
1377 OnSetHistoryOffsetAndLength)
[email protected]5a7b15a2011-08-22 22:48:181378 IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode)
[email protected]cb189e062014-04-23 00:57:011379 IPC_MESSAGE_HANDLER(ViewMsg_ReleaseDisambiguationPopupBitmap,
1380 OnReleaseDisambiguationPopupBitmap)
[email protected]506563d2014-06-23 12:22:411381 IPC_MESSAGE_HANDLER(ViewMsg_ForceRedraw, OnForceRedraw)
[email protected]4dda6a6c2014-05-17 15:35:041382 IPC_MESSAGE_HANDLER(ViewMsg_SelectWordAroundCaret, OnSelectWordAroundCaret)
[email protected]55750b32012-09-21 14:05:031383#if defined(OS_ANDROID)
[email protected]c084330e02013-04-27 01:08:151384 IPC_MESSAGE_HANDLER(InputMsg_ActivateNearestFindResult,
[email protected]55750b32012-09-21 14:05:031385 OnActivateNearestFindResult)
1386 IPC_MESSAGE_HANDLER(ViewMsg_FindMatchRects, OnFindMatchRects)
[email protected]452b4a92013-03-28 21:24:381387 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTopControlsState,
1388 OnUpdateTopControlsState)
[email protected]c4790dcb2013-12-27 22:08:021389 IPC_MESSAGE_HANDLER(ViewMsg_ExtractSmartClipData, OnExtractSmartClipData)
[email protected]55750b32012-09-21 14:05:031390#elif defined(OS_MACOSX)
[email protected]7411a3c2014-08-15 05:20:191391 IPC_MESSAGE_HANDLER(ViewMsg_GetRenderedText,
1392 OnGetRenderedText)
[email protected]55750b32012-09-21 14:05:031393 IPC_MESSAGE_HANDLER(ViewMsg_PluginImeCompositionCompleted,
1394 OnPluginImeCompositionCompleted)
naskoc288745f2015-05-01 22:54:211395 IPC_MESSAGE_HANDLER(ViewMsg_Close, OnClose)
[email protected]55750b32012-09-21 14:05:031396 IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize)
1397 IPC_MESSAGE_HANDLER(ViewMsg_SetWindowVisibility, OnSetWindowVisibility)
1398 IPC_MESSAGE_HANDLER(ViewMsg_WindowFrameChanged, OnWindowFrameChanged)
1399#endif
[email protected]a794f3a2013-10-30 17:00:321400 // Adding a new message? Add platform independent ones first, then put the
1401 // platform specific ones at the end.
[email protected]9e1ad4b2011-08-14 16:49:191402
initial.commit09911bf2008-07-26 23:55:291403 // Have the super handle all other messages.
[email protected]a95986a82010-12-24 06:19:281404 IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
initial.commit09911bf2008-07-26 23:55:291405 IPC_END_MESSAGE_MAP()
[email protected]ffc906f2011-10-04 22:55:401406
[email protected]a95986a82010-12-24 06:19:281407 return handled;
initial.commit09911bf2008-07-26 23:55:291408}
1409
[email protected]4dda6a6c2014-05-17 15:35:041410void RenderViewImpl::OnSelectWordAroundCaret() {
1411 if (!webview())
1412 return;
1413
fsamuele8326c742016-01-12 00:49:391414 input_handler_->set_handling_input_event(true);
[email protected]4dda6a6c2014-05-17 15:35:041415 webview()->focusedFrame()->selectWordAroundCaret();
fsamuele8326c742016-01-12 00:49:391416 input_handler_->set_handling_input_event(false);
[email protected]4dda6a6c2014-05-17 15:35:041417}
1418
[email protected]310ebd6302011-10-10 19:06:281419void RenderViewImpl::OnCopyImageAt(int x, int y) {
[email protected]26aa0482009-09-30 16:55:271420 webview()->copyImageAt(WebPoint(x, y));
initial.commit09911bf2008-07-26 23:55:291421}
1422
[email protected]6a6fa3e2014-05-09 06:57:181423void RenderViewImpl::OnSaveImageAt(int x, int y) {
1424 webview()->saveImageAt(WebPoint(x, y));
1425}
1426
[email protected]310ebd6302011-10-10 19:06:281427void RenderViewImpl::OnUpdateTargetURLAck() {
initial.commit09911bf2008-07-26 23:55:291428 // Check if there is a targeturl waiting to be sent.
avi450ce00e2014-09-24 01:58:521429 if (target_url_status_ == TARGET_PENDING)
fsamuele8326c742016-01-12 00:49:391430 Send(new ViewHostMsg_UpdateTargetURL(routing_id(), pending_target_url_));
initial.commit09911bf2008-07-26 23:55:291431
1432 target_url_status_ = TARGET_NONE;
1433}
1434
[email protected]c084330e02013-04-27 01:08:151435void RenderViewImpl::OnExecuteEditCommand(const std::string& name,
1436 const std::string& value) {
1437 if (!webview() || !webview()->focusedFrame())
1438 return;
1439
1440 webview()->focusedFrame()->executeCommand(
1441 WebString::fromUTF8(name), WebString::fromUTF8(value));
1442}
1443
1444void RenderViewImpl::OnMoveCaret(const gfx::Point& point) {
1445 if (!webview())
1446 return;
1447
fsamuele8326c742016-01-12 00:49:391448 Send(new InputHostMsg_MoveCaret_ACK(routing_id()));
[email protected]c084330e02013-04-27 01:08:151449
[email protected]b74d4064d2013-11-27 01:45:091450 webview()->focusedFrame()->moveCaretSelection(point);
[email protected]c084330e02013-04-27 01:08:151451}
[email protected]a954bf72009-09-12 07:30:351452
[email protected]c084330e02013-04-27 01:08:151453void RenderViewImpl::OnScrollFocusedEditableNodeIntoRect(
1454 const gfx::Rect& rect) {
[email protected]1875bc02014-03-14 06:33:591455 if (has_scrolled_focused_editable_node_into_rect_ &&
1456 rect == rect_for_scrolled_focused_editable_node_) {
rouslanf7ebd8832015-01-22 01:54:141457 FocusChangeComplete();
[email protected]1875bc02014-03-14 06:33:591458 return;
1459 }
1460
[email protected]c39f7442014-02-27 03:33:171461 blink::WebElement element = GetFocusedElement();
rouslanf7ebd8832015-01-22 01:54:141462 bool will_animate = false;
esprehn3d4471a2015-09-17 07:13:201463 if (!element.isNull() && element.isEditable()) {
[email protected]1875bc02014-03-14 06:33:591464 rect_for_scrolled_focused_editable_node_ = rect;
1465 has_scrolled_focused_editable_node_into_rect_ = true;
rouslanf7ebd8832015-01-22 01:54:141466 will_animate = webview()->scrollFocusedNodeIntoRect(rect);
[email protected]c084330e02013-04-27 01:08:151467 }
rouslanf7ebd8832015-01-22 01:54:141468
1469 if (!will_animate)
1470 FocusChangeComplete();
[email protected]25bcc8f2013-01-09 02:49:251471}
1472
[email protected]c084330e02013-04-27 01:08:151473void RenderViewImpl::OnSetEditCommandsForNextKeyEvent(
1474 const EditCommands& edit_commands) {
1475 edit_commands_ = edit_commands;
1476}
1477
avi2b177592014-12-10 02:08:021478void RenderViewImpl::OnSetHistoryOffsetAndLength(int history_offset,
1479 int history_length) {
1480 DCHECK_GE(history_offset, -1);
[email protected]e1ed5a12012-08-08 19:57:441481 DCHECK_GE(history_length, 0);
[email protected]9e1ad4b2011-08-14 16:49:191482
avi2b177592014-12-10 02:08:021483 history_list_offset_ = history_offset;
1484 history_list_length_ = history_length;
[email protected]9e1ad4b2011-08-14 16:49:191485}
1486
[email protected]310ebd6302011-10-10 19:06:281487void RenderViewImpl::OnSetInitialFocus(bool reverse) {
initial.commit09911bf2008-07-26 23:55:291488 if (!webview())
1489 return;
[email protected]26aa0482009-09-30 16:55:271490 webview()->setInitialFocus(reverse);
initial.commit09911bf2008-07-26 23:55:291491}
1492
[email protected]54ca3ca892011-06-07 21:14:541493#if defined(OS_MACOSX)
[email protected]310ebd6302011-10-10 19:06:281494void RenderViewImpl::OnSetInLiveResize(bool in_live_resize) {
[email protected]4274b3e2011-08-09 19:09:331495 if (!webview())
1496 return;
1497 if (in_live_resize)
1498 webview()->willStartLiveResize();
1499 else
1500 webview()->willEndLiveResize();
[email protected]54ca3ca892011-06-07 21:14:541501}
1502#endif
1503
initial.commit09911bf2008-07-26 23:55:291504///////////////////////////////////////////////////////////////////////////////
1505
avi137dc952015-07-24 23:19:141506void RenderViewImpl::SendUpdateState() {
creis8eb8ef22015-11-04 22:51:381507 // We don't use this path in OOPIF-enabled modes.
1508 DCHECK(!SiteIsolationPolicy::UseSubframeNavigationEntries());
creisae7ce9a2015-11-02 20:52:191509
avi137dc952015-07-24 23:19:141510 HistoryEntry* entry = history_controller_->GetCurrentEntry();
avif937e1d2014-11-02 18:13:071511 if (!entry)
1512 return;
1513
1514 // Don't send state updates for kSwappedOutURL.
esprehnaf92a8f92015-12-12 05:08:011515 if (entry->root().urlString() == kSwappedOutURL)
avif937e1d2014-11-02 18:13:071516 return;
1517
fsamuele8326c742016-01-12 00:49:391518 Send(new ViewHostMsg_UpdateState(routing_id(), page_id_,
1519 HistoryEntryToPageState(entry)));
avif937e1d2014-11-02 18:13:071520}
1521
creis69b184a472015-11-26 05:29:511522void RenderViewImpl::SendFrameStateUpdates() {
1523 // We only use this path in OOPIF-enabled modes.
1524 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
1525
1526 // Tell each frame with pending state to send its UpdateState message.
1527 for (int render_frame_routing_id : frames_with_pending_state_) {
1528 RenderFrameImpl* frame =
1529 RenderFrameImpl::FromRoutingID(render_frame_routing_id);
1530 if (frame)
1531 frame->SendUpdateState();
1532 }
1533 frames_with_pending_state_.clear();
1534}
1535
sataya.mf405d0e2015-07-07 16:51:111536void RenderViewImpl::ApplyWebPreferencesInternal(
1537 const WebPreferences& prefs,
1538 blink::WebView* web_view,
1539 CompositorDependencies* compositor_deps) {
1540 ApplyWebPreferences(prefs, web_view);
1541#if defined(OS_MACOSX) && !defined(OS_IOS)
1542 DCHECK(compositor_deps);
1543 bool is_elastic_overscroll_enabled =
1544 compositor_deps->IsElasticOverscrollEnabled();
1545 web_view->settings()->setReportWheelOverscroll(is_elastic_overscroll_enabled);
1546#endif
1547}
1548
[email protected]310ebd6302011-10-10 19:06:281549bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) {
[email protected]c1f50aa2010-02-18 03:46:571550 // Before WebKit asks us to show an alert (etc.), it takes care of doing the
1551 // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog
1552 // it is particularly important that we do not call willEnterModalLoop as
1553 // that would defer resource loads for the dialog itself.
[email protected]f1a29a02011-10-06 23:08:441554 if (RenderThreadImpl::current()) // Will be NULL during unit tests.
1555 RenderThreadImpl::current()->DoNotNotifyWebKitOfModalLoop();
[email protected]c1f50aa2010-02-18 03:46:571556
1557 message->EnableMessagePumping(); // Runs a nested message loop.
1558 return Send(message);
1559}
1560
[email protected]506563d2014-06-23 12:22:411561void RenderViewImpl::OnForceRedraw(int id) {
1562 ui::LatencyInfo latency_info;
[email protected]f9f3fac2014-08-05 00:47:591563 if (id) {
1564 latency_info.AddLatencyNumber(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
1565 0,
1566 id);
1567 }
[email protected]6be422b2013-12-08 06:47:311568 scoped_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor;
[email protected]7d08a9352013-10-15 08:24:561569 if (RenderWidgetCompositor* rwc = compositor()) {
[email protected]6be422b2013-12-08 06:47:311570 latency_info_swap_promise_monitor =
dcheng07945f632015-12-26 07:59:321571 rwc->CreateLatencyInfoSwapPromiseMonitor(&latency_info);
[email protected]7d08a9352013-10-15 08:24:561572 }
1573 ScheduleCompositeWithForcedRedraw();
[email protected]c9bc8f12012-12-15 22:20:091574}
1575
[email protected]180ef242013-11-07 06:50:461576// blink::WebViewClient ------------------------------------------------------
[email protected]48c9cf2d2009-09-16 16:47:521577
[email protected]35b2a972014-04-04 15:50:221578WebView* RenderViewImpl::createView(WebLocalFrame* creator,
1579 const WebURLRequest& request,
1580 const WebWindowFeatures& features,
1581 const WebString& frame_name,
1582 WebNavigationPolicy policy,
1583 bool suppress_opener) {
[email protected]8ab04652010-06-12 02:47:261584 ViewHostMsg_CreateWindow_Params params;
fsamuele8326c742016-01-12 00:49:391585 params.opener_id = routing_id();
[email protected]af15bf22013-03-08 01:18:171586 params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture();
[email protected]00323f02013-07-24 15:47:411587 if (GetContentClient()->renderer()->AllowPopup())
1588 params.user_gesture = true;
[email protected]8ab04652010-06-12 02:47:261589 params.window_container_type = WindowFeaturesToContainerType(features);
1590 params.session_storage_namespace_id = session_storage_namespace_id_;
[email protected]5cef23d2013-02-27 13:11:211591 if (frame_name != "_blank")
brettw717861b62015-07-24 19:09:091592 params.frame_name = base::UTF16ToUTF8(base::StringPiece16(frame_name));
[email protected]a7531d772014-03-25 16:15:071593 params.opener_render_frame_id =
[email protected]501052ff2014-02-21 22:19:071594 RenderFrameImpl::FromWebFrame(creator)->GetRoutingID();
[email protected]b6cb3a842011-06-24 18:28:411595 params.opener_url = creator->document().url();
alexmosa97d5c52015-06-19 22:19:091596
1597 // The browser process uses the top frame's URL for a content settings check
1598 // to determine whether the popup is allowed. If the top frame is remote,
1599 // its URL is not available, so use its replicated origin instead.
1600 //
1601 // TODO(alexmos): This works fine for regular origins but may break path
1602 // matching for file URLs with OOP subframes that open popups. This should
1603 // be fixed by either moving this lookup to the browser process or removing
1604 // path-based matching for file URLs from content settings. See
1605 // https://crbug.com/466297.
1606 if (creator->top()->isWebLocalFrame()) {
1607 params.opener_top_level_frame_url = creator->top()->document().url();
1608 } else {
1609 params.opener_top_level_frame_url =
1610 GURL(creator->top()->securityOrigin().toString());
1611 }
1612
[email protected]6c53a7f2014-03-31 16:56:281613 GURL security_url(creator->document().securityOrigin().toString());
[email protected]7f48b712013-01-25 01:48:301614 if (!security_url.is_valid())
1615 security_url = GURL();
1616 params.opener_security_origin = security_url;
[email protected]147b2bf2013-11-05 04:00:041617 params.opener_suppressed = suppress_opener;
[email protected]f92ce2b2012-03-06 18:02:591618 params.disposition = NavigationPolicyToDisposition(policy);
[email protected]44e55b012013-07-23 14:21:561619 if (!request.isNull()) {
[email protected]41e65502011-01-21 09:29:111620 params.target_url = request.url();
[email protected]44e55b012013-07-23 14:21:561621 params.referrer = GetReferrerFromRequest(creator, request);
1622 }
[email protected]453c1b22013-07-23 09:31:481623 params.features = features;
[email protected]8ab04652010-06-12 02:47:261624
[email protected]22217ed32013-11-18 18:40:231625 for (size_t i = 0; i < features.additionalFeatures.size(); ++i)
1626 params.additional_features.push_back(features.additionalFeatures[i]);
1627
dcheng3ce04b62015-10-26 23:30:551628 ViewHostMsg_CreateWindow_Reply reply;
1629 RenderThread::Get()->Send(new ViewHostMsg_CreateWindow(params, &reply));
1630 if (reply.route_id == MSG_ROUTING_NONE)
[email protected]48c9cf2d2009-09-16 16:47:521631 return NULL;
[email protected]48c9cf2d2009-09-16 16:47:521632
[email protected]af15bf22013-03-08 01:18:171633 WebUserGestureIndicator::consumeUserGesture();
[email protected]c59262422012-11-30 21:20:521634
[email protected]7912e822014-04-16 02:37:031635 // While this view may be a background extension page, it can spawn a visible
1636 // render view. So we just assume that the new one is not another background
1637 // page instead of passing on our own value.
1638 // TODO(vangelis): Can we tell if the new view will be a background page?
1639 bool never_visible = false;
[email protected]9115d5f2013-03-24 04:37:411640
mkosiba58fa72f02014-11-12 01:21:361641 ViewMsg_Resize_Params initial_size = ViewMsg_Resize_Params();
1642 initial_size.screen_info = screen_info_;
1643
[email protected]d6fa88f2013-10-18 16:00:431644 // The initial hidden state for the RenderViewImpl here has to match what the
1645 // browser will eventually decide for the given disposition. Since we have to
1646 // return from this call synchronously, we just have to make our best guess
1647 // and rely on the browser sending a WasHidden / WasShown message if it
1648 // disagrees.
naskobd911332014-11-25 01:13:361649 ViewMsg_New_Params view_params;
alexmos5ac402d2015-07-09 07:51:101650
1651 RenderFrameImpl* creator_frame = RenderFrameImpl::FromWebFrame(creator);
1652 view_params.opener_frame_route_id = creator_frame->GetRoutingID();
fsamuele8326c742016-01-12 00:49:391653 DCHECK_EQ(routing_id(), creator_frame->render_view()->GetRoutingID());
alexmos5ac402d2015-07-09 07:51:101654
naskobd911332014-11-25 01:13:361655 view_params.window_was_created_with_opener = true;
1656 view_params.renderer_preferences = renderer_preferences_;
1657 view_params.web_preferences = webkit_preferences_;
dcheng3ce04b62015-10-26 23:30:551658 view_params.view_id = reply.route_id;
1659 view_params.main_frame_routing_id = reply.main_frame_route_id;
1660 view_params.main_frame_widget_routing_id = reply.main_frame_widget_route_id;
naskobd911332014-11-25 01:13:361661 view_params.session_storage_namespace_id =
dcheng3ce04b62015-10-26 23:30:551662 reply.cloned_session_storage_namespace_id;
naskobd911332014-11-25 01:13:361663 view_params.swapped_out = false;
alexmos3448b552015-06-26 07:49:131664 // WebCore will take care of setting the correct name.
alexmosbc7eafa2014-12-06 01:38:091665 view_params.replicated_frame_state = FrameReplicationState();
naskobd911332014-11-25 01:13:361666 view_params.hidden = (params.disposition == NEW_BACKGROUND_TAB);
1667 view_params.never_visible = never_visible;
1668 view_params.next_page_id = 1;
1669 view_params.initial_size = initial_size;
1670 view_params.enable_auto_resize = false;
1671 view_params.min_size = gfx::Size();
1672 view_params.max_size = gfx::Size();
1673
danakj6e3bf8012014-12-16 18:27:531674 RenderViewImpl* view =
dcheng35d31c112015-07-22 00:17:361675 RenderViewImpl::Create(compositor_deps_, view_params, true);
[email protected]8ab04652010-06-12 02:47:261676 view->opened_by_user_gesture_ = params.user_gesture;
[email protected]48c9cf2d2009-09-16 16:47:521677
[email protected]007a848b2009-10-26 15:55:461678 // Record whether the creator frame is trying to suppress the opener field.
[email protected]f92ce2b2012-03-06 18:02:591679 view->opener_suppressed_ = params.opener_suppressed;
[email protected]007a848b2009-10-26 15:55:461680
[email protected]48c9cf2d2009-09-16 16:47:521681 return view->webview();
1682}
1683
[email protected]180ef242013-11-07 06:50:461684WebWidget* RenderViewImpl::createPopupMenu(blink::WebPopupType popup_type) {
fsamuele8326c742016-01-12 00:49:391685 RenderWidget* widget = RenderWidget::Create(routing_id(), compositor_deps_,
danakj6e3bf8012014-12-16 18:27:531686 popup_type, screen_info_);
[email protected]3b78ec12014-03-04 05:18:281687 if (!widget)
1688 return NULL;
[email protected]b2e4c70132013-10-03 02:07:511689 if (screen_metrics_emulator_) {
1690 widget->SetPopupOriginAdjustmentsForEmulation(
1691 screen_metrics_emulator_.get());
1692 }
[email protected]48c9cf2d2009-09-16 16:47:521693 return widget->webwidget();
1694}
1695
[email protected]23367482013-06-27 21:06:541696WebStorageNamespace* RenderViewImpl::createSessionStorageNamespace() {
[email protected]5f2aa722013-08-07 16:59:411697 CHECK(session_storage_namespace_id_ != kInvalidSessionStorageNamespaceId);
[email protected]1910fe82012-05-10 00:04:101698 return new WebStorageNamespaceImpl(session_storage_namespace_id_);
[email protected]bd92c3a2010-01-13 05:02:341699}
1700
[email protected]35b2a972014-04-04 15:50:221701void RenderViewImpl::printPage(WebLocalFrame* frame) {
[email protected]b0553c7e2012-09-19 21:36:111702 FOR_EACH_OBSERVER(RenderViewObserver, observers_,
fsamuel72464894f2015-12-15 06:59:311703 PrintPage(frame, input_handler().handling_input_event()));
[email protected]48c9cf2d2009-09-16 16:47:521704}
1705
jinho.bang632a1a722014-09-18 03:02:561706void RenderViewImpl::saveImageFromDataURL(const blink::WebString& data_url) {
1707 // Note: We should basically send GURL but we use size-limited string instead
1708 // in order to send a larger data url to save a image for <canvas> or <img>.
1709 if (data_url.length() < kMaxLengthOfDataURLString)
rdsmith6e60c082015-08-24 19:43:481710 Send(new ViewHostMsg_SaveImageFromDataURL(
fsamuele8326c742016-01-12 00:49:391711 routing_id(), GetMainRenderFrame()->GetRoutingID(), data_url.utf8()));
jinho.bang632a1a722014-09-18 03:02:561712}
1713
[email protected]310ebd6302011-10-10 19:06:281714bool RenderViewImpl::enumerateChosenDirectory(
[email protected]8a58c1c2011-04-19 18:40:121715 const WebString& path,
1716 WebFileChooserCompletion* chooser_completion) {
1717 int id = enumeration_completion_id_++;
1718 enumeration_completions_[id] = chooser_completion;
1719 return Send(new ViewHostMsg_EnumerateDirectory(
fsamuele8326c742016-01-12 00:49:391720 routing_id(), id, base::FilePath::FromUTF16Unsafe(path)));
[email protected]8a58c1c2011-04-19 18:40:121721}
1722
[email protected]7e9523b2014-03-25 03:02:421723void RenderViewImpl::FrameDidStartLoading(WebFrame* frame) {
[email protected]7e9523b2014-03-25 03:02:421724 DCHECK_GE(frames_in_progress_, 0);
1725 if (frames_in_progress_ == 0)
1726 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStartLoading());
1727 frames_in_progress_++;
[email protected]6dd5c322014-03-12 07:58:461728}
1729
[email protected]7e9523b2014-03-25 03:02:421730void RenderViewImpl::FrameDidStopLoading(WebFrame* frame) {
[email protected]eb473772014-04-11 20:54:331731 // TODO(japhet): This should be a DCHECK, but the pdf plugin sometimes
1732 // calls DidStopLoading() without a matching DidStartLoading().
1733 if (frames_in_progress_ == 0)
1734 return;
[email protected]7e9523b2014-03-25 03:02:421735 frames_in_progress_--;
[email protected]7e9523b2014-03-25 03:02:421736 if (frames_in_progress_ == 0) {
1737 DidStopLoadingIcons();
1738 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStopLoading());
1739 }
[email protected]48c9cf2d2009-09-16 16:47:521740}
1741
dcheng3ce04b62015-10-26 23:30:551742void RenderViewImpl::AttachWebFrameWidget(blink::WebWidget* frame_widget) {
1743 // The previous WebFrameWidget must already be detached by CloseForFrame().
1744 DCHECK(!frame_widget_);
1745 frame_widget_ = frame_widget;
1746}
1747
tommycli8aad3ba2015-08-12 17:57:591748void RenderViewImpl::SetZoomLevel(double zoom_level) {
1749 webview()->setZoomLevel(zoom_level);
1750 FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnZoomLevelChanged());
1751}
1752
[email protected]550b0c92013-02-04 05:09:151753void RenderViewImpl::didCancelCompositionOnSelectionChange() {
[email protected]a2214eb2014-06-23 18:31:221754 Send(new InputHostMsg_ImeCancelComposition(routing_id()));
[email protected]550b0c92013-02-04 05:09:151755}
1756
[email protected]310ebd6302011-10-10 19:06:281757bool RenderViewImpl::handleCurrentKeyboardEvent() {
[email protected]b2528b72009-09-24 06:57:101758 if (edit_commands_.empty())
1759 return false;
1760
[email protected]26aa0482009-09-30 16:55:271761 WebFrame* frame = webview()->focusedFrame();
[email protected]b2528b72009-09-24 06:57:101762 if (!frame)
1763 return false;
1764
1765 EditCommands::iterator it = edit_commands_.begin();
1766 EditCommands::iterator end = edit_commands_.end();
1767
[email protected]507b33ea2009-09-29 03:56:511768 bool did_execute_command = false;
[email protected]b2528b72009-09-24 06:57:101769 for (; it != end; ++it) {
[email protected]e6e15012009-09-30 14:59:331770 // In gtk and cocoa, it's possible to bind multiple edit commands to one
1771 // key (but it's the exception). Once one edit command is not executed, it
1772 // seems safest to not execute the rest.
[email protected]b2528b72009-09-24 06:57:101773 if (!frame->executeCommand(WebString::fromUTF8(it->name),
[email protected]b77fac52013-06-01 01:03:461774 WebString::fromUTF8(it->value),
[email protected]c39f7442014-02-27 03:33:171775 GetFocusedElement()))
[email protected]b2528b72009-09-24 06:57:101776 break;
[email protected]507b33ea2009-09-29 03:56:511777 did_execute_command = true;
[email protected]b2528b72009-09-24 06:57:101778 }
1779
[email protected]507b33ea2009-09-29 03:56:511780 return did_execute_command;
[email protected]b2528b72009-09-24 06:57:101781}
1782
[email protected]310ebd6302011-10-10 19:06:281783bool RenderViewImpl::runFileChooser(
[email protected]180ef242013-11-07 06:50:461784 const blink::WebFileChooserParams& params,
[email protected]cdaf8d02010-03-30 19:52:471785 WebFileChooserCompletion* chooser_completion) {
[email protected]7ef03e02010-10-23 11:58:351786 // Do not open the file dialog in a hidden RenderView.
1787 if (is_hidden())
1788 return false;
[email protected]e9ff79c2012-10-19 21:31:261789 FileChooserParams ipc_params;
[email protected]b5977a0c2010-08-24 19:46:261790 if (params.directory)
[email protected]6bedbef2013-07-31 06:33:491791 ipc_params.mode = FileChooserParams::UploadFolder;
[email protected]b5977a0c2010-08-24 19:46:261792 else if (params.multiSelect)
[email protected]e9ff79c2012-10-19 21:31:261793 ipc_params.mode = FileChooserParams::OpenMultiple;
[email protected]459fba82011-10-13 02:48:501794 else if (params.saveAs)
[email protected]e9ff79c2012-10-19 21:31:261795 ipc_params.mode = FileChooserParams::Save;
[email protected]b5977a0c2010-08-24 19:46:261796 else
[email protected]e9ff79c2012-10-19 21:31:261797 ipc_params.mode = FileChooserParams::Open;
[email protected]cdaf8d02010-03-30 19:52:471798 ipc_params.title = params.title;
1799 ipc_params.default_file_name =
wfh815c4872015-02-25 21:01:311800 base::FilePath::FromUTF16Unsafe(params.initialValue).BaseName();
[email protected]f9a4c41a2012-05-30 00:05:321801 ipc_params.accept_types.reserve(params.acceptTypes.size());
1802 for (size_t i = 0; i < params.acceptTypes.size(); ++i)
1803 ipc_params.accept_types.push_back(params.acceptTypes[i]);
hironoe9f2732b2014-10-22 08:06:411804 ipc_params.need_local_path = params.needLocalPath;
[email protected]2fdf2352012-11-01 19:23:021805#if defined(OS_ANDROID)
[email protected]b7b4beb2013-07-09 14:06:501806 ipc_params.capture = params.useMediaCapture;
[email protected]2fdf2352012-11-01 19:23:021807#endif
asanka1cbf49812015-11-03 18:28:151808 ipc_params.requestor = params.requestor;
[email protected]cdaf8d02010-03-30 19:52:471809
1810 return ScheduleFileChooser(ipc_params, chooser_completion);
[email protected]a1128322009-10-06 18:38:461811}
1812
habib.virji597255e2014-09-09 00:30:181813void RenderViewImpl::SetValidationMessageDirection(
1814 base::string16* wrapped_main_text,
1815 blink::WebTextDirection main_text_hint,
1816 base::string16* wrapped_sub_text,
1817 blink::WebTextDirection sub_text_hint) {
1818 if (main_text_hint == blink::WebTextDirectionLeftToRight) {
1819 *wrapped_main_text =
1820 base::i18n::GetDisplayStringInLTRDirectionality(*wrapped_main_text);
1821 } else if (main_text_hint == blink::WebTextDirectionRightToLeft &&
1822 !base::i18n::IsRTL()) {
1823 base::i18n::WrapStringWithRTLFormatting(wrapped_main_text);
1824 }
1825
1826 if (!wrapped_sub_text->empty()) {
1827 if (sub_text_hint == blink::WebTextDirectionLeftToRight) {
1828 *wrapped_sub_text =
1829 base::i18n::GetDisplayStringInLTRDirectionality(*wrapped_sub_text);
1830 } else if (sub_text_hint == blink::WebTextDirectionRightToLeft) {
1831 base::i18n::WrapStringWithRTLFormatting(wrapped_sub_text);
1832 }
1833 }
1834}
1835
[email protected]edc3af82013-12-12 21:24:071836void RenderViewImpl::showValidationMessage(
bokan72a7e342015-12-03 15:46:281837 const blink::WebRect& anchor_in_viewport,
[email protected]edc3af82013-12-12 21:24:071838 const blink::WebString& main_text,
habib.virji597255e2014-09-09 00:30:181839 blink::WebTextDirection main_text_hint,
[email protected]edc3af82013-12-12 21:24:071840 const blink::WebString& sub_text,
habib.virji597255e2014-09-09 00:30:181841 blink::WebTextDirection sub_text_hint) {
[email protected]edc3af82013-12-12 21:24:071842 base::string16 wrapped_main_text = main_text;
1843 base::string16 wrapped_sub_text = sub_text;
habib.virji597255e2014-09-09 00:30:181844
1845 SetValidationMessageDirection(
1846 &wrapped_main_text, main_text_hint, &wrapped_sub_text, sub_text_hint);
1847
[email protected]edc3af82013-12-12 21:24:071848 Send(new ViewHostMsg_ShowValidationMessage(
bokan72a7e342015-12-03 15:46:281849 routing_id(), AdjustValidationMessageAnchor(anchor_in_viewport),
[email protected]2d6836f42014-07-02 17:25:311850 wrapped_main_text, wrapped_sub_text));
[email protected]edc3af82013-12-12 21:24:071851}
1852
1853void RenderViewImpl::hideValidationMessage() {
1854 Send(new ViewHostMsg_HideValidationMessage(routing_id()));
1855}
1856
1857void RenderViewImpl::moveValidationMessage(
bokan72a7e342015-12-03 15:46:281858 const blink::WebRect& anchor_in_viewport) {
[email protected]2d6836f42014-07-02 17:25:311859 Send(new ViewHostMsg_MoveValidationMessage(
bokan72a7e342015-12-03 15:46:281860 routing_id(), AdjustValidationMessageAnchor(anchor_in_viewport)));
[email protected]edc3af82013-12-12 21:24:071861}
1862
[email protected]310ebd6302011-10-10 19:06:281863void RenderViewImpl::setStatusText(const WebString& text) {
[email protected]48c9cf2d2009-09-16 16:47:521864}
1865
[email protected]310ebd6302011-10-10 19:06:281866void RenderViewImpl::UpdateTargetURL(const GURL& url,
1867 const GURL& fallback_url) {
[email protected]aa6b90b32010-04-26 15:49:581868 GURL latest_url = url.is_empty() ? fallback_url : url;
[email protected]48c9cf2d2009-09-16 16:47:521869 if (latest_url == target_url_)
1870 return;
[email protected]163f8242009-10-30 20:19:551871
[email protected]48c9cf2d2009-09-16 16:47:521872 // Tell the browser to display a destination link.
1873 if (target_url_status_ == TARGET_INFLIGHT ||
1874 target_url_status_ == TARGET_PENDING) {
1875 // If we have a request in-flight, save the URL to be sent when we
1876 // receive an ACK to the in-flight request. We can happily overwrite
1877 // any existing pending sends.
1878 pending_target_url_ = latest_url;
1879 target_url_status_ = TARGET_PENDING;
1880 } else {
mnaganovbf087422015-12-16 05:10:031881 // URLs larger than |kMaxURLChars| cannot be sent through IPC -
[email protected]c85f0212011-11-04 16:54:411882 // see |ParamTraits<GURL>|.
mnaganovbf087422015-12-16 05:10:031883 if (latest_url.possibly_invalid_spec().size() > kMaxURLChars)
[email protected]c85f0212011-11-04 16:54:411884 latest_url = GURL();
fsamuele8326c742016-01-12 00:49:391885 Send(new ViewHostMsg_UpdateTargetURL(routing_id(), latest_url));
[email protected]48c9cf2d2009-09-16 16:47:521886 target_url_ = latest_url;
1887 target_url_status_ = TARGET_INFLIGHT;
1888 }
1889}
1890
[email protected]70221f02013-01-31 22:17:071891gfx::RectF RenderViewImpl::ClientRectToPhysicalWindowRect(
1892 const gfx::RectF& rect) const {
1893 gfx::RectF window_rect = rect;
1894 window_rect.Scale(device_scale_factor_ * webview()->pageScaleFactor());
1895 return window_rect;
1896}
1897
creis69b184a472015-11-26 05:29:511898void RenderViewImpl::StartNavStateSyncTimerIfNecessary(RenderFrameImpl* frame) {
1899 // In OOPIF modes, keep track of which frames have pending updates.
creis8eb8ef22015-11-04 22:51:381900 if (SiteIsolationPolicy::UseSubframeNavigationEntries())
creis69b184a472015-11-26 05:29:511901 frames_with_pending_state_.insert(frame->GetRoutingID());
creis8eb8ef22015-11-04 22:51:381902
[email protected]882daa92009-11-05 16:31:311903 int delay;
avif937e1d2014-11-02 18:13:071904 if (send_content_state_immediately_)
[email protected]882daa92009-11-05 16:31:311905 delay = 0;
1906 else if (is_hidden())
avif937e1d2014-11-02 18:13:071907 delay = kDelaySecondsForContentStateSyncHidden;
[email protected]882daa92009-11-05 16:31:311908 else
avif937e1d2014-11-02 18:13:071909 delay = kDelaySecondsForContentStateSync;
[email protected]882daa92009-11-05 16:31:311910
avif937e1d2014-11-02 18:13:071911 if (nav_state_sync_timer_.IsRunning()) {
[email protected]882daa92009-11-05 16:31:311912 // The timer is already running. If the delay of the timer maches the amount
1913 // we want to delay by, then return. Otherwise stop the timer so that it
1914 // gets started with the right delay.
avif937e1d2014-11-02 18:13:071915 if (nav_state_sync_timer_.GetCurrentDelay().InSeconds() == delay)
[email protected]882daa92009-11-05 16:31:311916 return;
avif937e1d2014-11-02 18:13:071917 nav_state_sync_timer_.Stop();
[email protected]882daa92009-11-05 16:31:311918 }
1919
creis69b184a472015-11-26 05:29:511920 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
1921 // In OOPIF modes, tell each frame with pending state to inform the browser.
1922 nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this,
1923 &RenderViewImpl::SendFrameStateUpdates);
1924 } else {
1925 // By default, send an UpdateState for the current history item.
1926 nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this,
1927 &RenderViewImpl::SendUpdateState);
1928 }
[email protected]882daa92009-11-05 16:31:311929}
1930
[email protected]310ebd6302011-10-10 19:06:281931void RenderViewImpl::setMouseOverURL(const WebURL& url) {
[email protected]163f8242009-10-30 20:19:551932 mouse_over_url_ = GURL(url);
1933 UpdateTargetURL(mouse_over_url_, focus_url_);
1934}
1935
[email protected]310ebd6302011-10-10 19:06:281936void RenderViewImpl::setKeyboardFocusURL(const WebURL& url) {
[email protected]163f8242009-10-30 20:19:551937 focus_url_ = GURL(url);
1938 UpdateTargetURL(focus_url_, mouse_over_url_);
1939}
1940
[email protected]35b2a972014-04-04 15:50:221941void RenderViewImpl::startDragging(WebLocalFrame* frame,
[email protected]0407e422012-05-18 19:51:251942 const WebDragData& data,
[email protected]310ebd6302011-10-10 19:06:281943 WebDragOperationsMask mask,
1944 const WebImage& image,
[email protected]ceb36f7d2012-10-31 18:33:241945 const WebPoint& webImageOffset) {
[email protected]dc293a72013-07-01 11:11:221946 DropData drop_data(DropDataBuilder::Build(data));
[email protected]b67151d2012-05-25 23:23:241947 drop_data.referrer_policy = frame->document().referrerPolicy();
[email protected]ceb36f7d2012-10-31 18:33:241948 gfx::Vector2d imageOffset(webImageOffset.x, webImageOffset.y);
fsamuele8326c742016-01-12 00:49:391949 Send(new DragHostMsg_StartDragging(routing_id(), drop_data, mask,
1950 image.getSkBitmap(), imageOffset,
[email protected]41d86852012-11-07 12:23:241951 possible_drag_event_info_));
[email protected]48c9cf2d2009-09-16 16:47:521952}
1953
[email protected]310ebd6302011-10-10 19:06:281954bool RenderViewImpl::acceptsLoadDrops() {
[email protected]28b92df2009-09-25 17:35:451955 return renderer_preferences_.can_accept_load_drops;
1956}
1957
[email protected]310ebd6302011-10-10 19:06:281958void RenderViewImpl::focusNext() {
fsamuele8326c742016-01-12 00:49:391959 Send(new ViewHostMsg_TakeFocus(routing_id(), false));
[email protected]48c9cf2d2009-09-16 16:47:521960}
1961
[email protected]310ebd6302011-10-10 19:06:281962void RenderViewImpl::focusPrevious() {
fsamuele8326c742016-01-12 00:49:391963 Send(new ViewHostMsg_TakeFocus(routing_id(), true));
[email protected]48c9cf2d2009-09-16 16:47:521964}
1965
esprehn3d4471a2015-09-17 07:13:201966// TODO(esprehn): Blink only ever passes Elements, this should take WebElement.
estade31c54342015-01-23 03:34:361967void RenderViewImpl::focusedNodeChanged(const WebNode& fromNode,
1968 const WebNode& toNode) {
[email protected]1875bc02014-03-14 06:33:591969 has_scrolled_focused_editable_node_into_rect_ = false;
1970
jennyz399d6e62014-12-16 01:40:051971 gfx::Rect node_bounds;
esprehn3d4471a2015-09-17 07:13:201972 bool is_editable = false;
estade31c54342015-01-23 03:34:361973 if (!toNode.isNull() && toNode.isElementNode()) {
esprehn3d4471a2015-09-17 07:13:201974 WebElement element = const_cast<WebNode&>(toNode).to<WebElement>();
oshimae2b3b402015-12-04 04:27:241975 blink::WebRect rect = element.boundsInViewport();
1976 convertViewportToWindow(&rect);
1977 node_bounds = gfx::Rect(rect);
esprehn3d4471a2015-09-17 07:13:201978 is_editable = element.isEditable();
jennyz399d6e62014-12-16 01:40:051979 }
fsamuele8326c742016-01-12 00:49:391980 Send(new ViewHostMsg_FocusedNodeChanged(routing_id(), is_editable,
jennyz399d6e62014-12-16 01:40:051981 node_bounds));
[email protected]a4b103b2010-10-05 18:46:071982
estade31c54342015-01-23 03:34:361983 // TODO(estade): remove.
1984 FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusedNodeChanged(toNode));
[email protected]95640212014-07-26 18:14:301985
estade31c54342015-01-23 03:34:361986 RenderFrameImpl* previous_frame = nullptr;
1987 if (!fromNode.isNull())
1988 previous_frame = RenderFrameImpl::FromWebFrame(fromNode.document().frame());
1989 RenderFrameImpl* new_frame = nullptr;
1990 if (!toNode.isNull())
1991 new_frame = RenderFrameImpl::FromWebFrame(toNode.document().frame());
1992
1993 if (previous_frame && previous_frame != new_frame)
1994 previous_frame->FocusedNodeChanged(WebNode());
1995 if (new_frame)
1996 new_frame->FocusedNodeChanged(toNode);
1997
1998 // TODO(dmazzoni): remove once there's a separate a11y tree per frame.
naskoe8d115752015-08-07 00:43:131999 if (main_render_frame_)
2000 main_render_frame_->FocusedNodeChangedForAccessibility(toNode);
[email protected]08e9e132010-06-01 16:58:492001}
2002
[email protected]169d4282011-11-30 19:33:592003void RenderViewImpl::didUpdateLayout() {
[email protected]d01b2a62013-09-18 23:21:332004 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidUpdateLayout());
2005
[email protected]169d4282011-11-30 19:33:592006 // We don't always want to set up a timer, only if we've been put in that
2007 // mode by getting a |ViewMsg_EnablePreferredSizeChangedMode|
2008 // message.
2009 if (!send_preferred_size_changes_ || !webview())
2010 return;
2011
2012 if (check_preferred_size_timer_.IsRunning())
2013 return;
2014 check_preferred_size_timer_.Start(FROM_HERE,
2015 TimeDelta::FromMilliseconds(0), this,
2016 &RenderViewImpl::CheckPreferredSize);
2017}
2018
[email protected]310ebd6302011-10-10 19:06:282019void RenderViewImpl::navigateBackForwardSoon(int offset) {
fsamuele8326c742016-01-12 00:49:392020 Send(new ViewHostMsg_GoToEntryAtOffset(routing_id(), offset));
[email protected]48c9cf2d2009-09-16 16:47:522021}
2022
[email protected]310ebd6302011-10-10 19:06:282023int RenderViewImpl::historyBackListCount() {
[email protected]3cc72b12010-03-18 23:03:002024 return history_list_offset_ < 0 ? 0 : history_list_offset_;
[email protected]48c9cf2d2009-09-16 16:47:522025}
2026
[email protected]310ebd6302011-10-10 19:06:282027int RenderViewImpl::historyForwardListCount() {
[email protected]3cc72b12010-03-18 23:03:002028 return history_list_length_ - historyBackListCount() - 1;
[email protected]48c9cf2d2009-09-16 16:47:522029}
2030
[email protected]180ef242013-11-07 06:50:462031// blink::WebWidgetClient ----------------------------------------------------
[email protected]79dbc662009-09-04 05:42:512032
[email protected]310ebd6302011-10-10 19:06:282033void RenderViewImpl::didFocus() {
[email protected]ea42e7782010-08-23 23:58:122034 // TODO(jcivelli): when https://bugs.webkit.org/show_bug.cgi?id=33389 is fixed
2035 // we won't have to test for user gesture anymore and we can
2036 // move that code back to render_widget.cc
[email protected]af15bf22013-03-08 01:18:172037 if (WebUserGestureIndicator::isProcessingUserGesture() &&
[email protected]70dee7e2013-05-29 18:28:302038 !RenderThreadImpl::current()->layout_test_mode()) {
fsamuele8326c742016-01-12 00:49:392039 Send(new ViewHostMsg_Focus(routing_id()));
[email protected]ea42e7782010-08-23 23:58:122040 }
2041}
2042
initial.commit09911bf2008-07-26 23:55:292043// We are supposed to get a single call to Show for a newly created RenderView
[email protected]310ebd6302011-10-10 19:06:282044// that was created via RenderViewImpl::CreateWebView. So, we wait until this
initial.commit09911bf2008-07-26 23:55:292045// point to dispatch the ShowView message.
2046//
2047// This method provides us with the information about how to display the newly
[email protected]5f9de5882011-09-30 23:36:282048// created RenderView (i.e., as a blocked popup or as a new tab).
initial.commit09911bf2008-07-26 23:55:292049//
[email protected]310ebd6302011-10-10 19:06:282050void RenderViewImpl::show(WebNavigationPolicy policy) {
[email protected]b2142e962012-10-30 13:59:252051 if (did_show_) {
[email protected]b2142e962012-10-30 13:59:252052 // When supports_multiple_windows is disabled, popups are reusing
2053 // the same view. In some scenarios, this makes WebKit to call show() twice.
[email protected]c9edabd2013-05-23 13:56:242054 if (webkit_preferences_.supports_multiple_windows)
2055 NOTREACHED() << "received extraneous Show call";
initial.commit09911bf2008-07-26 23:55:292056 return;
[email protected]b2142e962012-10-30 13:59:252057 }
initial.commit09911bf2008-07-26 23:55:292058 did_show_ = true;
2059
[email protected]b2142e962012-10-30 13:59:252060 DCHECK(opener_id_ != MSG_ROUTING_NONE);
2061
bokanc007c3a2015-02-03 07:15:562062 // NOTE: initial_rect_ may still have its default values at this point, but
initial.commit09911bf2008-07-26 23:55:292063 // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the
2064 // browser process will impose a default position otherwise.
fsamuele8326c742016-01-12 00:49:392065 Send(new ViewHostMsg_ShowView(opener_id_, routing_id(),
2066 NavigationPolicyToDisposition(policy),
2067 initial_rect_, opened_by_user_gesture_));
bokanc007c3a2015-02-03 07:15:562068 SetPendingWindowRect(initial_rect_);
initial.commit09911bf2008-07-26 23:55:292069}
2070
[email protected]217690d2012-01-27 07:33:112071bool RenderViewImpl::requestPointerLock() {
2072 return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get());
2073}
2074
2075void RenderViewImpl::requestPointerUnlock() {
2076 mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get());
2077}
2078
2079bool RenderViewImpl::isPointerLocked() {
2080 return mouse_lock_dispatcher_->IsMouseLockedTo(
2081 webwidget_mouse_lock_target_.get());
2082}
2083
miletuse8d28ba2015-06-19 04:52:042084void RenderViewImpl::onMouseDown(const WebNode& mouse_down_node) {
2085 FOR_EACH_OBSERVER(
2086 RenderViewObserver, observers_, OnMouseDown(mouse_down_node));
2087}
2088
[email protected]c68c3e4e2013-01-24 00:36:562089void RenderViewImpl::didHandleGestureEvent(
2090 const WebGestureEvent& event,
2091 bool event_cancelled) {
2092 RenderWidget::didHandleGestureEvent(event, event_cancelled);
[email protected]bb37b652013-11-27 23:47:112093
[email protected]91dcc6d32014-07-30 00:01:332094 if (!event_cancelled) {
2095 FOR_EACH_OBSERVER(
2096 RenderViewObserver, observers_, DidHandleGestureEvent(event));
2097 }
2098
jdduke45762d22014-10-07 04:19:082099 // TODO(ananta): Piggyback off existing IPCs to communicate this information,
2100 // crbug/420130.
2101#if defined(OS_WIN)
[email protected]bb37b652013-11-27 23:47:112102 if (event.type != blink::WebGestureEvent::GestureTap)
2103 return;
2104
[email protected]91dcc6d32014-07-30 00:01:332105 // TODO(estade): hit test the event against focused node to make sure
2106 // the tap actually hit the focused node.
jdduke3bf083fe2015-09-29 23:40:532107 blink::WebTextInputType text_input_type = GetWebView()->textInputType();
[email protected]bb37b652013-11-27 23:47:112108
2109 Send(new ViewHostMsg_FocusedNodeTouched(
2110 routing_id(), text_input_type != blink::WebTextInputTypeNone));
jdduke45762d22014-10-07 04:19:082111#endif
[email protected]c68c3e4e2013-01-24 00:36:562112}
2113
[email protected]6e89eb72013-07-23 13:28:222114void RenderViewImpl::initializeLayerTreeView() {
2115 RenderWidget::initializeLayerTreeView();
2116 RenderWidgetCompositor* rwc = compositor();
[email protected]9f7638f42014-05-30 01:51:162117 if (!rwc)
[email protected]6e89eb72013-07-23 13:28:222118 return;
[email protected]9f7638f42014-05-30 01:51:162119
ccameron1f89c002014-10-21 06:19:052120 bool use_threaded_event_handling = true;
2121#if defined(OS_MACOSX) && !defined(OS_IOS)
ccamerona7644752014-12-30 01:16:312122 // Disable threaded event handling if content is not handling the elastic
2123 // overscroll effect. This includes the cases where the elastic overscroll
2124 // effect is being handled by Blink (because of command line flags) and older
2125 // operating system versions which do not have an elastic overscroll effect
2126 // (SnowLeopard, which has Aqua scrollbars which need synchronous updates).
2127 use_threaded_event_handling = compositor_deps_->IsElasticOverscrollEnabled();
[email protected]9f7638f42014-05-30 01:51:162128#endif
ccameron1f89c002014-10-21 06:19:052129 if (use_threaded_event_handling) {
2130 RenderThreadImpl* render_thread = RenderThreadImpl::current();
2131 // render_thread may be NULL in tests.
2132 InputHandlerManager* input_handler_manager =
2133 render_thread ? render_thread->input_handler_manager() : NULL;
2134 if (input_handler_manager) {
2135 input_handler_manager->AddInputHandler(
ymalikfb8b9642016-01-12 05:24:222136 routing_id(), rwc->GetInputHandler(), AsWeakPtr(),
2137 webkit_preferences_.enable_scroll_animator);
ccameron1f89c002014-10-21 06:19:052138 }
2139 }
[email protected]6e89eb72013-07-23 13:28:222140}
2141
[email protected]180ef242013-11-07 06:50:462142// blink::WebFrameClient -----------------------------------------------------
[email protected]3d9689372009-09-10 04:29:172143
[email protected]5e92282f2012-08-17 08:11:572144void RenderViewImpl::Repaint(const gfx::Size& size) {
[email protected]3d9ec5052013-01-02 22:05:252145 OnRepaint(size);
[email protected]5e92282f2012-08-17 08:11:572146}
2147
[email protected]b2324b092012-11-01 10:34:112148void RenderViewImpl::SetEditCommandForNextKeyEvent(const std::string& name,
2149 const std::string& value) {
2150 EditCommands edit_commands;
2151 edit_commands.push_back(EditCommand(name, value));
2152 OnSetEditCommandsForNextKeyEvent(edit_commands);
2153}
2154
2155void RenderViewImpl::ClearEditCommands() {
2156 edit_commands_.clear();
2157}
2158
[email protected]180ef242013-11-07 06:50:462159SSLStatus RenderViewImpl::GetSSLStatusOfFrame(blink::WebFrame* frame) const {
[email protected]83c0abca2013-07-23 20:09:422160 std::string security_info;
2161 if (frame && frame->dataSource())
2162 security_info = frame->dataSource()->response().securityInfo();
2163
estarka5635c42015-07-14 00:06:532164 SSLStatus result;
2165 CHECK(DeserializeSecurityInfo(security_info, &result));
2166 return result;
[email protected]e4495212012-12-06 03:09:122167}
2168
[email protected]b38806a2013-10-04 16:01:382169const std::string& RenderViewImpl::GetAcceptLanguages() const {
2170 return renderer_preferences_.accept_languages;
2171}
2172
oshimae2b3b402015-12-04 04:27:242173void RenderViewImpl::convertViewportToWindow(blink::WebRect* rect) {
oshimaf866dab2015-12-05 00:41:542174 RenderWidget::convertViewportToWindow(rect);
oshimae2b3b402015-12-04 04:27:242175}
2176
huangs2a342352015-12-15 16:59:242177gfx::RectF RenderViewImpl::ElementBoundsInWindow(
2178 const blink::WebElement& element) {
2179 blink::WebRect bounding_box_in_window = element.boundsInViewport();
2180 convertViewportToWindow(&bounding_box_in_window);
2181 return gfx::RectF(bounding_box_in_window);
2182}
2183
oshimac059194c2016-01-12 19:40:152184float RenderViewImpl::GetDeviceScaleFactorForTest() const {
2185 return device_scale_factor_;
2186}
2187
[email protected]35b2a972014-04-04 15:50:222188void RenderViewImpl::didChangeIcon(WebLocalFrame* frame,
[email protected]41225fe2013-03-29 05:32:022189 WebIconURL::Type icon_type) {
2190 if (frame->parent())
2191 return;
2192
[email protected]41225fe2013-03-29 05:32:022193 WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type);
2194 std::vector<FaviconURL> urls;
2195 for (size_t i = 0; i < icon_urls.size(); i++) {
[email protected]2bd262b2014-04-16 05:31:232196 std::vector<gfx::Size> sizes;
[email protected]f34ac132014-03-20 23:02:052197 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes);
2198 urls.push_back(FaviconURL(
2199 icon_urls[i].iconURL(), ToFaviconType(icon_urls[i].iconType()), sizes));
[email protected]41225fe2013-03-29 05:32:022200 }
2201 SendUpdateFaviconURL(urls);
[email protected]5019ef12010-04-27 17:26:582202}
2203
[email protected]310ebd6302011-10-10 19:06:282204void RenderViewImpl::CheckPreferredSize() {
[email protected]d812fd12011-05-27 23:05:072205 // We don't always want to send the change messages over IPC, only if we've
2206 // been put in that mode by getting a |ViewMsg_EnablePreferredSizeChangedMode|
2207 // message.
2208 if (!send_preferred_size_changes_ || !webview())
2209 return;
2210
[email protected]e76b7972013-06-06 02:58:482211 gfx::Size size = webview()->contentsPreferredMinimumSize();
[email protected]705243f2010-05-05 19:58:072212 if (size == preferred_size_)
2213 return;
[email protected]c27324b2009-11-19 22:44:292214
[email protected]705243f2010-05-05 19:58:072215 preferred_size_ = size;
fsamuele8326c742016-01-12 00:49:392216 Send(new ViewHostMsg_DidContentsPreferredSizeChange(routing_id(),
[email protected]705243f2010-05-05 19:58:072217 preferred_size_));
[email protected]3d9689372009-09-10 04:29:172218}
2219
[email protected]55750b32012-09-21 14:05:032220void RenderViewImpl::SendFindReply(int request_id,
2221 int match_count,
2222 int ordinal,
2223 const WebRect& selection_rect,
2224 bool final_status_update) {
fsamuele8326c742016-01-12 00:49:392225 Send(new ViewHostMsg_Find_Reply(routing_id(), request_id, match_count,
2226 selection_rect, ordinal,
[email protected]55750b32012-09-21 14:05:032227 final_status_update));
2228}
2229
[email protected]180ef242013-11-07 06:50:462230blink::WebString RenderViewImpl::acceptLanguages() {
[email protected]9982c802013-06-12 15:22:062231 return WebString::fromUTF8(renderer_preferences_.accept_languages);
2232}
2233
[email protected]e9ff79c2012-10-19 21:31:262234// RenderView implementation ---------------------------------------------------
[email protected]a2ef54c2011-10-10 16:20:312235
[email protected]310ebd6302011-10-10 19:06:282236bool RenderViewImpl::Send(IPC::Message* message) {
[email protected]a2ef54c2011-10-10 16:20:312237 return RenderWidget::Send(message);
2238}
2239
mostynbc33353232014-09-12 09:38:312240RenderFrameImpl* RenderViewImpl::GetMainRenderFrame() {
nasko77de2312015-05-12 03:09:162241 return main_render_frame_;
[email protected]b849847b2013-12-10 21:57:582242}
2243
[email protected]82114f52012-03-20 22:53:412244int RenderViewImpl::GetRoutingID() const {
fsamuele8326c742016-01-12 00:49:392245 return routing_id();
[email protected]a2ef54c2011-10-10 16:20:312246}
2247
[email protected]82114f52012-03-20 22:53:412248gfx::Size RenderViewImpl::GetSize() const {
[email protected]a2ef54c2011-10-10 16:20:312249 return size();
2250}
2251
oshima129b75e2016-01-14 09:15:142252float RenderViewImpl::GetDeviceScaleFactor() const {
2253 return device_scale_factor_;
2254}
2255
[email protected]82114f52012-03-20 22:53:412256WebPreferences& RenderViewImpl::GetWebkitPreferences() {
[email protected]a2ef54c2011-10-10 16:20:312257 return webkit_preferences_;
2258}
2259
[email protected]324825d2012-11-30 12:37:152260void RenderViewImpl::SetWebkitPreferences(const WebPreferences& preferences) {
2261 OnUpdateWebPreferences(preferences);
2262}
2263
[email protected]180ef242013-11-07 06:50:462264blink::WebView* RenderViewImpl::GetWebView() {
[email protected]a2ef54c2011-10-10 16:20:312265 return webview();
2266}
2267
[email protected]310ebd6302011-10-10 19:06:282268bool RenderViewImpl::ShouldDisplayScrollbars(int width, int height) const {
[email protected]a2ef54c2011-10-10 16:20:312269 return (!send_preferred_size_changes_ ||
2270 (disable_scrollbars_size_limit_.width() <= width ||
2271 disable_scrollbars_size_limit_.height() <= height));
2272}
2273
[email protected]82114f52012-03-20 22:53:412274int RenderViewImpl::GetEnabledBindings() const {
[email protected]a2ef54c2011-10-10 16:20:312275 return enabled_bindings_;
2276}
2277
avif937e1d2014-11-02 18:13:072278bool RenderViewImpl::GetContentStateImmediately() const {
2279 return send_content_state_immediately_;
[email protected]a2ef54c2011-10-10 16:20:312280}
2281
[email protected]180ef242013-11-07 06:50:462282blink::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const {
[email protected]a2ef54c2011-10-10 16:20:312283 return visibilityState();
2284}
2285
[email protected]3c71576ce2013-07-23 02:00:012286void RenderViewImpl::DidStartLoading() {
[email protected]6dd5c322014-03-12 07:58:462287 main_render_frame_->didStartLoading(true);
[email protected]3c71576ce2013-07-23 02:00:012288}
2289
2290void RenderViewImpl::DidStopLoading() {
[email protected]6dd5c322014-03-12 07:58:462291 main_render_frame_->didStopLoading();
[email protected]3c71576ce2013-07-23 02:00:012292}
2293
estade78d655f82015-01-30 01:55:082294blink::WebElement RenderViewImpl::GetFocusedElement() const {
2295 if (!webview())
2296 return WebElement();
2297 WebFrame* focused_frame = webview()->focusedFrame();
2298 if (focused_frame) {
2299 WebDocument doc = focused_frame->document();
2300 if (!doc.isNull())
2301 return doc.focusedElement();
2302 }
2303
2304 return WebElement();
2305}
2306
[email protected]54ea9ff2014-03-20 00:27:542307blink::WebPlugin* RenderViewImpl::GetWebPluginForFind() {
2308 if (!webview())
2309 return NULL;
2310
2311 WebFrame* main_frame = webview()->mainFrame();
[email protected]82307f6b2014-08-07 03:30:122312 if (main_frame->isWebLocalFrame() &&
2313 main_frame->document().isPluginDocument())
[email protected]54ea9ff2014-03-20 00:27:542314 return webview()->mainFrame()->document().to<WebPluginDocument>().plugin();
2315
2316#if defined(ENABLE_PLUGINS)
2317 if (plugin_find_handler_)
2318 return plugin_find_handler_->container()->plugin();
2319#endif
2320
2321 return NULL;
[email protected]24a7f3c2010-03-25 08:26:492322}
2323
[email protected]55750b32012-09-21 14:05:032324void RenderViewImpl::OnFind(int request_id,
[email protected]fcf75d42013-12-03 20:11:262325 const base::string16& search_text,
[email protected]310ebd6302011-10-10 19:06:282326 const WebFindOptions& options) {
thestig6057a6b22015-11-12 23:01:332327 DCHECK(!search_text.empty());
2328
[email protected]26aa0482009-09-30 16:55:272329 WebFrame* main_frame = webview()->mainFrame();
[email protected]54ea9ff2014-03-20 00:27:542330 blink::WebPlugin* plugin = GetWebPluginForFind();
[email protected]872542532011-06-23 00:43:162331 // Check if the plugin still exists in the document.
[email protected]54ea9ff2014-03-20 00:27:542332 if (plugin) {
[email protected]24a7f3c2010-03-25 08:26:492333 if (options.findNext) {
2334 // Just navigate back/forward.
[email protected]54ea9ff2014-03-20 00:27:542335 plugin->selectFindResult(options.forward);
[email protected]24a7f3c2010-03-25 08:26:492336 } else {
[email protected]54ea9ff2014-03-20 00:27:542337 if (!plugin->startFind(
[email protected]afdbd142010-07-10 08:01:232338 search_text, options.matchCase, request_id)) {
[email protected]e7c58a32010-08-13 19:47:112339 // Send "no results".
[email protected]55750b32012-09-21 14:05:032340 SendFindReply(request_id, 0, 0, gfx::Rect(), true);
[email protected]24a7f3c2010-03-25 08:26:492341 }
2342 }
2343 return;
2344 }
2345
[email protected]b4bb2502009-10-01 22:35:272346 WebFrame* frame_after_main = main_frame->traverseNext(true);
[email protected]26aa0482009-09-30 16:55:272347 WebFrame* focused_frame = webview()->focusedFrame();
initial.commit09911bf2008-07-26 23:55:292348 WebFrame* search_frame = focused_frame; // start searching focused frame.
2349
2350 bool multi_frame = (frame_after_main != main_frame);
2351
2352 // If we have multiple frames, we don't want to wrap the search within the
2353 // frame, so we check here if we only have main_frame in the chain.
2354 bool wrap_within_frame = !multi_frame;
2355
[email protected]b3f2b912009-04-09 16:18:522356 WebRect selection_rect;
initial.commit09911bf2008-07-26 23:55:292357 bool result = false;
2358
[email protected]7830da3e2009-11-06 16:27:262359 // If something is selected when we start searching it means we cannot just
2360 // increment the current match ordinal; we need to re-generate it.
2361 WebRange current_selection = focused_frame->selectionRange();
2362
initial.commit09911bf2008-07-26 23:55:292363 do {
[email protected]dd7daa82009-08-10 05:46:452364 result = search_frame->find(
[email protected]7ea066a2009-04-06 20:21:592365 request_id, search_text, options, wrap_within_frame, &selection_rect);
initial.commit09911bf2008-07-26 23:55:292366
2367 if (!result) {
2368 // don't leave text selected as you move to the next frame.
[email protected]6dd17a8a2013-05-01 05:50:102369 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172370 GetFocusedElement());
initial.commit09911bf2008-07-26 23:55:292371
2372 // Find the next frame, but skip the invisible ones.
2373 do {
2374 // What is the next frame to search? (we might be going backwards). Note
2375 // that we specify wrap=true so that search_frame never becomes NULL.
[email protected]7ea066a2009-04-06 20:21:592376 search_frame = options.forward ?
[email protected]b4bb2502009-10-01 22:35:272377 search_frame->traverseNext(true) :
2378 search_frame->traversePrevious(true);
[email protected]dd7daa82009-08-10 05:46:452379 } while (!search_frame->hasVisibleContent() &&
2380 search_frame != focused_frame);
initial.commit09911bf2008-07-26 23:55:292381
[email protected]884db412008-11-24 23:46:502382 // Make sure selection doesn't affect the search operation in new frame.
[email protected]6dd17a8a2013-05-01 05:50:102383 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172384 GetFocusedElement());
initial.commit09911bf2008-07-26 23:55:292385
2386 // If we have multiple frames and we have wrapped back around to the
2387 // focused frame, we need to search it once more allowing wrap within
2388 // the frame, otherwise it will report 'no match' if the focused frame has
2389 // reported matches, but no frames after the focused_frame contain a
2390 // match for the search word(s).
2391 if (multi_frame && search_frame == focused_frame) {
[email protected]dd7daa82009-08-10 05:46:452392 result = search_frame->find(
[email protected]7ea066a2009-04-06 20:21:592393 request_id, search_text, options, true, // Force wrapping.
2394 &selection_rect);
initial.commit09911bf2008-07-26 23:55:292395 }
2396 }
2397
[email protected]26aa0482009-09-30 16:55:272398 webview()->setFocusedFrame(search_frame);
initial.commit09911bf2008-07-26 23:55:292399 } while (!result && search_frame != focused_frame);
2400
[email protected]7830da3e2009-11-06 16:27:262401 if (options.findNext && current_selection.isNull()) {
[email protected]4f3dc372009-02-24 00:10:292402 // Force the main_frame to report the actual count.
[email protected]dd7daa82009-08-10 05:46:452403 main_frame->increaseMatchCount(0, request_id);
[email protected]4f3dc372009-02-24 00:10:292404 } else {
2405 // If nothing is found, set result to "0 of 0", otherwise, set it to
2406 // "-1 of 1" to indicate that we found at least one item, but we don't know
2407 // yet what is active.
2408 int ordinal = result ? -1 : 0; // -1 here means, we might know more later.
2409 int match_count = result ? 1 : 0; // 1 here means possibly more coming.
initial.commit09911bf2008-07-26 23:55:292410
[email protected]4f3dc372009-02-24 00:10:292411 // If we find no matches then this will be our last status update.
2412 // Otherwise the scoping effort will send more results.
2413 bool final_status_update = !result;
initial.commit09911bf2008-07-26 23:55:292414
[email protected]55750b32012-09-21 14:05:032415 SendFindReply(request_id, match_count, ordinal, selection_rect,
2416 final_status_update);
initial.commit09911bf2008-07-26 23:55:292417
initial.commit09911bf2008-07-26 23:55:292418 // Scoping effort begins, starting with the mainframe.
2419 search_frame = main_frame;
2420
[email protected]dd7daa82009-08-10 05:46:452421 main_frame->resetMatchCount();
initial.commit09911bf2008-07-26 23:55:292422
2423 do {
2424 // Cancel all old scoping requests before starting a new one.
[email protected]dd7daa82009-08-10 05:46:452425 search_frame->cancelPendingScopingEffort();
initial.commit09911bf2008-07-26 23:55:292426
2427 // We don't start another scoping effort unless at least one match has
2428 // been found.
2429 if (result) {
2430 // Start new scoping request. If the scoping function determines that it
2431 // needs to scope, it will defer until later.
[email protected]dd7daa82009-08-10 05:46:452432 search_frame->scopeStringMatches(request_id,
[email protected]7ea066a2009-04-06 20:21:592433 search_text,
2434 options,
initial.commit09911bf2008-07-26 23:55:292435 true); // reset the tickmarks
2436 }
2437
2438 // Iterate to the next frame. The frame will not necessarily scope, for
2439 // example if it is not visible.
[email protected]b4bb2502009-10-01 22:35:272440 search_frame = search_frame->traverseNext(true);
initial.commit09911bf2008-07-26 23:55:292441 } while (search_frame != main_frame);
2442 }
2443}
2444
[email protected]e9ff79c2012-10-19 21:31:262445void RenderViewImpl::OnStopFinding(StopFindAction action) {
[email protected]24a7f3c2010-03-25 08:26:492446 WebView* view = webview();
2447 if (!view)
2448 return;
2449
[email protected]54ea9ff2014-03-20 00:27:542450 blink::WebPlugin* plugin = GetWebPluginForFind();
2451 if (plugin) {
2452 plugin->stopFind();
[email protected]24a7f3c2010-03-25 08:26:492453 return;
2454 }
2455
[email protected]e9ff79c2012-10-19 21:31:262456 bool clear_selection = action == STOP_FIND_ACTION_CLEAR_SELECTION;
[email protected]6dd17a8a2013-05-01 05:50:102457 if (clear_selection) {
2458 view->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172459 GetFocusedElement());
[email protected]6dd17a8a2013-05-01 05:50:102460 }
[email protected]24a7f3c2010-03-25 08:26:492461
2462 WebFrame* frame = view->mainFrame();
2463 while (frame) {
2464 frame->stopFinding(clear_selection);
2465 frame = frame->traverseNext(false);
2466 }
2467
[email protected]e9ff79c2012-10-19 21:31:262468 if (action == STOP_FIND_ACTION_ACTIVATE_SELECTION) {
[email protected]24a7f3c2010-03-25 08:26:492469 WebFrame* focused_frame = view->focusedFrame();
2470 if (focused_frame) {
2471 WebDocument doc = focused_frame->document();
2472 if (!doc.isNull()) {
[email protected]c39f7442014-02-27 03:33:172473 WebElement element = doc.focusedElement();
2474 if (!element.isNull())
2475 element.simulateClick();
[email protected]24a7f3c2010-03-25 08:26:492476 }
2477 }
2478 }
2479}
2480
[email protected]59363fc92012-09-05 03:46:312481#if defined(OS_ANDROID)
2482void RenderViewImpl::OnActivateNearestFindResult(int request_id,
2483 float x, float y) {
2484 if (!webview())
2485 return;
2486
2487 WebFrame* main_frame = webview()->mainFrame();
2488 WebRect selection_rect;
2489 int ordinal = main_frame->selectNearestFindMatch(WebFloatPoint(x, y),
2490 &selection_rect);
2491 if (ordinal == -1) {
2492 // Something went wrong, so send a no-op reply (force the main_frame to
2493 // report the current match count) in case the host is waiting for a
2494 // response due to rate-limiting).
2495 main_frame->increaseMatchCount(0, request_id);
2496 return;
2497 }
2498
[email protected]55750b32012-09-21 14:05:032499 SendFindReply(request_id,
2500 -1 /* number_of_matches */,
2501 ordinal,
2502 selection_rect,
2503 true /* final_update */);
[email protected]59363fc92012-09-05 03:46:312504}
2505
2506void RenderViewImpl::OnFindMatchRects(int current_version) {
2507 if (!webview())
2508 return;
2509
2510 WebFrame* main_frame = webview()->mainFrame();
2511 std::vector<gfx::RectF> match_rects;
2512
2513 int rects_version = main_frame->findMatchMarkersVersion();
2514 if (current_version != rects_version) {
2515 WebVector<WebFloatRect> web_match_rects;
2516 main_frame->findMatchRects(web_match_rects);
2517 match_rects.reserve(web_match_rects.size());
2518 for (size_t i = 0; i < web_match_rects.size(); ++i)
2519 match_rects.push_back(gfx::RectF(web_match_rects[i]));
2520 }
2521
2522 gfx::RectF active_rect = main_frame->activeFindMatchRect();
fsamuele8326c742016-01-12 00:49:392523 Send(new ViewHostMsg_FindMatchRects_Reply(routing_id(), rects_version,
2524 match_rects, active_rect));
[email protected]59363fc92012-09-05 03:46:312525}
2526#endif
2527
mcnee432e47d2015-11-09 19:37:462528void RenderViewImpl::OnSetPageScale(float page_scale_factor) {
ccameronb7c1d6c2015-03-09 17:08:242529 if (!webview())
2530 return;
mcnee432e47d2015-11-09 19:37:462531 webview()->setPageScaleFactor(page_scale_factor);
ccameronb7c1d6c2015-03-09 17:08:242532}
2533
[email protected]e9ff79c2012-10-19 21:31:262534void RenderViewImpl::OnZoom(PageZoom zoom) {
[email protected]40bd6582009-12-04 23:49:512535 if (!webview()) // Not sure if this can happen, but no harm in being safe.
2536 return;
2537
[email protected]258d31122010-05-09 10:59:412538 webview()->hidePopups();
[email protected]854ab5462011-11-22 20:48:102539
[email protected]b75b8292010-10-01 07:28:252540 double old_zoom_level = webview()->zoomLevel();
2541 double zoom_level;
[email protected]e9ff79c2012-10-19 21:31:262542 if (zoom == PAGE_ZOOM_RESET) {
[email protected]b75b8292010-10-01 07:28:252543 zoom_level = 0;
2544 } else if (static_cast<int>(old_zoom_level) == old_zoom_level) {
2545 // Previous zoom level is a whole number, so just increment/decrement.
[email protected]54087fe2011-10-28 22:02:482546 zoom_level = old_zoom_level + zoom;
[email protected]b75b8292010-10-01 07:28:252547 } else {
2548 // Either the user hit the zoom factor limit and thus the zoom level is now
2549 // not a whole number, or a plugin changed it to a custom value. We want
2550 // to go to the next whole number so that the user can always get back to
2551 // 100% with the keyboard/menu.
[email protected]54087fe2011-10-28 22:02:482552 if ((old_zoom_level > 1 && zoom > 0) ||
2553 (old_zoom_level < 1 && zoom < 0)) {
2554 zoom_level = static_cast<int>(old_zoom_level + zoom);
[email protected]b75b8292010-10-01 07:28:252555 } else {
2556 // We're going towards 100%, so first go to the next whole number.
2557 zoom_level = static_cast<int>(old_zoom_level);
2558 }
2559 }
tommycli8aad3ba2015-08-12 17:57:592560 SetZoomLevel(zoom_level);
[email protected]47578fa02011-11-02 19:34:412561 zoomLevelChanged();
2562}
2563
[email protected]310ebd6302011-10-10 19:06:282564void RenderViewImpl::OnSetZoomLevelForLoadingURL(const GURL& url,
2565 double zoom_level) {
[email protected]cbe55d22013-02-14 17:04:332566#if !defined(OS_ANDROID)
2567 // On Android, page zoom isn't used, and in case of WebView, text zoom is used
2568 // for legacy WebView text scaling emulation. Thus, the code that resets
2569 // the zoom level from this map will be effectively resetting text zoom level.
[email protected]9d797f32010-04-23 07:17:542570 host_zoom_levels_[url] = zoom_level;
[email protected]cbe55d22013-02-14 17:04:332571#endif
initial.commit09911bf2008-07-26 23:55:292572}
2573
[email protected]d42bf472014-06-14 01:49:382574void RenderViewImpl::OnSetZoomLevelForView(bool uses_temporary_zoom_level,
2575 double level) {
2576 uses_temporary_zoom_level_ = uses_temporary_zoom_level;
2577
2578 webview()->hidePopups();
tommycli8aad3ba2015-08-12 17:57:592579 SetZoomLevel(level);
[email protected]d42bf472014-06-14 01:49:382580}
2581
[email protected]310ebd6302011-10-10 19:06:282582void RenderViewImpl::OnSetPageEncoding(const std::string& encoding_name) {
[email protected]26aa0482009-09-30 16:55:272583 webview()->setPageEncoding(WebString::fromUTF8(encoding_name));
initial.commit09911bf2008-07-26 23:55:292584}
2585
[email protected]310ebd6302011-10-10 19:06:282586void RenderViewImpl::OnResetPageEncodingToDefault() {
[email protected]26aa0482009-09-30 16:55:272587 WebString no_encoding;
2588 webview()->setPageEncoding(no_encoding);
[email protected]a697f4c2009-09-14 22:30:182589}
2590
[email protected]310ebd6302011-10-10 19:06:282591void RenderViewImpl::OnAllowBindings(int enabled_bindings_flags) {
[email protected]940ed1d2012-11-27 21:03:212592 if ((enabled_bindings_flags & BINDINGS_POLICY_WEB_UI) &&
2593 !(enabled_bindings_ & BINDINGS_POLICY_WEB_UI)) {
[email protected]69a0a132014-03-26 16:45:022594 // WebUIExtensionData deletes itself when we're destroyed.
[email protected]940ed1d2012-11-27 21:03:212595 new WebUIExtensionData(this);
nasko1fa0fb62015-12-09 01:49:572596
2597 if (main_render_frame_)
2598 main_render_frame_->EnableMojoBindings();
[email protected]940ed1d2012-11-27 21:03:212599 }
2600
[email protected]81e63782009-02-27 19:35:092601 enabled_bindings_ |= enabled_bindings_flags;
[email protected]744c2a22012-03-15 18:42:042602
2603 // Keep track of the total bindings accumulated in this process.
2604 RenderProcess::current()->AddBindings(enabled_bindings_flags);
initial.commit09911bf2008-07-26 23:55:292605}
2606
[email protected]dc293a72013-07-01 11:11:222607void RenderViewImpl::OnDragTargetDragEnter(const DropData& drop_data,
[email protected]310ebd6302011-10-10 19:06:282608 const gfx::Point& client_point,
2609 const gfx::Point& screen_point,
[email protected]1f2230b2012-05-17 23:43:422610 WebDragOperationsMask ops,
2611 int key_modifiers) {
[email protected]59f4f2fa2011-03-23 01:00:552612 WebDragOperation operation = webview()->dragTargetDragEnter(
[email protected]dc293a72013-07-01 11:11:222613 DropDataToWebDragData(drop_data),
[email protected]59f4f2fa2011-03-23 01:00:552614 client_point,
2615 screen_point,
[email protected]1f2230b2012-05-17 23:43:422616 ops,
2617 key_modifiers);
[email protected]59f4f2fa2011-03-23 01:00:552618
fsamuele8326c742016-01-12 00:49:392619 Send(new DragHostMsg_UpdateDragCursor(routing_id(), operation));
[email protected]59f4f2fa2011-03-23 01:00:552620}
2621
[email protected]310ebd6302011-10-10 19:06:282622void RenderViewImpl::OnDragTargetDragOver(const gfx::Point& client_point,
2623 const gfx::Point& screen_point,
[email protected]1f2230b2012-05-17 23:43:422624 WebDragOperationsMask ops,
2625 int key_modifiers) {
[email protected]59f4f2fa2011-03-23 01:00:552626 WebDragOperation operation = webview()->dragTargetDragOver(
2627 client_point,
2628 screen_point,
[email protected]1f2230b2012-05-17 23:43:422629 ops,
2630 key_modifiers);
[email protected]59f4f2fa2011-03-23 01:00:552631
fsamuele8326c742016-01-12 00:49:392632 Send(new DragHostMsg_UpdateDragCursor(routing_id(), operation));
[email protected]59f4f2fa2011-03-23 01:00:552633}
2634
[email protected]310ebd6302011-10-10 19:06:282635void RenderViewImpl::OnDragTargetDragLeave() {
[email protected]59f4f2fa2011-03-23 01:00:552636 webview()->dragTargetDragLeave();
2637}
2638
[email protected]310ebd6302011-10-10 19:06:282639void RenderViewImpl::OnDragTargetDrop(const gfx::Point& client_point,
[email protected]1f2230b2012-05-17 23:43:422640 const gfx::Point& screen_point,
2641 int key_modifiers) {
2642 webview()->dragTargetDrop(client_point, screen_point, key_modifiers);
[email protected]59f4f2fa2011-03-23 01:00:552643}
2644
[email protected]7a6d773f2014-04-04 01:25:092645void RenderViewImpl::OnDragSourceEnded(const gfx::Point& client_point,
2646 const gfx::Point& screen_point,
2647 WebDragOperation op) {
2648 webview()->dragSourceEndedAt(client_point, screen_point, op);
initial.commit09911bf2008-07-26 23:55:292649}
2650
[email protected]310ebd6302011-10-10 19:06:282651void RenderViewImpl::OnDragSourceSystemDragEnded() {
[email protected]26aa0482009-09-30 16:55:272652 webview()->dragSourceSystemDragEnded();
initial.commit09911bf2008-07-26 23:55:292653}
2654
[email protected]310ebd6302011-10-10 19:06:282655void RenderViewImpl::OnUpdateWebPreferences(const WebPreferences& prefs) {
[email protected]2fab253a2009-08-17 23:00:592656 webkit_preferences_ = prefs;
sataya.mf405d0e2015-07-07 16:51:112657 ApplyWebPreferencesInternal(webkit_preferences_, webview(), compositor_deps_);
initial.commit09911bf2008-07-26 23:55:292658}
2659
[email protected]310ebd6302011-10-10 19:06:282660void RenderViewImpl::OnEnumerateDirectoryResponse(
[email protected]600ea402011-04-12 00:01:512661 int id,
[email protected]c42de732013-02-16 06:26:312662 const std::vector<base::FilePath>& paths) {
[email protected]600ea402011-04-12 00:01:512663 if (!enumeration_completions_[id])
2664 return;
2665
2666 WebVector<WebString> ws_file_names(paths.size());
2667 for (size_t i = 0; i < paths.size(); ++i)
[email protected]728c2ee2013-06-25 04:01:072668 ws_file_names[i] = paths[i].AsUTF16Unsafe();
[email protected]600ea402011-04-12 00:01:512669
2670 enumeration_completions_[id]->didChooseFile(ws_file_names);
2671 enumeration_completions_.erase(id);
2672}
2673
[email protected]fb11b6a42012-03-14 07:25:122674void RenderViewImpl::OnFileChooserResponse(
hirono570357bd2014-10-08 12:39:272675 const std::vector<content::FileChooserFileInfo>& files) {
[email protected]8029f5672009-03-20 22:33:362676 // This could happen if we navigated to a different page before the user
2677 // closed the chooser.
[email protected]cdaf8d02010-03-30 19:52:472678 if (file_chooser_completions_.empty())
[email protected]8029f5672009-03-20 22:33:362679 return;
2680
[email protected]b5188522012-03-15 00:18:042681 // Convert Chrome's SelectedFileInfo list to WebKit's.
2682 WebVector<WebFileChooserCompletion::SelectedFileInfo> selected_files(
2683 files.size());
2684 for (size_t i = 0; i < files.size(); ++i) {
2685 WebFileChooserCompletion::SelectedFileInfo selected_file;
hirono570357bd2014-10-08 12:39:272686 selected_file.path = files[i].file_path.AsUTF16Unsafe();
[email protected]728c2ee2013-06-25 04:01:072687 selected_file.displayName =
2688 base::FilePath(files[i].display_name).AsUTF16Unsafe();
hironoe9f2732b2014-10-22 08:06:412689 if (files[i].file_system_url.is_valid()) {
2690 selected_file.fileSystemURL = files[i].file_system_url;
2691 selected_file.length = files[i].length;
2692 selected_file.modificationTime = files[i].modification_time.ToDoubleT();
2693 selected_file.isDirectory = files[i].is_directory;
2694 }
[email protected]b5188522012-03-15 00:18:042695 selected_files[i] = selected_file;
2696 }
[email protected]a1128322009-10-06 18:38:462697
[email protected]cdaf8d02010-03-30 19:52:472698 if (file_chooser_completions_.front()->completion)
[email protected]b5188522012-03-15 00:18:042699 file_chooser_completions_.front()->completion->didChooseFile(
2700 selected_files);
[email protected]cdaf8d02010-03-30 19:52:472701 file_chooser_completions_.pop_front();
2702
2703 // If there are more pending file chooser requests, schedule one now.
2704 if (!file_chooser_completions_.empty()) {
fsamuele8326c742016-01-12 00:49:392705 Send(new ViewHostMsg_RunFileChooser(
2706 routing_id(), file_chooser_completions_.front()->params));
[email protected]cdaf8d02010-03-30 19:52:472707 }
initial.commit09911bf2008-07-26 23:55:292708}
2709
[email protected]244ac1892011-12-02 17:04:472710void RenderViewImpl::OnEnableAutoResize(const gfx::Size& min_size,
2711 const gfx::Size& max_size) {
2712 DCHECK(disable_scrollbars_size_limit_.IsEmpty());
2713 if (!webview())
2714 return;
oshima33ec97cd2015-12-14 19:40:242715
[email protected]97e1bf72013-03-06 14:06:052716 auto_resize_mode_ = true;
oshima33ec97cd2015-12-14 19:40:242717 if (IsUseZoomForDSFEnabled()) {
2718 webview()->enableAutoResizeMode(
2719 gfx::ScaleToCeiledSize(min_size, device_scale_factor_),
2720 gfx::ScaleToCeiledSize(max_size, device_scale_factor_));
2721 } else {
2722 webview()->enableAutoResizeMode(min_size, max_size);
2723 }
[email protected]61e2b3cc2012-03-02 16:13:342724}
2725
2726void RenderViewImpl::OnDisableAutoResize(const gfx::Size& new_size) {
2727 DCHECK(disable_scrollbars_size_limit_.IsEmpty());
2728 if (!webview())
2729 return;
[email protected]97e1bf72013-03-06 14:06:052730 auto_resize_mode_ = false;
[email protected]61e2b3cc2012-03-02 16:13:342731 webview()->disableAutoResizeMode();
2732
[email protected]eac2b362013-05-22 07:01:452733 if (!new_size.IsEmpty()) {
2734 Resize(new_size,
2735 physical_backing_size_,
dtrainorcb7779b82014-12-04 01:08:022736 top_controls_shrink_blink_size_,
2737 top_controls_height_,
[email protected]bb6378fe2014-04-28 21:19:442738 visible_viewport_size_,
[email protected]eac2b362013-05-22 07:01:452739 resizer_rect_,
mikhail.pozdnyakovf2c902a2015-04-14 08:09:122740 is_fullscreen_granted_,
mikhail.pozdnyakovc0e251b2015-04-15 06:51:122741 display_mode_,
[email protected]eac2b362013-05-22 07:01:452742 NO_RESIZE_ACK);
2743 }
[email protected]244ac1892011-12-02 17:04:472744}
2745
[email protected]2bf834f2011-11-17 20:02:212746void RenderViewImpl::OnEnablePreferredSizeChangedMode() {
[email protected]9fb325e2010-05-06 18:23:242747 if (send_preferred_size_changes_)
2748 return;
[email protected]9fb325e2010-05-06 18:23:242749 send_preferred_size_changes_ = true;
[email protected]770dd8b2010-05-24 18:11:392750
[email protected]d812fd12011-05-27 23:05:072751 // Start off with an initial preferred size notification (in case
2752 // |didUpdateLayout| was already called).
[email protected]169d4282011-11-30 19:33:592753 didUpdateLayout();
[email protected]0666aef2009-05-13 19:48:082754}
2755
[email protected]310ebd6302011-10-10 19:06:282756void RenderViewImpl::OnDisableScrollbarsForSmallWindows(
[email protected]cda45c02010-02-25 19:28:102757 const gfx::Size& disable_scrollbar_size_limit) {
2758 disable_scrollbars_size_limit_ = disable_scrollbar_size_limit;
2759}
2760
[email protected]310ebd6302011-10-10 19:06:282761void RenderViewImpl::OnSetRendererPrefs(
[email protected]e9ff79c2012-10-19 21:31:262762 const RendererPreferences& renderer_prefs) {
[email protected]d051d9a2011-12-10 02:02:502763 double old_zoom_level = renderer_preferences_.default_zoom_level;
[email protected]ebd5ea52014-05-28 14:51:152764 std::string old_accept_languages = renderer_preferences_.accept_languages;
2765
[email protected]80d96fa2009-06-10 22:34:512766 renderer_preferences_ = renderer_prefs;
ananta59b9fe72015-04-07 01:33:262767
[email protected]6e282c92009-07-24 01:19:372768 UpdateFontRenderingFromRendererPrefs();
ananta59b9fe72015-04-07 01:33:262769 UpdateThemePrefs();
[email protected]38a85712013-01-02 22:45:022770
[email protected]dcc297772014-04-10 22:20:522771#if defined(USE_DEFAULT_RENDER_THEME)
[email protected]1596efb2013-01-17 22:13:012772 if (renderer_prefs.use_custom_colors) {
esprehn021507d2015-11-13 23:35:012773 blink::setFocusRingColor(renderer_prefs.focus_ring_color);
[email protected]180ef242013-11-07 06:50:462774 blink::setCaretBlinkInterval(renderer_prefs.caret_blink_interval);
[email protected]1596efb2013-01-17 22:13:012775
2776 if (webview()) {
[email protected]1596efb2013-01-17 22:13:012777 webview()->setSelectionColors(
2778 renderer_prefs.active_selection_bg_color,
2779 renderer_prefs.active_selection_fg_color,
2780 renderer_prefs.inactive_selection_bg_color,
2781 renderer_prefs.inactive_selection_fg_color);
2782 webview()->themeChanged();
2783 }
[email protected]644d77e2010-01-27 01:03:102784 }
[email protected]c997bc42014-04-11 18:25:582785#endif // defined(USE_DEFAULT_RENDER_THEME)
[email protected]d299d972012-03-23 02:26:552786
[email protected]d051d9a2011-12-10 02:02:502787 // If the zoom level for this page matches the old zoom default, and this
2788 // is not a plugin, update the zoom level to match the new default.
[email protected]82307f6b2014-08-07 03:30:122789 if (webview() && webview()->mainFrame()->isWebLocalFrame() &&
2790 !webview()->mainFrame()->document().isPluginDocument() &&
[email protected]cbe55d22013-02-14 17:04:332791 !ZoomValuesEqual(old_zoom_level,
2792 renderer_preferences_.default_zoom_level) &&
[email protected]e9ff79c2012-10-19 21:31:262793 ZoomValuesEqual(webview()->zoomLevel(), old_zoom_level)) {
tommycli8aad3ba2015-08-12 17:57:592794 SetZoomLevel(renderer_preferences_.default_zoom_level);
[email protected]d051d9a2011-12-10 02:02:502795 zoomLevelChanged();
2796 }
[email protected]ebd5ea52014-05-28 14:51:152797
2798 if (webview() &&
2799 old_accept_languages != renderer_preferences_.accept_languages) {
2800 webview()->acceptLanguagesChanged();
2801 }
[email protected]80d96fa2009-06-10 22:34:512802}
2803
[email protected]310ebd6302011-10-10 19:06:282804void RenderViewImpl::OnMediaPlayerActionAt(const gfx::Point& location,
2805 const WebMediaPlayerAction& action) {
[email protected]952cb702009-10-07 05:50:282806 if (webview())
2807 webview()->performMediaPlayerAction(action, location);
[email protected]581b87eb2009-07-23 23:06:562808}
2809
[email protected]fcdc5642014-05-09 14:32:242810void RenderViewImpl::OnOrientationChange() {
japhete20ec7c2015-03-18 19:16:182811 if (webview() && webview()->mainFrame()->isWebLocalFrame())
2812 webview()->mainFrame()->toWebLocalFrame()->sendOrientationChangeEvent();
[email protected]77829642012-05-15 14:47:172813}
2814
[email protected]81375e872012-01-11 21:40:362815void RenderViewImpl::OnPluginActionAt(const gfx::Point& location,
2816 const WebPluginAction& action) {
2817 if (webview())
2818 webview()->performPluginAction(action, location);
2819}
2820
[email protected]88f10a22013-11-06 21:22:122821void RenderViewImpl::OnSuppressDialogsUntilSwapOut() {
2822 // Don't show any more dialogs until we finish OnSwapOut.
2823 suppress_dialogs_until_swap_out_ = true;
2824}
2825
[email protected]310ebd6302011-10-10 19:06:282826void RenderViewImpl::OnClosePage() {
[email protected]77fc9b92011-10-15 16:20:372827 FOR_EACH_OBSERVER(RenderViewObserver, observers_, ClosePage());
initial.commit09911bf2008-07-26 23:55:292828 // TODO(creis): We'd rather use webview()->Close() here, but that currently
2829 // sets the WebView's delegate_ to NULL, preventing any JavaScript dialogs
2830 // in the onunload handler from appearing. For now, we're bypassing that and
2831 // calling the FrameLoader's CloseURL method directly. This should be
2832 // revisited to avoid having two ways to close a page. Having a single way
2833 // to close that can run onunload is also useful for fixing
2834 // http://b/issue?id=753080.
[email protected]11fd5db2014-04-02 03:49:462835 webview()->mainFrame()->dispatchUnloadEvent();
initial.commit09911bf2008-07-26 23:55:292836
fsamuele8326c742016-01-12 00:49:392837 Send(new ViewHostMsg_ClosePage_ACK(routing_id()));
initial.commit09911bf2008-07-26 23:55:292838}
2839
naskoc288745f2015-05-01 22:54:212840void RenderViewImpl::OnClose() {
2841 if (closing_)
fsamuele8326c742016-01-12 00:49:392842 RenderThread::Get()->Send(new ViewHostMsg_Close_ACK(routing_id()));
naskoc288745f2015-05-01 22:54:212843 RenderWidget::OnClose();
2844}
2845
[email protected]310ebd6302011-10-10 19:06:282846void RenderViewImpl::OnThemeChanged() {
[email protected]e8d6b9f2011-10-10 22:21:022847#if defined(USE_AURA)
2848 // Aura doesn't care if we switch themes.
2849#elif defined(OS_WIN)
[email protected]f78452f2012-05-15 02:07:522850 ui::NativeThemeWin::instance()->CloseHandles();
[email protected]f98d7e3c2010-09-13 22:30:462851 if (webview())
2852 webview()->themeChanged();
[email protected]6c8afae52009-01-22 02:24:572853#else // defined(OS_WIN)
2854 // TODO(port): we don't support theming on non-Windows platforms yet
2855 NOTIMPLEMENTED();
2856#endif
initial.commit09911bf2008-07-26 23:55:292857}
2858
[email protected]310ebd6302011-10-10 19:06:282859void RenderViewImpl::OnMoveOrResizeStarted() {
[email protected]30f75e62009-02-25 22:01:002860 if (webview())
[email protected]a72a1fa2010-05-03 22:18:472861 webview()->hidePopups();
[email protected]30f75e62009-02-25 22:01:002862}
2863
[email protected]0fdd5012013-05-29 08:05:562864void RenderViewImpl::OnResize(const ViewMsg_Resize_Params& params) {
[email protected]189a8862014-07-18 00:27:532865 TRACE_EVENT0("renderer", "RenderViewImpl::OnResize");
[email protected]cda45c02010-02-25 19:28:102866 if (webview()) {
[email protected]a72a1fa2010-05-03 22:18:472867 webview()->hidePopups();
[email protected]cda45c02010-02-25 19:28:102868 if (send_preferred_size_changes_) {
[email protected]7339cd22010-10-27 00:11:202869 webview()->mainFrame()->setCanHaveScrollbars(
[email protected]0fdd5012013-05-29 08:05:562870 ShouldDisplayScrollbars(params.new_size.width(),
2871 params.new_size.height()));
[email protected]cda45c02010-02-25 19:28:102872 }
mikhail.pozdnyakovc0e251b2015-04-15 06:51:122873 if (display_mode_ != params.display_mode) {
2874 display_mode_ = params.display_mode;
2875 webview()->setDisplayMode(display_mode_);
2876 }
[email protected]cda45c02010-02-25 19:28:102877 }
2878
[email protected]cbbdeef2014-05-26 15:57:362879 gfx::Size old_visible_viewport_size = visible_viewport_size_;
2880
[email protected]0fdd5012013-05-29 08:05:562881 RenderWidget::OnResize(params);
[email protected]cbbdeef2014-05-26 15:57:362882
2883 if (old_visible_viewport_size != visible_viewport_size_)
2884 has_scrolled_focused_editable_node_into_rect_ = false;
[email protected]30f75e62009-02-25 22:01:002885}
[email protected]0aa477bd2009-03-23 22:21:432886
[email protected]310ebd6302011-10-10 19:06:282887void RenderViewImpl::DidInitiatePaint() {
[email protected]ea2fb972013-08-07 05:44:262888#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:572889 // Notify all instances that we painted. The same caveats apply as for
2890 // ViewFlushedPaint regarding instances closing themselves, so we take
2891 // similar precautions.
2892 PepperPluginSet plugins = active_pepper_instances_;
2893 for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) {
2894 if (active_pepper_instances_.find(*i) != active_pepper_instances_.end())
2895 (*i)->ViewInitiatedPaint();
2896 }
[email protected]ea2fb972013-08-07 05:44:262897#endif
[email protected]00c39612010-03-06 02:53:282898}
2899
[email protected]310ebd6302011-10-10 19:06:282900void RenderViewImpl::DidFlushPaint() {
[email protected]5b1dec8c2012-02-07 04:35:382901 // If the RenderWidget is closing down then early-exit, otherwise we'll crash.
2902 // See crbug.com/112921.
2903 if (!webview())
2904 return;
2905
[email protected]00c39612010-03-06 02:53:282906 WebFrame* main_frame = webview()->mainFrame();
[email protected]82307f6b2014-08-07 03:30:122907 for (WebFrame* frame = main_frame; frame;
2908 frame = frame->traverseNext(false)) {
pmeenandcc725b2014-10-22 18:04:112909 // TODO(nasko): This is a hack for the case in which the top-level
2910 // frame is being rendered in another process. It will not
2911 // behave correctly for out of process iframes.
2912 if (frame->isWebLocalFrame()) {
[email protected]82307f6b2014-08-07 03:30:122913 main_frame = frame;
pmeenandcc725b2014-10-22 18:04:112914 break;
2915 }
[email protected]82307f6b2014-08-07 03:30:122916 }
[email protected]00c39612010-03-06 02:53:282917
alexmos6806d182015-07-28 00:04:192918 // There's nothing to do if there are no local frames in this RenderView's
2919 // frame tree. This can happen if DidFlushPaint is called after the
2920 // RenderView's local main frame is swapped to a remote frame. See
2921 // http://crbug.com/513552.
2922 if (main_frame->isWebRemoteFrame())
2923 return;
2924
[email protected]00c39612010-03-06 02:53:282925 // If we have a provisional frame we are between the start and commit stages
2926 // of loading and we don't want to save stats.
2927 if (!main_frame->provisionalDataSource()) {
2928 WebDataSource* ds = main_frame->dataSource();
enne95486602015-04-30 23:41:102929 if (!ds)
2930 return;
2931
[email protected]007733c2011-11-17 00:34:072932 DocumentState* document_state = DocumentState::FromDataSource(ds);
[email protected]92d457802013-04-01 19:18:492933
[email protected]05c8e502010-08-15 15:13:522934 // TODO(jar): The following code should all be inside a method, probably in
2935 // NavigatorState.
[email protected]00c39612010-03-06 02:53:282936 Time now = Time::Now();
[email protected]007733c2011-11-17 00:34:072937 if (document_state->first_paint_time().is_null()) {
2938 document_state->set_first_paint_time(now);
[email protected]00c39612010-03-06 02:53:282939 }
[email protected]007733c2011-11-17 00:34:072940 if (document_state->first_paint_after_load_time().is_null() &&
2941 !document_state->finish_load_time().is_null()) {
2942 document_state->set_first_paint_after_load_time(now);
[email protected]00c39612010-03-06 02:53:282943 }
2944 }
2945}
2946
[email protected]ceb36f7d2012-10-31 18:33:242947gfx::Vector2d RenderViewImpl::GetScrollOffset() {
[email protected]82307f6b2014-08-07 03:30:122948 WebFrame* main_frame = webview()->mainFrame();
2949 for (WebFrame* frame = main_frame; frame;
2950 frame = frame->traverseNext(false)) {
2951 // TODO(nasko): This is a hack for the case in which the top-level
2952 // frame is being rendered in another process. It will not
2953 // behave correctly for out of process iframes.
2954 if (frame->isWebLocalFrame()) {
2955 main_frame = frame;
2956 break;
2957 }
2958 }
2959
2960 WebSize scroll_offset = main_frame->scrollOffset();
[email protected]ceb36f7d2012-10-31 18:33:242961 return gfx::Vector2d(scroll_offset.width, scroll_offset.height);
[email protected]d54169e92011-01-21 09:19:522962}
2963
[email protected]ab6c9112014-02-27 00:20:582964void RenderViewImpl::OnClearFocusedElement() {
[email protected]05d478752009-04-08 23:38:162965 if (webview())
[email protected]ab6c9112014-02-27 00:20:582966 webview()->clearFocusedElement();
[email protected]05d478752009-04-08 23:38:162967}
2968
[email protected]61f91832014-05-13 01:24:422969void RenderViewImpl::OnSetBackgroundOpaque(bool opaque) {
[email protected]699ab0d2009-04-23 23:19:142970 if (webview())
[email protected]61f91832014-05-13 01:24:422971 webview()->setIsTransparent(!opaque);
[email protected]ba91a792013-02-06 09:48:282972 if (compositor_)
[email protected]61f91832014-05-13 01:24:422973 compositor_->setHasTransparentBackground(!opaque);
[email protected]699ab0d2009-04-23 23:19:142974}
2975
[email protected]310ebd6302011-10-10 19:06:282976void RenderViewImpl::OnSetActive(bool active) {
[email protected]8c66c5a2009-07-22 17:26:342977 if (webview())
[email protected]b4bb2502009-10-01 22:35:272978 webview()->setIsActive(active);
[email protected]d8fd6fa2010-02-01 15:54:262979
[email protected]a80af12e2013-08-07 23:36:132980#if defined(ENABLE_PLUGINS) && defined(OS_MACOSX)
[email protected]d8fd6fa2010-02-01 15:54:262981 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
2982 for (plugin_it = plugin_delegates_.begin();
2983 plugin_it != plugin_delegates_.end(); ++plugin_it) {
2984 (*plugin_it)->SetWindowFocus(active);
2985 }
2986#endif
[email protected]8c66c5a2009-07-22 17:26:342987}
2988
[email protected]6ce7abc52010-02-02 18:40:142989#if defined(OS_MACOSX)
[email protected]310ebd6302011-10-10 19:06:282990void RenderViewImpl::OnSetWindowVisibility(bool visible) {
[email protected]a80af12e2013-08-07 23:36:132991#if defined(ENABLE_PLUGINS)
[email protected]6ce7abc52010-02-02 18:40:142992 // Inform plugins that their container has changed visibility.
2993 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
2994 for (plugin_it = plugin_delegates_.begin();
2995 plugin_it != plugin_delegates_.end(); ++plugin_it) {
2996 (*plugin_it)->SetContainerVisibility(visible);
2997 }
[email protected]a80af12e2013-08-07 23:36:132998#endif
[email protected]6ce7abc52010-02-02 18:40:142999}
[email protected]1e6e3c992010-02-08 15:52:133000
[email protected]310ebd6302011-10-10 19:06:283001void RenderViewImpl::OnWindowFrameChanged(const gfx::Rect& window_frame,
3002 const gfx::Rect& view_frame) {
[email protected]a80af12e2013-08-07 23:36:133003#if defined(ENABLE_PLUGINS)
[email protected]1e6e3c992010-02-08 15:52:133004 // Inform plugins that their window's frame has changed.
3005 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3006 for (plugin_it = plugin_delegates_.begin();
3007 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3008 (*plugin_it)->WindowFrameChanged(window_frame, view_frame);
3009 }
[email protected]a80af12e2013-08-07 23:36:133010#endif
[email protected]1e6e3c992010-02-08 15:52:133011}
[email protected]935d63d2010-10-15 23:31:553012
[email protected]fcf75d42013-12-03 20:11:263013void RenderViewImpl::OnPluginImeCompositionCompleted(const base::string16& text,
[email protected]310ebd6302011-10-10 19:06:283014 int plugin_id) {
[email protected]b7f75862011-01-21 21:15:133015 // WebPluginDelegateProxy is responsible for figuring out if this event
[email protected]935d63d2010-10-15 23:31:553016 // applies to it or not, so inform all the delegates.
3017 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3018 for (plugin_it = plugin_delegates_.begin();
3019 plugin_it != plugin_delegates_.end(); ++plugin_it) {
[email protected]b7f75862011-01-21 21:15:133020 (*plugin_it)->ImeCompositionCompleted(text, plugin_id);
[email protected]935d63d2010-10-15 23:31:553021 }
3022}
[email protected]6ce7abc52010-02-02 18:40:143023#endif // OS_MACOSX
3024
dcheng3ce04b62015-10-26 23:30:553025void RenderViewImpl::CloseForFrame() {
3026 DCHECK(frame_widget_);
3027 frame_widget_->close();
3028 frame_widget_ = nullptr;
3029}
3030
[email protected]310ebd6302011-10-10 19:06:283031void RenderViewImpl::Close() {
[email protected]60c42a8c72009-10-09 04:08:593032 // We need to grab a pointer to the doomed WebView before we destroy it.
3033 WebView* doomed = webview();
3034 RenderWidget::Close();
[email protected]625332e02010-12-14 07:48:493035 g_view_map.Get().erase(doomed);
fsamuele8326c742016-01-12 00:49:393036 g_routing_id_view_map.Get().erase(routing_id());
3037 RenderThread::Get()->Send(new ViewHostMsg_Close_ACK(routing_id()));
[email protected]60c42a8c72009-10-09 04:08:593038}
3039
[email protected]310ebd6302011-10-10 19:06:283040void RenderViewImpl::OnWasHidden() {
[email protected]941e4552010-02-01 21:23:433041 RenderWidget::OnWasHidden();
3042
[email protected]68877c282013-09-20 05:52:423043#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
[email protected]6392d982013-04-16 16:59:223044 RenderThreadImpl::current()->video_capture_impl_manager()->
3045 SuspendDevices(true);
[email protected]e976c3c52014-07-24 17:41:553046 if (speech_recognition_dispatcher_)
3047 speech_recognition_dispatcher_->AbortAllRecognitions();
[email protected]6392d982013-04-16 16:59:223048#endif
[email protected]2d7b82c2012-06-01 05:57:503049
[email protected]8869d392013-05-07 15:34:263050 if (webview())
[email protected]f59203a2011-06-07 10:01:443051 webview()->setVisibilityState(visibilityState(), false);
[email protected]a6939ca42011-02-18 17:58:073052
[email protected]ea2fb972013-08-07 05:44:263053#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573054 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3055 i != active_pepper_instances_.end(); ++i)
3056 (*i)->PageVisibilityChanged(false);
[email protected]204f1df2012-01-04 20:21:133057
[email protected]a6939ca42011-02-18 17:58:073058#if defined(OS_MACOSX)
[email protected]204f1df2012-01-04 20:21:133059 // Inform NPAPI plugins that their container is no longer visible.
[email protected]941e4552010-02-01 21:23:433060 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3061 for (plugin_it = plugin_delegates_.begin();
3062 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3063 (*plugin_it)->SetContainerVisibility(false);
3064 }
[email protected]a6939ca42011-02-18 17:58:073065#endif // OS_MACOSX
thestig6057a6b22015-11-12 23:01:333066#endif // ENABLE_PLUGINS
[email protected]941e4552010-02-01 21:23:433067}
3068
[email protected]3399dd822014-08-09 11:14:243069void RenderViewImpl::OnWasShown(bool needs_repainting,
3070 const ui::LatencyInfo& latency_info) {
3071 RenderWidget::OnWasShown(needs_repainting, latency_info);
[email protected]941e4552010-02-01 21:23:433072
[email protected]6392d982013-04-16 16:59:223073#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
3074 RenderThreadImpl::current()->video_capture_impl_manager()->
3075 SuspendDevices(false);
3076#endif
3077
[email protected]8869d392013-05-07 15:34:263078 if (webview())
[email protected]f59203a2011-06-07 10:01:443079 webview()->setVisibilityState(visibilityState(), false);
[email protected]a6939ca42011-02-18 17:58:073080
[email protected]ea2fb972013-08-07 05:44:263081#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573082 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3083 i != active_pepper_instances_.end(); ++i)
3084 (*i)->PageVisibilityChanged(true);
[email protected]204f1df2012-01-04 20:21:133085
[email protected]a6939ca42011-02-18 17:58:073086#if defined(OS_MACOSX)
[email protected]204f1df2012-01-04 20:21:133087 // Inform NPAPI plugins that their container is now visible.
[email protected]941e4552010-02-01 21:23:433088 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3089 for (plugin_it = plugin_delegates_.begin();
3090 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3091 (*plugin_it)->SetContainerVisibility(true);
3092 }
[email protected]784ea1ab2010-09-18 00:02:343093#endif // OS_MACOSX
[email protected]a80af12e2013-08-07 23:36:133094#endif // ENABLE_PLUGINS
[email protected]a6939ca42011-02-18 17:58:073095}
[email protected]1e6e3c992010-02-08 15:52:133096
[email protected]ed7defa2013-03-12 21:29:593097GURL RenderViewImpl::GetURLForGraphicsContext3D() {
3098 DCHECK(webview());
[email protected]82307f6b2014-08-07 03:30:123099 if (webview()->mainFrame()->isWebLocalFrame())
[email protected]ed7defa2013-03-12 21:29:593100 return GURL(webview()->mainFrame()->document().url());
3101 else
3102 return GURL("chrome://gpu/RenderViewImpl::CreateGraphicsContext3D");
[email protected]65225772011-05-12 21:10:243103}
3104
[email protected]310ebd6302011-10-10 19:06:283105void RenderViewImpl::OnSetFocus(bool enable) {
naskoc6edf7e2015-10-16 01:48:453106 // This message must always be received when the main frame is a
3107 // WebLocalFrame.
3108 CHECK(webview()->mainFrame()->isWebLocalFrame());
alexmos3fcd0ca2015-10-23 18:18:333109 SetFocus(enable);
3110}
alexmos7fac9aeb2015-10-16 22:39:493111
alexmos3fcd0ca2015-10-23 18:18:333112void RenderViewImpl::SetFocus(bool enable) {
alexmos7fac9aeb2015-10-16 22:39:493113 has_focus_ = enable;
[email protected]1e6e3c992010-02-08 15:52:133114 RenderWidget::OnSetFocus(enable);
3115
[email protected]a80af12e2013-08-07 23:36:133116#if defined(ENABLE_PLUGINS)
[email protected]7d3c02c2010-05-05 23:10:313117 if (webview() && webview()->isActive()) {
[email protected]589621b2010-09-23 22:01:073118 // Notify all NPAPI plugins.
[email protected]1e6e3c992010-02-08 15:52:133119 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3120 for (plugin_it = plugin_delegates_.begin();
3121 plugin_it != plugin_delegates_.end(); ++plugin_it) {
[email protected]784ea1ab2010-09-18 00:02:343122#if defined(OS_MACOSX)
[email protected]7d3c02c2010-05-05 23:10:313123 // RenderWidget's call to setFocus can cause the underlying webview's
3124 // activation state to change just like a call to setIsActive.
3125 if (enable)
3126 (*plugin_it)->SetWindowFocus(true);
[email protected]784ea1ab2010-09-18 00:02:343127#endif
[email protected]7d3c02c2010-05-05 23:10:313128 (*plugin_it)->SetContentAreaFocus(enable);
[email protected]1e6e3c992010-02-08 15:52:133129 }
3130 }
[email protected]a99a38802014-01-14 15:46:573131 // Notify all Pepper plugins.
3132 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3133 i != active_pepper_instances_.end(); ++i)
3134 (*i)->SetContentAreaFocus(enable);
[email protected]ea2fb972013-08-07 05:44:263135#endif
[email protected]321032992012-11-08 01:01:273136 // Notify all BrowserPlugins of the RenderView's focus state.
fsamuel6c1dfeb2014-12-18 19:21:333137 if (BrowserPluginManager::Get())
3138 BrowserPluginManager::Get()->UpdateFocusState();
[email protected]1e6e3c992010-02-08 15:52:133139}
[email protected]941e4552010-02-01 21:23:433140
[email protected]310ebd6302011-10-10 19:06:283141void RenderViewImpl::OnImeSetComposition(
[email protected]fcf75d42013-12-03 20:11:263142 const base::string16& text,
[email protected]180ef242013-11-07 06:50:463143 const std::vector<blink::WebCompositionUnderline>& underlines,
[email protected]56ea1a62011-05-30 07:05:573144 int selection_start,
3145 int selection_end) {
[email protected]ea2fb972013-08-07 05:44:263146#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083147 if (focused_pepper_plugin_) {
3148 focused_pepper_plugin_->render_frame()->OnImeSetComposition(
[email protected]7a4e2532013-12-02 21:30:023149 text, underlines, selection_start, selection_end);
[email protected]ea2fb972013-08-07 05:44:263150 return;
[email protected]56ea1a62011-05-30 07:05:573151 }
[email protected]ea2fb972013-08-07 05:44:263152
3153#if defined(OS_WIN)
tommyclie86b2982015-03-16 20:16:453154 // When a plugin has focus, we create platform-specific IME data used by
3155 // our IME emulator and send it directly to the focused plugin, i.e. we
[email protected]ea2fb972013-08-07 05:44:263156 // bypass WebKit. (WebPluginDelegate dispatches this IME data only when its
3157 // instance ID is the same one as the specified ID.)
3158 if (focused_plugin_id_ >= 0) {
3159 std::vector<int> clauses;
3160 std::vector<int> target;
3161 for (size_t i = 0; i < underlines.size(); ++i) {
3162 clauses.push_back(underlines[i].startOffset);
3163 clauses.push_back(underlines[i].endOffset);
3164 if (underlines[i].thick) {
3165 target.clear();
3166 target.push_back(underlines[i].startOffset);
3167 target.push_back(underlines[i].endOffset);
3168 }
3169 }
3170 std::set<WebPluginDelegateProxy*>::iterator it;
3171 for (it = plugin_delegates_.begin(); it != plugin_delegates_.end(); ++it) {
3172 (*it)->ImeCompositionUpdated(text, clauses, target, selection_end,
3173 focused_plugin_id_);
3174 }
3175 return;
3176 }
[email protected]a80af12e2013-08-07 23:36:133177#endif // OS_WIN
3178#endif // ENABLE_PLUGINS
[email protected]ea2fb972013-08-07 05:44:263179 RenderWidget::OnImeSetComposition(text,
3180 underlines,
3181 selection_start,
3182 selection_end);
[email protected]56ea1a62011-05-30 07:05:573183}
3184
[email protected]db4fc1e2013-09-06 20:01:513185void RenderViewImpl::OnImeConfirmComposition(
[email protected]fcf75d42013-12-03 20:11:263186 const base::string16& text,
[email protected]db4fc1e2013-09-06 20:01:513187 const gfx::Range& replacement_range,
3188 bool keep_selection) {
[email protected]ea2fb972013-08-07 05:44:263189#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083190 if (focused_pepper_plugin_) {
3191 focused_pepper_plugin_->render_frame()->OnImeConfirmComposition(
[email protected]7a4e2532013-12-02 21:30:023192 text, replacement_range, keep_selection);
[email protected]ea2fb972013-08-07 05:44:263193 return;
[email protected]56ea1a62011-05-30 07:05:573194 }
[email protected]ea2fb972013-08-07 05:44:263195#if defined(OS_WIN)
3196 // Same as OnImeSetComposition(), we send the text from IMEs directly to
tommyclie86b2982015-03-16 20:16:453197 // plugins. When we send IME text directly to plugins, we should not send
[email protected]ea2fb972013-08-07 05:44:263198 // it to WebKit to prevent WebKit from controlling IMEs.
3199 // TODO(thakis): Honor |replacement_range| for plugins?
3200 if (focused_plugin_id_ >= 0) {
3201 std::set<WebPluginDelegateProxy*>::iterator it;
3202 for (it = plugin_delegates_.begin();
3203 it != plugin_delegates_.end(); ++it) {
3204 (*it)->ImeCompositionCompleted(text, focused_plugin_id_);
3205 }
3206 return;
3207 }
[email protected]a80af12e2013-08-07 23:36:133208#endif // OS_WIN
3209#endif // ENABLE_PLUGINS
[email protected]ea2fb972013-08-07 05:44:263210 if (replacement_range.IsValid() && webview()) {
3211 // Select the text in |replacement_range|, it will then be replaced by
3212 // text added by the call to RenderWidget::OnImeConfirmComposition().
[email protected]35b2a972014-04-04 15:50:223213 if (WebLocalFrame* frame = webview()->focusedFrame()->toWebLocalFrame()) {
[email protected]ea2fb972013-08-07 05:44:263214 WebRange webrange = WebRange::fromDocumentRange(
3215 frame, replacement_range.start(), replacement_range.length());
3216 if (!webrange.isNull())
3217 frame->selectRange(webrange);
3218 }
3219 }
3220 RenderWidget::OnImeConfirmComposition(text,
3221 replacement_range,
3222 keep_selection);
[email protected]56ea1a62011-05-30 07:05:573223}
3224
[email protected]28ed6b32014-06-08 02:16:273225bool RenderViewImpl::SetDeviceColorProfile(
3226 const std::vector<char>& profile) {
3227 bool changed = RenderWidget::SetDeviceColorProfile(profile);
3228 if (changed && webview()) {
noelc76aa4c2014-09-25 01:08:563229 WebVector<char> colorProfile = profile;
3230 webview()->setDeviceColorProfile(colorProfile);
[email protected]28ed6b32014-06-08 02:16:273231 }
3232 return changed;
3233}
3234
noeldb4df152014-09-16 17:45:203235void RenderViewImpl::ResetDeviceColorProfileForTesting() {
3236 RenderWidget::ResetDeviceColorProfileForTesting();
3237 if (webview())
dominicc0b4687b2015-11-24 20:08:353238 webview()->resetDeviceColorProfileForTesting();
noeldb4df152014-09-16 17:45:203239}
3240
[email protected]310ebd6302011-10-10 19:06:283241ui::TextInputType RenderViewImpl::GetTextInputType() {
[email protected]ea2fb972013-08-07 05:44:263242#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083243 if (focused_pepper_plugin_)
3244 return focused_pepper_plugin_->text_input_type();
[email protected]ea2fb972013-08-07 05:44:263245#endif
3246 return RenderWidget::GetTextInputType();
[email protected]73bf95812011-10-12 11:38:323247}
3248
[email protected]3f783362011-10-21 22:40:503249void RenderViewImpl::GetSelectionBounds(gfx::Rect* start, gfx::Rect* end) {
[email protected]ea2fb972013-08-07 05:44:263250#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083251 if (focused_pepper_plugin_) {
[email protected]3f783362011-10-21 22:40:503252 // TODO(kinaba) http://crbug.com/101101
3253 // Current Pepper IME API does not handle selection bounds. So we simply
3254 // use the caret position as an empty range for now. It will be updated
3255 // after Pepper API equips features related to surrounding text retrieval.
oshima33ec97cd2015-12-14 19:40:243256 blink::WebRect caret(focused_pepper_plugin_->GetCaretBounds());
3257 convertViewportToWindow(&caret);
[email protected]3f783362011-10-21 22:40:503258 *start = caret;
3259 *end = caret;
3260 return;
3261 }
[email protected]ea2fb972013-08-07 05:44:263262#endif
[email protected]3f783362011-10-21 22:40:503263 RenderWidget::GetSelectionBounds(start, end);
[email protected]ad26ef42011-06-17 07:59:453264}
3265
[email protected]58b48a0d2012-06-13 07:01:353266void RenderViewImpl::GetCompositionCharacterBounds(
oshima33ec97cd2015-12-14 19:40:243267 std::vector<gfx::Rect>* bounds_in_window) {
3268 DCHECK(bounds_in_window);
3269 bounds_in_window->clear();
[email protected]58b48a0d2012-06-13 07:01:353270
[email protected]ea2fb972013-08-07 05:44:263271#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083272 if (focused_pepper_plugin_) {
[email protected]88dbe32f2013-06-20 23:31:363273 return;
3274 }
[email protected]ea2fb972013-08-07 05:44:263275#endif
3276
[email protected]58b48a0d2012-06-13 07:01:353277 if (!webview())
3278 return;
3279 size_t start_offset = 0;
3280 size_t character_count = 0;
3281 if (!webview()->compositionRange(&start_offset, &character_count))
3282 return;
3283 if (character_count == 0)
3284 return;
3285
[email protected]180ef242013-11-07 06:50:463286 blink::WebFrame* frame = webview()->focusedFrame();
[email protected]58b48a0d2012-06-13 07:01:353287 if (!frame)
3288 return;
3289
oshima33ec97cd2015-12-14 19:40:243290 bounds_in_window->reserve(character_count);
[email protected]180ef242013-11-07 06:50:463291 blink::WebRect webrect;
[email protected]58b48a0d2012-06-13 07:01:353292 for (size_t i = 0; i < character_count; ++i) {
3293 if (!frame->firstRectForCharacterRange(start_offset + i, 1, webrect)) {
3294 DLOG(ERROR) << "Could not retrieve character rectangle at " << i;
oshima33ec97cd2015-12-14 19:40:243295 bounds_in_window->clear();
[email protected]58b48a0d2012-06-13 07:01:353296 return;
3297 }
oshima33ec97cd2015-12-14 19:40:243298 convertViewportToWindow(&webrect);
3299 bounds_in_window->push_back(webrect);
[email protected]58b48a0d2012-06-13 07:01:353300 }
3301}
3302
[email protected]db4fc1e2013-09-06 20:01:513303void RenderViewImpl::GetCompositionRange(gfx::Range* range) {
[email protected]ea2fb972013-08-07 05:44:263304#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083305 if (focused_pepper_plugin_) {
[email protected]88dbe32f2013-06-20 23:31:363306 return;
3307 }
[email protected]ea2fb972013-08-07 05:44:263308#endif
[email protected]88dbe32f2013-06-20 23:31:363309 RenderWidget::GetCompositionRange(range);
3310}
3311
[email protected]310ebd6302011-10-10 19:06:283312bool RenderViewImpl::CanComposeInline() {
[email protected]ea2fb972013-08-07 05:44:263313#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083314 if (focused_pepper_plugin_)
3315 return focused_pepper_plugin_->IsPluginAcceptingCompositionEvents();
[email protected]ea2fb972013-08-07 05:44:263316#endif
3317 return true;
[email protected]56ea1a62011-05-30 07:05:573318}
3319
rouslanf7ebd8832015-01-22 01:54:143320void RenderViewImpl::DidCompletePageScaleAnimation() {
3321 FocusChangeComplete();
3322}
3323
oshimad5279032015-12-16 18:22:333324void RenderViewImpl::OnDeviceScaleFactorChanged() {
3325 RenderWidget::OnDeviceScaleFactorChanged();
3326 UpdateWebViewWithDeviceScaleFactor();
3327 if (auto_resize_mode_)
3328 AutoResizeCompositor();
3329}
3330
[email protected]b2e4c70132013-10-03 02:07:513331void RenderViewImpl::SetScreenMetricsEmulationParameters(
dgozman9260b0a12015-03-16 13:45:203332 bool enabled,
3333 const blink::WebDeviceEmulationParams& params) {
[email protected]404630b2014-07-03 19:33:033334 if (webview() && compositor()) {
dgozman9260b0a12015-03-16 13:45:203335 if (enabled)
3336 webview()->enableDeviceEmulation(params);
3337 else
3338 webview()->disableDeviceEmulation();
[email protected]b2e4c70132013-10-03 02:07:513339 }
3340}
3341
[email protected]310ebd6302011-10-10 19:06:283342bool RenderViewImpl::ScheduleFileChooser(
[email protected]e9ff79c2012-10-19 21:31:263343 const FileChooserParams& params,
[email protected]cdaf8d02010-03-30 19:52:473344 WebFileChooserCompletion* completion) {
3345 static const size_t kMaximumPendingFileChooseRequests = 4;
3346 if (file_chooser_completions_.size() > kMaximumPendingFileChooseRequests) {
3347 // This sanity check prevents too many file choose requests from getting
3348 // queued which could DoS the user. Getting these is most likely a
3349 // programming error (there are many ways to DoS the user so it's not
3350 // considered a "real" security check), either in JS requesting many file
3351 // choosers to pop up, or in a plugin.
3352 //
3353 // TODO(brettw) we might possibly want to require a user gesture to open
3354 // a file picker, which will address this issue in a better way.
3355 return false;
3356 }
3357
limasdf81d962e2015-11-20 08:39:183358 file_chooser_completions_.push_back(
3359 make_scoped_ptr(new PendingFileChooser(params, completion)));
[email protected]cdaf8d02010-03-30 19:52:473360 if (file_chooser_completions_.size() == 1) {
3361 // Actually show the browse dialog when this is the first request.
fsamuele8326c742016-01-12 00:49:393362 Send(new ViewHostMsg_RunFileChooser(routing_id(), params));
[email protected]cdaf8d02010-03-30 19:52:473363 }
3364 return true;
3365}
3366
[email protected]180ef242013-11-07 06:50:463367blink::WebSpeechRecognizer* RenderViewImpl::speechRecognizer() {
[email protected]64d09222012-05-25 10:10:343368 if (!speech_recognition_dispatcher_)
3369 speech_recognition_dispatcher_ = new SpeechRecognitionDispatcher(this);
[email protected]64d09222012-05-25 10:10:343370 return speech_recognition_dispatcher_;
3371}
3372
[email protected]310ebd6302011-10-10 19:06:283373void RenderViewImpl::zoomLimitsChanged(double minimum_level,
3374 double maximum_level) {
a.sarkar.arundaadc712015-02-26 05:39:083375 // Round the double to avoid returning incorrect minimum/maximum zoom
3376 // percentages.
3377 int minimum_percent = round(
[email protected]7940b8e2013-07-25 23:08:493378 ZoomLevelToZoomFactor(minimum_level) * 100);
a.sarkar.arundaadc712015-02-26 05:39:083379 int maximum_percent = round(
[email protected]7940b8e2013-07-25 23:08:493380 ZoomLevelToZoomFactor(maximum_level) * 100);
[email protected]b75b8292010-10-01 07:28:253381
fsamuele8326c742016-01-12 00:49:393382 Send(new ViewHostMsg_UpdateZoomLimits(routing_id(), minimum_percent,
3383 maximum_percent));
[email protected]b75b8292010-10-01 07:28:253384}
3385
[email protected]310ebd6302011-10-10 19:06:283386void RenderViewImpl::zoomLevelChanged() {
[email protected]54b8e182014-05-02 18:08:293387 double zoom_level = webview()->zoomLevel();
[email protected]2b942c332012-04-25 16:26:263388
[email protected]54b8e182014-05-02 18:08:293389 // Do not send empty URLs to the browser when we are just setting the default
3390 // zoom level (from RendererPreferences) before the first navigation.
3391 if (!webview()->mainFrame()->document().url().isEmpty()) {
3392 // Tell the browser which url got zoomed so it can update the menu and the
3393 // saved values if necessary
3394 Send(new ViewHostMsg_DidZoomURL(
fsamuele8326c742016-01-12 00:49:393395 routing_id(), zoom_level,
[email protected]54b8e182014-05-02 18:08:293396 GURL(webview()->mainFrame()->document().url())));
3397 }
[email protected]b75b8292010-10-01 07:28:253398}
3399
ccameronb7c1d6c2015-03-09 17:08:243400void RenderViewImpl::pageScaleFactorChanged() {
3401 if (!webview())
3402 return;
mcnee432e47d2015-11-09 19:37:463403
fsamuele8326c742016-01-12 00:49:393404 Send(new ViewHostMsg_PageScaleFactorChanged(routing_id(),
mcnee432e47d2015-11-09 19:37:463405 webview()->pageScaleFactor()));
ccameronb7c1d6c2015-03-09 17:08:243406}
3407
[email protected]7940b8e2013-07-25 23:08:493408double RenderViewImpl::zoomLevelToZoomFactor(double zoom_level) const {
3409 return ZoomLevelToZoomFactor(zoom_level);
3410}
3411
3412double RenderViewImpl::zoomFactorToZoomLevel(double factor) const {
3413 return ZoomFactorToZoomLevel(factor);
3414}
3415
[email protected]180ef242013-11-07 06:50:463416blink::WebPageVisibilityState RenderViewImpl::visibilityState() const {
3417 blink::WebPageVisibilityState current_state = is_hidden() ?
3418 blink::WebPageVisibilityStateHidden :
3419 blink::WebPageVisibilityStateVisible;
3420 blink::WebPageVisibilityState override_state = current_state;
[email protected]b849847b2013-12-10 21:57:583421 // TODO(jam): move this method to WebFrameClient.
[email protected]e9ff79c2012-10-19 21:31:263422 if (GetContentClient()->renderer()->
nasko77de2312015-05-12 03:09:163423 ShouldOverridePageVisibilityState(main_render_frame_,
[email protected]f59203a2011-06-07 10:01:443424 &override_state))
3425 return override_state;
3426 return current_state;
[email protected]94dec932011-05-26 20:04:213427}
3428
[email protected]a0629af92012-08-08 00:39:373429void RenderViewImpl::draggableRegionsChanged() {
3430 FOR_EACH_OBSERVER(
3431 RenderViewObserver,
3432 observers_,
3433 DraggableRegionsChanged(webview()->mainFrame()));
3434}
3435
kouhei40f03cb2015-09-24 07:47:013436void RenderViewImpl::pageImportanceSignalsChanged() {
3437 if (!webview() || !main_render_frame_)
3438 return;
3439
3440 const auto& web_signals = webview()->pageImportanceSignals();
3441
3442 PageImportanceSignals signals;
3443 signals.had_form_interaction = web_signals->hadFormInteraction();
3444
3445 main_render_frame_->Send(new FrameHostMsg_UpdatePageImportanceSignals(
3446 main_render_frame_->GetRoutingID(), signals));
3447}
3448
[email protected]20657a82012-08-21 20:23:033449#if defined(OS_ANDROID)
3450WebContentDetectionResult RenderViewImpl::detectContentAround(
3451 const WebHitTestResult& touch_hit) {
[email protected]20657a82012-08-21 20:23:033452 DCHECK(touch_hit.node().isTextNode());
3453
3454 // Process the position with all the registered content detectors until
3455 // a match is found. Priority is provided by their relative order.
limasdf81d962e2015-11-20 08:39:183456 for (const auto& detector : content_detectors_) {
3457 ContentDetector::Result content = detector->FindTappedContent(touch_hit);
[email protected]20657a82012-08-21 20:23:033458 if (content.valid) {
3459 return WebContentDetectionResult(content.content_boundaries,
[email protected]32956122013-12-25 07:29:243460 base::UTF8ToUTF16(content.text), content.intent_url);
[email protected]20657a82012-08-21 20:23:033461 }
3462 }
3463 return WebContentDetectionResult();
3464}
3465
mnaganov42d9e372015-11-02 23:27:413466void RenderViewImpl::scheduleContentIntent(const WebURL& intent,
3467 bool is_main_frame) {
[email protected]20657a82012-08-21 20:23:033468 // Introduce a short delay so that the user can notice the content.
[email protected]dd32b1272013-05-04 14:17:113469 base::MessageLoop::current()->PostDelayedTask(
[email protected]20657a82012-08-21 20:23:033470 FROM_HERE,
mnaganov42d9e372015-11-02 23:27:413471 base::Bind(&RenderViewImpl::LaunchAndroidContentIntent, AsWeakPtr(),
3472 intent, expected_content_intent_id_, is_main_frame),
[email protected]20657a82012-08-21 20:23:033473 base::TimeDelta::FromMilliseconds(kContentIntentDelayMilliseconds));
3474}
3475
3476void RenderViewImpl::cancelScheduledContentIntents() {
3477 ++expected_content_intent_id_;
3478}
3479
3480void RenderViewImpl::LaunchAndroidContentIntent(const GURL& intent,
mnaganov42d9e372015-11-02 23:27:413481 size_t request_id,
3482 bool is_main_frame) {
[email protected]20657a82012-08-21 20:23:033483 if (request_id != expected_content_intent_id_)
qinmin0d5560df2014-11-12 19:03:393484 return;
[email protected]20657a82012-08-21 20:23:033485
3486 // Remove the content highlighting if any.
jdduke491a3f0c2015-06-15 23:30:263487 ScheduleComposite();
[email protected]20657a82012-08-21 20:23:033488
mnaganov42d9e372015-11-02 23:27:413489 if (!intent.is_empty()) {
fsamuele8326c742016-01-12 00:49:393490 Send(new ViewHostMsg_StartContentIntent(routing_id(), intent,
3491 is_main_frame));
mnaganov42d9e372015-11-02 23:27:413492 }
[email protected]20657a82012-08-21 20:23:033493}
[email protected]b18583c2012-12-18 06:55:273494
3495bool RenderViewImpl::openDateTimeChooser(
[email protected]180ef242013-11-07 06:50:463496 const blink::WebDateTimeChooserParams& params,
3497 blink::WebDateTimeChooserCompletion* completion) {
[email protected]e8072562013-12-04 06:04:133498 // JavaScript may try to open a date time chooser while one is already open.
3499 if (date_time_picker_client_)
3500 return false;
[email protected]b18583c2012-12-18 06:55:273501 date_time_picker_client_.reset(
3502 new RendererDateTimePicker(this, params, completion));
3503 return date_time_picker_client_->Open();
3504}
3505
[email protected]e8072562013-12-04 06:04:133506void RenderViewImpl::DismissDateTimeDialog() {
3507 DCHECK(date_time_picker_client_);
3508 date_time_picker_client_.reset(NULL);
3509}
[email protected]e8072562013-12-04 06:04:133510
[email protected]6d17f6392012-12-05 05:24:543511#endif // defined(OS_ANDROID)
[email protected]20657a82012-08-21 20:23:033512
[email protected]be1af0662014-07-29 19:55:513513void RenderViewImpl::OnShowContextMenu(
3514 ui::MenuSourceType source_type, const gfx::Point& location) {
fsamuele8326c742016-01-12 00:49:393515 input_handler_->set_context_menu_source_type(source_type);
[email protected]be1af0662014-07-29 19:55:513516 has_host_context_menu_location_ = true;
3517 host_context_menu_location_ = location;
[email protected]47822262013-04-23 17:22:363518 if (webview())
3519 webview()->showContextMenu();
[email protected]be1af0662014-07-29 19:55:513520 has_host_context_menu_location_ = false;
[email protected]47822262013-04-23 17:22:363521}
3522
[email protected]310ebd6302011-10-10 19:06:283523void RenderViewImpl::OnEnableViewSourceMode() {
[email protected]5a7b15a2011-08-22 22:48:183524 if (!webview())
3525 return;
3526 WebFrame* main_frame = webview()->mainFrame();
3527 if (!main_frame)
3528 return;
3529 main_frame->enableViewSourceMode(true);
3530}
[email protected]67bfb83f2011-09-22 03:36:373531
sadrul90f88a9b2015-06-16 16:22:043532#if defined(OS_ANDROID) || defined(USE_AURA)
[email protected]f9526d12012-10-18 01:55:033533bool RenderViewImpl::didTapMultipleTargets(
timav29a8d0f62014-09-25 20:45:533534 const WebSize& inner_viewport_offset,
3535 const WebRect& touch_rect,
[email protected]f9526d12012-10-18 01:55:033536 const WebVector<WebRect>& target_rects) {
mustaq35bb250b2015-05-06 21:22:393537 DCHECK(switches::IsLinkDisambiguationPopupEnabled());
lukene23094a2014-11-23 14:12:313538
[email protected]8d3dfee62013-06-19 05:50:333539 // Never show a disambiguation popup when accessibility is enabled,
3540 // as this interferes with "touch exploration".
[email protected]95640212014-07-26 18:14:303541 AccessibilityMode accessibility_mode =
mostynbc33353232014-09-12 09:38:313542 GetMainRenderFrame()->accessibility_mode();
[email protected]95640212014-07-26 18:14:303543 bool matches_accessibility_mode_complete =
3544 (accessibility_mode & AccessibilityModeComplete) ==
3545 AccessibilityModeComplete;
3546 if (matches_accessibility_mode_complete)
[email protected]8d3dfee62013-06-19 05:50:333547 return false;
3548
timav29a8d0f62014-09-25 20:45:533549 // The touch_rect, target_rects and zoom_rect are in the outer viewport
3550 // reference frame.
[email protected]f9526d12012-10-18 01:55:033551 gfx::Rect zoom_rect;
[email protected]70221f02013-01-31 22:17:073552 float new_total_scale =
3553 DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor(
timav29a8d0f62014-09-25 20:45:533554 touch_rect, target_rects, GetSize(),
[email protected]70221f02013-01-31 22:17:073555 gfx::Rect(webview()->mainFrame()->visibleContentRect()).size(),
3556 device_scale_factor_ * webview()->pageScaleFactor(), &zoom_rect);
jbauman0ed09182015-01-30 22:33:493557 if (!new_total_scale || zoom_rect.IsEmpty())
[email protected]f9526d12012-10-18 01:55:033558 return false;
3559
[email protected]4ded1dbf2013-08-28 21:11:033560 bool handled = false;
3561 switch (renderer_preferences_.tap_multiple_targets_strategy) {
3562 case TAP_MULTIPLE_TARGETS_STRATEGY_ZOOM:
3563 handled = webview()->zoomToMultipleTargetsRect(zoom_rect);
3564 break;
3565 case TAP_MULTIPLE_TARGETS_STRATEGY_POPUP: {
[email protected]bc2804d2013-08-06 07:45:493566 gfx::Size canvas_size =
danakjddaec912015-09-25 19:38:403567 gfx::ScaleToCeiledSize(zoom_rect.size(), new_total_scale);
[email protected]cb189e062014-04-23 00:57:013568 cc::SharedBitmapManager* manager =
3569 RenderThreadImpl::current()->shared_bitmap_manager();
3570 scoped_ptr<cc::SharedBitmap> shared_bitmap =
3571 manager->AllocateSharedBitmap(canvas_size);
jbauman0ed09182015-01-30 22:33:493572 CHECK(!!shared_bitmap);
[email protected]bc2804d2013-08-06 07:45:493573 {
[email protected]cb189e062014-04-23 00:57:013574 SkBitmap bitmap;
3575 SkImageInfo info = SkImageInfo::MakeN32Premul(canvas_size.width(),
3576 canvas_size.height());
3577 bitmap.installPixels(info, shared_bitmap->pixels(), info.minRowBytes());
3578 SkCanvas canvas(bitmap);
[email protected]f9526d12012-10-18 01:55:033579
[email protected]bc2804d2013-08-06 07:45:493580 // TODO(trchen): Cleanup the device scale factor mess.
3581 // device scale will be applied in WebKit
3582 // --> zoom_rect doesn't include device scale,
3583 // but WebKit will still draw on zoom_rect * device_scale_factor_
[email protected]cb189e062014-04-23 00:57:013584 canvas.scale(new_total_scale / device_scale_factor_,
3585 new_total_scale / device_scale_factor_);
3586 canvas.translate(-zoom_rect.x() * device_scale_factor_,
3587 -zoom_rect.y() * device_scale_factor_);
[email protected]f9526d12012-10-18 01:55:033588
[email protected]bcb1f022014-05-06 01:54:173589 DCHECK(webwidget_->isAcceleratedCompositingActive());
3590 // TODO(aelias): The disambiguation popup should be composited so we
3591 // don't have to call this method.
3592 webwidget_->paintCompositedDeprecated(&canvas, zoom_rect);
[email protected]bc2804d2013-08-06 07:45:493593 }
3594
timav29a8d0f62014-09-25 20:45:533595 gfx::Rect zoom_rect_in_screen =
3596 zoom_rect - gfx::Vector2d(inner_viewport_offset.width,
3597 inner_viewport_offset.height);
3598
[email protected]bc2804d2013-08-06 07:45:493599 gfx::Rect physical_window_zoom_rect = gfx::ToEnclosingRect(
timav29a8d0f62014-09-25 20:45:533600 ClientRectToPhysicalWindowRect(gfx::RectF(zoom_rect_in_screen)));
3601
fsamuele8326c742016-01-12 00:49:393602 Send(new ViewHostMsg_ShowDisambiguationPopup(
3603 routing_id(), physical_window_zoom_rect, canvas_size,
3604 shared_bitmap->id()));
[email protected]cb189e062014-04-23 00:57:013605 cc::SharedBitmapId id = shared_bitmap->id();
3606 disambiguation_bitmaps_[id] = shared_bitmap.release();
[email protected]4ded1dbf2013-08-28 21:11:033607 handled = true;
3608 break;
3609 }
3610 case TAP_MULTIPLE_TARGETS_STRATEGY_NONE:
3611 // No-op.
3612 break;
[email protected]f9526d12012-10-18 01:55:033613 }
[email protected]70221f02013-01-31 22:17:073614
[email protected]4ded1dbf2013-08-28 21:11:033615 return handled;
[email protected]f9526d12012-10-18 01:55:033616}
sadrul90f88a9b2015-06-16 16:22:043617#endif // defined(OS_ANDROID) || defined(USE_AURA)
[email protected]f9526d12012-10-18 01:55:033618
[email protected]b283d292013-02-21 08:40:343619unsigned RenderViewImpl::GetLocalSessionHistoryLengthForTesting() const {
3620 return history_list_length_;
3621}
3622
[email protected]cc290f902013-03-04 20:06:023623void RenderViewImpl::SetFocusAndActivateForTesting(bool enable) {
3624 if (enable) {
3625 if (has_focus())
3626 return;
3627 OnSetActive(true);
3628 OnSetFocus(true);
3629 } else {
3630 if (!has_focus())
3631 return;
3632 OnSetFocus(false);
3633 OnSetActive(false);
3634 }
3635}
3636
[email protected]3a1c8a8032013-03-18 22:35:323637void RenderViewImpl::SetDeviceScaleFactorForTesting(float factor) {
[email protected]b54fe452013-06-07 14:01:533638 ViewMsg_Resize_Params params;
3639 params.screen_info = screen_info_;
3640 params.screen_info.deviceScaleFactor = factor;
3641 params.new_size = size();
bokanf0fd2412014-10-30 15:28:553642 params.visible_viewport_size = visible_viewport_size_;
danakjddaec912015-09-25 19:38:403643 params.physical_backing_size = gfx::ScaleToCeiledSize(size(), factor);
dtrainorcb7779b82014-12-04 01:08:023644 params.top_controls_shrink_blink_size = false;
3645 params.top_controls_height = 0.f;
[email protected]b54fe452013-06-07 14:01:533646 params.resizer_rect = WebRect();
mikhail.pozdnyakovf2c902a2015-04-14 08:09:123647 params.is_fullscreen_granted = is_fullscreen_granted();
mikhail.pozdnyakovc0e251b2015-04-15 06:51:123648 params.display_mode = display_mode_;
[email protected]b54fe452013-06-07 14:01:533649 OnResize(params);
[email protected]3a1c8a8032013-03-18 22:35:323650}
3651
[email protected]71e652302014-05-09 14:20:133652void RenderViewImpl::SetDeviceColorProfileForTesting(
3653 const std::vector<char>& color_profile) {
[email protected]28ed6b32014-06-08 02:16:273654 SetDeviceColorProfile(color_profile);
[email protected]71e652302014-05-09 14:20:133655}
3656
[email protected]92650162013-10-30 03:31:023657void RenderViewImpl::ForceResizeForTesting(const gfx::Size& new_size) {
bokanc007c3a2015-02-03 07:15:563658 gfx::Rect new_window_rect(rootWindowRect().x,
3659 rootWindowRect().y,
3660 new_size.width(),
3661 new_size.height());
3662 SetWindowRectSynchronously(new_window_rect);
[email protected]92650162013-10-30 03:31:023663}
3664
[email protected]5b45ad42013-10-25 00:42:043665void RenderViewImpl::UseSynchronousResizeModeForTesting(bool enable) {
3666 resizing_mode_selector_->set_is_synchronous_mode(enable);
3667}
3668
[email protected]eac2b362013-05-22 07:01:453669void RenderViewImpl::EnableAutoResizeForTesting(const gfx::Size& min_size,
3670 const gfx::Size& max_size) {
3671 OnEnableAutoResize(min_size, max_size);
3672}
3673
3674void RenderViewImpl::DisableAutoResizeForTesting(const gfx::Size& new_size) {
3675 OnDisableAutoResize(new_size);
3676}
3677
[email protected]cb189e062014-04-23 00:57:013678void RenderViewImpl::OnReleaseDisambiguationPopupBitmap(
3679 const cc::SharedBitmapId& id) {
3680 BitmapMap::iterator it = disambiguation_bitmaps_.find(id);
3681 DCHECK(it != disambiguation_bitmaps_.end());
3682 delete it->second;
3683 disambiguation_bitmaps_.erase(it);
[email protected]f9526d12012-10-18 01:55:033684}
[email protected]e9ff79c2012-10-19 21:31:263685
[email protected]6fceb912013-02-15 06:24:153686void RenderViewImpl::DidCommitCompositorFrame() {
3687 RenderWidget::DidCommitCompositorFrame();
3688 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidCommitCompositorFrame());
3689}
3690
[email protected]41225fe2013-03-29 05:32:023691void RenderViewImpl::SendUpdateFaviconURL(const std::vector<FaviconURL>& urls) {
3692 if (!urls.empty())
fsamuele8326c742016-01-12 00:49:393693 Send(new ViewHostMsg_UpdateFaviconURL(routing_id(), urls));
[email protected]41225fe2013-03-29 05:32:023694}
3695
3696void RenderViewImpl::DidStopLoadingIcons() {
huangsdde9aceb2015-03-17 21:26:163697 int icon_types = WebIconURL::TypeFavicon | WebIconURL::TypeTouchPrecomposed |
3698 WebIconURL::TypeTouch;
[email protected]41225fe2013-03-29 05:32:023699
nasko2411ba372014-10-13 17:45:413700 // Favicons matter only for the top-level frame. If it is a WebRemoteFrame,
3701 // just return early.
3702 if (webview()->mainFrame()->isWebRemoteFrame())
3703 return;
3704
[email protected]41225fe2013-03-29 05:32:023705 WebVector<WebIconURL> icon_urls =
3706 webview()->mainFrame()->iconURLs(icon_types);
3707
3708 std::vector<FaviconURL> urls;
3709 for (size_t i = 0; i < icon_urls.size(); i++) {
3710 WebURL url = icon_urls[i].iconURL();
[email protected]2bd262b2014-04-16 05:31:233711 std::vector<gfx::Size> sizes;
[email protected]f34ac132014-03-20 23:02:053712 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes);
[email protected]41225fe2013-03-29 05:32:023713 if (!url.isEmpty())
[email protected]f34ac132014-03-20 23:02:053714 urls.push_back(
3715 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes));
[email protected]41225fe2013-03-29 05:32:023716 }
3717 SendUpdateFaviconURL(urls);
3718}
3719
oshimad5279032015-12-16 18:22:333720void RenderViewImpl::UpdateWebViewWithDeviceScaleFactor() {
3721 if (!webview())
3722 return;
oshima750cb4342015-10-31 00:59:013723 if (IsUseZoomForDSFEnabled()) {
oshimad5279032015-12-16 18:22:333724 webview()->setZoomFactorForDeviceScaleFactor(device_scale_factor_);
oshima750cb4342015-10-31 00:59:013725 } else {
3726 webview()->setDeviceScaleFactor(device_scale_factor_);
3727 }
oshimad5279032015-12-16 18:22:333728 webview()->settings()->setPreferCompositingToLCDTextEnabled(
3729 PreferCompositingToLCDText(compositor_deps_, device_scale_factor_));
oshima750cb4342015-10-31 00:59:013730}
3731
[email protected]e9ff79c2012-10-19 21:31:263732} // namespace content