blob: 3fb5b008e1fadbfa985f49ca8409162f81674196 [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"
[email protected]a8cb3b73b2013-08-12 05:50:5033#include "content/child/appcache/appcache_dispatcher.h"
34#include "content/child/appcache/web_application_cache_host_impl.h"
[email protected]cb189e062014-04-23 00:57:0135#include "content/child/child_shared_bitmap_manager.h"
[email protected]29e2fb42013-07-19 01:13:4736#include "content/child/npapi/webplugin_delegate_impl.h"
[email protected]541b7b02013-06-07 00:59:3437#include "content/child/request_extra_data.h"
mek87e0ab52015-02-13 01:18:2638#include "content/child/v8_value_converter_impl.h"
[email protected]10208ea2013-06-06 20:08:0339#include "content/child/webmessageportchannel_impl.h"
jinho.bang632a1a722014-09-18 03:02:5640#include "content/common/content_constants_internal.h"
[email protected]37666cf2011-03-13 21:51:4241#include "content/common/database_messages.h"
[email protected]5f2aa722013-08-07 16:59:4142#include "content/common/dom_storage/dom_storage_types.h"
[email protected]59f4f2fa2011-03-23 01:00:5543#include "content/common/drag_messages.h"
[email protected]c6bc20332014-02-28 18:30:3944#include "content/common/frame_messages.h"
alexmosbc7eafa2014-12-06 01:38:0945#include "content/common/frame_replication_state.h"
[email protected]c26ad882012-02-07 06:41:2046#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
[email protected]c084330e02013-04-27 01:08:1547#include "content/common/input_messages.h"
[email protected]127dd582011-03-16 21:32:1048#include "content/common/pepper_messages.h"
[email protected]e4495212012-12-06 03:09:1249#include "content/common/ssl_status_serialization.h"
[email protected]778574e2011-03-21 22:03:5050#include "content/common/view_messages.h"
[email protected]e091df82011-10-11 18:13:2151#include "content/public/common/bindings_policy.h"
[email protected]744c2a22012-03-15 18:42:0452#include "content/public/common/content_client.h"
[email protected]54087fe2011-10-28 22:02:4853#include "content/public/common/content_constants.h"
[email protected]c08950d22011-10-13 22:20:2954#include "content/public/common/content_switches.h"
[email protected]dc293a72013-07-01 11:11:2255#include "content/public/common/drop_data.h"
[email protected]41225fe2013-03-29 05:32:0256#include "content/public/common/favicon_url.h"
hirono570357bd2014-10-08 12:39:2757#include "content/public/common/file_chooser_file_info.h"
[email protected]8caadeb2011-11-22 02:45:2358#include "content/public/common/file_chooser_params.h"
clamyda97e8322014-10-07 21:57:2559#include "content/public/common/page_state.h"
[email protected]7940b8e2013-07-25 23:08:4960#include "content/public/common/page_zoom.h"
[email protected]e4495212012-12-06 03:09:1261#include "content/public/common/ssl_status.h"
[email protected]818915cd2012-11-20 13:14:1162#include "content/public/common/three_d_api_types.h"
[email protected]a1d29162011-10-14 17:14:0363#include "content/public/common/url_constants.h"
[email protected]3b366ae2013-05-17 21:16:5864#include "content/public/common/url_utils.h"
[email protected]b3a97b52014-07-09 06:25:0565#include "content/public/common/web_preferences.h"
[email protected]d344114c2011-10-01 01:24:3466#include "content/public/renderer/content_renderer_client.h"
[email protected]007733c2011-11-17 00:34:0767#include "content/public/renderer/document_state.h"
[email protected]82ddba1c2011-10-04 00:15:3268#include "content/public/renderer/navigation_state.h"
[email protected]3a034ebb2011-10-03 19:19:4469#include "content/public/renderer/render_view_observer.h"
[email protected]64ffa0442011-10-03 22:08:3670#include "content/public/renderer/render_view_visitor.h"
[email protected]e6e56752012-08-10 00:46:0671#include "content/renderer/browser_plugin/browser_plugin.h"
72#include "content/renderer/browser_plugin/browser_plugin_manager.h"
[email protected]f9526d12012-10-18 01:55:0373#include "content/renderer/disambiguation_popup_helper.h"
[email protected]1910fe82012-05-10 00:04:1074#include "content/renderer/dom_storage/webstoragenamespace_impl.h"
[email protected]dc293a72013-07-01 11:11:2275#include "content/renderer/drop_data_builder.h"
[email protected]ba91a792013-02-06 09:48:2876#include "content/renderer/gpu/render_widget_compositor.h"
[email protected]d4734982014-04-15 02:05:5577#include "content/renderer/history_controller.h"
[email protected]dc064352014-04-25 08:36:3878#include "content/renderer/history_serialization.h"
[email protected]1784b2f2011-11-24 10:53:4879#include "content/renderer/idle_user_detector.h"
[email protected]66fca5bc2013-05-23 06:58:2980#include "content/renderer/ime_event_guard.h"
[email protected]7a72d452013-12-13 10:01:1381#include "content/renderer/input/input_handler_manager.h"
[email protected]92d457802013-04-01 19:18:4982#include "content/renderer/internal_document_state_data.h"
[email protected]4a914882013-01-10 00:43:4883#include "content/renderer/media/audio_device_factory.h"
[email protected]6392d982013-04-16 16:59:2284#include "content/renderer/media/video_capture_impl_manager.h"
[email protected]4a19be92011-09-22 14:25:0285#include "content/renderer/mhtml_generator.h"
clamy5f342202015-03-18 13:47:5686#include "content/renderer/navigation_state_impl.h"
[email protected]b3a97b52014-07-09 06:25:0587#include "content/renderer/net_info_helper.h"
[email protected]227692c52013-05-31 22:43:0488#include "content/renderer/render_frame_impl.h"
[email protected]5a7100d2014-05-19 01:29:0489#include "content/renderer/render_frame_proxy.h"
[email protected]8704f89b2011-04-15 00:30:0590#include "content/renderer/render_process.h"
[email protected]f1a29a02011-10-06 23:08:4491#include "content/renderer/render_thread_impl.h"
[email protected]89054502012-06-03 10:29:2492#include "content/renderer/render_view_mouse_lock_dispatcher.h"
[email protected]2cff0052011-03-18 16:51:4493#include "content/renderer/render_widget_fullscreen_pepper.h"
[email protected]663bd9e2011-03-21 01:07:0194#include "content/renderer/renderer_webapplicationcachehost_impl.h"
[email protected]5b45ad42013-10-25 00:42:0495#include "content/renderer/resizing_mode_selector.h"
[email protected]12a936d2013-05-15 04:55:4996#include "content/renderer/savable_resources.h"
[email protected]64d09222012-05-25 10:10:3497#include "content/renderer/speech_recognition_dispatcher.h"
[email protected]86a7d3c2011-09-12 16:45:3298#include "content/renderer/text_input_client_observer.h"
[email protected]940ed1d2012-11-27 21:03:2199#include "content/renderer/web_ui_extension_data.h"
[email protected]1c142a52014-04-05 20:14:17100#include "content/renderer/web_ui_mojo.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]2255a9332013-06-17 05:12:31129#include "third_party/WebKit/public/web/WebColorName.h"
[email protected]8bc5ff02013-11-29 06:34:03130#include "third_party/WebKit/public/web/WebColorSuggestion.h"
[email protected]2255a9332013-06-17 05:12:31131#include "third_party/WebKit/public/web/WebDOMEvent.h"
132#include "third_party/WebKit/public/web/WebDOMMessageEvent.h"
133#include "third_party/WebKit/public/web/WebDataSource.h"
134#include "third_party/WebKit/public/web/WebDateTimeChooserCompletion.h"
135#include "third_party/WebKit/public/web/WebDateTimeChooserParams.h"
[email protected]2255a9332013-06-17 05:12:31136#include "third_party/WebKit/public/web/WebDocument.h"
137#include "third_party/WebKit/public/web/WebElement.h"
138#include "third_party/WebKit/public/web/WebFileChooserParams.h"
[email protected]2255a9332013-06-17 05:12:31139#include "third_party/WebKit/public/web/WebFindOptions.h"
140#include "third_party/WebKit/public/web/WebFormControlElement.h"
141#include "third_party/WebKit/public/web/WebFormElement.h"
142#include "third_party/WebKit/public/web/WebFrame.h"
[email protected]6bd867b2013-07-24 22:10:20143#include "third_party/WebKit/public/web/WebGlyphCache.h"
[email protected]2255a9332013-06-17 05:12:31144#include "third_party/WebKit/public/web/WebHistoryItem.h"
[email protected]91dcc6d32014-07-30 00:01:33145#include "third_party/WebKit/public/web/WebHitTestResult.h"
[email protected]2255a9332013-06-17 05:12:31146#include "third_party/WebKit/public/web/WebInputElement.h"
147#include "third_party/WebKit/public/web/WebInputEvent.h"
[email protected]35b2a972014-04-04 15:50:22148#include "third_party/WebKit/public/web/WebLocalFrame.h"
[email protected]2255a9332013-06-17 05:12:31149#include "third_party/WebKit/public/web/WebMediaPlayerAction.h"
150#include "third_party/WebKit/public/web/WebNavigationPolicy.h"
[email protected]b3a97b52014-07-09 06:25:05151#include "third_party/WebKit/public/web/WebNetworkStateNotifier.h"
[email protected]2255a9332013-06-17 05:12:31152#include "third_party/WebKit/public/web/WebNodeList.h"
153#include "third_party/WebKit/public/web/WebPageSerializer.h"
154#include "third_party/WebKit/public/web/WebPlugin.h"
155#include "third_party/WebKit/public/web/WebPluginAction.h"
156#include "third_party/WebKit/public/web/WebPluginContainer.h"
157#include "third_party/WebKit/public/web/WebPluginDocument.h"
[email protected]2255a9332013-06-17 05:12:31158#include "third_party/WebKit/public/web/WebRange.h"
[email protected]b3a97b52014-07-09 06:25:05159#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
[email protected]2255a9332013-06-17 05:12:31160#include "third_party/WebKit/public/web/WebScriptSource.h"
161#include "third_party/WebKit/public/web/WebSearchableFormData.h"
162#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
163#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
[email protected]2255a9332013-06-17 05:12:31164#include "third_party/WebKit/public/web/WebSettings.h"
[email protected]2255a9332013-06-17 05:12:31165#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
[email protected]2255a9332013-06-17 05:12:31166#include "third_party/WebKit/public/web/WebView.h"
167#include "third_party/WebKit/public/web/WebWindowFeatures.h"
168#include "third_party/WebKit/public/web/default/WebRenderTheme.h"
[email protected]b3a97b52014-07-09 06:25:05169#include "third_party/icu/source/common/unicode/uchar.h"
170#include "third_party/icu/source/common/unicode/uscript.h"
[email protected]4ee64622014-03-21 22:34:15171#include "ui/base/clipboard/clipboard.h"
[email protected]1400e6dc2013-04-27 02:36:27172#include "ui/base/ui_base_switches_util.h"
[email protected]7d08a9352013-10-15 08:24:56173#include "ui/events/latency_info.h"
tfarina655f81d2014-12-23 02:38:50174#include "ui/gfx/geometry/point.h"
tfarina3b0452d2014-12-31 15:20:09175#include "ui/gfx/geometry/rect.h"
176#include "ui/gfx/geometry/rect_conversions.h"
tfarinaebe974f02015-01-03 04:25:32177#include "ui/gfx/geometry/size_conversions.h"
[email protected]08397d52011-02-05 01:53:38178#include "ui/gfx/native_widget_types.h"
[email protected]c4a9e932011-03-05 04:05:55179#include "v8/include/v8.h"
initial.commit09911bf2008-07-26 23:55:29180
[email protected]25fb9b32012-04-27 03:21:55181#if defined(OS_ANDROID)
[email protected]befe54782013-04-23 00:49:25182#include <cpu-features.h>
183
[email protected]20657a82012-08-21 20:23:03184#include "content/renderer/android/address_detector.h"
185#include "content/renderer/android/content_detector.h"
186#include "content/renderer/android/email_detector.h"
187#include "content/renderer/android/phone_number_detector.h"
[email protected]5c30b5e02013-05-30 03:46:08188#include "third_party/WebKit/public/platform/WebFloatPoint.h"
189#include "third_party/WebKit/public/platform/WebFloatRect.h"
tfarina3b0452d2014-12-31 15:20:09190#include "ui/gfx/geometry/rect_f.h"
[email protected]e69bb062013-06-03 13:05:40191
[email protected]25fb9b32012-04-27 03:21:55192#elif defined(OS_WIN)
[email protected]6c8afae52009-01-22 02:24:57193// TODO(port): these files are currently Windows only because they concern:
[email protected]6c8afae52009-01-22 02:24:57194// * theming
[email protected]990e6222012-11-16 13:31:18195#include "ui/native_theme/native_theme_win.h"
[email protected]6981f7f2010-03-09 00:53:03196#elif defined(USE_X11)
[email protected]990e6222012-11-16 13:31:18197#include "ui/native_theme/native_theme.h"
[email protected]78043bdd2010-04-05 18:45:33198#elif defined(OS_MACOSX)
199#include "skia/ext/skia_utils_mac.h"
[email protected]6c8afae52009-01-22 02:24:57200#endif
201
[email protected]ea2fb972013-08-07 05:44:26202#if defined(ENABLE_PLUGINS)
[email protected]a80af12e2013-08-07 23:36:13203#include "content/renderer/npapi/webplugin_delegate_proxy.h"
[email protected]ea2fb972013-08-07 05:44:26204#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
205#include "content/renderer/pepper/pepper_plugin_registry.h"
[email protected]ea2fb972013-08-07 05:44:26206#endif
207
[email protected]9ac667e2013-09-09 12:49:21208#if defined(ENABLE_WEBRTC)
209#include "content/renderer/media/rtc_peer_connection_handler.h"
[email protected]22fe91d2014-08-12 17:07:12210#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
[email protected]9ac667e2013-09-09 12:49:21211#endif
212
[email protected]180ef242013-11-07 06:50:46213using blink::WebAXObject;
214using blink::WebApplicationCacheHost;
215using blink::WebApplicationCacheHostClient;
216using blink::WebCString;
217using blink::WebColor;
218using blink::WebColorName;
219using blink::WebConsoleMessage;
[email protected]180ef242013-11-07 06:50:46220using blink::WebData;
221using blink::WebDataSource;
222using blink::WebDocument;
[email protected]180ef242013-11-07 06:50:46223using blink::WebDragData;
224using blink::WebDragOperation;
225using blink::WebDragOperationsMask;
226using blink::WebElement;
[email protected]180ef242013-11-07 06:50:46227using blink::WebFileChooserCompletion;
228using blink::WebFindOptions;
229using blink::WebFormControlElement;
230using blink::WebFormElement;
231using blink::WebFrame;
232using blink::WebGestureEvent;
233using blink::WebHistoryItem;
234using blink::WebHTTPBody;
235using blink::WebIconURL;
236using blink::WebImage;
237using blink::WebInputElement;
238using blink::WebInputEvent;
[email protected]35b2a972014-04-04 15:50:22239using blink::WebLocalFrame;
[email protected]180ef242013-11-07 06:50:46240using blink::WebMediaPlayerAction;
[email protected]180ef242013-11-07 06:50:46241using blink::WebMouseEvent;
242using blink::WebNavigationPolicy;
243using blink::WebNavigationType;
244using blink::WebNode;
245using blink::WebPageSerializer;
246using blink::WebPageSerializerClient;
247using blink::WebPeerConnection00Handler;
248using blink::WebPeerConnection00HandlerClient;
249using blink::WebPeerConnectionHandler;
250using blink::WebPeerConnectionHandlerClient;
251using blink::WebPluginAction;
252using blink::WebPluginContainer;
253using blink::WebPluginDocument;
[email protected]180ef242013-11-07 06:50:46254using blink::WebPoint;
[email protected]180ef242013-11-07 06:50:46255using blink::WebRange;
256using blink::WebRect;
257using blink::WebReferrerPolicy;
[email protected]180ef242013-11-07 06:50:46258using blink::WebScriptSource;
259using blink::WebSearchableFormData;
260using blink::WebSecurityOrigin;
261using blink::WebSecurityPolicy;
[email protected]180ef242013-11-07 06:50:46262using blink::WebSettings;
263using blink::WebSize;
[email protected]180ef242013-11-07 06:50:46264using blink::WebStorageNamespace;
265using blink::WebStorageQuotaCallbacks;
266using blink::WebStorageQuotaError;
267using blink::WebStorageQuotaType;
268using blink::WebString;
269using blink::WebTextAffinity;
270using blink::WebTextDirection;
271using blink::WebTouchEvent;
272using blink::WebURL;
273using blink::WebURLError;
274using blink::WebURLRequest;
275using blink::WebURLResponse;
276using blink::WebUserGestureIndicator;
277using blink::WebVector;
278using blink::WebView;
279using blink::WebWidget;
280using blink::WebWindowFeatures;
[email protected]b3a97b52014-07-09 06:25:05281using blink::WebNetworkStateNotifier;
282using blink::WebRuntimeFeatures;
[email protected]6fdd4182010-10-14 23:59:26283using base::Time;
284using base::TimeDelta;
[email protected]e1acf6f2008-10-27 20:43:33285
[email protected]20657a82012-08-21 20:23:03286#if defined(OS_ANDROID)
[email protected]180ef242013-11-07 06:50:46287using blink::WebContentDetectionResult;
288using blink::WebFloatPoint;
289using blink::WebFloatRect;
290using blink::WebHitTestResult;
[email protected]20657a82012-08-21 20:23:03291#endif
292
[email protected]e9ff79c2012-10-19 21:31:26293namespace content {
294
initial.commit09911bf2008-07-26 23:55:29295//-----------------------------------------------------------------------------
296
[email protected]180ef242013-11-07 06:50:46297typedef std::map<blink::WebView*, RenderViewImpl*> ViewMap;
[email protected]6de0fd1d2011-11-15 13:31:49298static base::LazyInstance<ViewMap> g_view_map = LAZY_INSTANCE_INITIALIZER;
[email protected]058561b2012-12-03 06:48:22299typedef std::map<int32, RenderViewImpl*> RoutingIDViewMap;
300static base::LazyInstance<RoutingIDViewMap> g_routing_id_view_map =
301 LAZY_INSTANCE_INITIALIZER;
[email protected]3354d3e2010-06-10 19:53:02302
[email protected]882daa92009-11-05 16:31:31303// Time, in seconds, we delay before sending content state changes (such as form
304// state and scroll position) to the browser. We delay sending changes to avoid
305// spamming the browser.
306// To avoid having tab/session restore require sending a message to get the
307// current content state during tab closing we use a shorter timeout for the
308// foreground renderer. This means there is a small window of time from which
309// content state is modified and not sent to session restore, but this is
310// better than having to wake up all renderers during shutdown.
avif937e1d2014-11-02 18:13:07311const int kDelaySecondsForContentStateSyncHidden = 5;
312const int kDelaySecondsForContentStateSync = 1;
initial.commit09911bf2008-07-26 23:55:29313
[email protected]20657a82012-08-21 20:23:03314#if defined(OS_ANDROID)
315// Delay between tapping in content and launching the associated android intent.
316// Used to allow users see what has been recognized as content.
[email protected]9afc14e22013-09-25 22:34:14317const size_t kContentIntentDelayMilliseconds = 700;
[email protected]20657a82012-08-21 20:23:03318#endif
319
naskobd911332014-11-25 01:13:36320static RenderViewImpl* (*g_create_render_view_impl)(const ViewMsg_New_Params&) =
[email protected]8d41d7612012-11-14 20:32:19321 NULL;
322
[email protected]c6bc20332014-02-28 18:30:39323// static
[email protected]e507045d2013-07-24 15:23:44324Referrer RenderViewImpl::GetReferrerFromRequest(
[email protected]44e55b012013-07-23 14:21:56325 WebFrame* frame,
326 const WebURLRequest& request) {
327 return Referrer(GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))),
[email protected]cacbd7a2014-02-04 01:26:02328 request.referrerPolicy());
[email protected]44e55b012013-07-23 14:21:56329}
330
[email protected]c6bc20332014-02-28 18:30:39331// static
[email protected]65920f332014-03-04 21:14:18332WindowOpenDisposition RenderViewImpl::NavigationPolicyToDisposition(
[email protected]48861e22013-01-09 00:27:32333 WebNavigationPolicy policy) {
334 switch (policy) {
[email protected]180ef242013-11-07 06:50:46335 case blink::WebNavigationPolicyIgnore:
[email protected]48861e22013-01-09 00:27:32336 return IGNORE_ACTION;
[email protected]180ef242013-11-07 06:50:46337 case blink::WebNavigationPolicyDownload:
[email protected]48861e22013-01-09 00:27:32338 return SAVE_TO_DISK;
[email protected]180ef242013-11-07 06:50:46339 case blink::WebNavigationPolicyCurrentTab:
[email protected]48861e22013-01-09 00:27:32340 return CURRENT_TAB;
[email protected]180ef242013-11-07 06:50:46341 case blink::WebNavigationPolicyNewBackgroundTab:
[email protected]48861e22013-01-09 00:27:32342 return NEW_BACKGROUND_TAB;
[email protected]180ef242013-11-07 06:50:46343 case blink::WebNavigationPolicyNewForegroundTab:
[email protected]48861e22013-01-09 00:27:32344 return NEW_FOREGROUND_TAB;
[email protected]180ef242013-11-07 06:50:46345 case blink::WebNavigationPolicyNewWindow:
[email protected]48861e22013-01-09 00:27:32346 return NEW_WINDOW;
[email protected]180ef242013-11-07 06:50:46347 case blink::WebNavigationPolicyNewPopup:
[email protected]48861e22013-01-09 00:27:32348 return NEW_POPUP;
349 default:
350 NOTREACHED() << "Unexpected WebNavigationPolicy";
351 return IGNORE_ACTION;
352 }
353}
354
[email protected]d8221b22013-05-23 05:35:43355// Returns true if the device scale is high enough that losing subpixel
356// antialiasing won't have a noticeable effect on text quality.
357static bool DeviceScaleEnsuresTextQuality(float device_scale_factor) {
358#if defined(OS_ANDROID)
359 // On Android, we never have subpixel antialiasing.
360 return true;
361#else
362 return device_scale_factor > 1.5f;
363#endif
364
365}
366
danakj6e3bf8012014-12-16 18:27:53367static bool PreferCompositingToLCDText(CompositorDependencies* compositor_deps,
368 float device_scale_factor) {
avi83883c82014-12-23 00:08:49369 const base::CommandLine& command_line =
370 *base::CommandLine::ForCurrentProcess();
[email protected]b8ec1112014-08-17 20:09:10371 if (command_line.HasSwitch(switches::kDisablePreferCompositingToLCDText))
[email protected]fb854192013-02-06 01:30:04372 return false;
[email protected]b8ec1112014-08-17 20:09:10373 if (command_line.HasSwitch(switches::kEnablePreferCompositingToLCDText))
[email protected]fb854192013-02-06 01:30:04374 return true;
danakj6e3bf8012014-12-16 18:27:53375 if (!compositor_deps->IsLcdTextEnabled())
[email protected]10c19732014-08-18 19:39:23376 return true;
[email protected]d8221b22013-05-23 05:35:43377 return DeviceScaleEnsuresTextQuality(device_scale_factor);
378}
379
[email protected]180ef242013-11-07 06:50:46380static FaviconURL::IconType ToFaviconType(blink::WebIconURL::Type type) {
[email protected]41225fe2013-03-29 05:32:02381 switch (type) {
[email protected]180ef242013-11-07 06:50:46382 case blink::WebIconURL::TypeFavicon:
[email protected]41225fe2013-03-29 05:32:02383 return FaviconURL::FAVICON;
[email protected]180ef242013-11-07 06:50:46384 case blink::WebIconURL::TypeTouch:
[email protected]41225fe2013-03-29 05:32:02385 return FaviconURL::TOUCH_ICON;
[email protected]180ef242013-11-07 06:50:46386 case blink::WebIconURL::TypeTouchPrecomposed:
[email protected]41225fe2013-03-29 05:32:02387 return FaviconURL::TOUCH_PRECOMPOSED_ICON;
[email protected]180ef242013-11-07 06:50:46388 case blink::WebIconURL::TypeInvalid:
[email protected]41225fe2013-03-29 05:32:02389 return FaviconURL::INVALID_ICON;
390 }
391 return FaviconURL::INVALID_ICON;
392}
393
[email protected]f34ac132014-03-20 23:02:05394static void ConvertToFaviconSizes(
395 const blink::WebVector<blink::WebSize>& web_sizes,
396 std::vector<gfx::Size>* sizes) {
[email protected]2bd262b2014-04-16 05:31:23397 DCHECK(sizes->empty());
398 sizes->reserve(web_sizes.size());
[email protected]f34ac132014-03-20 23:02:05399 for (size_t i = 0; i < web_sizes.size(); ++i)
400 sizes->push_back(gfx::Size(web_sizes[i]));
401}
402
initial.commit09911bf2008-07-26 23:55:29403///////////////////////////////////////////////////////////////////////////////
404
[email protected]310ebd6302011-10-10 19:06:28405struct RenderViewImpl::PendingFileChooser {
[email protected]e9ff79c2012-10-19 21:31:26406 PendingFileChooser(const FileChooserParams& p, WebFileChooserCompletion* c)
[email protected]cdaf8d02010-03-30 19:52:47407 : params(p),
408 completion(c) {
409 }
[email protected]e9ff79c2012-10-19 21:31:26410 FileChooserParams params;
[email protected]cdaf8d02010-03-30 19:52:47411 WebFileChooserCompletion* completion; // MAY BE NULL to skip callback.
412};
413
[email protected]217690d2012-01-27 07:33:11414namespace {
415
416class WebWidgetLockTarget : public MouseLockDispatcher::LockTarget {
417 public:
[email protected]180ef242013-11-07 06:50:46418 explicit WebWidgetLockTarget(blink::WebWidget* webwidget)
[email protected]217690d2012-01-27 07:33:11419 : webwidget_(webwidget) {}
420
dcheng6d18e402014-10-21 12:32:52421 void OnLockMouseACK(bool succeeded) override {
[email protected]217690d2012-01-27 07:33:11422 if (succeeded)
423 webwidget_->didAcquirePointerLock();
424 else
425 webwidget_->didNotAcquirePointerLock();
426 }
427
dcheng6d18e402014-10-21 12:32:52428 void OnMouseLockLost() override { webwidget_->didLosePointerLock(); }
[email protected]217690d2012-01-27 07:33:11429
dcheng6d18e402014-10-21 12:32:52430 bool HandleMouseLockedInputEvent(const blink::WebMouseEvent& event) override {
[email protected]217690d2012-01-27 07:33:11431 // The WebWidget handles mouse lock in WebKit's handleInputEvent().
432 return false;
433 }
434
435 private:
[email protected]180ef242013-11-07 06:50:46436 blink::WebWidget* webwidget_;
[email protected]217690d2012-01-27 07:33:11437};
438
[email protected]dc293a72013-07-01 11:11:22439WebDragData DropDataToWebDragData(const DropData& drop_data) {
[email protected]c10680312013-05-31 15:22:05440 std::vector<WebDragData::Item> item_list;
441
442 // These fields are currently unused when dragging into WebKit.
443 DCHECK(drop_data.download_metadata.empty());
444 DCHECK(drop_data.file_contents.empty());
445 DCHECK(drop_data.file_description_filename.empty());
446
447 if (!drop_data.text.is_null()) {
448 WebDragData::Item item;
449 item.storageType = WebDragData::Item::StorageTypeString;
450 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeText);
451 item.stringData = drop_data.text.string();
452 item_list.push_back(item);
453 }
454
455 // TODO(dcheng): Do we need to distinguish between null and empty URLs? Is it
456 // meaningful to write an empty URL to the clipboard?
457 if (!drop_data.url.is_empty()) {
458 WebDragData::Item item;
459 item.storageType = WebDragData::Item::StorageTypeString;
460 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeURIList);
461 item.stringData = WebString::fromUTF8(drop_data.url.spec());
462 item.title = drop_data.url_title;
463 item_list.push_back(item);
464 }
465
466 if (!drop_data.html.is_null()) {
467 WebDragData::Item item;
468 item.storageType = WebDragData::Item::StorageTypeString;
469 item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeHTML);
470 item.stringData = drop_data.html.string();
471 item.baseURL = drop_data.html_base_url;
472 item_list.push_back(item);
473 }
474
[email protected]17ea0ae22014-03-28 21:54:46475 for (std::vector<ui::FileInfo>::const_iterator it =
[email protected]c10680312013-05-31 15:22:05476 drop_data.filenames.begin();
477 it != drop_data.filenames.end();
478 ++it) {
479 WebDragData::Item item;
480 item.storageType = WebDragData::Item::StorageTypeFilename;
[email protected]17ea0ae22014-03-28 21:54:46481 item.filenameData = it->path.AsUTF16Unsafe();
482 item.displayNameData = it->display_name.AsUTF16Unsafe();
[email protected]c10680312013-05-31 15:22:05483 item_list.push_back(item);
484 }
485
[email protected]60ed95f2014-04-23 12:19:48486 for (std::vector<DropData::FileSystemFileInfo>::const_iterator it =
487 drop_data.file_system_files.begin();
488 it != drop_data.file_system_files.end();
489 ++it) {
490 WebDragData::Item item;
491 item.storageType = WebDragData::Item::StorageTypeFileSystemFile;
492 item.fileSystemURL = it->url;
493 item.fileSystemFileSize = it->size;
494 item_list.push_back(item);
495 }
496
[email protected]c10680312013-05-31 15:22:05497 for (std::map<base::string16, base::string16>::const_iterator it =
498 drop_data.custom_data.begin();
499 it != drop_data.custom_data.end();
500 ++it) {
501 WebDragData::Item item;
502 item.storageType = WebDragData::Item::StorageTypeString;
503 item.stringType = it->first;
504 item.stringData = it->second;
505 item_list.push_back(item);
506 }
507
508 WebDragData result;
509 result.initialize();
510 result.setItems(item_list);
511 result.setFilesystemId(drop_data.filesystem_id);
512 return result;
513}
514
[email protected]b3a97b52014-07-09 06:25:05515typedef void (*SetFontFamilyWrapper)(blink::WebSettings*,
516 const base::string16&,
517 UScriptCode);
518
519void SetStandardFontFamilyWrapper(WebSettings* settings,
520 const base::string16& font,
521 UScriptCode script) {
522 settings->setStandardFontFamily(font, script);
523}
524
525void SetFixedFontFamilyWrapper(WebSettings* settings,
526 const base::string16& font,
527 UScriptCode script) {
528 settings->setFixedFontFamily(font, script);
529}
530
531void SetSerifFontFamilyWrapper(WebSettings* settings,
532 const base::string16& font,
533 UScriptCode script) {
534 settings->setSerifFontFamily(font, script);
535}
536
537void SetSansSerifFontFamilyWrapper(WebSettings* settings,
538 const base::string16& font,
539 UScriptCode script) {
540 settings->setSansSerifFontFamily(font, script);
541}
542
543void SetCursiveFontFamilyWrapper(WebSettings* settings,
544 const base::string16& font,
545 UScriptCode script) {
546 settings->setCursiveFontFamily(font, script);
547}
548
549void SetFantasyFontFamilyWrapper(WebSettings* settings,
550 const base::string16& font,
551 UScriptCode script) {
552 settings->setFantasyFontFamily(font, script);
553}
554
555void SetPictographFontFamilyWrapper(WebSettings* settings,
556 const base::string16& font,
557 UScriptCode script) {
558 settings->setPictographFontFamily(font, script);
559}
560
561// If |scriptCode| is a member of a family of "similar" script codes, returns
562// the script code in that family that is used by WebKit for font selection
563// purposes. For example, USCRIPT_KATAKANA_OR_HIRAGANA and USCRIPT_JAPANESE are
564// considered equivalent for the purposes of font selection. WebKit uses the
565// script code USCRIPT_KATAKANA_OR_HIRAGANA. So, if |scriptCode| is
566// USCRIPT_JAPANESE, the function returns USCRIPT_KATAKANA_OR_HIRAGANA. WebKit
567// uses different scripts than the ones in Chrome pref names because the version
568// of ICU included on certain ports does not have some of the newer scripts. If
569// |scriptCode| is not a member of such a family, returns |scriptCode|.
570UScriptCode GetScriptForWebSettings(UScriptCode scriptCode) {
571 switch (scriptCode) {
572 case USCRIPT_HIRAGANA:
573 case USCRIPT_KATAKANA:
574 case USCRIPT_JAPANESE:
575 return USCRIPT_KATAKANA_OR_HIRAGANA;
576 case USCRIPT_KOREAN:
577 return USCRIPT_HANGUL;
578 default:
579 return scriptCode;
580 }
581}
582
583void ApplyFontsFromMap(const ScriptFontFamilyMap& map,
584 SetFontFamilyWrapper setter,
585 WebSettings* settings) {
586 for (ScriptFontFamilyMap::const_iterator it = map.begin(); it != map.end();
587 ++it) {
588 int32 script = u_getPropertyValueEnum(UCHAR_SCRIPT, (it->first).c_str());
589 if (script >= 0 && script < USCRIPT_CODE_LIMIT) {
590 UScriptCode code = static_cast<UScriptCode>(script);
591 (*setter)(settings, it->second, GetScriptForWebSettings(code));
592 }
593 }
594}
595
wangxianzhu3bf39be52015-04-10 23:56:41596void ApplyBlinkSettings(const base::CommandLine& command_line,
597 WebSettings* settings) {
598 if (!command_line.HasSwitch(switches::kBlinkSettings))
599 return;
600
601 std::vector<std::string> blink_settings;
602 base::SplitString(
603 command_line.GetSwitchValueASCII(switches::kBlinkSettings), ',',
604 &blink_settings);
605 for (const std::string& setting : blink_settings) {
606 size_t pos = setting.find('=');
607 settings->setFromStrings(
608 blink::WebString::fromLatin1(setting.substr(0, pos)),
609 blink::WebString::fromLatin1(
610 pos == std::string::npos ? "" : setting.substr(pos + 1)));
611 }
612}
613
alexmos5ac402d2015-07-09 07:51:10614// Looks up and returns the WebFrame corresponding to a given opener frame
615// routing ID. Also stores the opener's RenderView routing ID into
616// |opener_view_routing_id|.
617WebFrame* ResolveOpener(int opener_frame_routing_id,
618 int* opener_view_routing_id) {
619 *opener_view_routing_id = MSG_ROUTING_NONE;
620 if (opener_frame_routing_id == MSG_ROUTING_NONE)
621 return nullptr;
622
623 // Opener routing ID could refer to either a RenderFrameProxy or a
624 // RenderFrame, so need to check both.
625 RenderFrameProxy* opener_proxy =
626 RenderFrameProxy::FromRoutingID(opener_frame_routing_id);
627 if (opener_proxy) {
628 *opener_view_routing_id = opener_proxy->render_view()->GetRoutingID();
629
630 // TODO(nasko,alexmos): This check won't be needed once swapped-out:// is
631 // gone.
632 if (opener_proxy->IsMainFrameDetachedFromTree()) {
633 DCHECK(!RenderFrameProxy::IsSwappedOutStateForbidden());
634 return opener_proxy->render_view()->webview()->mainFrame();
635 } else {
636 return opener_proxy->web_frame();
637 }
638 }
639
640 RenderFrameImpl* opener_frame =
641 RenderFrameImpl::FromRoutingID(opener_frame_routing_id);
642 if (opener_frame) {
643 *opener_view_routing_id = opener_frame->render_view()->GetRoutingID();
644 return opener_frame->GetWebFrame();
645 }
646
647 return nullptr;
648}
649
[email protected]217690d2012-01-27 07:33:11650} // namespace
651
naskobd911332014-11-25 01:13:36652RenderViewImpl::RenderViewImpl(const ViewMsg_New_Params& params)
[email protected]180ef242013-11-07 06:50:46653 : RenderWidget(blink::WebPopupTypeNone,
naskobd911332014-11-25 01:13:36654 params.initial_size.screen_info,
655 params.swapped_out,
656 params.hidden,
657 params.never_visible),
658 webkit_preferences_(params.web_preferences),
avif937e1d2014-11-02 18:13:07659 send_content_state_immediately_(false),
[email protected]81e63782009-02-27 19:35:09660 enabled_bindings_(0),
[email protected]3354d3e2010-06-10 19:53:02661 send_preferred_size_changes_(false),
[email protected]e75cb49e2009-01-05 23:13:21662 navigation_gesture_(NavigationGestureUnknown),
[email protected]3354d3e2010-06-10 19:53:02663 opened_by_user_gesture_(true),
664 opener_suppressed_(false),
[email protected]88f10a22013-11-06 21:22:12665 suppress_dialogs_until_swap_out_(false),
[email protected]81a34412009-01-05 19:17:24666 page_id_(-1),
naskobd911332014-11-25 01:13:36667 next_page_id_(params.next_page_id),
[email protected]3cc72b12010-03-18 23:03:00668 history_list_offset_(-1),
669 history_list_length_(0),
[email protected]7e9523b2014-03-25 03:02:42670 frames_in_progress_(0),
[email protected]3354d3e2010-06-10 19:53:02671 target_url_status_(TARGET_NONE),
[email protected]d42bf472014-06-14 01:49:38672 uses_temporary_zoom_level_(false),
[email protected]bbc8856d2013-06-14 10:37:04673#if defined(OS_ANDROID)
majidvpfb80e432015-02-23 14:15:50674 top_controls_constraints_(TOP_CONTROLS_STATE_BOTH),
[email protected]bbc8856d2013-06-14 10:37:04675#endif
[email protected]1875bc02014-03-14 06:33:59676 has_scrolled_focused_editable_node_into_rect_(false),
nasko4c0feb62015-06-05 18:37:06677 main_render_frame_(nullptr),
[email protected]64d09222012-05-25 10:10:34678 speech_recognition_dispatcher_(NULL),
[email protected]217690d2012-01-27 07:33:11679 mouse_lock_dispatcher_(NULL),
[email protected]20657a82012-08-21 20:23:03680#if defined(OS_ANDROID)
681 expected_content_intent_id_(0),
[email protected]a7564272013-04-19 14:24:46682#endif
683#if defined(OS_WIN)
684 focused_plugin_id_(-1),
685#endif
[email protected]e16c7a12013-12-05 16:30:08686#if defined(ENABLE_PLUGINS)
[email protected]54ea9ff2014-03-20 00:27:54687 plugin_find_handler_(NULL),
[email protected]e16c7a12013-12-05 16:30:08688 focused_pepper_plugin_(NULL),
689 pepper_last_mouse_event_target_(NULL),
690#endif
[email protected]8a67aa352013-02-20 02:58:29691 enumeration_completion_id_(0),
naskobd911332014-11-25 01:13:36692 session_storage_namespace_id_(params.session_storage_namespace_id),
lfg8302db822015-03-19 18:32:55693 page_scale_factor_is_one_(true) {
[email protected]075366912013-02-18 07:13:24694}
695
danakj6e3bf8012014-12-16 18:27:53696void RenderViewImpl::Initialize(const ViewMsg_New_Params& params,
697 CompositorDependencies* compositor_deps,
698 bool was_created_by_renderer) {
naskobd911332014-11-25 01:13:36699 routing_id_ = params.view_id;
700 surface_id_ = params.surface_id;
alexmos5ac402d2015-07-09 07:51:10701
702 int opener_view_routing_id;
703 WebFrame* opener_frame =
704 ResolveOpener(params.opener_frame_route_id, &opener_view_routing_id);
705 if (opener_view_routing_id != MSG_ROUTING_NONE && was_created_by_renderer)
706 opener_id_ = opener_view_routing_id;
707
mikhail.pozdnyakovc0e251b2015-04-15 06:51:12708 display_mode_= params.initial_size.display_mode;
[email protected]676126f72011-01-15 00:03:51709
[email protected]74ce1ad2011-12-16 21:51:46710 // Ensure we start with a valid next_page_id_ from the browser.
711 DCHECK_GE(next_page_id_, 0);
712
nasko4c0feb62015-06-05 18:37:06713 if (params.main_frame_routing_id != MSG_ROUTING_NONE) {
714 main_render_frame_ = RenderFrameImpl::Create(
715 this, params.main_frame_routing_id);
716 // The main frame WebLocalFrame object is closed by
717 // RenderFrameImpl::frameDetached().
718 WebLocalFrame* web_frame = WebLocalFrame::create(
719 blink::WebTreeScopeType::Document, main_render_frame_);
720 main_render_frame_->SetWebFrame(web_frame);
721 }
[email protected]34f288c2014-04-28 16:25:37722
danakj6e3bf8012014-12-16 18:27:53723 compositor_deps_ = compositor_deps;
[email protected]11fee2332011-03-29 20:36:35724 webwidget_ = WebView::create(this);
[email protected]217690d2012-01-27 07:33:11725 webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_));
[email protected]11fee2332011-03-29 20:36:35726
nasko4c0feb62015-06-05 18:37:06727 g_view_map.Get().insert(std::make_pair(webview(), this));
728 g_routing_id_view_map.Get().insert(std::make_pair(routing_id_, this));
729
avi83883c82014-12-23 00:08:49730 const base::CommandLine& command_line =
731 *base::CommandLine::ForCurrentProcess();
[email protected]20657a82012-08-21 20:23:03732
[email protected]27c521a2013-05-29 20:44:32733 if (command_line.HasSwitch(switches::kStatsCollectionController))
734 stats_collection_observer_.reset(new StatsCollectionObserver(this));
735
nasko4c0feb62015-06-05 18:37:06736 RenderFrameProxy* proxy = NULL;
737 if (params.proxy_routing_id != MSG_ROUTING_NONE) {
738 CHECK(params.swapped_out);
739 if (main_render_frame_) {
740 proxy = RenderFrameProxy::CreateProxyToReplaceFrame(
741 main_render_frame_, params.proxy_routing_id,
742 blink::WebTreeScopeType::Document);
743 main_render_frame_->set_render_frame_proxy(proxy);
744 } else {
745 proxy = RenderFrameProxy::CreateFrameProxy(
746 params.proxy_routing_id,
747 MSG_ROUTING_NONE,
748 routing_id_,
749 params.replicated_frame_state);
750 }
751 }
752
naskoba9691622015-06-26 20:33:03753 // When not using swapped out state, just use the WebRemoteFrame as the main
754 // frame.
755 if (proxy && RenderFrameProxy::IsSwappedOutStateForbidden()) {
nasko4c0feb62015-06-05 18:37:06756 webview()->setMainFrame(proxy->web_frame());
757 // Initialize the WebRemoteFrame with information replicated from the
758 // browser process.
759 proxy->SetReplicatedState(params.replicated_frame_state);
760 } else {
761 webview()->setMainFrame(main_render_frame_->GetWebFrame());
762 }
763 if (main_render_frame_)
764 main_render_frame_->Initialize();
765
[email protected]20657a82012-08-21 20:23:03766#if defined(OS_ANDROID)
[email protected]20657a82012-08-21 20:23:03767 content_detectors_.push_back(linked_ptr<ContentDetector>(
768 new AddressDetector()));
qinminc6a739f92015-03-31 17:46:11769 const std::string& contry_iso =
770 params.renderer_preferences.network_contry_iso;
771 if (!contry_iso.empty()) {
qinmin0d5560df2014-11-12 19:03:39772 content_detectors_.push_back(linked_ptr<ContentDetector>(
qinminc6a739f92015-03-31 17:46:11773 new PhoneNumberDetector(contry_iso)));
qinmin0d5560df2014-11-12 19:03:39774 }
[email protected]20657a82012-08-21 20:23:03775 content_detectors_.push_back(linked_ptr<ContentDetector>(
776 new EmailDetector()));
777#endif
778
[email protected]380244092011-10-07 17:26:27779 RenderThread::Get()->AddRoute(routing_id_, this);
[email protected]676126f72011-01-15 00:03:51780 // Take a reference on behalf of the RenderThread. This will be balanced
lfge208fa42015-04-17 20:29:18781 // when we receive ViewMsg_Close in the RenderWidget (which RenderView
782 // inherits from).
[email protected]676126f72011-01-15 00:03:51783 AddRef();
[email protected]b2db9272014-01-10 17:42:00784 if (RenderThreadImpl::current()) {
785 RenderThreadImpl::current()->WidgetCreated();
786 if (is_hidden_)
787 RenderThreadImpl::current()->WidgetHidden();
788 }
[email protected]676126f72011-01-15 00:03:51789
790 // If this is a popup, we must wait for the CreatingNew_ACK message before
791 // completing initialization. Otherwise, we can finish it now.
[email protected]6cd7c6b2012-10-25 03:26:23792 if (opener_id_ == MSG_ROUTING_NONE) {
[email protected]676126f72011-01-15 00:03:51793 did_show_ = true;
[email protected]fc4404d2012-11-07 19:53:30794 CompleteInit();
[email protected]676126f72011-01-15 00:03:51795 }
796
[email protected]60051ec2012-06-08 22:40:57797 webview()->setDeviceScaleFactor(device_scale_factor_);
mikhail.pozdnyakovc0e251b2015-04-15 06:51:12798 webview()->setDisplayMode(display_mode_);
[email protected]b8ec1112014-08-17 20:09:10799 webview()->settings()->setPreferCompositingToLCDTextEnabled(
danakj6e3bf8012014-12-16 18:27:53800 PreferCompositingToLCDText(compositor_deps_, device_scale_factor_));
jdduke2eee6cb2014-09-25 17:02:21801 webview()->settings()->setThreadedScrollingEnabled(
802 !command_line.HasSwitch(switches::kDisableThreadedScrolling));
skobes92ed7d462014-11-05 22:05:23803 webview()->settings()->setRootLayerScrolls(
804 command_line.HasSwitch(switches::kRootLayerScrolls));
[email protected]fb854192013-02-06 01:30:04805
sataya.mf405d0e2015-07-07 16:51:11806 ApplyWebPreferencesInternal(webkit_preferences_, webview(), compositor_deps_);
[email protected]9b159a52013-10-03 17:24:55807
[email protected]1400e6dc2013-04-27 02:36:27808 if (switches::IsTouchDragDropEnabled())
[email protected]edbea622012-11-28 20:39:38809 webview()->settings()->setTouchDragDropEnabled(true);
810
[email protected]1400e6dc2013-04-27 02:36:27811 if (switches::IsTouchEditingEnabled())
[email protected]47822262013-04-23 17:22:36812 webview()->settings()->setTouchEditingEnabled(true);
813
mfomitchev5ad034ec2015-04-24 21:57:27814 WebSettings::SelectionStrategyType selection_strategy =
jdduke9a6cbec2015-05-13 22:00:03815 WebSettings::SelectionStrategyType::Character;
mfomitchev5ad034ec2015-04-24 21:57:27816 const std::string selection_strategy_str =
817 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
818 switches::kTouchTextSelectionStrategy);
jdduke9a6cbec2015-05-13 22:00:03819 if (selection_strategy_str == "direction")
mfomitchev5ad034ec2015-04-24 21:57:27820 selection_strategy = WebSettings::SelectionStrategyType::Direction;
821 webview()->settings()->setSelectionStrategy(selection_strategy);
822
alexmos35799be2015-07-02 08:59:50823 // Set the main frame's name. Only needs to be done for WebLocalFrames,
824 // since the remote case was handled as part of SetReplicatedState on the
825 // proxy above.
826 if (!params.replicated_frame_state.name.empty() &&
827 webview()->mainFrame()->isWebLocalFrame()) {
alexmos3448b552015-06-26 07:49:13828 webview()->mainFrame()->setName(
829 blink::WebString::fromUTF8(params.replicated_frame_state.name));
830 }
[email protected]34c61bd52011-05-02 19:38:33831
[email protected]c7c0d822014-04-16 20:19:49832 // TODO(davidben): Move this state from Blink into content.
naskobd911332014-11-25 01:13:36833 if (params.window_was_created_with_opener)
[email protected]c7c0d822014-04-16 20:19:49834 webview()->setOpenedByDOM();
835
naskobd911332014-11-25 01:13:36836 OnSetRendererPrefs(params.renderer_preferences);
[email protected]34c61bd52011-05-02 19:38:33837
wangxianzhu3bf39be52015-04-10 23:56:41838 ApplyBlinkSettings(command_line, webview()->settings());
839
naskobd911332014-11-25 01:13:36840 if (!params.enable_auto_resize) {
841 OnResize(params.initial_size);
mkosiba58fa72f02014-11-12 01:21:36842 } else {
naskobd911332014-11-25 01:13:36843 OnEnableAutoResize(params.min_size, params.max_size);
mkosiba58fa72f02014-11-12 01:21:36844 }
845
[email protected]8f6a3b852011-07-19 16:48:56846 new MHTMLGenerator(this);
[email protected]86a7d3c2011-09-12 16:45:32847#if defined(OS_MACOSX)
848 new TextInputClientObserver(this);
849#endif // defined(OS_MACOSX)
[email protected]8f6a3b852011-07-19 16:48:56850
dgozman358ba322015-03-26 15:05:30851 // The next group of objects all implement RenderViewObserver, so are deleted
852 // along with the RenderView automatically.
[email protected]89054502012-06-03 10:29:24853 mouse_lock_dispatcher_ = new RenderViewMouseLockDispatcher(this);
[email protected]063afcb2011-09-29 07:54:32854
[email protected]d4734982014-04-15 02:05:55855 history_controller_.reset(new HistoryController(this));
856
[email protected]1784b2f2011-11-24 10:53:48857 new IdleUserDetector(this);
858
[email protected]766a7082012-02-03 23:39:15859 if (command_line.HasSwitch(switches::kDomAutomationController))
[email protected]e9ff79c2012-10-19 21:31:26860 enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION;
[email protected]27c521a2013-05-29 20:44:32861 if (command_line.HasSwitch(switches::kStatsCollectionController))
862 enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION;
[email protected]766a7082012-02-03 23:39:15863
[email protected]e9ff79c2012-10-19 21:31:26864 GetContentClient()->renderer()->RenderViewCreated(this);
[email protected]14392a52012-05-02 20:28:44865
alexmos5ac402d2015-07-09 07:51:10866 // If we have an opener_frame but we weren't created by a renderer, then it's
867 // the browser asking us to set our opener to another frame.
868 if (opener_frame && !was_created_by_renderer)
869 webview()->mainFrame()->setOpener(opener_frame);
[email protected]14392a52012-05-02 20:28:44870
871 // If we are initially swapped out, navigate to kSwappedOutURL.
872 // This ensures we are in a unique origin that others cannot script.
[email protected]82307f6b2014-08-07 03:30:12873 if (is_swapped_out_ && webview()->mainFrame()->isWebLocalFrame())
nasko78f06bc2014-11-18 18:18:57874 main_render_frame_->NavigateToSwappedOutURL();
initial.commit09911bf2008-07-26 23:55:29875}
876
[email protected]310ebd6302011-10-10 19:06:28877RenderViewImpl::~RenderViewImpl() {
[email protected]cb189e062014-04-23 00:57:01878 for (BitmapMap::iterator it = disambiguation_bitmaps_.begin();
879 it != disambiguation_bitmaps_.end();
880 ++it)
881 delete it->second;
[email protected]91a2aea2013-07-08 23:14:39882
[email protected]a1128322009-10-06 18:38:46883 // If file chooser is still waiting for answer, dispatch empty answer.
[email protected]cdaf8d02010-03-30 19:52:47884 while (!file_chooser_completions_.empty()) {
885 if (file_chooser_completions_.front()->completion) {
886 file_chooser_completions_.front()->completion->didChooseFile(
887 WebVector<WebString>());
888 }
889 file_chooser_completions_.pop_front();
890 }
[email protected]a1128322009-10-06 18:38:46891
[email protected]8ed1d3f2013-02-20 11:45:55892#if defined(OS_ANDROID)
893 // The date/time picker client is both a scoped_ptr member of this class and
894 // a RenderViewObserver. Reset it to prevent double deletion.
895 date_time_picker_client_.reset();
896#endif
897
[email protected]60c42a8c72009-10-09 04:08:59898#ifndef NDEBUG
[email protected]058561b2012-12-03 06:48:22899 // Make sure we are no longer referenced by the ViewMap or RoutingIDViewMap.
[email protected]625332e02010-12-14 07:48:49900 ViewMap* views = g_view_map.Pointer();
[email protected]60c42a8c72009-10-09 04:08:59901 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it)
902 DCHECK_NE(this, it->second) << "Failed to call Close?";
[email protected]058561b2012-12-03 06:48:22903 RoutingIDViewMap* routing_id_views = g_routing_id_view_map.Pointer();
904 for (RoutingIDViewMap::iterator it = routing_id_views->begin();
905 it != routing_id_views->end(); ++it)
906 DCHECK_NE(this, it->second) << "Failed to call Close?";
[email protected]60c42a8c72009-10-09 04:08:59907#endif
[email protected]676126f72011-01-15 00:03:51908
[email protected]310ebd6302011-10-10 19:06:28909 FOR_EACH_OBSERVER(RenderViewObserver, observers_, RenderViewGone());
[email protected]676126f72011-01-15 00:03:51910 FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct());
[email protected]60c42a8c72009-10-09 04:08:59911}
912
913/*static*/
[email protected]310ebd6302011-10-10 19:06:28914RenderViewImpl* RenderViewImpl::FromWebView(WebView* webview) {
[email protected]a2ef54c2011-10-10 16:20:31915 ViewMap* views = g_view_map.Pointer();
916 ViewMap::iterator it = views->find(webview);
917 return it == views->end() ? NULL : it->second;
918}
919
920/*static*/
[email protected]180ef242013-11-07 06:50:46921RenderView* RenderView::FromWebView(blink::WebView* webview) {
[email protected]310ebd6302011-10-10 19:06:28922 return RenderViewImpl::FromWebView(webview);
[email protected]a2ef54c2011-10-10 16:20:31923}
924
925/*static*/
[email protected]640e303c2012-12-05 01:36:07926RenderViewImpl* RenderViewImpl::FromRoutingID(int32 routing_id) {
927 RoutingIDViewMap* views = g_routing_id_view_map.Pointer();
928 RoutingIDViewMap::iterator it = views->find(routing_id);
929 return it == views->end() ? NULL : it->second;
930}
931
932/*static*/
933RenderView* RenderView::FromRoutingID(int routing_id) {
934 return RenderViewImpl::FromRoutingID(routing_id);
935}
936
[email protected]f3a95312014-06-12 16:46:58937/* static */
jochen9c7b8f242015-06-01 15:32:02938size_t RenderView::GetRenderViewCount() {
[email protected]f3a95312014-06-12 16:46:58939 return g_view_map.Get().size();
940}
941
[email protected]640e303c2012-12-05 01:36:07942/*static*/
[email protected]e9ff79c2012-10-19 21:31:26943void RenderView::ForEach(RenderViewVisitor* visitor) {
[email protected]625332e02010-12-14 07:48:49944 ViewMap* views = g_view_map.Pointer();
[email protected]60c42a8c72009-10-09 04:08:59945 for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) {
946 if (!visitor->Visit(it->second))
947 return;
948 }
949}
950
951/*static*/
[email protected]b3a97b52014-07-09 06:25:05952void RenderView::ApplyWebPreferences(const WebPreferences& prefs,
953 WebView* web_view) {
954 WebSettings* settings = web_view->settings();
955 ApplyFontsFromMap(prefs.standard_font_family_map,
956 SetStandardFontFamilyWrapper, settings);
957 ApplyFontsFromMap(prefs.fixed_font_family_map,
958 SetFixedFontFamilyWrapper, settings);
959 ApplyFontsFromMap(prefs.serif_font_family_map,
960 SetSerifFontFamilyWrapper, settings);
961 ApplyFontsFromMap(prefs.sans_serif_font_family_map,
962 SetSansSerifFontFamilyWrapper, settings);
963 ApplyFontsFromMap(prefs.cursive_font_family_map,
964 SetCursiveFontFamilyWrapper, settings);
965 ApplyFontsFromMap(prefs.fantasy_font_family_map,
966 SetFantasyFontFamilyWrapper, settings);
967 ApplyFontsFromMap(prefs.pictograph_font_family_map,
968 SetPictographFontFamilyWrapper, settings);
969 settings->setDefaultFontSize(prefs.default_font_size);
970 settings->setDefaultFixedFontSize(prefs.default_fixed_font_size);
971 settings->setMinimumFontSize(prefs.minimum_font_size);
972 settings->setMinimumLogicalFontSize(prefs.minimum_logical_font_size);
973 settings->setDefaultTextEncodingName(
974 base::ASCIIToUTF16(prefs.default_encoding));
975 settings->setJavaScriptEnabled(prefs.javascript_enabled);
976 settings->setWebSecurityEnabled(prefs.web_security_enabled);
977 settings->setJavaScriptCanOpenWindowsAutomatically(
978 prefs.javascript_can_open_windows_automatically);
979 settings->setLoadsImagesAutomatically(prefs.loads_images_automatically);
980 settings->setImagesEnabled(prefs.images_enabled);
981 settings->setPluginsEnabled(prefs.plugins_enabled);
982 settings->setDOMPasteAllowed(prefs.dom_paste_enabled);
[email protected]b3a97b52014-07-09 06:25:05983 settings->setUsesEncodingDetector(prefs.uses_universal_detector);
984 settings->setTextAreasAreResizable(prefs.text_areas_are_resizable);
985 settings->setAllowScriptsToCloseWindows(prefs.allow_scripts_to_close_windows);
986 settings->setDownloadableBinaryFontsEnabled(prefs.remote_fonts_enabled);
987 settings->setJavaScriptCanAccessClipboard(
988 prefs.javascript_can_access_clipboard);
989 WebRuntimeFeatures::enableXSLT(prefs.xslt_enabled);
leviwb6fdf8872014-10-28 17:46:52990 WebRuntimeFeatures::enableSlimmingPaint(prefs.slimming_paint_enabled);
[email protected]b3a97b52014-07-09 06:25:05991 settings->setXSSAuditorEnabled(prefs.xss_auditor_enabled);
992 settings->setDNSPrefetchingEnabled(prefs.dns_prefetching_enabled);
993 settings->setLocalStorageEnabled(prefs.local_storage_enabled);
994 settings->setSyncXHRInDocumentsEnabled(prefs.sync_xhr_in_documents_enabled);
995 WebRuntimeFeatures::enableDatabase(prefs.databases_enabled);
996 settings->setOfflineWebApplicationCacheEnabled(
997 prefs.application_cache_enabled);
998 settings->setCaretBrowsingEnabled(prefs.caret_browsing_enabled);
999 settings->setHyperlinkAuditingEnabled(prefs.hyperlink_auditing_enabled);
1000 settings->setCookieEnabled(prefs.cookie_enabled);
1001 settings->setNavigateOnDragDrop(prefs.navigate_on_drag_drop);
1002
1003 settings->setJavaEnabled(prefs.java_enabled);
1004
1005 // By default, allow_universal_access_from_file_urls is set to false and thus
1006 // we mitigate attacks from local HTML files by not granting file:// URLs
1007 // universal access. Only test shell will enable this.
1008 settings->setAllowUniversalAccessFromFileURLs(
1009 prefs.allow_universal_access_from_file_urls);
1010 settings->setAllowFileAccessFromFileURLs(
1011 prefs.allow_file_access_from_file_urls);
1012
1013 // Enable the web audio API if requested on the command line.
1014 settings->setWebAudioEnabled(prefs.webaudio_enabled);
1015
1016 // Enable experimental WebGL support if requested on command line
1017 // and support is compiled in.
1018 settings->setExperimentalWebGLEnabled(prefs.experimental_webgl_enabled);
1019
1020 // Disable GL multisampling if requested on command line.
1021 settings->setOpenGLMultisamplingEnabled(prefs.gl_multisampling_enabled);
1022
1023 // Enable WebGL errors to the JS console if requested.
1024 settings->setWebGLErrorsToConsoleEnabled(
1025 prefs.webgl_errors_to_console_enabled);
1026
1027 // Uses the mock theme engine for scrollbars.
1028 settings->setMockScrollbarsEnabled(prefs.mock_scrollbars_enabled);
1029
[email protected]b3a97b52014-07-09 06:25:051030 // Enable gpu-accelerated 2d canvas if requested on the command line.
1031 settings->setAccelerated2dCanvasEnabled(prefs.accelerated_2d_canvas_enabled);
1032
1033 settings->setMinimumAccelerated2dCanvasSize(
1034 prefs.minimum_accelerated_2d_canvas_size);
1035
1036 // Disable antialiasing for 2d canvas if requested on the command line.
1037 settings->setAntialiased2dCanvasEnabled(
1038 !prefs.antialiased_2d_canvas_disabled);
1039
robertphillipse25137b2014-10-20 13:44:341040 // Enabled antialiasing of clips for 2d canvas if requested on the command
1041 // line.
1042 settings->setAntialiasedClips2dCanvasEnabled(
1043 prefs.antialiased_clips_2d_canvas_enabled);
1044
[email protected]b3a97b52014-07-09 06:25:051045 // Set MSAA sample count for 2d canvas if requested on the command line (or
1046 // default value if not).
1047 settings->setAccelerated2dCanvasMSAASampleCount(
1048 prefs.accelerated_2d_canvas_msaa_sample_count);
1049
fmalita6d3d8f112014-10-08 01:58:061050 WebRuntimeFeatures::enableTextBlobs(prefs.text_blobs_enabled);
1051
[email protected]b3a97b52014-07-09 06:25:051052 settings->setAsynchronousSpellCheckingEnabled(
1053 prefs.asynchronous_spell_checking_enabled);
1054 settings->setUnifiedTextCheckerEnabled(prefs.unified_textchecker_enabled);
1055
[email protected]b3a97b52014-07-09 06:25:051056 // Tabs to link is not part of the settings. WebCore calls
1057 // ChromeClient::tabsToLinks which is part of the glue code.
1058 web_view->setTabsToLinks(prefs.tabs_to_links);
1059
1060 settings->setAllowDisplayOfInsecureContent(
1061 prefs.allow_displaying_insecure_content);
1062 settings->setAllowRunningOfInsecureContent(
1063 prefs.allow_running_insecure_content);
mkwst772ce8142015-01-16 13:28:071064 settings->setDisableReadingFromCanvas(prefs.disable_reading_from_canvas);
mkwst2fc2c4f2015-01-08 08:29:181065 settings->setStrictMixedContentChecking(prefs.strict_mixed_content_checking);
mkwst673a452f2015-01-10 14:41:501066 settings->setStrictPowerfulFeatureRestrictions(
1067 prefs.strict_powerful_feature_restrictions);
[email protected]b3a97b52014-07-09 06:25:051068 settings->setPasswordEchoEnabled(prefs.password_echo_enabled);
1069 settings->setShouldPrintBackgrounds(prefs.should_print_backgrounds);
1070 settings->setShouldClearDocumentBackground(
1071 prefs.should_clear_document_background);
1072 settings->setEnableScrollAnimator(prefs.enable_scroll_animator);
1073
[email protected]b3a97b52014-07-09 06:25:051074 WebRuntimeFeatures::enableTouch(prefs.touch_enabled);
1075 settings->setMaxTouchPoints(prefs.pointer_events_max_touch_points);
mustaq29eb7092014-11-14 00:32:121076 settings->setAvailablePointerTypes(prefs.available_pointer_types);
1077 settings->setPrimaryPointerType(
1078 static_cast<WebSettings::PointerType>(prefs.primary_pointer_type));
1079 settings->setAvailableHoverTypes(prefs.available_hover_types);
1080 settings->setPrimaryHoverType(
1081 static_cast<WebSettings::HoverType>(prefs.primary_hover_type));
[email protected]b3a97b52014-07-09 06:25:051082 settings->setDeviceSupportsTouch(prefs.device_supports_touch);
1083 settings->setDeviceSupportsMouse(prefs.device_supports_mouse);
1084 settings->setEnableTouchAdjustment(prefs.touch_adjustment_enabled);
mustaq35bb250b2015-05-06 21:22:391085 settings->setMultiTargetTapNotificationEnabled(
1086 switches::IsLinkDisambiguationPopupEnabled());
[email protected]b3a97b52014-07-09 06:25:051087
noelf552c5172014-11-05 22:53:211088 WebRuntimeFeatures::enableImageColorProfiles(
1089 prefs.image_color_profiles_enabled);
[email protected]b3a97b52014-07-09 06:25:051090 settings->setShouldRespectImageOrientation(
1091 prefs.should_respect_image_orientation);
1092
1093 settings->setUnsafePluginPastingEnabled(false);
1094 settings->setEditingBehavior(
1095 static_cast<WebSettings::EditingBehavior>(prefs.editing_behavior));
1096
1097 settings->setSupportsMultipleWindows(prefs.supports_multiple_windows);
1098
1099 settings->setViewportEnabled(prefs.viewport_enabled);
1100 settings->setLoadWithOverviewMode(prefs.initialize_at_minimum_page_scale);
1101 settings->setViewportMetaEnabled(prefs.viewport_meta_enabled);
1102 settings->setMainFrameResizesAreOrientationChanges(
1103 prefs.main_frame_resizes_are_orientation_changes);
1104
1105 settings->setSmartInsertDeleteEnabled(prefs.smart_insert_delete_enabled);
1106
1107 settings->setSpatialNavigationEnabled(prefs.spatial_navigation_enabled);
1108
1109 settings->setSelectionIncludesAltImageText(true);
1110
[email protected]35103c02014-08-12 15:08:471111 settings->setV8CacheOptions(
1112 static_cast<WebSettings::V8CacheOptions>(prefs.v8_cache_options));
1113
je_julie.kim7fbb5a1a2015-02-09 17:26:051114 settings->setImageAnimationPolicy(
1115 static_cast<WebSettings::ImageAnimationPolicy>(prefs.animation_policy));
1116
dcheng5ae8ca362015-02-05 04:03:471117 // Needs to happen before setIgnoreVIewportTagScaleLimits below.
1118 web_view->setDefaultPageScaleLimits(
1119 prefs.default_minimum_page_scale_factor,
1120 prefs.default_maximum_page_scale_factor);
1121
[email protected]b3a97b52014-07-09 06:25:051122#if defined(OS_ANDROID)
1123 settings->setAllowCustomScrollbarInMainFrame(false);
1124 settings->setTextAutosizingEnabled(prefs.text_autosizing_enabled);
1125 settings->setAccessibilityFontScaleFactor(prefs.font_scale_factor);
1126 settings->setDeviceScaleAdjustment(prefs.device_scale_adjustment);
[email protected]023fed312014-08-11 16:13:051127 settings->setFullscreenSupported(prefs.fullscreen_supported);
[email protected]b3a97b52014-07-09 06:25:051128 web_view->setIgnoreViewportTagScaleLimits(prefs.force_enable_zoom);
1129 settings->setAutoZoomFocusedNodeToLegibleScale(true);
1130 settings->setDoubleTapToZoomEnabled(prefs.double_tap_to_zoom_enabled);
1131 settings->setMediaControlsOverlayPlayButtonEnabled(true);
1132 settings->setMediaPlaybackRequiresUserGesture(
1133 prefs.user_gesture_required_for_media_playback);
1134 settings->setDefaultVideoPosterURL(
1135 base::ASCIIToUTF16(prefs.default_video_poster_url.spec()));
1136 settings->setSupportDeprecatedTargetDensityDPI(
1137 prefs.support_deprecated_target_density_dpi);
1138 settings->setUseLegacyBackgroundSizeShorthandBehavior(
1139 prefs.use_legacy_background_size_shorthand_behavior);
1140 settings->setWideViewportQuirkEnabled(prefs.wide_viewport_quirk);
1141 settings->setUseWideViewport(prefs.use_wide_viewport);
[email protected]9954ea92014-08-12 15:48:451142 settings->setForceZeroLayoutHeight(prefs.force_zero_layout_height);
[email protected]b3a97b52014-07-09 06:25:051143 settings->setViewportMetaLayoutSizeQuirk(
1144 prefs.viewport_meta_layout_size_quirk);
1145 settings->setViewportMetaMergeContentQuirk(
1146 prefs.viewport_meta_merge_content_quirk);
1147 settings->setViewportMetaNonUserScalableQuirk(
1148 prefs.viewport_meta_non_user_scalable_quirk);
1149 settings->setViewportMetaZeroValuesQuirk(
1150 prefs.viewport_meta_zero_values_quirk);
1151 settings->setClobberUserAgentInitialScaleQuirk(
1152 prefs.clobber_user_agent_initial_scale_quirk);
1153 settings->setIgnoreMainFrameOverflowHiddenQuirk(
1154 prefs.ignore_main_frame_overflow_hidden_quirk);
1155 settings->setReportScreenSizeInPhysicalPixelsQuirk(
1156 prefs.report_screen_size_in_physical_pixels_quirk);
timav7a5032e2014-12-05 01:59:431157
1158 bool record_full_layer =
1159 RenderViewImpl::FromWebView(web_view)
1160 ? RenderViewImpl::FromWebView(web_view)->DoesRecordFullLayer()
1161 : false;
1162 settings->setMainFrameClipsContent(!record_full_layer);
1163
[email protected]b3a97b52014-07-09 06:25:051164 settings->setShrinksViewportContentToFit(true);
runed1677fd2015-03-12 09:01:531165 settings->setUseMobileViewportStyle(true);
[email protected]b3a97b52014-07-09 06:25:051166#endif
1167
1168 WebNetworkStateNotifier::setOnLine(prefs.is_online);
1169 WebNetworkStateNotifier::setWebConnectionType(
1170 NetConnectionTypeToWebConnectionType(prefs.connection_type));
[email protected]b3a97b52014-07-09 06:25:051171
1172 settings->setPinchOverlayScrollbarThickness(
1173 prefs.pinch_overlay_scrollbar_thickness);
1174 settings->setUseSolidColorScrollbars(prefs.use_solid_color_scrollbars);
jinho.bang8f11ffa2014-12-04 06:03:031175
arjanl98804912015-03-04 09:23:041176 settings->setShowContextMenuOnMouseUp(prefs.context_menu_on_mouse_up);
ccameron2fd70de72015-02-19 00:40:401177
1178#if defined(OS_MACOSX)
1179 settings->setDoubleTapToZoomEnabled(true);
ccameronf29a7802015-02-20 22:11:251180 web_view->setMaximumLegibleScale(prefs.default_maximum_page_scale_factor);
ccameron2fd70de72015-02-19 00:40:401181#endif
[email protected]b3a97b52014-07-09 06:25:051182}
1183
1184/*static*/
danakj6e3bf8012014-12-16 18:27:531185RenderViewImpl* RenderViewImpl::Create(const ViewMsg_New_Params& params,
1186 CompositorDependencies* compositor_deps,
1187 bool was_created_by_renderer) {
naskobd911332014-11-25 01:13:361188 DCHECK(params.view_id != MSG_ROUTING_NONE);
[email protected]075366912013-02-18 07:13:241189 RenderViewImpl* render_view = NULL;
[email protected]8d41d7612012-11-14 20:32:191190 if (g_create_render_view_impl)
naskobd911332014-11-25 01:13:361191 render_view = g_create_render_view_impl(params);
[email protected]075366912013-02-18 07:13:241192 else
naskobd911332014-11-25 01:13:361193 render_view = new RenderViewImpl(params);
[email protected]0287e762014-04-11 13:07:581194
danakj6e3bf8012014-12-16 18:27:531195 render_view->Initialize(params, compositor_deps, was_created_by_renderer);
[email protected]075366912013-02-18 07:13:241196 return render_view;
[email protected]8d41d7612012-11-14 20:32:191197}
1198
1199// static
1200void RenderViewImpl::InstallCreateHook(
naskobd911332014-11-25 01:13:361201 RenderViewImpl* (*create_render_view_impl)(const ViewMsg_New_Params&)) {
[email protected]8d41d7612012-11-14 20:32:191202 CHECK(!g_create_render_view_impl);
1203 g_create_render_view_impl = create_render_view_impl;
initial.commit09911bf2008-07-26 23:55:291204}
1205
[email protected]310ebd6302011-10-10 19:06:281206void RenderViewImpl::AddObserver(RenderViewObserver* observer) {
[email protected]676126f72011-01-15 00:03:511207 observers_.AddObserver(observer);
1208}
1209
[email protected]310ebd6302011-10-10 19:06:281210void RenderViewImpl::RemoveObserver(RenderViewObserver* observer) {
1211 observer->RenderViewGone();
[email protected]676126f72011-01-15 00:03:511212 observers_.RemoveObserver(observer);
1213}
1214
[email protected]180ef242013-11-07 06:50:461215blink::WebView* RenderViewImpl::webview() const {
1216 return static_cast<blink::WebView*>(webwidget());
[email protected]4d51d5bf2010-07-26 18:48:261217}
1218
[email protected]ea2fb972013-08-07 05:44:261219#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:571220void RenderViewImpl::PepperInstanceCreated(
1221 PepperPluginInstanceImpl* instance) {
1222 active_pepper_instances_.insert(instance);
emaxxe70f5e12015-05-29 11:26:001223
1224 RenderFrameImpl* const render_frame = instance->render_frame();
1225 render_frame->Send(
1226 new FrameHostMsg_PepperInstanceCreated(render_frame->GetRoutingID()));
[email protected]a99a38802014-01-14 15:46:571227}
1228
1229void RenderViewImpl::PepperInstanceDeleted(
1230 PepperPluginInstanceImpl* instance) {
1231 active_pepper_instances_.erase(instance);
1232
1233 if (pepper_last_mouse_event_target_ == instance)
1234 pepper_last_mouse_event_target_ = NULL;
1235 if (focused_pepper_plugin_ == instance)
1236 PepperFocusChanged(instance, false);
emaxxe70f5e12015-05-29 11:26:001237
1238 RenderFrameImpl* const render_frame = instance->render_frame();
1239 if (render_frame)
1240 render_frame->Send(
1241 new FrameHostMsg_PepperInstanceDeleted(render_frame->GetRoutingID()));
[email protected]a99a38802014-01-14 15:46:571242}
1243
1244void RenderViewImpl::PepperFocusChanged(PepperPluginInstanceImpl* instance,
1245 bool focused) {
1246 if (focused)
1247 focused_pepper_plugin_ = instance;
1248 else if (focused_pepper_plugin_ == instance)
1249 focused_pepper_plugin_ = NULL;
1250
shuchen3517bb62014-10-15 03:55:571251 UpdateTextInputType();
[email protected]a99a38802014-01-14 15:46:571252 UpdateSelectionBounds();
1253}
1254
[email protected]310ebd6302011-10-10 19:06:281255void RenderViewImpl::RegisterPluginDelegate(WebPluginDelegateProxy* delegate) {
[email protected]d8fd6fa2010-02-01 15:54:261256 plugin_delegates_.insert(delegate);
[email protected]49232292010-09-03 19:07:301257 // If the renderer is visible, set initial visibility and focus state.
1258 if (!is_hidden()) {
[email protected]784ea1ab2010-09-18 00:02:341259#if defined(OS_MACOSX)
[email protected]49232292010-09-03 19:07:301260 delegate->SetContainerVisibility(true);
1261 if (webview() && webview()->isActive())
1262 delegate->SetWindowFocus(true);
[email protected]784ea1ab2010-09-18 00:02:341263#endif
[email protected]49232292010-09-03 19:07:301264 }
[email protected]784ea1ab2010-09-18 00:02:341265 // Plugins start assuming the content has focus (so that they work in
1266 // environments where RenderView isn't hosting them), so we always have to
1267 // set the initial state. See webplugin_delegate_impl.h for details.
1268 delegate->SetContentAreaFocus(has_focus());
[email protected]d8fd6fa2010-02-01 15:54:261269}
1270
[email protected]310ebd6302011-10-10 19:06:281271void RenderViewImpl::UnregisterPluginDelegate(
1272 WebPluginDelegateProxy* delegate) {
[email protected]d8fd6fa2010-02-01 15:54:261273 plugin_delegates_.erase(delegate);
1274}
[email protected]d8fd6fa2010-02-01 15:54:261275
[email protected]a80af12e2013-08-07 23:36:131276#if defined(OS_WIN)
1277void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
1278 if (focused)
1279 focused_plugin_id_ = plugin_id;
1280 else
1281 focused_plugin_id_ = -1;
1282}
1283#endif
1284
1285#if defined(OS_MACOSX)
1286void RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) {
1287 Send(new ViewHostMsg_PluginFocusChanged(routing_id(), focused, plugin_id));
1288}
1289
[email protected]7411a3c2014-08-15 05:20:191290void RenderViewImpl::OnGetRenderedText() {
1291 if (!webview())
1292 return;
1293 // Get rendered text from WebLocalFrame.
1294 // TODO: Currently IPC truncates any data that has a
1295 // size > kMaximumMessageSize. May be split the text into smaller chunks and
1296 // send back using multiple IPC. See http://crbug.com/393444.
1297 static const size_t kMaximumMessageSize = 8 * 1024 * 1024;
1298 std::string text = webview()->mainFrame()->contentAsText(
1299 kMaximumMessageSize).utf8();
1300
1301 Send(new ViewMsg_GetRenderedTextCompleted(routing_id(), text));
1302}
1303
[email protected]a80af12e2013-08-07 23:36:131304void RenderViewImpl::StartPluginIme() {
1305 IPC::Message* msg = new ViewHostMsg_StartPluginIme(routing_id());
1306 // This message can be sent during event-handling, and needs to be delivered
1307 // within that context.
1308 msg->set_unblock(true);
1309 Send(msg);
1310}
1311#endif // defined(OS_MACOSX)
1312
1313#endif // ENABLE_PLUGINS
1314
[email protected]7a1ec28a2012-03-28 21:10:241315void RenderViewImpl::TransferActiveWheelFlingAnimation(
[email protected]180ef242013-11-07 06:50:461316 const blink::WebActiveWheelFlingParameters& params) {
[email protected]7a1ec28a2012-03-28 21:10:241317 if (webview())
1318 webview()->transferActiveWheelFlingAnimation(params);
1319}
1320
[email protected]8fe8f742012-06-14 00:36:081321bool RenderViewImpl::HasIMETextFocus() {
1322 return GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE;
1323}
1324
[email protected]310ebd6302011-10-10 19:06:281325bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
[email protected]26aa0482009-09-30 16:55:271326 WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL;
[email protected]82307f6b2014-08-07 03:30:121327 if (main_frame && main_frame->isWebLocalFrame())
[email protected]e9ff79c2012-10-19 21:31:261328 GetContentClient()->SetActiveURL(main_frame->document().url());
[email protected]f8b6b6f2009-03-10 16:48:261329
brettw5a1613dc2015-06-02 05:34:431330 base::ObserverListBase<RenderViewObserver>::Iterator it(&observers_);
[email protected]676126f72011-01-15 00:03:511331 RenderViewObserver* observer;
1332 while ((observer = it.GetNext()) != NULL)
1333 if (observer->OnMessageReceived(message))
1334 return true;
[email protected]b2abac72009-02-26 12:39:281335
[email protected]a95986a82010-12-24 06:19:281336 bool handled = true;
[email protected]e44d1342014-05-16 21:29:331337 IPC_BEGIN_MESSAGE_MAP(RenderViewImpl, message)
[email protected]c084330e02013-04-27 01:08:151338 IPC_MESSAGE_HANDLER(InputMsg_ExecuteEditCommand, OnExecuteEditCommand)
1339 IPC_MESSAGE_HANDLER(InputMsg_MoveCaret, OnMoveCaret)
[email protected]c084330e02013-04-27 01:08:151340 IPC_MESSAGE_HANDLER(InputMsg_ScrollFocusedEditableNodeIntoRect,
1341 OnScrollFocusedEditableNodeIntoRect)
[email protected]c084330e02013-04-27 01:08:151342 IPC_MESSAGE_HANDLER(InputMsg_SetEditCommandsForNextKeyEvent,
1343 OnSetEditCommandsForNextKeyEvent)
initial.commit09911bf2008-07-26 23:55:291344 IPC_MESSAGE_HANDLER(ViewMsg_CopyImageAt, OnCopyImageAt)
[email protected]6a6fa3e2014-05-09 06:57:181345 IPC_MESSAGE_HANDLER(ViewMsg_SaveImageAt, OnSaveImageAt)
initial.commit09911bf2008-07-26 23:55:291346 IPC_MESSAGE_HANDLER(ViewMsg_Find, OnFind)
[email protected]24a7f3c2010-03-25 08:26:491347 IPC_MESSAGE_HANDLER(ViewMsg_StopFinding, OnStopFinding)
ccameronb7c1d6c2015-03-09 17:08:241348 IPC_MESSAGE_HANDLER(ViewMsg_ResetPageScale, OnResetPageScale)
[email protected]630e26b2008-10-14 22:55:171349 IPC_MESSAGE_HANDLER(ViewMsg_Zoom, OnZoom)
[email protected]9d797f32010-04-23 07:17:541350 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForLoadingURL,
1351 OnSetZoomLevelForLoadingURL)
[email protected]d42bf472014-06-14 01:49:381352 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForView,
1353 OnSetZoomLevelForView)
initial.commit09911bf2008-07-26 23:55:291354 IPC_MESSAGE_HANDLER(ViewMsg_SetPageEncoding, OnSetPageEncoding)
[email protected]a697f4c2009-09-14 22:30:181355 IPC_MESSAGE_HANDLER(ViewMsg_ResetPageEncodingToDefault,
1356 OnResetPageEncodingToDefault)
[email protected]59f4f2fa2011-03-23 01:00:551357 IPC_MESSAGE_HANDLER(DragMsg_TargetDragEnter, OnDragTargetDragEnter)
1358 IPC_MESSAGE_HANDLER(DragMsg_TargetDragOver, OnDragTargetDragOver)
1359 IPC_MESSAGE_HANDLER(DragMsg_TargetDragLeave, OnDragTargetDragLeave)
1360 IPC_MESSAGE_HANDLER(DragMsg_TargetDrop, OnDragTargetDrop)
[email protected]7a6d773f2014-04-04 01:25:091361 IPC_MESSAGE_HANDLER(DragMsg_SourceEnded, OnDragSourceEnded)
[email protected]59f4f2fa2011-03-23 01:00:551362 IPC_MESSAGE_HANDLER(DragMsg_SourceSystemDragEnded,
1363 OnDragSourceSystemDragEnded)
[email protected]18cb2572008-08-21 20:34:451364 IPC_MESSAGE_HANDLER(ViewMsg_AllowBindings, OnAllowBindings)
initial.commit09911bf2008-07-26 23:55:291365 IPC_MESSAGE_HANDLER(ViewMsg_SetInitialFocus, OnSetInitialFocus)
initial.commit09911bf2008-07-26 23:55:291366 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTargetURL_ACK, OnUpdateTargetURLAck)
1367 IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences)
[email protected]600ea402011-04-12 00:01:511368 IPC_MESSAGE_HANDLER(ViewMsg_EnumerateDirectoryResponse,
1369 OnEnumerateDirectoryResponse)
initial.commit09911bf2008-07-26 23:55:291370 IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse)
[email protected]88f10a22013-11-06 21:22:121371 IPC_MESSAGE_HANDLER(ViewMsg_SuppressDialogsUntilSwapOut,
1372 OnSuppressDialogsUntilSwapOut)
initial.commit09911bf2008-07-26 23:55:291373 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage)
1374 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged)
[email protected]30f75e62009-02-25 22:01:001375 IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
[email protected]ab6c9112014-02-27 00:20:581376 IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedElement, OnClearFocusedElement)
[email protected]61f91832014-05-13 01:24:421377 IPC_MESSAGE_HANDLER(ViewMsg_SetBackgroundOpaque, OnSetBackgroundOpaque)
[email protected]ab32b16c2009-10-16 14:57:251378 IPC_MESSAGE_HANDLER(ViewMsg_EnablePreferredSizeChangedMode,
1379 OnEnablePreferredSizeChangedMode)
[email protected]244ac1892011-12-02 17:04:471380 IPC_MESSAGE_HANDLER(ViewMsg_EnableAutoResize, OnEnableAutoResize)
[email protected]61e2b3cc2012-03-02 16:13:341381 IPC_MESSAGE_HANDLER(ViewMsg_DisableAutoResize, OnDisableAutoResize)
[email protected]cda45c02010-02-25 19:28:101382 IPC_MESSAGE_HANDLER(ViewMsg_DisableScrollbarsForSmallWindows,
1383 OnDisableScrollbarsForSmallWindows)
[email protected]80d96fa2009-06-10 22:34:511384 IPC_MESSAGE_HANDLER(ViewMsg_SetRendererPrefs, OnSetRendererPrefs)
[email protected]581b87eb2009-07-23 23:06:561385 IPC_MESSAGE_HANDLER(ViewMsg_MediaPlayerActionAt, OnMediaPlayerActionAt)
[email protected]81375e872012-01-11 21:40:361386 IPC_MESSAGE_HANDLER(ViewMsg_PluginActionAt, OnPluginActionAt)
[email protected]8c66c5a2009-07-22 17:26:341387 IPC_MESSAGE_HANDLER(ViewMsg_SetActive, OnSetActive)
[email protected]18d5be92011-07-25 18:00:191388 IPC_MESSAGE_HANDLER(ViewMsg_GetAllSavableResourceLinksForCurrentPage,
1389 OnGetAllSavableResourceLinksForCurrentPage)
1390 IPC_MESSAGE_HANDLER(
1391 ViewMsg_GetSerializedHtmlDataForCurrentPageWithLocalLinks,
1392 OnGetSerializedHtmlDataForCurrentPageWithLocalLinks)
[email protected]47822262013-04-23 17:22:361393 IPC_MESSAGE_HANDLER(ViewMsg_ShowContextMenu, OnShowContextMenu)
[email protected]f0557932011-01-25 20:20:511394 // TODO(viettrungluu): Move to a separate message filter.
avi2b177592014-12-10 02:08:021395 IPC_MESSAGE_HANDLER(ViewMsg_SetHistoryOffsetAndLength,
1396 OnSetHistoryOffsetAndLength)
[email protected]5a7b15a2011-08-22 22:48:181397 IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode)
[email protected]cb189e062014-04-23 00:57:011398 IPC_MESSAGE_HANDLER(ViewMsg_ReleaseDisambiguationPopupBitmap,
1399 OnReleaseDisambiguationPopupBitmap)
[email protected]506563d2014-06-23 12:22:411400 IPC_MESSAGE_HANDLER(ViewMsg_ForceRedraw, OnForceRedraw)
[email protected]4dda6a6c2014-05-17 15:35:041401 IPC_MESSAGE_HANDLER(ViewMsg_SelectWordAroundCaret, OnSelectWordAroundCaret)
[email protected]55750b32012-09-21 14:05:031402#if defined(OS_ANDROID)
[email protected]c084330e02013-04-27 01:08:151403 IPC_MESSAGE_HANDLER(InputMsg_ActivateNearestFindResult,
[email protected]55750b32012-09-21 14:05:031404 OnActivateNearestFindResult)
1405 IPC_MESSAGE_HANDLER(ViewMsg_FindMatchRects, OnFindMatchRects)
[email protected]452b4a92013-03-28 21:24:381406 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTopControlsState,
1407 OnUpdateTopControlsState)
[email protected]c4790dcb2013-12-27 22:08:021408 IPC_MESSAGE_HANDLER(ViewMsg_ExtractSmartClipData, OnExtractSmartClipData)
[email protected]55750b32012-09-21 14:05:031409#elif defined(OS_MACOSX)
[email protected]7411a3c2014-08-15 05:20:191410 IPC_MESSAGE_HANDLER(ViewMsg_GetRenderedText,
1411 OnGetRenderedText)
[email protected]55750b32012-09-21 14:05:031412 IPC_MESSAGE_HANDLER(ViewMsg_PluginImeCompositionCompleted,
1413 OnPluginImeCompositionCompleted)
naskoc288745f2015-05-01 22:54:211414 IPC_MESSAGE_HANDLER(ViewMsg_Close, OnClose)
[email protected]55750b32012-09-21 14:05:031415 IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize)
1416 IPC_MESSAGE_HANDLER(ViewMsg_SetWindowVisibility, OnSetWindowVisibility)
1417 IPC_MESSAGE_HANDLER(ViewMsg_WindowFrameChanged, OnWindowFrameChanged)
1418#endif
[email protected]a794f3a2013-10-30 17:00:321419 // Adding a new message? Add platform independent ones first, then put the
1420 // platform specific ones at the end.
[email protected]9e1ad4b2011-08-14 16:49:191421
initial.commit09911bf2008-07-26 23:55:291422 // Have the super handle all other messages.
[email protected]a95986a82010-12-24 06:19:281423 IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
initial.commit09911bf2008-07-26 23:55:291424 IPC_END_MESSAGE_MAP()
[email protected]ffc906f2011-10-04 22:55:401425
[email protected]a95986a82010-12-24 06:19:281426 return handled;
initial.commit09911bf2008-07-26 23:55:291427}
1428
[email protected]4dda6a6c2014-05-17 15:35:041429void RenderViewImpl::OnSelectWordAroundCaret() {
1430 if (!webview())
1431 return;
1432
1433 handling_input_event_ = true;
1434 webview()->focusedFrame()->selectWordAroundCaret();
1435 handling_input_event_ = false;
1436}
1437
[email protected]310ebd6302011-10-10 19:06:281438void RenderViewImpl::OnCopyImageAt(int x, int y) {
[email protected]26aa0482009-09-30 16:55:271439 webview()->copyImageAt(WebPoint(x, y));
initial.commit09911bf2008-07-26 23:55:291440}
1441
[email protected]6a6fa3e2014-05-09 06:57:181442void RenderViewImpl::OnSaveImageAt(int x, int y) {
1443 webview()->saveImageAt(WebPoint(x, y));
1444}
1445
[email protected]310ebd6302011-10-10 19:06:281446void RenderViewImpl::OnUpdateTargetURLAck() {
initial.commit09911bf2008-07-26 23:55:291447 // Check if there is a targeturl waiting to be sent.
avi450ce00e2014-09-24 01:58:521448 if (target_url_status_ == TARGET_PENDING)
1449 Send(new ViewHostMsg_UpdateTargetURL(routing_id_, pending_target_url_));
initial.commit09911bf2008-07-26 23:55:291450
1451 target_url_status_ = TARGET_NONE;
1452}
1453
[email protected]c084330e02013-04-27 01:08:151454void RenderViewImpl::OnExecuteEditCommand(const std::string& name,
1455 const std::string& value) {
1456 if (!webview() || !webview()->focusedFrame())
1457 return;
1458
1459 webview()->focusedFrame()->executeCommand(
1460 WebString::fromUTF8(name), WebString::fromUTF8(value));
1461}
1462
1463void RenderViewImpl::OnMoveCaret(const gfx::Point& point) {
1464 if (!webview())
1465 return;
1466
christiankaeed9862014-11-05 10:49:141467 Send(new InputHostMsg_MoveCaret_ACK(routing_id_));
[email protected]c084330e02013-04-27 01:08:151468
[email protected]b74d4064d2013-11-27 01:45:091469 webview()->focusedFrame()->moveCaretSelection(point);
[email protected]c084330e02013-04-27 01:08:151470}
[email protected]a954bf72009-09-12 07:30:351471
[email protected]c084330e02013-04-27 01:08:151472void RenderViewImpl::OnScrollFocusedEditableNodeIntoRect(
1473 const gfx::Rect& rect) {
[email protected]1875bc02014-03-14 06:33:591474 if (has_scrolled_focused_editable_node_into_rect_ &&
1475 rect == rect_for_scrolled_focused_editable_node_) {
rouslanf7ebd8832015-01-22 01:54:141476 FocusChangeComplete();
[email protected]1875bc02014-03-14 06:33:591477 return;
1478 }
1479
[email protected]c39f7442014-02-27 03:33:171480 blink::WebElement element = GetFocusedElement();
rouslanf7ebd8832015-01-22 01:54:141481 bool will_animate = false;
[email protected]1875bc02014-03-14 06:33:591482 if (!element.isNull() && IsEditableNode(element)) {
1483 rect_for_scrolled_focused_editable_node_ = rect;
1484 has_scrolled_focused_editable_node_into_rect_ = true;
rouslanf7ebd8832015-01-22 01:54:141485 will_animate = webview()->scrollFocusedNodeIntoRect(rect);
[email protected]c084330e02013-04-27 01:08:151486 }
rouslanf7ebd8832015-01-22 01:54:141487
1488 if (!will_animate)
1489 FocusChangeComplete();
[email protected]25bcc8f2013-01-09 02:49:251490}
1491
[email protected]c084330e02013-04-27 01:08:151492void RenderViewImpl::OnSetEditCommandsForNextKeyEvent(
1493 const EditCommands& edit_commands) {
1494 edit_commands_ = edit_commands;
1495}
1496
avi2b177592014-12-10 02:08:021497void RenderViewImpl::OnSetHistoryOffsetAndLength(int history_offset,
1498 int history_length) {
1499 DCHECK_GE(history_offset, -1);
[email protected]e1ed5a12012-08-08 19:57:441500 DCHECK_GE(history_length, 0);
[email protected]9e1ad4b2011-08-14 16:49:191501
avi2b177592014-12-10 02:08:021502 history_list_offset_ = history_offset;
1503 history_list_length_ = history_length;
[email protected]9e1ad4b2011-08-14 16:49:191504}
1505
[email protected]310ebd6302011-10-10 19:06:281506void RenderViewImpl::OnSetInitialFocus(bool reverse) {
initial.commit09911bf2008-07-26 23:55:291507 if (!webview())
1508 return;
[email protected]26aa0482009-09-30 16:55:271509 webview()->setInitialFocus(reverse);
initial.commit09911bf2008-07-26 23:55:291510}
1511
[email protected]54ca3ca892011-06-07 21:14:541512#if defined(OS_MACOSX)
[email protected]310ebd6302011-10-10 19:06:281513void RenderViewImpl::OnSetInLiveResize(bool in_live_resize) {
[email protected]4274b3e2011-08-09 19:09:331514 if (!webview())
1515 return;
1516 if (in_live_resize)
1517 webview()->willStartLiveResize();
1518 else
1519 webview()->willEndLiveResize();
[email protected]54ca3ca892011-06-07 21:14:541520}
1521#endif
1522
initial.commit09911bf2008-07-26 23:55:291523///////////////////////////////////////////////////////////////////////////////
1524
avif937e1d2014-11-02 18:13:071525// Sends the current history state to the browser so it will be saved before we
1526// navigate to a new page.
1527void RenderViewImpl::UpdateSessionHistory(WebFrame* frame) {
1528 // If we have a valid page ID at this point, then it corresponds to the page
1529 // we are navigating away from. Otherwise, this is the first navigation, so
1530 // there is no past session history to record.
1531 if (page_id_ == -1)
1532 return;
1533 SendUpdateState(history_controller_->GetCurrentEntry());
1534}
1535
1536void RenderViewImpl::SendUpdateState(HistoryEntry* entry) {
1537 if (!entry)
1538 return;
1539
1540 // Don't send state updates for kSwappedOutURL.
1541 if (entry->root().urlString() == WebString::fromUTF8(kSwappedOutURL))
1542 return;
1543
1544 Send(new ViewHostMsg_UpdateState(
1545 routing_id_, page_id_, HistoryEntryToPageState(entry)));
1546}
1547
sataya.mf405d0e2015-07-07 16:51:111548void RenderViewImpl::ApplyWebPreferencesInternal(
1549 const WebPreferences& prefs,
1550 blink::WebView* web_view,
1551 CompositorDependencies* compositor_deps) {
1552 ApplyWebPreferences(prefs, web_view);
1553#if defined(OS_MACOSX) && !defined(OS_IOS)
1554 DCHECK(compositor_deps);
1555 bool is_elastic_overscroll_enabled =
1556 compositor_deps->IsElasticOverscrollEnabled();
1557 web_view->settings()->setReportWheelOverscroll(is_elastic_overscroll_enabled);
1558#endif
1559}
1560
[email protected]310ebd6302011-10-10 19:06:281561bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) {
[email protected]c1f50aa2010-02-18 03:46:571562 // Before WebKit asks us to show an alert (etc.), it takes care of doing the
1563 // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog
1564 // it is particularly important that we do not call willEnterModalLoop as
1565 // that would defer resource loads for the dialog itself.
[email protected]f1a29a02011-10-06 23:08:441566 if (RenderThreadImpl::current()) // Will be NULL during unit tests.
1567 RenderThreadImpl::current()->DoNotNotifyWebKitOfModalLoop();
[email protected]c1f50aa2010-02-18 03:46:571568
1569 message->EnableMessagePumping(); // Runs a nested message loop.
1570 return Send(message);
1571}
1572
[email protected]506563d2014-06-23 12:22:411573void RenderViewImpl::OnForceRedraw(int id) {
1574 ui::LatencyInfo latency_info;
[email protected]f9f3fac2014-08-05 00:47:591575 if (id) {
1576 latency_info.AddLatencyNumber(ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT,
1577 0,
1578 id);
1579 }
[email protected]6be422b2013-12-08 06:47:311580 scoped_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor;
[email protected]7d08a9352013-10-15 08:24:561581 if (RenderWidgetCompositor* rwc = compositor()) {
[email protected]6be422b2013-12-08 06:47:311582 latency_info_swap_promise_monitor =
1583 rwc->CreateLatencyInfoSwapPromiseMonitor(&latency_info).Pass();
[email protected]7d08a9352013-10-15 08:24:561584 }
1585 ScheduleCompositeWithForcedRedraw();
[email protected]c9bc8f12012-12-15 22:20:091586}
1587
[email protected]180ef242013-11-07 06:50:461588// blink::WebViewClient ------------------------------------------------------
[email protected]48c9cf2d2009-09-16 16:47:521589
[email protected]35b2a972014-04-04 15:50:221590WebView* RenderViewImpl::createView(WebLocalFrame* creator,
1591 const WebURLRequest& request,
1592 const WebWindowFeatures& features,
1593 const WebString& frame_name,
1594 WebNavigationPolicy policy,
1595 bool suppress_opener) {
[email protected]8ab04652010-06-12 02:47:261596 ViewHostMsg_CreateWindow_Params params;
1597 params.opener_id = routing_id_;
[email protected]af15bf22013-03-08 01:18:171598 params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture();
[email protected]00323f02013-07-24 15:47:411599 if (GetContentClient()->renderer()->AllowPopup())
1600 params.user_gesture = true;
[email protected]8ab04652010-06-12 02:47:261601 params.window_container_type = WindowFeaturesToContainerType(features);
1602 params.session_storage_namespace_id = session_storage_namespace_id_;
[email protected]5cef23d2013-02-27 13:11:211603 if (frame_name != "_blank")
nasko48321ca32015-07-02 20:44:121604 params.frame_name = base::UTF16ToUTF8(frame_name);
[email protected]a7531d772014-03-25 16:15:071605 params.opener_render_frame_id =
[email protected]501052ff2014-02-21 22:19:071606 RenderFrameImpl::FromWebFrame(creator)->GetRoutingID();
[email protected]b6cb3a842011-06-24 18:28:411607 params.opener_url = creator->document().url();
alexmosa97d5c52015-06-19 22:19:091608
1609 // The browser process uses the top frame's URL for a content settings check
1610 // to determine whether the popup is allowed. If the top frame is remote,
1611 // its URL is not available, so use its replicated origin instead.
1612 //
1613 // TODO(alexmos): This works fine for regular origins but may break path
1614 // matching for file URLs with OOP subframes that open popups. This should
1615 // be fixed by either moving this lookup to the browser process or removing
1616 // path-based matching for file URLs from content settings. See
1617 // https://crbug.com/466297.
1618 if (creator->top()->isWebLocalFrame()) {
1619 params.opener_top_level_frame_url = creator->top()->document().url();
1620 } else {
1621 params.opener_top_level_frame_url =
1622 GURL(creator->top()->securityOrigin().toString());
1623 }
1624
[email protected]6c53a7f2014-03-31 16:56:281625 GURL security_url(creator->document().securityOrigin().toString());
[email protected]7f48b712013-01-25 01:48:301626 if (!security_url.is_valid())
1627 security_url = GURL();
1628 params.opener_security_origin = security_url;
[email protected]147b2bf2013-11-05 04:00:041629 params.opener_suppressed = suppress_opener;
[email protected]f92ce2b2012-03-06 18:02:591630 params.disposition = NavigationPolicyToDisposition(policy);
[email protected]44e55b012013-07-23 14:21:561631 if (!request.isNull()) {
[email protected]41e65502011-01-21 09:29:111632 params.target_url = request.url();
[email protected]44e55b012013-07-23 14:21:561633 params.referrer = GetReferrerFromRequest(creator, request);
1634 }
[email protected]453c1b22013-07-23 09:31:481635 params.features = features;
[email protected]8ab04652010-06-12 02:47:261636
[email protected]22217ed32013-11-18 18:40:231637 for (size_t i = 0; i < features.additionalFeatures.size(); ++i)
1638 params.additional_features.push_back(features.additionalFeatures[i]);
1639
[email protected]48c9cf2d2009-09-16 16:47:521640 int32 routing_id = MSG_ROUTING_NONE;
[email protected]227692c52013-05-31 22:43:041641 int32 main_frame_routing_id = MSG_ROUTING_NONE;
[email protected]9f4f3322012-01-18 22:29:561642 int32 surface_id = 0;
[email protected]176fe9a2014-07-08 02:31:531643 int64 cloned_session_storage_namespace_id = 0;
[email protected]48c9cf2d2009-09-16 16:47:521644
danakj6e3bf8012014-12-16 18:27:531645 RenderThread::Get()->Send(new ViewHostMsg_CreateWindow(
1646 params, &routing_id, &main_frame_routing_id, &surface_id,
1647 &cloned_session_storage_namespace_id));
[email protected]12636df2009-09-28 22:32:211648 if (routing_id == MSG_ROUTING_NONE)
[email protected]48c9cf2d2009-09-16 16:47:521649 return NULL;
[email protected]48c9cf2d2009-09-16 16:47:521650
[email protected]af15bf22013-03-08 01:18:171651 WebUserGestureIndicator::consumeUserGesture();
[email protected]c59262422012-11-30 21:20:521652
[email protected]7912e822014-04-16 02:37:031653 // While this view may be a background extension page, it can spawn a visible
1654 // render view. So we just assume that the new one is not another background
1655 // page instead of passing on our own value.
1656 // TODO(vangelis): Can we tell if the new view will be a background page?
1657 bool never_visible = false;
[email protected]9115d5f2013-03-24 04:37:411658
mkosiba58fa72f02014-11-12 01:21:361659 ViewMsg_Resize_Params initial_size = ViewMsg_Resize_Params();
1660 initial_size.screen_info = screen_info_;
1661
[email protected]d6fa88f2013-10-18 16:00:431662 // The initial hidden state for the RenderViewImpl here has to match what the
1663 // browser will eventually decide for the given disposition. Since we have to
1664 // return from this call synchronously, we just have to make our best guess
1665 // and rely on the browser sending a WasHidden / WasShown message if it
1666 // disagrees.
naskobd911332014-11-25 01:13:361667 ViewMsg_New_Params view_params;
alexmos5ac402d2015-07-09 07:51:101668
1669 RenderFrameImpl* creator_frame = RenderFrameImpl::FromWebFrame(creator);
1670 view_params.opener_frame_route_id = creator_frame->GetRoutingID();
1671 DCHECK_EQ(routing_id_, creator_frame->render_view()->GetRoutingID());
1672
naskobd911332014-11-25 01:13:361673 view_params.window_was_created_with_opener = true;
1674 view_params.renderer_preferences = renderer_preferences_;
1675 view_params.web_preferences = webkit_preferences_;
1676 view_params.view_id = routing_id;
1677 view_params.main_frame_routing_id = main_frame_routing_id;
1678 view_params.surface_id = surface_id;
1679 view_params.session_storage_namespace_id =
1680 cloned_session_storage_namespace_id;
naskobd911332014-11-25 01:13:361681 view_params.swapped_out = false;
alexmos3448b552015-06-26 07:49:131682 // WebCore will take care of setting the correct name.
alexmosbc7eafa2014-12-06 01:38:091683 view_params.replicated_frame_state = FrameReplicationState();
naskobd911332014-11-25 01:13:361684 view_params.proxy_routing_id = MSG_ROUTING_NONE;
1685 view_params.hidden = (params.disposition == NEW_BACKGROUND_TAB);
1686 view_params.never_visible = never_visible;
1687 view_params.next_page_id = 1;
1688 view_params.initial_size = initial_size;
1689 view_params.enable_auto_resize = false;
1690 view_params.min_size = gfx::Size();
1691 view_params.max_size = gfx::Size();
1692
danakj6e3bf8012014-12-16 18:27:531693 RenderViewImpl* view =
1694 RenderViewImpl::Create(view_params, compositor_deps_, true);
[email protected]8ab04652010-06-12 02:47:261695 view->opened_by_user_gesture_ = params.user_gesture;
[email protected]48c9cf2d2009-09-16 16:47:521696
[email protected]007a848b2009-10-26 15:55:461697 // Record whether the creator frame is trying to suppress the opener field.
[email protected]f92ce2b2012-03-06 18:02:591698 view->opener_suppressed_ = params.opener_suppressed;
[email protected]007a848b2009-10-26 15:55:461699
[email protected]48c9cf2d2009-09-16 16:47:521700 return view->webview();
1701}
1702
[email protected]180ef242013-11-07 06:50:461703WebWidget* RenderViewImpl::createPopupMenu(blink::WebPopupType popup_type) {
danakj6e3bf8012014-12-16 18:27:531704 RenderWidget* widget = RenderWidget::Create(routing_id_, compositor_deps_,
1705 popup_type, screen_info_);
[email protected]3b78ec12014-03-04 05:18:281706 if (!widget)
1707 return NULL;
[email protected]b2e4c70132013-10-03 02:07:511708 if (screen_metrics_emulator_) {
1709 widget->SetPopupOriginAdjustmentsForEmulation(
1710 screen_metrics_emulator_.get());
1711 }
[email protected]48c9cf2d2009-09-16 16:47:521712 return widget->webwidget();
1713}
1714
[email protected]23367482013-06-27 21:06:541715WebStorageNamespace* RenderViewImpl::createSessionStorageNamespace() {
[email protected]5f2aa722013-08-07 16:59:411716 CHECK(session_storage_namespace_id_ != kInvalidSessionStorageNamespaceId);
[email protected]1910fe82012-05-10 00:04:101717 return new WebStorageNamespaceImpl(session_storage_namespace_id_);
[email protected]bd92c3a2010-01-13 05:02:341718}
1719
[email protected]35b2a972014-04-04 15:50:221720void RenderViewImpl::printPage(WebLocalFrame* frame) {
[email protected]b0553c7e2012-09-19 21:36:111721 FOR_EACH_OBSERVER(RenderViewObserver, observers_,
1722 PrintPage(frame, handling_input_event_));
[email protected]48c9cf2d2009-09-16 16:47:521723}
1724
jinho.bang632a1a722014-09-18 03:02:561725void RenderViewImpl::saveImageFromDataURL(const blink::WebString& data_url) {
1726 // Note: We should basically send GURL but we use size-limited string instead
1727 // in order to send a larger data url to save a image for <canvas> or <img>.
1728 if (data_url.length() < kMaxLengthOfDataURLString)
1729 Send(new ViewHostMsg_SaveImageFromDataURL(routing_id_, data_url.utf8()));
1730}
1731
[email protected]310ebd6302011-10-10 19:06:281732bool RenderViewImpl::enumerateChosenDirectory(
[email protected]8a58c1c2011-04-19 18:40:121733 const WebString& path,
1734 WebFileChooserCompletion* chooser_completion) {
1735 int id = enumeration_completion_id_++;
1736 enumeration_completions_[id] = chooser_completion;
1737 return Send(new ViewHostMsg_EnumerateDirectory(
1738 routing_id_,
1739 id,
[email protected]728c2ee2013-06-25 04:01:071740 base::FilePath::FromUTF16Unsafe(path)));
[email protected]8a58c1c2011-04-19 18:40:121741}
1742
[email protected]7e9523b2014-03-25 03:02:421743void RenderViewImpl::FrameDidStartLoading(WebFrame* frame) {
[email protected]7e9523b2014-03-25 03:02:421744 DCHECK_GE(frames_in_progress_, 0);
1745 if (frames_in_progress_ == 0)
1746 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStartLoading());
1747 frames_in_progress_++;
[email protected]6dd5c322014-03-12 07:58:461748}
1749
[email protected]7e9523b2014-03-25 03:02:421750void RenderViewImpl::FrameDidStopLoading(WebFrame* frame) {
[email protected]eb473772014-04-11 20:54:331751 // TODO(japhet): This should be a DCHECK, but the pdf plugin sometimes
1752 // calls DidStopLoading() without a matching DidStartLoading().
1753 if (frames_in_progress_ == 0)
1754 return;
[email protected]7e9523b2014-03-25 03:02:421755 frames_in_progress_--;
[email protected]7e9523b2014-03-25 03:02:421756 if (frames_in_progress_ == 0) {
1757 DidStopLoadingIcons();
1758 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStopLoading());
1759 }
[email protected]48c9cf2d2009-09-16 16:47:521760}
1761
[email protected]550b0c92013-02-04 05:09:151762void RenderViewImpl::didCancelCompositionOnSelectionChange() {
[email protected]a2214eb2014-06-23 18:31:221763 Send(new InputHostMsg_ImeCancelComposition(routing_id()));
[email protected]550b0c92013-02-04 05:09:151764}
1765
[email protected]310ebd6302011-10-10 19:06:281766bool RenderViewImpl::handleCurrentKeyboardEvent() {
[email protected]b2528b72009-09-24 06:57:101767 if (edit_commands_.empty())
1768 return false;
1769
[email protected]26aa0482009-09-30 16:55:271770 WebFrame* frame = webview()->focusedFrame();
[email protected]b2528b72009-09-24 06:57:101771 if (!frame)
1772 return false;
1773
1774 EditCommands::iterator it = edit_commands_.begin();
1775 EditCommands::iterator end = edit_commands_.end();
1776
[email protected]507b33ea2009-09-29 03:56:511777 bool did_execute_command = false;
[email protected]b2528b72009-09-24 06:57:101778 for (; it != end; ++it) {
[email protected]e6e15012009-09-30 14:59:331779 // In gtk and cocoa, it's possible to bind multiple edit commands to one
1780 // key (but it's the exception). Once one edit command is not executed, it
1781 // seems safest to not execute the rest.
[email protected]b2528b72009-09-24 06:57:101782 if (!frame->executeCommand(WebString::fromUTF8(it->name),
[email protected]b77fac52013-06-01 01:03:461783 WebString::fromUTF8(it->value),
[email protected]c39f7442014-02-27 03:33:171784 GetFocusedElement()))
[email protected]b2528b72009-09-24 06:57:101785 break;
[email protected]507b33ea2009-09-29 03:56:511786 did_execute_command = true;
[email protected]b2528b72009-09-24 06:57:101787 }
1788
[email protected]507b33ea2009-09-29 03:56:511789 return did_execute_command;
[email protected]b2528b72009-09-24 06:57:101790}
1791
[email protected]310ebd6302011-10-10 19:06:281792bool RenderViewImpl::runFileChooser(
[email protected]180ef242013-11-07 06:50:461793 const blink::WebFileChooserParams& params,
[email protected]cdaf8d02010-03-30 19:52:471794 WebFileChooserCompletion* chooser_completion) {
[email protected]7ef03e02010-10-23 11:58:351795 // Do not open the file dialog in a hidden RenderView.
1796 if (is_hidden())
1797 return false;
[email protected]e9ff79c2012-10-19 21:31:261798 FileChooserParams ipc_params;
[email protected]b5977a0c2010-08-24 19:46:261799 if (params.directory)
[email protected]6bedbef2013-07-31 06:33:491800 ipc_params.mode = FileChooserParams::UploadFolder;
[email protected]b5977a0c2010-08-24 19:46:261801 else if (params.multiSelect)
[email protected]e9ff79c2012-10-19 21:31:261802 ipc_params.mode = FileChooserParams::OpenMultiple;
[email protected]459fba82011-10-13 02:48:501803 else if (params.saveAs)
[email protected]e9ff79c2012-10-19 21:31:261804 ipc_params.mode = FileChooserParams::Save;
[email protected]b5977a0c2010-08-24 19:46:261805 else
[email protected]e9ff79c2012-10-19 21:31:261806 ipc_params.mode = FileChooserParams::Open;
[email protected]cdaf8d02010-03-30 19:52:471807 ipc_params.title = params.title;
1808 ipc_params.default_file_name =
wfh815c4872015-02-25 21:01:311809 base::FilePath::FromUTF16Unsafe(params.initialValue).BaseName();
[email protected]f9a4c41a2012-05-30 00:05:321810 ipc_params.accept_types.reserve(params.acceptTypes.size());
1811 for (size_t i = 0; i < params.acceptTypes.size(); ++i)
1812 ipc_params.accept_types.push_back(params.acceptTypes[i]);
hironoe9f2732b2014-10-22 08:06:411813 ipc_params.need_local_path = params.needLocalPath;
[email protected]2fdf2352012-11-01 19:23:021814#if defined(OS_ANDROID)
[email protected]b7b4beb2013-07-09 14:06:501815 ipc_params.capture = params.useMediaCapture;
[email protected]2fdf2352012-11-01 19:23:021816#endif
[email protected]cdaf8d02010-03-30 19:52:471817
1818 return ScheduleFileChooser(ipc_params, chooser_completion);
[email protected]a1128322009-10-06 18:38:461819}
1820
habib.virji597255e2014-09-09 00:30:181821void RenderViewImpl::SetValidationMessageDirection(
1822 base::string16* wrapped_main_text,
1823 blink::WebTextDirection main_text_hint,
1824 base::string16* wrapped_sub_text,
1825 blink::WebTextDirection sub_text_hint) {
1826 if (main_text_hint == blink::WebTextDirectionLeftToRight) {
1827 *wrapped_main_text =
1828 base::i18n::GetDisplayStringInLTRDirectionality(*wrapped_main_text);
1829 } else if (main_text_hint == blink::WebTextDirectionRightToLeft &&
1830 !base::i18n::IsRTL()) {
1831 base::i18n::WrapStringWithRTLFormatting(wrapped_main_text);
1832 }
1833
1834 if (!wrapped_sub_text->empty()) {
1835 if (sub_text_hint == blink::WebTextDirectionLeftToRight) {
1836 *wrapped_sub_text =
1837 base::i18n::GetDisplayStringInLTRDirectionality(*wrapped_sub_text);
1838 } else if (sub_text_hint == blink::WebTextDirectionRightToLeft) {
1839 base::i18n::WrapStringWithRTLFormatting(wrapped_sub_text);
1840 }
1841 }
1842}
1843
[email protected]edc3af82013-12-12 21:24:071844void RenderViewImpl::showValidationMessage(
1845 const blink::WebRect& anchor_in_root_view,
1846 const blink::WebString& main_text,
habib.virji597255e2014-09-09 00:30:181847 blink::WebTextDirection main_text_hint,
[email protected]edc3af82013-12-12 21:24:071848 const blink::WebString& sub_text,
habib.virji597255e2014-09-09 00:30:181849 blink::WebTextDirection sub_text_hint) {
[email protected]edc3af82013-12-12 21:24:071850 base::string16 wrapped_main_text = main_text;
1851 base::string16 wrapped_sub_text = sub_text;
habib.virji597255e2014-09-09 00:30:181852
1853 SetValidationMessageDirection(
1854 &wrapped_main_text, main_text_hint, &wrapped_sub_text, sub_text_hint);
1855
[email protected]edc3af82013-12-12 21:24:071856 Send(new ViewHostMsg_ShowValidationMessage(
[email protected]2d6836f42014-07-02 17:25:311857 routing_id(), AdjustValidationMessageAnchor(anchor_in_root_view),
1858 wrapped_main_text, wrapped_sub_text));
[email protected]edc3af82013-12-12 21:24:071859}
1860
1861void RenderViewImpl::hideValidationMessage() {
1862 Send(new ViewHostMsg_HideValidationMessage(routing_id()));
1863}
1864
1865void RenderViewImpl::moveValidationMessage(
1866 const blink::WebRect& anchor_in_root_view) {
[email protected]2d6836f42014-07-02 17:25:311867 Send(new ViewHostMsg_MoveValidationMessage(
1868 routing_id(), AdjustValidationMessageAnchor(anchor_in_root_view)));
[email protected]edc3af82013-12-12 21:24:071869}
1870
[email protected]310ebd6302011-10-10 19:06:281871void RenderViewImpl::setStatusText(const WebString& text) {
[email protected]48c9cf2d2009-09-16 16:47:521872}
1873
[email protected]310ebd6302011-10-10 19:06:281874void RenderViewImpl::UpdateTargetURL(const GURL& url,
1875 const GURL& fallback_url) {
[email protected]aa6b90b32010-04-26 15:49:581876 GURL latest_url = url.is_empty() ? fallback_url : url;
[email protected]48c9cf2d2009-09-16 16:47:521877 if (latest_url == target_url_)
1878 return;
[email protected]163f8242009-10-30 20:19:551879
[email protected]48c9cf2d2009-09-16 16:47:521880 // Tell the browser to display a destination link.
1881 if (target_url_status_ == TARGET_INFLIGHT ||
1882 target_url_status_ == TARGET_PENDING) {
1883 // If we have a request in-flight, save the URL to be sent when we
1884 // receive an ACK to the in-flight request. We can happily overwrite
1885 // any existing pending sends.
1886 pending_target_url_ = latest_url;
1887 target_url_status_ = TARGET_PENDING;
1888 } else {
[email protected]f16cc6782013-12-16 23:42:571889 // URLs larger than |MaxURLChars()| cannot be sent through IPC -
[email protected]c85f0212011-11-04 16:54:411890 // see |ParamTraits<GURL>|.
[email protected]f16cc6782013-12-16 23:42:571891 if (latest_url.possibly_invalid_spec().size() > GetMaxURLChars())
[email protected]c85f0212011-11-04 16:54:411892 latest_url = GURL();
avi450ce00e2014-09-24 01:58:521893 Send(new ViewHostMsg_UpdateTargetURL(routing_id_, latest_url));
[email protected]48c9cf2d2009-09-16 16:47:521894 target_url_ = latest_url;
1895 target_url_status_ = TARGET_INFLIGHT;
1896 }
1897}
1898
[email protected]70221f02013-01-31 22:17:071899gfx::RectF RenderViewImpl::ClientRectToPhysicalWindowRect(
1900 const gfx::RectF& rect) const {
1901 gfx::RectF window_rect = rect;
1902 window_rect.Scale(device_scale_factor_ * webview()->pageScaleFactor());
1903 return window_rect;
1904}
1905
avif937e1d2014-11-02 18:13:071906void RenderViewImpl::StartNavStateSyncTimerIfNecessary() {
1907 // No need to update state if no page has committed yet.
[email protected]a183fb82012-12-14 04:46:221908 if (page_id_ == -1)
1909 return;
1910
[email protected]882daa92009-11-05 16:31:311911 int delay;
avif937e1d2014-11-02 18:13:071912 if (send_content_state_immediately_)
[email protected]882daa92009-11-05 16:31:311913 delay = 0;
1914 else if (is_hidden())
avif937e1d2014-11-02 18:13:071915 delay = kDelaySecondsForContentStateSyncHidden;
[email protected]882daa92009-11-05 16:31:311916 else
avif937e1d2014-11-02 18:13:071917 delay = kDelaySecondsForContentStateSync;
[email protected]882daa92009-11-05 16:31:311918
avif937e1d2014-11-02 18:13:071919 if (nav_state_sync_timer_.IsRunning()) {
[email protected]882daa92009-11-05 16:31:311920 // The timer is already running. If the delay of the timer maches the amount
1921 // we want to delay by, then return. Otherwise stop the timer so that it
1922 // gets started with the right delay.
avif937e1d2014-11-02 18:13:071923 if (nav_state_sync_timer_.GetCurrentDelay().InSeconds() == delay)
[email protected]882daa92009-11-05 16:31:311924 return;
avif937e1d2014-11-02 18:13:071925 nav_state_sync_timer_.Stop();
[email protected]882daa92009-11-05 16:31:311926 }
1927
avif937e1d2014-11-02 18:13:071928 nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this,
1929 &RenderViewImpl::SyncNavigationState);
[email protected]882daa92009-11-05 16:31:311930}
1931
[email protected]310ebd6302011-10-10 19:06:281932void RenderViewImpl::setMouseOverURL(const WebURL& url) {
[email protected]163f8242009-10-30 20:19:551933 mouse_over_url_ = GURL(url);
1934 UpdateTargetURL(mouse_over_url_, focus_url_);
1935}
1936
[email protected]310ebd6302011-10-10 19:06:281937void RenderViewImpl::setKeyboardFocusURL(const WebURL& url) {
[email protected]163f8242009-10-30 20:19:551938 focus_url_ = GURL(url);
1939 UpdateTargetURL(focus_url_, mouse_over_url_);
1940}
1941
[email protected]35b2a972014-04-04 15:50:221942void RenderViewImpl::startDragging(WebLocalFrame* frame,
[email protected]0407e422012-05-18 19:51:251943 const WebDragData& data,
[email protected]310ebd6302011-10-10 19:06:281944 WebDragOperationsMask mask,
1945 const WebImage& image,
[email protected]ceb36f7d2012-10-31 18:33:241946 const WebPoint& webImageOffset) {
[email protected]dc293a72013-07-01 11:11:221947 DropData drop_data(DropDataBuilder::Build(data));
[email protected]b67151d2012-05-25 23:23:241948 drop_data.referrer_policy = frame->document().referrerPolicy();
[email protected]ceb36f7d2012-10-31 18:33:241949 gfx::Vector2d imageOffset(webImageOffset.x, webImageOffset.y);
[email protected]59f4f2fa2011-03-23 01:00:551950 Send(new DragHostMsg_StartDragging(routing_id_,
[email protected]b67151d2012-05-25 23:23:241951 drop_data,
[email protected]c27ae592010-03-18 15:24:411952 mask,
[email protected]976127072012-05-10 20:08:111953 image.getSkBitmap(),
[email protected]41d86852012-11-07 12:23:241954 imageOffset,
1955 possible_drag_event_info_));
[email protected]48c9cf2d2009-09-16 16:47:521956}
1957
[email protected]310ebd6302011-10-10 19:06:281958bool RenderViewImpl::acceptsLoadDrops() {
[email protected]28b92df2009-09-25 17:35:451959 return renderer_preferences_.can_accept_load_drops;
1960}
1961
[email protected]310ebd6302011-10-10 19:06:281962void RenderViewImpl::focusNext() {
[email protected]48c9cf2d2009-09-16 16:47:521963 Send(new ViewHostMsg_TakeFocus(routing_id_, false));
1964}
1965
[email protected]310ebd6302011-10-10 19:06:281966void RenderViewImpl::focusPrevious() {
[email protected]48c9cf2d2009-09-16 16:47:521967 Send(new ViewHostMsg_TakeFocus(routing_id_, true));
1968}
1969
estade31c54342015-01-23 03:34:361970void RenderViewImpl::focusedNodeChanged(const WebNode& fromNode,
1971 const WebNode& toNode) {
[email protected]1875bc02014-03-14 06:33:591972 has_scrolled_focused_editable_node_into_rect_ = false;
1973
jennyz399d6e62014-12-16 01:40:051974 gfx::Rect node_bounds;
estade31c54342015-01-23 03:34:361975 if (!toNode.isNull() && toNode.isElementNode()) {
1976 WebNode web_node = const_cast<WebNode&>(toNode);
jennyz399d6e62014-12-16 01:40:051977 node_bounds = gfx::Rect(web_node.to<WebElement>().boundsInViewportSpace());
1978 }
estade31c54342015-01-23 03:34:361979 Send(new ViewHostMsg_FocusedNodeChanged(routing_id_, IsEditableNode(toNode),
jennyz399d6e62014-12-16 01:40:051980 node_bounds));
[email protected]a4b103b2010-10-05 18:46:071981
estade31c54342015-01-23 03:34:361982 // TODO(estade): remove.
1983 FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusedNodeChanged(toNode));
[email protected]95640212014-07-26 18:14:301984
estade31c54342015-01-23 03:34:361985 RenderFrameImpl* previous_frame = nullptr;
1986 if (!fromNode.isNull())
1987 previous_frame = RenderFrameImpl::FromWebFrame(fromNode.document().frame());
1988 RenderFrameImpl* new_frame = nullptr;
1989 if (!toNode.isNull())
1990 new_frame = RenderFrameImpl::FromWebFrame(toNode.document().frame());
1991
1992 if (previous_frame && previous_frame != new_frame)
1993 previous_frame->FocusedNodeChanged(WebNode());
1994 if (new_frame)
1995 new_frame->FocusedNodeChanged(toNode);
1996
1997 // TODO(dmazzoni): remove once there's a separate a11y tree per frame.
1998 GetMainRenderFrame()->FocusedNodeChangedForAccessibility(toNode);
[email protected]08e9e132010-06-01 16:58:491999}
2000
[email protected]169d4282011-11-30 19:33:592001void RenderViewImpl::didUpdateLayout() {
[email protected]d01b2a62013-09-18 23:21:332002 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidUpdateLayout());
2003
[email protected]169d4282011-11-30 19:33:592004 // We don't always want to set up a timer, only if we've been put in that
2005 // mode by getting a |ViewMsg_EnablePreferredSizeChangedMode|
2006 // message.
2007 if (!send_preferred_size_changes_ || !webview())
2008 return;
2009
2010 if (check_preferred_size_timer_.IsRunning())
2011 return;
2012 check_preferred_size_timer_.Start(FROM_HERE,
2013 TimeDelta::FromMilliseconds(0), this,
2014 &RenderViewImpl::CheckPreferredSize);
2015}
2016
[email protected]310ebd6302011-10-10 19:06:282017void RenderViewImpl::navigateBackForwardSoon(int offset) {
[email protected]48c9cf2d2009-09-16 16:47:522018 Send(new ViewHostMsg_GoToEntryAtOffset(routing_id_, offset));
2019}
2020
[email protected]310ebd6302011-10-10 19:06:282021int RenderViewImpl::historyBackListCount() {
[email protected]3cc72b12010-03-18 23:03:002022 return history_list_offset_ < 0 ? 0 : history_list_offset_;
[email protected]48c9cf2d2009-09-16 16:47:522023}
2024
[email protected]310ebd6302011-10-10 19:06:282025int RenderViewImpl::historyForwardListCount() {
[email protected]3cc72b12010-03-18 23:03:002026 return history_list_length_ - historyBackListCount() - 1;
[email protected]48c9cf2d2009-09-16 16:47:522027}
2028
[email protected]180ef242013-11-07 06:50:462029// blink::WebWidgetClient ----------------------------------------------------
[email protected]79dbc662009-09-04 05:42:512030
[email protected]310ebd6302011-10-10 19:06:282031void RenderViewImpl::didFocus() {
[email protected]ea42e7782010-08-23 23:58:122032 // TODO(jcivelli): when https://bugs.webkit.org/show_bug.cgi?id=33389 is fixed
2033 // we won't have to test for user gesture anymore and we can
2034 // move that code back to render_widget.cc
[email protected]af15bf22013-03-08 01:18:172035 if (WebUserGestureIndicator::isProcessingUserGesture() &&
[email protected]70dee7e2013-05-29 18:28:302036 !RenderThreadImpl::current()->layout_test_mode()) {
[email protected]e1176152013-03-06 09:16:442037 Send(new ViewHostMsg_Focus(routing_id_));
[email protected]ea42e7782010-08-23 23:58:122038 }
2039}
2040
[email protected]310ebd6302011-10-10 19:06:282041void RenderViewImpl::didBlur() {
[email protected]ea42e7782010-08-23 23:58:122042 // TODO(jcivelli): see TODO above in didFocus().
[email protected]af15bf22013-03-08 01:18:172043 if (WebUserGestureIndicator::isProcessingUserGesture() &&
[email protected]70dee7e2013-05-29 18:28:302044 !RenderThreadImpl::current()->layout_test_mode()) {
[email protected]e1176152013-03-06 09:16:442045 Send(new ViewHostMsg_Blur(routing_id_));
[email protected]ea42e7782010-08-23 23:58:122046 }
2047}
2048
initial.commit09911bf2008-07-26 23:55:292049// We are supposed to get a single call to Show for a newly created RenderView
[email protected]310ebd6302011-10-10 19:06:282050// that was created via RenderViewImpl::CreateWebView. So, we wait until this
initial.commit09911bf2008-07-26 23:55:292051// point to dispatch the ShowView message.
2052//
2053// This method provides us with the information about how to display the newly
[email protected]5f9de5882011-09-30 23:36:282054// created RenderView (i.e., as a blocked popup or as a new tab).
initial.commit09911bf2008-07-26 23:55:292055//
[email protected]310ebd6302011-10-10 19:06:282056void RenderViewImpl::show(WebNavigationPolicy policy) {
[email protected]b2142e962012-10-30 13:59:252057 if (did_show_) {
[email protected]b2142e962012-10-30 13:59:252058 // When supports_multiple_windows is disabled, popups are reusing
2059 // the same view. In some scenarios, this makes WebKit to call show() twice.
[email protected]c9edabd2013-05-23 13:56:242060 if (webkit_preferences_.supports_multiple_windows)
2061 NOTREACHED() << "received extraneous Show call";
initial.commit09911bf2008-07-26 23:55:292062 return;
[email protected]b2142e962012-10-30 13:59:252063 }
initial.commit09911bf2008-07-26 23:55:292064 did_show_ = true;
2065
[email protected]b2142e962012-10-30 13:59:252066 DCHECK(opener_id_ != MSG_ROUTING_NONE);
2067
bokanc007c3a2015-02-03 07:15:562068 // NOTE: initial_rect_ may still have its default values at this point, but
initial.commit09911bf2008-07-26 23:55:292069 // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the
2070 // browser process will impose a default position otherwise.
[email protected]4873c7d2009-07-16 06:36:282071 Send(new ViewHostMsg_ShowView(opener_id_, routing_id_,
bokanc007c3a2015-02-03 07:15:562072 NavigationPolicyToDisposition(policy), initial_rect_,
[email protected]7e7414ae2010-01-26 20:19:292073 opened_by_user_gesture_));
bokanc007c3a2015-02-03 07:15:562074 SetPendingWindowRect(initial_rect_);
initial.commit09911bf2008-07-26 23:55:292075}
2076
[email protected]217690d2012-01-27 07:33:112077bool RenderViewImpl::requestPointerLock() {
2078 return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get());
2079}
2080
2081void RenderViewImpl::requestPointerUnlock() {
2082 mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get());
2083}
2084
2085bool RenderViewImpl::isPointerLocked() {
2086 return mouse_lock_dispatcher_->IsMouseLockedTo(
2087 webwidget_mouse_lock_target_.get());
2088}
2089
miletuse8d28ba2015-06-19 04:52:042090void RenderViewImpl::onMouseDown(const WebNode& mouse_down_node) {
2091 FOR_EACH_OBSERVER(
2092 RenderViewObserver, observers_, OnMouseDown(mouse_down_node));
2093}
2094
[email protected]c68c3e4e2013-01-24 00:36:562095void RenderViewImpl::didHandleGestureEvent(
2096 const WebGestureEvent& event,
2097 bool event_cancelled) {
2098 RenderWidget::didHandleGestureEvent(event, event_cancelled);
[email protected]bb37b652013-11-27 23:47:112099
[email protected]91dcc6d32014-07-30 00:01:332100 if (!event_cancelled) {
2101 FOR_EACH_OBSERVER(
2102 RenderViewObserver, observers_, DidHandleGestureEvent(event));
2103 }
2104
jdduke45762d22014-10-07 04:19:082105 // TODO(ananta): Piggyback off existing IPCs to communicate this information,
2106 // crbug/420130.
2107#if defined(OS_WIN)
[email protected]bb37b652013-11-27 23:47:112108 if (event.type != blink::WebGestureEvent::GestureTap)
2109 return;
2110
[email protected]91dcc6d32014-07-30 00:01:332111 // TODO(estade): hit test the event against focused node to make sure
2112 // the tap actually hit the focused node.
[email protected]bb37b652013-11-27 23:47:112113 blink::WebTextInputType text_input_type =
2114 GetWebView()->textInputInfo().type;
2115
2116 Send(new ViewHostMsg_FocusedNodeTouched(
2117 routing_id(), text_input_type != blink::WebTextInputTypeNone));
jdduke45762d22014-10-07 04:19:082118#endif
[email protected]c68c3e4e2013-01-24 00:36:562119}
2120
[email protected]6e89eb72013-07-23 13:28:222121void RenderViewImpl::initializeLayerTreeView() {
2122 RenderWidget::initializeLayerTreeView();
2123 RenderWidgetCompositor* rwc = compositor();
[email protected]9f7638f42014-05-30 01:51:162124 if (!rwc)
[email protected]6e89eb72013-07-23 13:28:222125 return;
[email protected]9f7638f42014-05-30 01:51:162126
ccameron1f89c002014-10-21 06:19:052127 bool use_threaded_event_handling = true;
2128#if defined(OS_MACOSX) && !defined(OS_IOS)
ccamerona7644752014-12-30 01:16:312129 // Disable threaded event handling if content is not handling the elastic
2130 // overscroll effect. This includes the cases where the elastic overscroll
2131 // effect is being handled by Blink (because of command line flags) and older
2132 // operating system versions which do not have an elastic overscroll effect
2133 // (SnowLeopard, which has Aqua scrollbars which need synchronous updates).
2134 use_threaded_event_handling = compositor_deps_->IsElasticOverscrollEnabled();
[email protected]9f7638f42014-05-30 01:51:162135#endif
ccameron1f89c002014-10-21 06:19:052136 if (use_threaded_event_handling) {
2137 RenderThreadImpl* render_thread = RenderThreadImpl::current();
2138 // render_thread may be NULL in tests.
2139 InputHandlerManager* input_handler_manager =
2140 render_thread ? render_thread->input_handler_manager() : NULL;
2141 if (input_handler_manager) {
2142 input_handler_manager->AddInputHandler(
2143 routing_id_, rwc->GetInputHandler(), AsWeakPtr());
2144 }
2145 }
[email protected]6e89eb72013-07-23 13:28:222146}
2147
[email protected]180ef242013-11-07 06:50:462148// blink::WebFrameClient -----------------------------------------------------
[email protected]3d9689372009-09-10 04:29:172149
[email protected]5e92282f2012-08-17 08:11:572150void RenderViewImpl::Repaint(const gfx::Size& size) {
[email protected]3d9ec5052013-01-02 22:05:252151 OnRepaint(size);
[email protected]5e92282f2012-08-17 08:11:572152}
2153
[email protected]b2324b092012-11-01 10:34:112154void RenderViewImpl::SetEditCommandForNextKeyEvent(const std::string& name,
2155 const std::string& value) {
2156 EditCommands edit_commands;
2157 edit_commands.push_back(EditCommand(name, value));
2158 OnSetEditCommandsForNextKeyEvent(edit_commands);
2159}
2160
2161void RenderViewImpl::ClearEditCommands() {
2162 edit_commands_.clear();
2163}
2164
[email protected]180ef242013-11-07 06:50:462165SSLStatus RenderViewImpl::GetSSLStatusOfFrame(blink::WebFrame* frame) const {
[email protected]83c0abca2013-07-23 20:09:422166 std::string security_info;
2167 if (frame && frame->dataSource())
2168 security_info = frame->dataSource()->response().securityInfo();
2169
avie0d90182015-07-08 19:33:592170 return DeserializeSecurityInfo(security_info);
[email protected]e4495212012-12-06 03:09:122171}
2172
[email protected]b38806a2013-10-04 16:01:382173const std::string& RenderViewImpl::GetAcceptLanguages() const {
2174 return renderer_preferences_.accept_languages;
2175}
2176
[email protected]35b2a972014-04-04 15:50:222177void RenderViewImpl::didChangeIcon(WebLocalFrame* frame,
[email protected]41225fe2013-03-29 05:32:022178 WebIconURL::Type icon_type) {
2179 if (frame->parent())
2180 return;
2181
[email protected]41225fe2013-03-29 05:32:022182 WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type);
2183 std::vector<FaviconURL> urls;
2184 for (size_t i = 0; i < icon_urls.size(); i++) {
[email protected]2bd262b2014-04-16 05:31:232185 std::vector<gfx::Size> sizes;
[email protected]f34ac132014-03-20 23:02:052186 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes);
2187 urls.push_back(FaviconURL(
2188 icon_urls[i].iconURL(), ToFaviconType(icon_urls[i].iconType()), sizes));
[email protected]41225fe2013-03-29 05:32:022189 }
2190 SendUpdateFaviconURL(urls);
[email protected]5019ef12010-04-27 17:26:582191}
2192
[email protected]35b2a972014-04-04 15:50:222193void RenderViewImpl::didUpdateCurrentHistoryItem(WebLocalFrame* frame) {
avif937e1d2014-11-02 18:13:072194 StartNavStateSyncTimerIfNecessary();
[email protected]476b6f82009-09-10 21:00:592195}
2196
[email protected]310ebd6302011-10-10 19:06:282197void RenderViewImpl::CheckPreferredSize() {
[email protected]d812fd12011-05-27 23:05:072198 // We don't always want to send the change messages over IPC, only if we've
2199 // been put in that mode by getting a |ViewMsg_EnablePreferredSizeChangedMode|
2200 // message.
2201 if (!send_preferred_size_changes_ || !webview())
2202 return;
2203
[email protected]e76b7972013-06-06 02:58:482204 gfx::Size size = webview()->contentsPreferredMinimumSize();
[email protected]705243f2010-05-05 19:58:072205 if (size == preferred_size_)
2206 return;
[email protected]c27324b2009-11-19 22:44:292207
[email protected]705243f2010-05-05 19:58:072208 preferred_size_ = size;
2209 Send(new ViewHostMsg_DidContentsPreferredSizeChange(routing_id_,
2210 preferred_size_));
[email protected]3d9689372009-09-10 04:29:172211}
2212
[email protected]35b2a972014-04-04 15:50:222213void RenderViewImpl::didChangeScrollOffset(WebLocalFrame* frame) {
avif937e1d2014-11-02 18:13:072214 StartNavStateSyncTimerIfNecessary();
[email protected]dd6afca2011-08-13 03:44:312215}
2216
[email protected]55750b32012-09-21 14:05:032217void RenderViewImpl::SendFindReply(int request_id,
2218 int match_count,
2219 int ordinal,
2220 const WebRect& selection_rect,
2221 bool final_status_update) {
[email protected]55750b32012-09-21 14:05:032222 Send(new ViewHostMsg_Find_Reply(routing_id_,
2223 request_id,
2224 match_count,
2225 selection_rect,
2226 ordinal,
2227 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]180ef242013-11-07 06:50:462234// blink::WebPageSerializerClient implementation ------------------------------
[email protected]18d5be92011-07-25 18:00:192235
[email protected]310ebd6302011-10-10 19:06:282236void RenderViewImpl::didSerializeDataForFrame(
[email protected]18d5be92011-07-25 18:00:192237 const WebURL& frame_url,
2238 const WebCString& data,
2239 WebPageSerializerClient::PageSerializationStatus status) {
2240 Send(new ViewHostMsg_SendSerializedHtmlData(
2241 routing_id(),
2242 frame_url,
2243 data.data(),
2244 static_cast<int32>(status)));
2245}
2246
[email protected]e9ff79c2012-10-19 21:31:262247// RenderView implementation ---------------------------------------------------
[email protected]a2ef54c2011-10-10 16:20:312248
[email protected]310ebd6302011-10-10 19:06:282249bool RenderViewImpl::Send(IPC::Message* message) {
[email protected]a2ef54c2011-10-10 16:20:312250 return RenderWidget::Send(message);
2251}
2252
mostynbc33353232014-09-12 09:38:312253RenderFrameImpl* RenderViewImpl::GetMainRenderFrame() {
nasko77de2312015-05-12 03:09:162254 return main_render_frame_;
[email protected]b849847b2013-12-10 21:57:582255}
2256
[email protected]82114f52012-03-20 22:53:412257int RenderViewImpl::GetRoutingID() const {
[email protected]a2ef54c2011-10-10 16:20:312258 return routing_id_;
2259}
2260
[email protected]82114f52012-03-20 22:53:412261gfx::Size RenderViewImpl::GetSize() const {
[email protected]a2ef54c2011-10-10 16:20:312262 return size();
2263}
2264
[email protected]82114f52012-03-20 22:53:412265WebPreferences& RenderViewImpl::GetWebkitPreferences() {
[email protected]a2ef54c2011-10-10 16:20:312266 return webkit_preferences_;
2267}
2268
[email protected]324825d2012-11-30 12:37:152269void RenderViewImpl::SetWebkitPreferences(const WebPreferences& preferences) {
2270 OnUpdateWebPreferences(preferences);
2271}
2272
[email protected]180ef242013-11-07 06:50:462273blink::WebView* RenderViewImpl::GetWebView() {
[email protected]a2ef54c2011-10-10 16:20:312274 return webview();
2275}
2276
[email protected]2a84f9d2012-06-05 21:50:432277bool RenderViewImpl::IsEditableNode(const WebNode& node) const {
2278 if (node.isNull())
2279 return false;
2280
2281 if (node.isContentEditable())
2282 return true;
2283
2284 if (node.isElementNode()) {
2285 const WebElement& element = node.toConst<WebElement>();
ajith.ve77498c32014-10-22 05:32:292286 if (element.isTextFormControlElement()) {
2287 if (!(element.hasAttribute("readonly") ||
2288 element.hasAttribute("disabled")))
2289 return true;
2290 }
[email protected]2a84f9d2012-06-05 21:50:432291
esprehn172e64612015-07-08 16:35:212292 return base::LowerCaseEqualsASCII(element.getAttribute("role"), "textbox");
[email protected]a2ef54c2011-10-10 16:20:312293 }
[email protected]2a84f9d2012-06-05 21:50:432294
2295 return false;
[email protected]a2ef54c2011-10-10 16:20:312296}
2297
[email protected]310ebd6302011-10-10 19:06:282298bool RenderViewImpl::ShouldDisplayScrollbars(int width, int height) const {
[email protected]a2ef54c2011-10-10 16:20:312299 return (!send_preferred_size_changes_ ||
2300 (disable_scrollbars_size_limit_.width() <= width ||
2301 disable_scrollbars_size_limit_.height() <= height));
2302}
2303
[email protected]82114f52012-03-20 22:53:412304int RenderViewImpl::GetEnabledBindings() const {
[email protected]a2ef54c2011-10-10 16:20:312305 return enabled_bindings_;
2306}
2307
avif937e1d2014-11-02 18:13:072308bool RenderViewImpl::GetContentStateImmediately() const {
2309 return send_content_state_immediately_;
[email protected]a2ef54c2011-10-10 16:20:312310}
2311
[email protected]180ef242013-11-07 06:50:462312blink::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const {
[email protected]a2ef54c2011-10-10 16:20:312313 return visibilityState();
2314}
2315
[email protected]3c71576ce2013-07-23 02:00:012316void RenderViewImpl::DidStartLoading() {
[email protected]6dd5c322014-03-12 07:58:462317 main_render_frame_->didStartLoading(true);
[email protected]3c71576ce2013-07-23 02:00:012318}
2319
2320void RenderViewImpl::DidStopLoading() {
[email protected]6dd5c322014-03-12 07:58:462321 main_render_frame_->didStopLoading();
[email protected]3c71576ce2013-07-23 02:00:012322}
2323
avif937e1d2014-11-02 18:13:072324void RenderViewImpl::SyncNavigationState() {
2325 if (!webview())
2326 return;
2327 SendUpdateState(history_controller_->GetCurrentEntry());
initial.commit09911bf2008-07-26 23:55:292328}
2329
estade78d655f82015-01-30 01:55:082330blink::WebElement RenderViewImpl::GetFocusedElement() const {
2331 if (!webview())
2332 return WebElement();
2333 WebFrame* focused_frame = webview()->focusedFrame();
2334 if (focused_frame) {
2335 WebDocument doc = focused_frame->document();
2336 if (!doc.isNull())
2337 return doc.focusedElement();
2338 }
2339
2340 return WebElement();
2341}
2342
[email protected]54ea9ff2014-03-20 00:27:542343blink::WebPlugin* RenderViewImpl::GetWebPluginForFind() {
2344 if (!webview())
2345 return NULL;
2346
2347 WebFrame* main_frame = webview()->mainFrame();
[email protected]82307f6b2014-08-07 03:30:122348 if (main_frame->isWebLocalFrame() &&
2349 main_frame->document().isPluginDocument())
[email protected]54ea9ff2014-03-20 00:27:542350 return webview()->mainFrame()->document().to<WebPluginDocument>().plugin();
2351
2352#if defined(ENABLE_PLUGINS)
2353 if (plugin_find_handler_)
2354 return plugin_find_handler_->container()->plugin();
2355#endif
2356
2357 return NULL;
[email protected]24a7f3c2010-03-25 08:26:492358}
2359
[email protected]55750b32012-09-21 14:05:032360void RenderViewImpl::OnFind(int request_id,
[email protected]fcf75d42013-12-03 20:11:262361 const base::string16& search_text,
[email protected]310ebd6302011-10-10 19:06:282362 const WebFindOptions& options) {
[email protected]26aa0482009-09-30 16:55:272363 WebFrame* main_frame = webview()->mainFrame();
[email protected]54ea9ff2014-03-20 00:27:542364 blink::WebPlugin* plugin = GetWebPluginForFind();
[email protected]872542532011-06-23 00:43:162365 // Check if the plugin still exists in the document.
[email protected]54ea9ff2014-03-20 00:27:542366 if (plugin) {
[email protected]24a7f3c2010-03-25 08:26:492367 if (options.findNext) {
2368 // Just navigate back/forward.
[email protected]54ea9ff2014-03-20 00:27:542369 plugin->selectFindResult(options.forward);
[email protected]24a7f3c2010-03-25 08:26:492370 } else {
[email protected]54ea9ff2014-03-20 00:27:542371 if (!plugin->startFind(
[email protected]afdbd142010-07-10 08:01:232372 search_text, options.matchCase, request_id)) {
[email protected]e7c58a32010-08-13 19:47:112373 // Send "no results".
[email protected]55750b32012-09-21 14:05:032374 SendFindReply(request_id, 0, 0, gfx::Rect(), true);
[email protected]24a7f3c2010-03-25 08:26:492375 }
2376 }
2377 return;
2378 }
2379
[email protected]b4bb2502009-10-01 22:35:272380 WebFrame* frame_after_main = main_frame->traverseNext(true);
[email protected]26aa0482009-09-30 16:55:272381 WebFrame* focused_frame = webview()->focusedFrame();
initial.commit09911bf2008-07-26 23:55:292382 WebFrame* search_frame = focused_frame; // start searching focused frame.
2383
2384 bool multi_frame = (frame_after_main != main_frame);
2385
2386 // If we have multiple frames, we don't want to wrap the search within the
2387 // frame, so we check here if we only have main_frame in the chain.
2388 bool wrap_within_frame = !multi_frame;
2389
[email protected]b3f2b912009-04-09 16:18:522390 WebRect selection_rect;
initial.commit09911bf2008-07-26 23:55:292391 bool result = false;
2392
[email protected]7830da3e2009-11-06 16:27:262393 // If something is selected when we start searching it means we cannot just
2394 // increment the current match ordinal; we need to re-generate it.
2395 WebRange current_selection = focused_frame->selectionRange();
2396
initial.commit09911bf2008-07-26 23:55:292397 do {
[email protected]dd7daa82009-08-10 05:46:452398 result = search_frame->find(
[email protected]7ea066a2009-04-06 20:21:592399 request_id, search_text, options, wrap_within_frame, &selection_rect);
initial.commit09911bf2008-07-26 23:55:292400
2401 if (!result) {
2402 // don't leave text selected as you move to the next frame.
[email protected]6dd17a8a2013-05-01 05:50:102403 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172404 GetFocusedElement());
initial.commit09911bf2008-07-26 23:55:292405
2406 // Find the next frame, but skip the invisible ones.
2407 do {
2408 // What is the next frame to search? (we might be going backwards). Note
2409 // that we specify wrap=true so that search_frame never becomes NULL.
[email protected]7ea066a2009-04-06 20:21:592410 search_frame = options.forward ?
[email protected]b4bb2502009-10-01 22:35:272411 search_frame->traverseNext(true) :
2412 search_frame->traversePrevious(true);
[email protected]dd7daa82009-08-10 05:46:452413 } while (!search_frame->hasVisibleContent() &&
2414 search_frame != focused_frame);
initial.commit09911bf2008-07-26 23:55:292415
[email protected]884db412008-11-24 23:46:502416 // Make sure selection doesn't affect the search operation in new frame.
[email protected]6dd17a8a2013-05-01 05:50:102417 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172418 GetFocusedElement());
initial.commit09911bf2008-07-26 23:55:292419
2420 // If we have multiple frames and we have wrapped back around to the
2421 // focused frame, we need to search it once more allowing wrap within
2422 // the frame, otherwise it will report 'no match' if the focused frame has
2423 // reported matches, but no frames after the focused_frame contain a
2424 // match for the search word(s).
2425 if (multi_frame && search_frame == focused_frame) {
[email protected]dd7daa82009-08-10 05:46:452426 result = search_frame->find(
[email protected]7ea066a2009-04-06 20:21:592427 request_id, search_text, options, true, // Force wrapping.
2428 &selection_rect);
initial.commit09911bf2008-07-26 23:55:292429 }
2430 }
2431
[email protected]26aa0482009-09-30 16:55:272432 webview()->setFocusedFrame(search_frame);
initial.commit09911bf2008-07-26 23:55:292433 } while (!result && search_frame != focused_frame);
2434
[email protected]7830da3e2009-11-06 16:27:262435 if (options.findNext && current_selection.isNull()) {
[email protected]4f3dc372009-02-24 00:10:292436 // Force the main_frame to report the actual count.
[email protected]dd7daa82009-08-10 05:46:452437 main_frame->increaseMatchCount(0, request_id);
[email protected]4f3dc372009-02-24 00:10:292438 } else {
2439 // If nothing is found, set result to "0 of 0", otherwise, set it to
2440 // "-1 of 1" to indicate that we found at least one item, but we don't know
2441 // yet what is active.
2442 int ordinal = result ? -1 : 0; // -1 here means, we might know more later.
2443 int match_count = result ? 1 : 0; // 1 here means possibly more coming.
initial.commit09911bf2008-07-26 23:55:292444
[email protected]4f3dc372009-02-24 00:10:292445 // If we find no matches then this will be our last status update.
2446 // Otherwise the scoping effort will send more results.
2447 bool final_status_update = !result;
initial.commit09911bf2008-07-26 23:55:292448
[email protected]55750b32012-09-21 14:05:032449 SendFindReply(request_id, match_count, ordinal, selection_rect,
2450 final_status_update);
initial.commit09911bf2008-07-26 23:55:292451
initial.commit09911bf2008-07-26 23:55:292452 // Scoping effort begins, starting with the mainframe.
2453 search_frame = main_frame;
2454
[email protected]dd7daa82009-08-10 05:46:452455 main_frame->resetMatchCount();
initial.commit09911bf2008-07-26 23:55:292456
2457 do {
2458 // Cancel all old scoping requests before starting a new one.
[email protected]dd7daa82009-08-10 05:46:452459 search_frame->cancelPendingScopingEffort();
initial.commit09911bf2008-07-26 23:55:292460
2461 // We don't start another scoping effort unless at least one match has
2462 // been found.
2463 if (result) {
2464 // Start new scoping request. If the scoping function determines that it
2465 // needs to scope, it will defer until later.
[email protected]dd7daa82009-08-10 05:46:452466 search_frame->scopeStringMatches(request_id,
[email protected]7ea066a2009-04-06 20:21:592467 search_text,
2468 options,
initial.commit09911bf2008-07-26 23:55:292469 true); // reset the tickmarks
2470 }
2471
2472 // Iterate to the next frame. The frame will not necessarily scope, for
2473 // example if it is not visible.
[email protected]b4bb2502009-10-01 22:35:272474 search_frame = search_frame->traverseNext(true);
initial.commit09911bf2008-07-26 23:55:292475 } while (search_frame != main_frame);
2476 }
2477}
2478
[email protected]e9ff79c2012-10-19 21:31:262479void RenderViewImpl::OnStopFinding(StopFindAction action) {
[email protected]24a7f3c2010-03-25 08:26:492480 WebView* view = webview();
2481 if (!view)
2482 return;
2483
[email protected]54ea9ff2014-03-20 00:27:542484 blink::WebPlugin* plugin = GetWebPluginForFind();
2485 if (plugin) {
2486 plugin->stopFind();
[email protected]24a7f3c2010-03-25 08:26:492487 return;
2488 }
2489
[email protected]e9ff79c2012-10-19 21:31:262490 bool clear_selection = action == STOP_FIND_ACTION_CLEAR_SELECTION;
[email protected]6dd17a8a2013-05-01 05:50:102491 if (clear_selection) {
2492 view->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect"),
[email protected]c39f7442014-02-27 03:33:172493 GetFocusedElement());
[email protected]6dd17a8a2013-05-01 05:50:102494 }
[email protected]24a7f3c2010-03-25 08:26:492495
2496 WebFrame* frame = view->mainFrame();
2497 while (frame) {
2498 frame->stopFinding(clear_selection);
2499 frame = frame->traverseNext(false);
2500 }
2501
[email protected]e9ff79c2012-10-19 21:31:262502 if (action == STOP_FIND_ACTION_ACTIVATE_SELECTION) {
[email protected]24a7f3c2010-03-25 08:26:492503 WebFrame* focused_frame = view->focusedFrame();
2504 if (focused_frame) {
2505 WebDocument doc = focused_frame->document();
2506 if (!doc.isNull()) {
[email protected]c39f7442014-02-27 03:33:172507 WebElement element = doc.focusedElement();
2508 if (!element.isNull())
2509 element.simulateClick();
[email protected]24a7f3c2010-03-25 08:26:492510 }
2511 }
2512 }
2513}
2514
[email protected]59363fc92012-09-05 03:46:312515#if defined(OS_ANDROID)
2516void RenderViewImpl::OnActivateNearestFindResult(int request_id,
2517 float x, float y) {
2518 if (!webview())
2519 return;
2520
2521 WebFrame* main_frame = webview()->mainFrame();
2522 WebRect selection_rect;
2523 int ordinal = main_frame->selectNearestFindMatch(WebFloatPoint(x, y),
2524 &selection_rect);
2525 if (ordinal == -1) {
2526 // Something went wrong, so send a no-op reply (force the main_frame to
2527 // report the current match count) in case the host is waiting for a
2528 // response due to rate-limiting).
2529 main_frame->increaseMatchCount(0, request_id);
2530 return;
2531 }
2532
[email protected]55750b32012-09-21 14:05:032533 SendFindReply(request_id,
2534 -1 /* number_of_matches */,
2535 ordinal,
2536 selection_rect,
2537 true /* final_update */);
[email protected]59363fc92012-09-05 03:46:312538}
2539
2540void RenderViewImpl::OnFindMatchRects(int current_version) {
2541 if (!webview())
2542 return;
2543
2544 WebFrame* main_frame = webview()->mainFrame();
2545 std::vector<gfx::RectF> match_rects;
2546
2547 int rects_version = main_frame->findMatchMarkersVersion();
2548 if (current_version != rects_version) {
2549 WebVector<WebFloatRect> web_match_rects;
2550 main_frame->findMatchRects(web_match_rects);
2551 match_rects.reserve(web_match_rects.size());
2552 for (size_t i = 0; i < web_match_rects.size(); ++i)
2553 match_rects.push_back(gfx::RectF(web_match_rects[i]));
2554 }
2555
2556 gfx::RectF active_rect = main_frame->activeFindMatchRect();
2557 Send(new ViewHostMsg_FindMatchRects_Reply(routing_id_,
2558 rects_version,
2559 match_rects,
2560 active_rect));
2561}
2562#endif
2563
ccameronb7c1d6c2015-03-09 17:08:242564void RenderViewImpl::OnResetPageScale() {
2565 if (!webview())
2566 return;
2567 webview()->setPageScaleFactor(1);
2568}
2569
[email protected]e9ff79c2012-10-19 21:31:262570void RenderViewImpl::OnZoom(PageZoom zoom) {
[email protected]40bd6582009-12-04 23:49:512571 if (!webview()) // Not sure if this can happen, but no harm in being safe.
2572 return;
2573
[email protected]258d31122010-05-09 10:59:412574 webview()->hidePopups();
[email protected]854ab5462011-11-22 20:48:102575
[email protected]b75b8292010-10-01 07:28:252576 double old_zoom_level = webview()->zoomLevel();
2577 double zoom_level;
[email protected]e9ff79c2012-10-19 21:31:262578 if (zoom == PAGE_ZOOM_RESET) {
[email protected]b75b8292010-10-01 07:28:252579 zoom_level = 0;
2580 } else if (static_cast<int>(old_zoom_level) == old_zoom_level) {
2581 // Previous zoom level is a whole number, so just increment/decrement.
[email protected]54087fe2011-10-28 22:02:482582 zoom_level = old_zoom_level + zoom;
[email protected]b75b8292010-10-01 07:28:252583 } else {
2584 // Either the user hit the zoom factor limit and thus the zoom level is now
2585 // not a whole number, or a plugin changed it to a custom value. We want
2586 // to go to the next whole number so that the user can always get back to
2587 // 100% with the keyboard/menu.
[email protected]54087fe2011-10-28 22:02:482588 if ((old_zoom_level > 1 && zoom > 0) ||
2589 (old_zoom_level < 1 && zoom < 0)) {
2590 zoom_level = static_cast<int>(old_zoom_level + zoom);
[email protected]b75b8292010-10-01 07:28:252591 } else {
2592 // We're going towards 100%, so first go to the next whole number.
2593 zoom_level = static_cast<int>(old_zoom_level);
2594 }
2595 }
[email protected]91219702013-09-18 07:33:512596 webview()->setZoomLevel(zoom_level);
[email protected]47578fa02011-11-02 19:34:412597 zoomLevelChanged();
2598}
2599
[email protected]310ebd6302011-10-10 19:06:282600void RenderViewImpl::OnSetZoomLevelForLoadingURL(const GURL& url,
2601 double zoom_level) {
[email protected]cbe55d22013-02-14 17:04:332602#if !defined(OS_ANDROID)
2603 // On Android, page zoom isn't used, and in case of WebView, text zoom is used
2604 // for legacy WebView text scaling emulation. Thus, the code that resets
2605 // the zoom level from this map will be effectively resetting text zoom level.
[email protected]9d797f32010-04-23 07:17:542606 host_zoom_levels_[url] = zoom_level;
[email protected]cbe55d22013-02-14 17:04:332607#endif
initial.commit09911bf2008-07-26 23:55:292608}
2609
[email protected]d42bf472014-06-14 01:49:382610void RenderViewImpl::OnSetZoomLevelForView(bool uses_temporary_zoom_level,
2611 double level) {
2612 uses_temporary_zoom_level_ = uses_temporary_zoom_level;
2613
2614 webview()->hidePopups();
2615 webview()->setZoomLevel(level);
2616}
2617
[email protected]310ebd6302011-10-10 19:06:282618void RenderViewImpl::OnSetPageEncoding(const std::string& encoding_name) {
[email protected]26aa0482009-09-30 16:55:272619 webview()->setPageEncoding(WebString::fromUTF8(encoding_name));
initial.commit09911bf2008-07-26 23:55:292620}
2621
[email protected]310ebd6302011-10-10 19:06:282622void RenderViewImpl::OnResetPageEncodingToDefault() {
[email protected]26aa0482009-09-30 16:55:272623 WebString no_encoding;
2624 webview()->setPageEncoding(no_encoding);
[email protected]a697f4c2009-09-14 22:30:182625}
2626
[email protected]310ebd6302011-10-10 19:06:282627void RenderViewImpl::OnAllowBindings(int enabled_bindings_flags) {
[email protected]940ed1d2012-11-27 21:03:212628 if ((enabled_bindings_flags & BINDINGS_POLICY_WEB_UI) &&
2629 !(enabled_bindings_ & BINDINGS_POLICY_WEB_UI)) {
[email protected]69a0a132014-03-26 16:45:022630 // WebUIExtensionData deletes itself when we're destroyed.
[email protected]940ed1d2012-11-27 21:03:212631 new WebUIExtensionData(this);
[email protected]69a0a132014-03-26 16:45:022632 // WebUIMojo deletes itself when we're destroyed.
2633 new WebUIMojo(this);
[email protected]940ed1d2012-11-27 21:03:212634 }
2635
[email protected]81e63782009-02-27 19:35:092636 enabled_bindings_ |= enabled_bindings_flags;
[email protected]744c2a22012-03-15 18:42:042637
2638 // Keep track of the total bindings accumulated in this process.
2639 RenderProcess::current()->AddBindings(enabled_bindings_flags);
initial.commit09911bf2008-07-26 23:55:292640}
2641
[email protected]dc293a72013-07-01 11:11:222642void RenderViewImpl::OnDragTargetDragEnter(const DropData& drop_data,
[email protected]310ebd6302011-10-10 19:06:282643 const gfx::Point& client_point,
2644 const gfx::Point& screen_point,
[email protected]1f2230b2012-05-17 23:43:422645 WebDragOperationsMask ops,
2646 int key_modifiers) {
[email protected]59f4f2fa2011-03-23 01:00:552647 WebDragOperation operation = webview()->dragTargetDragEnter(
[email protected]dc293a72013-07-01 11:11:222648 DropDataToWebDragData(drop_data),
[email protected]59f4f2fa2011-03-23 01:00:552649 client_point,
2650 screen_point,
[email protected]1f2230b2012-05-17 23:43:422651 ops,
2652 key_modifiers);
[email protected]59f4f2fa2011-03-23 01:00:552653
2654 Send(new DragHostMsg_UpdateDragCursor(routing_id_, operation));
2655}
2656
[email protected]310ebd6302011-10-10 19:06:282657void RenderViewImpl::OnDragTargetDragOver(const gfx::Point& client_point,
2658 const gfx::Point& screen_point,
[email protected]1f2230b2012-05-17 23:43:422659 WebDragOperationsMask ops,
2660 int key_modifiers) {
[email protected]59f4f2fa2011-03-23 01:00:552661 WebDragOperation operation = webview()->dragTargetDragOver(
2662 client_point,
2663 screen_point,
[email protected]1f2230b2012-05-17 23:43:422664 ops,
2665 key_modifiers);
[email protected]59f4f2fa2011-03-23 01:00:552666
2667 Send(new DragHostMsg_UpdateDragCursor(routing_id_, operation));
2668}
2669
[email protected]310ebd6302011-10-10 19:06:282670void RenderViewImpl::OnDragTargetDragLeave() {
[email protected]59f4f2fa2011-03-23 01:00:552671 webview()->dragTargetDragLeave();
2672}
2673
[email protected]310ebd6302011-10-10 19:06:282674void RenderViewImpl::OnDragTargetDrop(const gfx::Point& client_point,
[email protected]1f2230b2012-05-17 23:43:422675 const gfx::Point& screen_point,
2676 int key_modifiers) {
2677 webview()->dragTargetDrop(client_point, screen_point, key_modifiers);
[email protected]fcad49452011-06-28 17:11:572678
2679 Send(new DragHostMsg_TargetDrop_ACK(routing_id_));
[email protected]59f4f2fa2011-03-23 01:00:552680}
2681
[email protected]7a6d773f2014-04-04 01:25:092682void RenderViewImpl::OnDragSourceEnded(const gfx::Point& client_point,
2683 const gfx::Point& screen_point,
2684 WebDragOperation op) {
2685 webview()->dragSourceEndedAt(client_point, screen_point, op);
initial.commit09911bf2008-07-26 23:55:292686}
2687
[email protected]310ebd6302011-10-10 19:06:282688void RenderViewImpl::OnDragSourceSystemDragEnded() {
[email protected]26aa0482009-09-30 16:55:272689 webview()->dragSourceSystemDragEnded();
initial.commit09911bf2008-07-26 23:55:292690}
2691
[email protected]310ebd6302011-10-10 19:06:282692void RenderViewImpl::OnUpdateWebPreferences(const WebPreferences& prefs) {
[email protected]2fab253a2009-08-17 23:00:592693 webkit_preferences_ = prefs;
sataya.mf405d0e2015-07-07 16:51:112694 ApplyWebPreferencesInternal(webkit_preferences_, webview(), compositor_deps_);
initial.commit09911bf2008-07-26 23:55:292695}
2696
[email protected]310ebd6302011-10-10 19:06:282697void RenderViewImpl::OnEnumerateDirectoryResponse(
[email protected]600ea402011-04-12 00:01:512698 int id,
[email protected]c42de732013-02-16 06:26:312699 const std::vector<base::FilePath>& paths) {
[email protected]600ea402011-04-12 00:01:512700 if (!enumeration_completions_[id])
2701 return;
2702
2703 WebVector<WebString> ws_file_names(paths.size());
2704 for (size_t i = 0; i < paths.size(); ++i)
[email protected]728c2ee2013-06-25 04:01:072705 ws_file_names[i] = paths[i].AsUTF16Unsafe();
[email protected]600ea402011-04-12 00:01:512706
2707 enumeration_completions_[id]->didChooseFile(ws_file_names);
2708 enumeration_completions_.erase(id);
2709}
2710
[email protected]fb11b6a42012-03-14 07:25:122711void RenderViewImpl::OnFileChooserResponse(
hirono570357bd2014-10-08 12:39:272712 const std::vector<content::FileChooserFileInfo>& files) {
[email protected]8029f5672009-03-20 22:33:362713 // This could happen if we navigated to a different page before the user
2714 // closed the chooser.
[email protected]cdaf8d02010-03-30 19:52:472715 if (file_chooser_completions_.empty())
[email protected]8029f5672009-03-20 22:33:362716 return;
2717
[email protected]b5188522012-03-15 00:18:042718 // Convert Chrome's SelectedFileInfo list to WebKit's.
2719 WebVector<WebFileChooserCompletion::SelectedFileInfo> selected_files(
2720 files.size());
2721 for (size_t i = 0; i < files.size(); ++i) {
2722 WebFileChooserCompletion::SelectedFileInfo selected_file;
hirono570357bd2014-10-08 12:39:272723 selected_file.path = files[i].file_path.AsUTF16Unsafe();
[email protected]728c2ee2013-06-25 04:01:072724 selected_file.displayName =
2725 base::FilePath(files[i].display_name).AsUTF16Unsafe();
hironoe9f2732b2014-10-22 08:06:412726 if (files[i].file_system_url.is_valid()) {
2727 selected_file.fileSystemURL = files[i].file_system_url;
2728 selected_file.length = files[i].length;
2729 selected_file.modificationTime = files[i].modification_time.ToDoubleT();
2730 selected_file.isDirectory = files[i].is_directory;
2731 }
[email protected]b5188522012-03-15 00:18:042732 selected_files[i] = selected_file;
2733 }
[email protected]a1128322009-10-06 18:38:462734
[email protected]cdaf8d02010-03-30 19:52:472735 if (file_chooser_completions_.front()->completion)
[email protected]b5188522012-03-15 00:18:042736 file_chooser_completions_.front()->completion->didChooseFile(
2737 selected_files);
[email protected]cdaf8d02010-03-30 19:52:472738 file_chooser_completions_.pop_front();
2739
2740 // If there are more pending file chooser requests, schedule one now.
2741 if (!file_chooser_completions_.empty()) {
2742 Send(new ViewHostMsg_RunFileChooser(routing_id_,
2743 file_chooser_completions_.front()->params));
2744 }
initial.commit09911bf2008-07-26 23:55:292745}
2746
[email protected]244ac1892011-12-02 17:04:472747void RenderViewImpl::OnEnableAutoResize(const gfx::Size& min_size,
2748 const gfx::Size& max_size) {
2749 DCHECK(disable_scrollbars_size_limit_.IsEmpty());
2750 if (!webview())
2751 return;
[email protected]97e1bf72013-03-06 14:06:052752 auto_resize_mode_ = true;
[email protected]61e2b3cc2012-03-02 16:13:342753 webview()->enableAutoResizeMode(min_size, max_size);
2754}
2755
2756void RenderViewImpl::OnDisableAutoResize(const gfx::Size& new_size) {
2757 DCHECK(disable_scrollbars_size_limit_.IsEmpty());
2758 if (!webview())
2759 return;
[email protected]97e1bf72013-03-06 14:06:052760 auto_resize_mode_ = false;
[email protected]61e2b3cc2012-03-02 16:13:342761 webview()->disableAutoResizeMode();
2762
[email protected]eac2b362013-05-22 07:01:452763 if (!new_size.IsEmpty()) {
2764 Resize(new_size,
2765 physical_backing_size_,
dtrainorcb7779b82014-12-04 01:08:022766 top_controls_shrink_blink_size_,
2767 top_controls_height_,
[email protected]bb6378fe2014-04-28 21:19:442768 visible_viewport_size_,
[email protected]eac2b362013-05-22 07:01:452769 resizer_rect_,
mikhail.pozdnyakovf2c902a2015-04-14 08:09:122770 is_fullscreen_granted_,
mikhail.pozdnyakovc0e251b2015-04-15 06:51:122771 display_mode_,
[email protected]eac2b362013-05-22 07:01:452772 NO_RESIZE_ACK);
2773 }
[email protected]244ac1892011-12-02 17:04:472774}
2775
[email protected]2bf834f2011-11-17 20:02:212776void RenderViewImpl::OnEnablePreferredSizeChangedMode() {
[email protected]9fb325e2010-05-06 18:23:242777 if (send_preferred_size_changes_)
2778 return;
[email protected]9fb325e2010-05-06 18:23:242779 send_preferred_size_changes_ = true;
[email protected]770dd8b2010-05-24 18:11:392780
[email protected]d812fd12011-05-27 23:05:072781 // Start off with an initial preferred size notification (in case
2782 // |didUpdateLayout| was already called).
[email protected]169d4282011-11-30 19:33:592783 didUpdateLayout();
[email protected]0666aef2009-05-13 19:48:082784}
2785
[email protected]310ebd6302011-10-10 19:06:282786void RenderViewImpl::OnDisableScrollbarsForSmallWindows(
[email protected]cda45c02010-02-25 19:28:102787 const gfx::Size& disable_scrollbar_size_limit) {
2788 disable_scrollbars_size_limit_ = disable_scrollbar_size_limit;
2789}
2790
[email protected]310ebd6302011-10-10 19:06:282791void RenderViewImpl::OnSetRendererPrefs(
[email protected]e9ff79c2012-10-19 21:31:262792 const RendererPreferences& renderer_prefs) {
[email protected]d051d9a2011-12-10 02:02:502793 double old_zoom_level = renderer_preferences_.default_zoom_level;
[email protected]ebd5ea52014-05-28 14:51:152794 std::string old_accept_languages = renderer_preferences_.accept_languages;
2795
[email protected]80d96fa2009-06-10 22:34:512796 renderer_preferences_ = renderer_prefs;
ananta59b9fe72015-04-07 01:33:262797
[email protected]6e282c92009-07-24 01:19:372798 UpdateFontRenderingFromRendererPrefs();
ananta59b9fe72015-04-07 01:33:262799 UpdateThemePrefs();
[email protected]38a85712013-01-02 22:45:022800
[email protected]dcc297772014-04-10 22:20:522801#if defined(USE_DEFAULT_RENDER_THEME)
[email protected]1596efb2013-01-17 22:13:012802 if (renderer_prefs.use_custom_colors) {
[email protected]180ef242013-11-07 06:50:462803 WebColorName name = blink::WebColorWebkitFocusRingColor;
2804 blink::setNamedColors(&name, &renderer_prefs.focus_ring_color, 1);
2805 blink::setCaretBlinkInterval(renderer_prefs.caret_blink_interval);
[email protected]1596efb2013-01-17 22:13:012806
2807 if (webview()) {
[email protected]1596efb2013-01-17 22:13:012808 webview()->setSelectionColors(
2809 renderer_prefs.active_selection_bg_color,
2810 renderer_prefs.active_selection_fg_color,
2811 renderer_prefs.inactive_selection_bg_color,
2812 renderer_prefs.inactive_selection_fg_color);
2813 webview()->themeChanged();
2814 }
[email protected]644d77e2010-01-27 01:03:102815 }
[email protected]c997bc42014-04-11 18:25:582816#endif // defined(USE_DEFAULT_RENDER_THEME)
[email protected]d299d972012-03-23 02:26:552817
[email protected]d051d9a2011-12-10 02:02:502818 // If the zoom level for this page matches the old zoom default, and this
2819 // is not a plugin, update the zoom level to match the new default.
[email protected]82307f6b2014-08-07 03:30:122820 if (webview() && webview()->mainFrame()->isWebLocalFrame() &&
2821 !webview()->mainFrame()->document().isPluginDocument() &&
[email protected]cbe55d22013-02-14 17:04:332822 !ZoomValuesEqual(old_zoom_level,
2823 renderer_preferences_.default_zoom_level) &&
[email protected]e9ff79c2012-10-19 21:31:262824 ZoomValuesEqual(webview()->zoomLevel(), old_zoom_level)) {
[email protected]91219702013-09-18 07:33:512825 webview()->setZoomLevel(renderer_preferences_.default_zoom_level);
[email protected]d051d9a2011-12-10 02:02:502826 zoomLevelChanged();
2827 }
[email protected]ebd5ea52014-05-28 14:51:152828
2829 if (webview() &&
2830 old_accept_languages != renderer_preferences_.accept_languages) {
2831 webview()->acceptLanguagesChanged();
2832 }
[email protected]80d96fa2009-06-10 22:34:512833}
2834
[email protected]310ebd6302011-10-10 19:06:282835void RenderViewImpl::OnMediaPlayerActionAt(const gfx::Point& location,
2836 const WebMediaPlayerAction& action) {
[email protected]952cb702009-10-07 05:50:282837 if (webview())
2838 webview()->performMediaPlayerAction(action, location);
[email protected]581b87eb2009-07-23 23:06:562839}
2840
[email protected]fcdc5642014-05-09 14:32:242841void RenderViewImpl::OnOrientationChange() {
japhete20ec7c2015-03-18 19:16:182842 if (webview() && webview()->mainFrame()->isWebLocalFrame())
2843 webview()->mainFrame()->toWebLocalFrame()->sendOrientationChangeEvent();
[email protected]77829642012-05-15 14:47:172844}
2845
[email protected]81375e872012-01-11 21:40:362846void RenderViewImpl::OnPluginActionAt(const gfx::Point& location,
2847 const WebPluginAction& action) {
2848 if (webview())
2849 webview()->performPluginAction(action, location);
2850}
2851
[email protected]310ebd6302011-10-10 19:06:282852void RenderViewImpl::OnGetAllSavableResourceLinksForCurrentPage(
[email protected]18d5be92011-07-25 18:00:192853 const GURL& page_url) {
2854 // Prepare list to storage all savable resource links.
2855 std::vector<GURL> resources_list;
[email protected]c2d986512012-05-12 00:22:462856 std::vector<GURL> referrer_urls_list;
[email protected]180ef242013-11-07 06:50:462857 std::vector<blink::WebReferrerPolicy> referrer_policies_list;
[email protected]18d5be92011-07-25 18:00:192858 std::vector<GURL> frames_list;
[email protected]12a936d2013-05-15 04:55:492859 SavableResourcesResult result(&resources_list,
2860 &referrer_urls_list,
2861 &referrer_policies_list,
2862 &frames_list);
[email protected]18d5be92011-07-25 18:00:192863
[email protected]e9ff79c2012-10-19 21:31:262864 // webkit/ doesn't know about Referrer.
[email protected]12a936d2013-05-15 04:55:492865 if (!GetAllSavableResourceLinksForCurrentPage(
[email protected]18d5be92011-07-25 18:00:192866 webview(),
2867 page_url,
2868 &result,
[email protected]e9ff79c2012-10-19 21:31:262869 const_cast<const char**>(GetSavableSchemes()))) {
[email protected]18d5be92011-07-25 18:00:192870 // If something is wrong when collecting all savable resource links,
2871 // send empty list to embedder(browser) to tell it failed.
[email protected]c2d986512012-05-12 00:22:462872 referrer_urls_list.clear();
2873 referrer_policies_list.clear();
[email protected]18d5be92011-07-25 18:00:192874 resources_list.clear();
2875 frames_list.clear();
2876 }
2877
[email protected]e9ff79c2012-10-19 21:31:262878 std::vector<Referrer> referrers_list;
[email protected]c2d986512012-05-12 00:22:462879 CHECK_EQ(referrer_urls_list.size(), referrer_policies_list.size());
2880 for (unsigned i = 0; i < referrer_urls_list.size(); ++i) {
2881 referrers_list.push_back(
[email protected]e9ff79c2012-10-19 21:31:262882 Referrer(referrer_urls_list[i], referrer_policies_list[i]));
[email protected]c2d986512012-05-12 00:22:462883 }
2884
[email protected]18d5be92011-07-25 18:00:192885 // Send result of all savable resource links to embedder.
2886 Send(new ViewHostMsg_SendCurrentPageAllSavableResourceLinks(routing_id(),
2887 resources_list,
2888 referrers_list,
2889 frames_list));
2890}
2891
[email protected]310ebd6302011-10-10 19:06:282892void RenderViewImpl::OnGetSerializedHtmlDataForCurrentPageWithLocalLinks(
[email protected]18d5be92011-07-25 18:00:192893 const std::vector<GURL>& links,
[email protected]c42de732013-02-16 06:26:312894 const std::vector<base::FilePath>& local_paths,
2895 const base::FilePath& local_directory_name) {
[email protected]18d5be92011-07-25 18:00:192896
2897 // Convert std::vector of GURLs to WebVector<WebURL>
2898 WebVector<WebURL> weburl_links(links);
2899
[email protected]728c2ee2013-06-25 04:01:072900 // Convert std::vector of base::FilePath to WebVector<WebString>
[email protected]18d5be92011-07-25 18:00:192901 WebVector<WebString> webstring_paths(local_paths.size());
2902 for (size_t i = 0; i < local_paths.size(); i++)
[email protected]728c2ee2013-06-25 04:01:072903 webstring_paths[i] = local_paths[i].AsUTF16Unsafe();
[email protected]18d5be92011-07-25 18:00:192904
[email protected]35b2a972014-04-04 15:50:222905 WebPageSerializer::serialize(webview()->mainFrame()->toWebLocalFrame(),
2906 true,
2907 this,
2908 weburl_links,
[email protected]18d5be92011-07-25 18:00:192909 webstring_paths,
[email protected]728c2ee2013-06-25 04:01:072910 local_directory_name.AsUTF16Unsafe());
[email protected]18d5be92011-07-25 18:00:192911}
2912
[email protected]88f10a22013-11-06 21:22:122913void RenderViewImpl::OnSuppressDialogsUntilSwapOut() {
2914 // Don't show any more dialogs until we finish OnSwapOut.
2915 suppress_dialogs_until_swap_out_ = true;
2916}
2917
[email protected]310ebd6302011-10-10 19:06:282918void RenderViewImpl::OnClosePage() {
[email protected]77fc9b92011-10-15 16:20:372919 FOR_EACH_OBSERVER(RenderViewObserver, observers_, ClosePage());
initial.commit09911bf2008-07-26 23:55:292920 // TODO(creis): We'd rather use webview()->Close() here, but that currently
2921 // sets the WebView's delegate_ to NULL, preventing any JavaScript dialogs
2922 // in the onunload handler from appearing. For now, we're bypassing that and
2923 // calling the FrameLoader's CloseURL method directly. This should be
2924 // revisited to avoid having two ways to close a page. Having a single way
2925 // to close that can run onunload is also useful for fixing
2926 // http://b/issue?id=753080.
[email protected]11fd5db2014-04-02 03:49:462927 webview()->mainFrame()->dispatchUnloadEvent();
initial.commit09911bf2008-07-26 23:55:292928
[email protected]992db4c2011-05-12 15:37:152929 Send(new ViewHostMsg_ClosePage_ACK(routing_id_));
initial.commit09911bf2008-07-26 23:55:292930}
2931
naskoc288745f2015-05-01 22:54:212932void RenderViewImpl::OnClose() {
2933 if (closing_)
2934 RenderThread::Get()->Send(new ViewHostMsg_Close_ACK(routing_id_));
2935 RenderWidget::OnClose();
2936}
2937
[email protected]310ebd6302011-10-10 19:06:282938void RenderViewImpl::OnThemeChanged() {
[email protected]e8d6b9f2011-10-10 22:21:022939#if defined(USE_AURA)
2940 // Aura doesn't care if we switch themes.
2941#elif defined(OS_WIN)
[email protected]f78452f2012-05-15 02:07:522942 ui::NativeThemeWin::instance()->CloseHandles();
[email protected]f98d7e3c2010-09-13 22:30:462943 if (webview())
2944 webview()->themeChanged();
[email protected]6c8afae52009-01-22 02:24:572945#else // defined(OS_WIN)
2946 // TODO(port): we don't support theming on non-Windows platforms yet
2947 NOTIMPLEMENTED();
2948#endif
initial.commit09911bf2008-07-26 23:55:292949}
2950
[email protected]310ebd6302011-10-10 19:06:282951void RenderViewImpl::OnMoveOrResizeStarted() {
[email protected]30f75e62009-02-25 22:01:002952 if (webview())
[email protected]a72a1fa2010-05-03 22:18:472953 webview()->hidePopups();
[email protected]30f75e62009-02-25 22:01:002954}
2955
[email protected]0fdd5012013-05-29 08:05:562956void RenderViewImpl::OnResize(const ViewMsg_Resize_Params& params) {
[email protected]189a8862014-07-18 00:27:532957 TRACE_EVENT0("renderer", "RenderViewImpl::OnResize");
[email protected]cda45c02010-02-25 19:28:102958 if (webview()) {
[email protected]a72a1fa2010-05-03 22:18:472959 webview()->hidePopups();
[email protected]cda45c02010-02-25 19:28:102960 if (send_preferred_size_changes_) {
[email protected]7339cd22010-10-27 00:11:202961 webview()->mainFrame()->setCanHaveScrollbars(
[email protected]0fdd5012013-05-29 08:05:562962 ShouldDisplayScrollbars(params.new_size.width(),
2963 params.new_size.height()));
[email protected]cda45c02010-02-25 19:28:102964 }
mikhail.pozdnyakovc0e251b2015-04-15 06:51:122965 if (display_mode_ != params.display_mode) {
2966 display_mode_ = params.display_mode;
2967 webview()->setDisplayMode(display_mode_);
2968 }
[email protected]cda45c02010-02-25 19:28:102969 }
2970
[email protected]cbbdeef2014-05-26 15:57:362971 gfx::Size old_visible_viewport_size = visible_viewport_size_;
2972
[email protected]0fdd5012013-05-29 08:05:562973 RenderWidget::OnResize(params);
[email protected]cbbdeef2014-05-26 15:57:362974
2975 if (old_visible_viewport_size != visible_viewport_size_)
2976 has_scrolled_focused_editable_node_into_rect_ = false;
[email protected]30f75e62009-02-25 22:01:002977}
[email protected]0aa477bd2009-03-23 22:21:432978
[email protected]310ebd6302011-10-10 19:06:282979void RenderViewImpl::DidInitiatePaint() {
[email protected]ea2fb972013-08-07 05:44:262980#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:572981 // Notify all instances that we painted. The same caveats apply as for
2982 // ViewFlushedPaint regarding instances closing themselves, so we take
2983 // similar precautions.
2984 PepperPluginSet plugins = active_pepper_instances_;
2985 for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) {
2986 if (active_pepper_instances_.find(*i) != active_pepper_instances_.end())
2987 (*i)->ViewInitiatedPaint();
2988 }
[email protected]ea2fb972013-08-07 05:44:262989#endif
[email protected]00c39612010-03-06 02:53:282990}
2991
[email protected]310ebd6302011-10-10 19:06:282992void RenderViewImpl::DidFlushPaint() {
[email protected]5b1dec8c2012-02-07 04:35:382993 // If the RenderWidget is closing down then early-exit, otherwise we'll crash.
2994 // See crbug.com/112921.
2995 if (!webview())
2996 return;
2997
[email protected]00c39612010-03-06 02:53:282998 WebFrame* main_frame = webview()->mainFrame();
[email protected]82307f6b2014-08-07 03:30:122999 for (WebFrame* frame = main_frame; frame;
3000 frame = frame->traverseNext(false)) {
pmeenandcc725b2014-10-22 18:04:113001 // TODO(nasko): This is a hack for the case in which the top-level
3002 // frame is being rendered in another process. It will not
3003 // behave correctly for out of process iframes.
3004 if (frame->isWebLocalFrame()) {
[email protected]82307f6b2014-08-07 03:30:123005 main_frame = frame;
pmeenandcc725b2014-10-22 18:04:113006 break;
3007 }
[email protected]82307f6b2014-08-07 03:30:123008 }
[email protected]00c39612010-03-06 02:53:283009
3010 // If we have a provisional frame we are between the start and commit stages
3011 // of loading and we don't want to save stats.
3012 if (!main_frame->provisionalDataSource()) {
3013 WebDataSource* ds = main_frame->dataSource();
enne95486602015-04-30 23:41:103014 if (!ds)
3015 return;
3016
[email protected]007733c2011-11-17 00:34:073017 DocumentState* document_state = DocumentState::FromDataSource(ds);
[email protected]92d457802013-04-01 19:18:493018
[email protected]05c8e502010-08-15 15:13:523019 // TODO(jar): The following code should all be inside a method, probably in
3020 // NavigatorState.
[email protected]00c39612010-03-06 02:53:283021 Time now = Time::Now();
[email protected]007733c2011-11-17 00:34:073022 if (document_state->first_paint_time().is_null()) {
3023 document_state->set_first_paint_time(now);
[email protected]00c39612010-03-06 02:53:283024 }
[email protected]007733c2011-11-17 00:34:073025 if (document_state->first_paint_after_load_time().is_null() &&
3026 !document_state->finish_load_time().is_null()) {
3027 document_state->set_first_paint_after_load_time(now);
[email protected]00c39612010-03-06 02:53:283028 }
3029 }
3030}
3031
[email protected]ceb36f7d2012-10-31 18:33:243032gfx::Vector2d RenderViewImpl::GetScrollOffset() {
[email protected]82307f6b2014-08-07 03:30:123033 WebFrame* main_frame = webview()->mainFrame();
3034 for (WebFrame* frame = main_frame; frame;
3035 frame = frame->traverseNext(false)) {
3036 // TODO(nasko): This is a hack for the case in which the top-level
3037 // frame is being rendered in another process. It will not
3038 // behave correctly for out of process iframes.
3039 if (frame->isWebLocalFrame()) {
3040 main_frame = frame;
3041 break;
3042 }
3043 }
3044
3045 WebSize scroll_offset = main_frame->scrollOffset();
[email protected]ceb36f7d2012-10-31 18:33:243046 return gfx::Vector2d(scroll_offset.width, scroll_offset.height);
[email protected]d54169e92011-01-21 09:19:523047}
3048
[email protected]ab6c9112014-02-27 00:20:583049void RenderViewImpl::OnClearFocusedElement() {
[email protected]05d478752009-04-08 23:38:163050 if (webview())
[email protected]ab6c9112014-02-27 00:20:583051 webview()->clearFocusedElement();
[email protected]05d478752009-04-08 23:38:163052}
3053
[email protected]61f91832014-05-13 01:24:423054void RenderViewImpl::OnSetBackgroundOpaque(bool opaque) {
[email protected]699ab0d2009-04-23 23:19:143055 if (webview())
[email protected]61f91832014-05-13 01:24:423056 webview()->setIsTransparent(!opaque);
[email protected]ba91a792013-02-06 09:48:283057 if (compositor_)
[email protected]61f91832014-05-13 01:24:423058 compositor_->setHasTransparentBackground(!opaque);
[email protected]699ab0d2009-04-23 23:19:143059}
3060
[email protected]310ebd6302011-10-10 19:06:283061void RenderViewImpl::OnSetActive(bool active) {
[email protected]8c66c5a2009-07-22 17:26:343062 if (webview())
[email protected]b4bb2502009-10-01 22:35:273063 webview()->setIsActive(active);
[email protected]d8fd6fa2010-02-01 15:54:263064
[email protected]a80af12e2013-08-07 23:36:133065#if defined(ENABLE_PLUGINS) && defined(OS_MACOSX)
[email protected]d8fd6fa2010-02-01 15:54:263066 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3067 for (plugin_it = plugin_delegates_.begin();
3068 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3069 (*plugin_it)->SetWindowFocus(active);
3070 }
3071#endif
[email protected]8c66c5a2009-07-22 17:26:343072}
3073
[email protected]6ce7abc52010-02-02 18:40:143074#if defined(OS_MACOSX)
[email protected]310ebd6302011-10-10 19:06:283075void RenderViewImpl::OnSetWindowVisibility(bool visible) {
[email protected]a80af12e2013-08-07 23:36:133076#if defined(ENABLE_PLUGINS)
[email protected]6ce7abc52010-02-02 18:40:143077 // Inform plugins that their container has changed visibility.
3078 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3079 for (plugin_it = plugin_delegates_.begin();
3080 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3081 (*plugin_it)->SetContainerVisibility(visible);
3082 }
[email protected]a80af12e2013-08-07 23:36:133083#endif
[email protected]6ce7abc52010-02-02 18:40:143084}
[email protected]1e6e3c992010-02-08 15:52:133085
[email protected]310ebd6302011-10-10 19:06:283086void RenderViewImpl::OnWindowFrameChanged(const gfx::Rect& window_frame,
3087 const gfx::Rect& view_frame) {
[email protected]a80af12e2013-08-07 23:36:133088#if defined(ENABLE_PLUGINS)
[email protected]1e6e3c992010-02-08 15:52:133089 // Inform plugins that their window's frame has changed.
3090 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3091 for (plugin_it = plugin_delegates_.begin();
3092 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3093 (*plugin_it)->WindowFrameChanged(window_frame, view_frame);
3094 }
[email protected]a80af12e2013-08-07 23:36:133095#endif
[email protected]1e6e3c992010-02-08 15:52:133096}
[email protected]935d63d2010-10-15 23:31:553097
[email protected]fcf75d42013-12-03 20:11:263098void RenderViewImpl::OnPluginImeCompositionCompleted(const base::string16& text,
[email protected]310ebd6302011-10-10 19:06:283099 int plugin_id) {
[email protected]b7f75862011-01-21 21:15:133100 // WebPluginDelegateProxy is responsible for figuring out if this event
[email protected]935d63d2010-10-15 23:31:553101 // applies to it or not, so inform all the delegates.
3102 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3103 for (plugin_it = plugin_delegates_.begin();
3104 plugin_it != plugin_delegates_.end(); ++plugin_it) {
[email protected]b7f75862011-01-21 21:15:133105 (*plugin_it)->ImeCompositionCompleted(text, plugin_id);
[email protected]935d63d2010-10-15 23:31:553106 }
3107}
[email protected]6ce7abc52010-02-02 18:40:143108#endif // OS_MACOSX
3109
[email protected]310ebd6302011-10-10 19:06:283110void RenderViewImpl::Close() {
[email protected]60c42a8c72009-10-09 04:08:593111 // We need to grab a pointer to the doomed WebView before we destroy it.
3112 WebView* doomed = webview();
3113 RenderWidget::Close();
[email protected]625332e02010-12-14 07:48:493114 g_view_map.Get().erase(doomed);
[email protected]058561b2012-12-03 06:48:223115 g_routing_id_view_map.Get().erase(routing_id_);
[email protected]6de7fc482014-06-06 10:46:443116 RenderThread::Get()->Send(new ViewHostMsg_Close_ACK(routing_id_));
[email protected]60c42a8c72009-10-09 04:08:593117}
3118
[email protected]310ebd6302011-10-10 19:06:283119void RenderViewImpl::DidHandleKeyEvent() {
[email protected]b2324b092012-11-01 10:34:113120 ClearEditCommands();
[email protected]446705872009-09-10 07:22:483121}
3122
[email protected]180ef242013-11-07 06:50:463123bool RenderViewImpl::WillHandleMouseEvent(const blink::WebMouseEvent& event) {
[email protected]41d86852012-11-07 12:23:243124 possible_drag_event_info_.event_source =
3125 ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE;
3126 possible_drag_event_info_.event_location =
3127 gfx::Point(event.globalX, event.globalY);
[email protected]ea2fb972013-08-07 05:44:263128
3129#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573130 // This method is called for every mouse event that the render view receives.
3131 // And then the mouse event is forwarded to WebKit, which dispatches it to the
3132 // event target. Potentially a Pepper plugin will receive the event.
3133 // In order to tell whether a plugin gets the last mouse event and which it
3134 // is, we set |pepper_last_mouse_event_target_| to NULL here. If a plugin gets
3135 // the event, it will notify us via DidReceiveMouseEvent() and set itself as
3136 // |pepper_last_mouse_event_target_|.
3137 pepper_last_mouse_event_target_ = NULL;
[email protected]ea2fb972013-08-07 05:44:263138#endif
[email protected]217690d2012-01-27 07:33:113139
3140 // If the mouse is locked, only the current owner of the mouse lock can
3141 // process mouse events.
3142 return mouse_lock_dispatcher_->WillHandleMouseEvent(event);
[email protected]67bfb83f2011-09-22 03:36:373143}
3144
[email protected]41d86852012-11-07 12:23:243145bool RenderViewImpl::WillHandleGestureEvent(
[email protected]180ef242013-11-07 06:50:463146 const blink::WebGestureEvent& event) {
[email protected]41d86852012-11-07 12:23:243147 possible_drag_event_info_.event_source =
3148 ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH;
3149 possible_drag_event_info_.event_location =
3150 gfx::Point(event.globalX, event.globalY);
3151 return false;
3152}
3153
[email protected]3d5c243b2012-11-30 00:26:013154bool RenderViewImpl::HasTouchEventHandlersAt(const gfx::Point& point) const {
3155 if (!webview())
3156 return false;
3157 return webview()->hasTouchEventHandlersAt(point);
3158}
3159
[email protected]310ebd6302011-10-10 19:06:283160void RenderViewImpl::OnWasHidden() {
[email protected]941e4552010-02-01 21:23:433161 RenderWidget::OnWasHidden();
3162
[email protected]68877c282013-09-20 05:52:423163#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
[email protected]6392d982013-04-16 16:59:223164 RenderThreadImpl::current()->video_capture_impl_manager()->
3165 SuspendDevices(true);
[email protected]e976c3c52014-07-24 17:41:553166 if (speech_recognition_dispatcher_)
3167 speech_recognition_dispatcher_->AbortAllRecognitions();
[email protected]6392d982013-04-16 16:59:223168#endif
[email protected]2d7b82c2012-06-01 05:57:503169
[email protected]8869d392013-05-07 15:34:263170 if (webview())
[email protected]f59203a2011-06-07 10:01:443171 webview()->setVisibilityState(visibilityState(), false);
[email protected]a6939ca42011-02-18 17:58:073172
[email protected]ea2fb972013-08-07 05:44:263173#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573174 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3175 i != active_pepper_instances_.end(); ++i)
3176 (*i)->PageVisibilityChanged(false);
[email protected]204f1df2012-01-04 20:21:133177
[email protected]a6939ca42011-02-18 17:58:073178#if defined(OS_MACOSX)
[email protected]204f1df2012-01-04 20:21:133179 // Inform NPAPI plugins that their container is no longer visible.
[email protected]941e4552010-02-01 21:23:433180 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3181 for (plugin_it = plugin_delegates_.begin();
3182 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3183 (*plugin_it)->SetContainerVisibility(false);
3184 }
[email protected]a6939ca42011-02-18 17:58:073185#endif // OS_MACOSX
[email protected]a80af12e2013-08-07 23:36:133186#endif // ENABLE_PLUGINS
[email protected]941e4552010-02-01 21:23:433187}
3188
[email protected]3399dd822014-08-09 11:14:243189void RenderViewImpl::OnWasShown(bool needs_repainting,
3190 const ui::LatencyInfo& latency_info) {
3191 RenderWidget::OnWasShown(needs_repainting, latency_info);
[email protected]941e4552010-02-01 21:23:433192
[email protected]6392d982013-04-16 16:59:223193#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC)
3194 RenderThreadImpl::current()->video_capture_impl_manager()->
3195 SuspendDevices(false);
3196#endif
3197
[email protected]8869d392013-05-07 15:34:263198 if (webview())
[email protected]f59203a2011-06-07 10:01:443199 webview()->setVisibilityState(visibilityState(), false);
[email protected]a6939ca42011-02-18 17:58:073200
[email protected]ea2fb972013-08-07 05:44:263201#if defined(ENABLE_PLUGINS)
[email protected]a99a38802014-01-14 15:46:573202 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3203 i != active_pepper_instances_.end(); ++i)
3204 (*i)->PageVisibilityChanged(true);
[email protected]204f1df2012-01-04 20:21:133205
[email protected]a6939ca42011-02-18 17:58:073206#if defined(OS_MACOSX)
[email protected]204f1df2012-01-04 20:21:133207 // Inform NPAPI plugins that their container is now visible.
[email protected]941e4552010-02-01 21:23:433208 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3209 for (plugin_it = plugin_delegates_.begin();
3210 plugin_it != plugin_delegates_.end(); ++plugin_it) {
3211 (*plugin_it)->SetContainerVisibility(true);
3212 }
[email protected]784ea1ab2010-09-18 00:02:343213#endif // OS_MACOSX
[email protected]a80af12e2013-08-07 23:36:133214#endif // ENABLE_PLUGINS
[email protected]a6939ca42011-02-18 17:58:073215}
[email protected]1e6e3c992010-02-08 15:52:133216
[email protected]ed7defa2013-03-12 21:29:593217GURL RenderViewImpl::GetURLForGraphicsContext3D() {
3218 DCHECK(webview());
[email protected]82307f6b2014-08-07 03:30:123219 if (webview()->mainFrame()->isWebLocalFrame())
[email protected]ed7defa2013-03-12 21:29:593220 return GURL(webview()->mainFrame()->document().url());
3221 else
3222 return GURL("chrome://gpu/RenderViewImpl::CreateGraphicsContext3D");
[email protected]65225772011-05-12 21:10:243223}
3224
[email protected]310ebd6302011-10-10 19:06:283225void RenderViewImpl::OnSetFocus(bool enable) {
[email protected]1e6e3c992010-02-08 15:52:133226 RenderWidget::OnSetFocus(enable);
3227
[email protected]a80af12e2013-08-07 23:36:133228#if defined(ENABLE_PLUGINS)
[email protected]7d3c02c2010-05-05 23:10:313229 if (webview() && webview()->isActive()) {
[email protected]589621b2010-09-23 22:01:073230 // Notify all NPAPI plugins.
[email protected]1e6e3c992010-02-08 15:52:133231 std::set<WebPluginDelegateProxy*>::iterator plugin_it;
3232 for (plugin_it = plugin_delegates_.begin();
3233 plugin_it != plugin_delegates_.end(); ++plugin_it) {
[email protected]784ea1ab2010-09-18 00:02:343234#if defined(OS_MACOSX)
[email protected]7d3c02c2010-05-05 23:10:313235 // RenderWidget's call to setFocus can cause the underlying webview's
3236 // activation state to change just like a call to setIsActive.
3237 if (enable)
3238 (*plugin_it)->SetWindowFocus(true);
[email protected]784ea1ab2010-09-18 00:02:343239#endif
[email protected]7d3c02c2010-05-05 23:10:313240 (*plugin_it)->SetContentAreaFocus(enable);
[email protected]1e6e3c992010-02-08 15:52:133241 }
3242 }
[email protected]a99a38802014-01-14 15:46:573243 // Notify all Pepper plugins.
3244 for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
3245 i != active_pepper_instances_.end(); ++i)
3246 (*i)->SetContentAreaFocus(enable);
[email protected]ea2fb972013-08-07 05:44:263247#endif
[email protected]321032992012-11-08 01:01:273248 // Notify all BrowserPlugins of the RenderView's focus state.
fsamuel6c1dfeb2014-12-18 19:21:333249 if (BrowserPluginManager::Get())
3250 BrowserPluginManager::Get()->UpdateFocusState();
[email protected]1e6e3c992010-02-08 15:52:133251}
[email protected]941e4552010-02-01 21:23:433252
[email protected]310ebd6302011-10-10 19:06:283253void RenderViewImpl::OnImeSetComposition(
[email protected]fcf75d42013-12-03 20:11:263254 const base::string16& text,
[email protected]180ef242013-11-07 06:50:463255 const std::vector<blink::WebCompositionUnderline>& underlines,
[email protected]56ea1a62011-05-30 07:05:573256 int selection_start,
3257 int selection_end) {
[email protected]ea2fb972013-08-07 05:44:263258#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083259 if (focused_pepper_plugin_) {
3260 focused_pepper_plugin_->render_frame()->OnImeSetComposition(
[email protected]7a4e2532013-12-02 21:30:023261 text, underlines, selection_start, selection_end);
[email protected]ea2fb972013-08-07 05:44:263262 return;
[email protected]56ea1a62011-05-30 07:05:573263 }
[email protected]ea2fb972013-08-07 05:44:263264
3265#if defined(OS_WIN)
tommyclie86b2982015-03-16 20:16:453266 // When a plugin has focus, we create platform-specific IME data used by
3267 // our IME emulator and send it directly to the focused plugin, i.e. we
[email protected]ea2fb972013-08-07 05:44:263268 // bypass WebKit. (WebPluginDelegate dispatches this IME data only when its
3269 // instance ID is the same one as the specified ID.)
3270 if (focused_plugin_id_ >= 0) {
3271 std::vector<int> clauses;
3272 std::vector<int> target;
3273 for (size_t i = 0; i < underlines.size(); ++i) {
3274 clauses.push_back(underlines[i].startOffset);
3275 clauses.push_back(underlines[i].endOffset);
3276 if (underlines[i].thick) {
3277 target.clear();
3278 target.push_back(underlines[i].startOffset);
3279 target.push_back(underlines[i].endOffset);
3280 }
3281 }
3282 std::set<WebPluginDelegateProxy*>::iterator it;
3283 for (it = plugin_delegates_.begin(); it != plugin_delegates_.end(); ++it) {
3284 (*it)->ImeCompositionUpdated(text, clauses, target, selection_end,
3285 focused_plugin_id_);
3286 }
3287 return;
3288 }
[email protected]a80af12e2013-08-07 23:36:133289#endif // OS_WIN
3290#endif // ENABLE_PLUGINS
[email protected]ea2fb972013-08-07 05:44:263291 RenderWidget::OnImeSetComposition(text,
3292 underlines,
3293 selection_start,
3294 selection_end);
[email protected]56ea1a62011-05-30 07:05:573295}
3296
[email protected]db4fc1e2013-09-06 20:01:513297void RenderViewImpl::OnImeConfirmComposition(
[email protected]fcf75d42013-12-03 20:11:263298 const base::string16& text,
[email protected]db4fc1e2013-09-06 20:01:513299 const gfx::Range& replacement_range,
3300 bool keep_selection) {
[email protected]ea2fb972013-08-07 05:44:263301#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083302 if (focused_pepper_plugin_) {
3303 focused_pepper_plugin_->render_frame()->OnImeConfirmComposition(
[email protected]7a4e2532013-12-02 21:30:023304 text, replacement_range, keep_selection);
[email protected]ea2fb972013-08-07 05:44:263305 return;
[email protected]56ea1a62011-05-30 07:05:573306 }
[email protected]ea2fb972013-08-07 05:44:263307#if defined(OS_WIN)
3308 // Same as OnImeSetComposition(), we send the text from IMEs directly to
tommyclie86b2982015-03-16 20:16:453309 // plugins. When we send IME text directly to plugins, we should not send
[email protected]ea2fb972013-08-07 05:44:263310 // it to WebKit to prevent WebKit from controlling IMEs.
3311 // TODO(thakis): Honor |replacement_range| for plugins?
3312 if (focused_plugin_id_ >= 0) {
3313 std::set<WebPluginDelegateProxy*>::iterator it;
3314 for (it = plugin_delegates_.begin();
3315 it != plugin_delegates_.end(); ++it) {
3316 (*it)->ImeCompositionCompleted(text, focused_plugin_id_);
3317 }
3318 return;
3319 }
[email protected]a80af12e2013-08-07 23:36:133320#endif // OS_WIN
3321#endif // ENABLE_PLUGINS
[email protected]ea2fb972013-08-07 05:44:263322 if (replacement_range.IsValid() && webview()) {
3323 // Select the text in |replacement_range|, it will then be replaced by
3324 // text added by the call to RenderWidget::OnImeConfirmComposition().
[email protected]35b2a972014-04-04 15:50:223325 if (WebLocalFrame* frame = webview()->focusedFrame()->toWebLocalFrame()) {
[email protected]ea2fb972013-08-07 05:44:263326 WebRange webrange = WebRange::fromDocumentRange(
3327 frame, replacement_range.start(), replacement_range.length());
3328 if (!webrange.isNull())
3329 frame->selectRange(webrange);
3330 }
3331 }
3332 RenderWidget::OnImeConfirmComposition(text,
3333 replacement_range,
3334 keep_selection);
[email protected]56ea1a62011-05-30 07:05:573335}
3336
[email protected]468ac582012-11-20 00:53:193337void RenderViewImpl::SetDeviceScaleFactor(float device_scale_factor) {
3338 RenderWidget::SetDeviceScaleFactor(device_scale_factor);
[email protected]fb854192013-02-06 01:30:043339 if (webview()) {
[email protected]dea5e7682012-06-14 05:21:243340 webview()->setDeviceScaleFactor(device_scale_factor);
[email protected]b8ec1112014-08-17 20:09:103341 webview()->settings()->setPreferCompositingToLCDTextEnabled(
danakj6e3bf8012014-12-16 18:27:533342 PreferCompositingToLCDText(compositor_deps_, device_scale_factor_));
[email protected]fb854192013-02-06 01:30:043343 }
[email protected]3a1c8a8032013-03-18 22:35:323344 if (auto_resize_mode_)
3345 AutoResizeCompositor();
[email protected]dea5e7682012-06-14 05:21:243346}
3347
[email protected]28ed6b32014-06-08 02:16:273348bool RenderViewImpl::SetDeviceColorProfile(
3349 const std::vector<char>& profile) {
3350 bool changed = RenderWidget::SetDeviceColorProfile(profile);
3351 if (changed && webview()) {
noelc76aa4c2014-09-25 01:08:563352 WebVector<char> colorProfile = profile;
3353 webview()->setDeviceColorProfile(colorProfile);
[email protected]28ed6b32014-06-08 02:16:273354 }
3355 return changed;
3356}
3357
noeldb4df152014-09-16 17:45:203358void RenderViewImpl::ResetDeviceColorProfileForTesting() {
3359 RenderWidget::ResetDeviceColorProfileForTesting();
3360 if (webview())
3361 webview()->resetDeviceColorProfile();
3362}
3363
[email protected]310ebd6302011-10-10 19:06:283364ui::TextInputType RenderViewImpl::GetTextInputType() {
[email protected]ea2fb972013-08-07 05:44:263365#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083366 if (focused_pepper_plugin_)
3367 return focused_pepper_plugin_->text_input_type();
[email protected]ea2fb972013-08-07 05:44:263368#endif
3369 return RenderWidget::GetTextInputType();
[email protected]73bf95812011-10-12 11:38:323370}
3371
[email protected]3f783362011-10-21 22:40:503372void RenderViewImpl::GetSelectionBounds(gfx::Rect* start, gfx::Rect* end) {
[email protected]ea2fb972013-08-07 05:44:263373#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083374 if (focused_pepper_plugin_) {
[email protected]3f783362011-10-21 22:40:503375 // TODO(kinaba) http://crbug.com/101101
3376 // Current Pepper IME API does not handle selection bounds. So we simply
3377 // use the caret position as an empty range for now. It will be updated
3378 // after Pepper API equips features related to surrounding text retrieval.
[email protected]e16c7a12013-12-05 16:30:083379 gfx::Rect caret = focused_pepper_plugin_->GetCaretBounds();
[email protected]3f783362011-10-21 22:40:503380 *start = caret;
3381 *end = caret;
3382 return;
3383 }
[email protected]ea2fb972013-08-07 05:44:263384#endif
[email protected]3f783362011-10-21 22:40:503385 RenderWidget::GetSelectionBounds(start, end);
[email protected]ad26ef42011-06-17 07:59:453386}
3387
rouslanf7ebd8832015-01-22 01:54:143388void RenderViewImpl::FocusChangeComplete() {
3389 RenderWidget::FocusChangeComplete();
3390 FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusChangeComplete());
3391}
3392
[email protected]58b48a0d2012-06-13 07:01:353393void RenderViewImpl::GetCompositionCharacterBounds(
3394 std::vector<gfx::Rect>* bounds) {
3395 DCHECK(bounds);
3396 bounds->clear();
3397
[email protected]ea2fb972013-08-07 05:44:263398#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083399 if (focused_pepper_plugin_) {
[email protected]88dbe32f2013-06-20 23:31:363400 return;
3401 }
[email protected]ea2fb972013-08-07 05:44:263402#endif
3403
[email protected]58b48a0d2012-06-13 07:01:353404 if (!webview())
3405 return;
3406 size_t start_offset = 0;
3407 size_t character_count = 0;
3408 if (!webview()->compositionRange(&start_offset, &character_count))
3409 return;
3410 if (character_count == 0)
3411 return;
3412
[email protected]180ef242013-11-07 06:50:463413 blink::WebFrame* frame = webview()->focusedFrame();
[email protected]58b48a0d2012-06-13 07:01:353414 if (!frame)
3415 return;
3416
3417 bounds->reserve(character_count);
[email protected]180ef242013-11-07 06:50:463418 blink::WebRect webrect;
[email protected]58b48a0d2012-06-13 07:01:353419 for (size_t i = 0; i < character_count; ++i) {
3420 if (!frame->firstRectForCharacterRange(start_offset + i, 1, webrect)) {
3421 DLOG(ERROR) << "Could not retrieve character rectangle at " << i;
3422 bounds->clear();
3423 return;
3424 }
3425 bounds->push_back(webrect);
3426 }
3427}
3428
[email protected]db4fc1e2013-09-06 20:01:513429void RenderViewImpl::GetCompositionRange(gfx::Range* range) {
[email protected]ea2fb972013-08-07 05:44:263430#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083431 if (focused_pepper_plugin_) {
[email protected]88dbe32f2013-06-20 23:31:363432 return;
3433 }
[email protected]ea2fb972013-08-07 05:44:263434#endif
[email protected]88dbe32f2013-06-20 23:31:363435 RenderWidget::GetCompositionRange(range);
3436}
3437
[email protected]310ebd6302011-10-10 19:06:283438bool RenderViewImpl::CanComposeInline() {
[email protected]ea2fb972013-08-07 05:44:263439#if defined(ENABLE_PLUGINS)
[email protected]e16c7a12013-12-05 16:30:083440 if (focused_pepper_plugin_)
3441 return focused_pepper_plugin_->IsPluginAcceptingCompositionEvents();
[email protected]ea2fb972013-08-07 05:44:263442#endif
3443 return true;
[email protected]56ea1a62011-05-30 07:05:573444}
3445
rouslanf7ebd8832015-01-22 01:54:143446void RenderViewImpl::DidCompletePageScaleAnimation() {
3447 FocusChangeComplete();
3448}
3449
[email protected]b2e4c70132013-10-03 02:07:513450void RenderViewImpl::SetScreenMetricsEmulationParameters(
dgozman9260b0a12015-03-16 13:45:203451 bool enabled,
3452 const blink::WebDeviceEmulationParams& params) {
[email protected]404630b2014-07-03 19:33:033453 if (webview() && compositor()) {
dgozman9260b0a12015-03-16 13:45:203454 if (enabled)
3455 webview()->enableDeviceEmulation(params);
3456 else
3457 webview()->disableDeviceEmulation();
[email protected]b2e4c70132013-10-03 02:07:513458 }
3459}
3460
[email protected]310ebd6302011-10-10 19:06:283461bool RenderViewImpl::ScheduleFileChooser(
[email protected]e9ff79c2012-10-19 21:31:263462 const FileChooserParams& params,
[email protected]cdaf8d02010-03-30 19:52:473463 WebFileChooserCompletion* completion) {
3464 static const size_t kMaximumPendingFileChooseRequests = 4;
3465 if (file_chooser_completions_.size() > kMaximumPendingFileChooseRequests) {
3466 // This sanity check prevents too many file choose requests from getting
3467 // queued which could DoS the user. Getting these is most likely a
3468 // programming error (there are many ways to DoS the user so it's not
3469 // considered a "real" security check), either in JS requesting many file
3470 // choosers to pop up, or in a plugin.
3471 //
3472 // TODO(brettw) we might possibly want to require a user gesture to open
3473 // a file picker, which will address this issue in a better way.
3474 return false;
3475 }
3476
3477 file_chooser_completions_.push_back(linked_ptr<PendingFileChooser>(
3478 new PendingFileChooser(params, completion)));
3479 if (file_chooser_completions_.size() == 1) {
3480 // Actually show the browse dialog when this is the first request.
3481 Send(new ViewHostMsg_RunFileChooser(routing_id_, params));
3482 }
3483 return true;
3484}
3485
[email protected]180ef242013-11-07 06:50:463486blink::WebSpeechRecognizer* RenderViewImpl::speechRecognizer() {
[email protected]64d09222012-05-25 10:10:343487 if (!speech_recognition_dispatcher_)
3488 speech_recognition_dispatcher_ = new SpeechRecognitionDispatcher(this);
[email protected]64d09222012-05-25 10:10:343489 return speech_recognition_dispatcher_;
3490}
3491
[email protected]310ebd6302011-10-10 19:06:283492void RenderViewImpl::zoomLimitsChanged(double minimum_level,
3493 double maximum_level) {
a.sarkar.arundaadc712015-02-26 05:39:083494 // Round the double to avoid returning incorrect minimum/maximum zoom
3495 // percentages.
3496 int minimum_percent = round(
[email protected]7940b8e2013-07-25 23:08:493497 ZoomLevelToZoomFactor(minimum_level) * 100);
a.sarkar.arundaadc712015-02-26 05:39:083498 int maximum_percent = round(
[email protected]7940b8e2013-07-25 23:08:493499 ZoomLevelToZoomFactor(maximum_level) * 100);
[email protected]b75b8292010-10-01 07:28:253500
3501 Send(new ViewHostMsg_UpdateZoomLimits(
[email protected]fce823222014-05-30 16:24:303502 routing_id_, minimum_percent, maximum_percent));
[email protected]b75b8292010-10-01 07:28:253503}
3504
[email protected]310ebd6302011-10-10 19:06:283505void RenderViewImpl::zoomLevelChanged() {
[email protected]54b8e182014-05-02 18:08:293506 double zoom_level = webview()->zoomLevel();
[email protected]2b942c332012-04-25 16:26:263507
[email protected]54b8e182014-05-02 18:08:293508 // Do not send empty URLs to the browser when we are just setting the default
3509 // zoom level (from RendererPreferences) before the first navigation.
3510 if (!webview()->mainFrame()->document().url().isEmpty()) {
3511 // Tell the browser which url got zoomed so it can update the menu and the
3512 // saved values if necessary
3513 Send(new ViewHostMsg_DidZoomURL(
[email protected]fce823222014-05-30 16:24:303514 routing_id_, zoom_level,
[email protected]54b8e182014-05-02 18:08:293515 GURL(webview()->mainFrame()->document().url())));
3516 }
[email protected]b75b8292010-10-01 07:28:253517}
3518
ccameronb7c1d6c2015-03-09 17:08:243519void RenderViewImpl::pageScaleFactorChanged() {
3520 if (!webview())
3521 return;
3522 bool page_scale_factor_is_one = webview()->pageScaleFactor() == 1;
3523 if (page_scale_factor_is_one == page_scale_factor_is_one_)
3524 return;
3525 page_scale_factor_is_one_ = page_scale_factor_is_one;
3526 Send(new ViewHostMsg_PageScaleFactorIsOneChanged(routing_id_,
3527 page_scale_factor_is_one_));
3528}
3529
[email protected]7940b8e2013-07-25 23:08:493530double RenderViewImpl::zoomLevelToZoomFactor(double zoom_level) const {
3531 return ZoomLevelToZoomFactor(zoom_level);
3532}
3533
3534double RenderViewImpl::zoomFactorToZoomLevel(double factor) const {
3535 return ZoomFactorToZoomLevel(factor);
3536}
3537
[email protected]f29bc5e2014-08-22 10:34:063538void RenderViewImpl::registerProtocolHandler(const WebString& scheme,
3539 const WebURL& url,
3540 const WebString& title) {
3541 bool user_gesture = WebUserGestureIndicator::isProcessingUserGesture();
3542 Send(new ViewHostMsg_RegisterProtocolHandler(routing_id_,
3543 base::UTF16ToUTF8(scheme),
3544 url,
3545 title,
3546 user_gesture));
3547}
3548
3549void RenderViewImpl::unregisterProtocolHandler(const WebString& scheme,
3550 const WebURL& url) {
3551 bool user_gesture = WebUserGestureIndicator::isProcessingUserGesture();
3552 Send(new ViewHostMsg_UnregisterProtocolHandler(routing_id_,
3553 base::UTF16ToUTF8(scheme),
3554 url,
3555 user_gesture));
3556}
3557
[email protected]180ef242013-11-07 06:50:463558blink::WebPageVisibilityState RenderViewImpl::visibilityState() const {
3559 blink::WebPageVisibilityState current_state = is_hidden() ?
3560 blink::WebPageVisibilityStateHidden :
3561 blink::WebPageVisibilityStateVisible;
3562 blink::WebPageVisibilityState override_state = current_state;
[email protected]b849847b2013-12-10 21:57:583563 // TODO(jam): move this method to WebFrameClient.
[email protected]e9ff79c2012-10-19 21:31:263564 if (GetContentClient()->renderer()->
nasko77de2312015-05-12 03:09:163565 ShouldOverridePageVisibilityState(main_render_frame_,
[email protected]f59203a2011-06-07 10:01:443566 &override_state))
3567 return override_state;
3568 return current_state;
[email protected]94dec932011-05-26 20:04:213569}
3570
[email protected]a0629af92012-08-08 00:39:373571void RenderViewImpl::draggableRegionsChanged() {
3572 FOR_EACH_OBSERVER(
3573 RenderViewObserver,
3574 observers_,
3575 DraggableRegionsChanged(webview()->mainFrame()));
3576}
3577
[email protected]20657a82012-08-21 20:23:033578#if defined(OS_ANDROID)
3579WebContentDetectionResult RenderViewImpl::detectContentAround(
3580 const WebHitTestResult& touch_hit) {
[email protected]20657a82012-08-21 20:23:033581 DCHECK(touch_hit.node().isTextNode());
3582
3583 // Process the position with all the registered content detectors until
3584 // a match is found. Priority is provided by their relative order.
3585 for (ContentDetectorList::const_iterator it = content_detectors_.begin();
3586 it != content_detectors_.end(); ++it) {
3587 ContentDetector::Result content = (*it)->FindTappedContent(touch_hit);
3588 if (content.valid) {
3589 return WebContentDetectionResult(content.content_boundaries,
[email protected]32956122013-12-25 07:29:243590 base::UTF8ToUTF16(content.text), content.intent_url);
[email protected]20657a82012-08-21 20:23:033591 }
3592 }
3593 return WebContentDetectionResult();
3594}
3595
3596void RenderViewImpl::scheduleContentIntent(const WebURL& intent) {
3597 // Introduce a short delay so that the user can notice the content.
[email protected]dd32b1272013-05-04 14:17:113598 base::MessageLoop::current()->PostDelayedTask(
[email protected]20657a82012-08-21 20:23:033599 FROM_HERE,
[email protected]dd32b1272013-05-04 14:17:113600 base::Bind(&RenderViewImpl::LaunchAndroidContentIntent,
3601 AsWeakPtr(),
3602 intent,
3603 expected_content_intent_id_),
[email protected]20657a82012-08-21 20:23:033604 base::TimeDelta::FromMilliseconds(kContentIntentDelayMilliseconds));
3605}
3606
3607void RenderViewImpl::cancelScheduledContentIntents() {
3608 ++expected_content_intent_id_;
3609}
3610
3611void RenderViewImpl::LaunchAndroidContentIntent(const GURL& intent,
3612 size_t request_id) {
3613 if (request_id != expected_content_intent_id_)
qinmin0d5560df2014-11-12 19:03:393614 return;
[email protected]20657a82012-08-21 20:23:033615
3616 // Remove the content highlighting if any.
jdduke491a3f0c2015-06-15 23:30:263617 ScheduleComposite();
[email protected]20657a82012-08-21 20:23:033618
3619 if (!intent.is_empty())
3620 Send(new ViewHostMsg_StartContentIntent(routing_id_, intent));
3621}
[email protected]b18583c2012-12-18 06:55:273622
3623bool RenderViewImpl::openDateTimeChooser(
[email protected]180ef242013-11-07 06:50:463624 const blink::WebDateTimeChooserParams& params,
3625 blink::WebDateTimeChooserCompletion* completion) {
[email protected]e8072562013-12-04 06:04:133626 // JavaScript may try to open a date time chooser while one is already open.
3627 if (date_time_picker_client_)
3628 return false;
[email protected]b18583c2012-12-18 06:55:273629 date_time_picker_client_.reset(
3630 new RendererDateTimePicker(this, params, completion));
3631 return date_time_picker_client_->Open();
3632}
3633
[email protected]e8072562013-12-04 06:04:133634void RenderViewImpl::DismissDateTimeDialog() {
3635 DCHECK(date_time_picker_client_);
3636 date_time_picker_client_.reset(NULL);
3637}
[email protected]e8072562013-12-04 06:04:133638
[email protected]6d17f6392012-12-05 05:24:543639#endif // defined(OS_ANDROID)
[email protected]20657a82012-08-21 20:23:033640
[email protected]be1af0662014-07-29 19:55:513641void RenderViewImpl::OnShowContextMenu(
3642 ui::MenuSourceType source_type, const gfx::Point& location) {
3643 context_menu_source_type_ = source_type;
3644 has_host_context_menu_location_ = true;
3645 host_context_menu_location_ = location;
[email protected]47822262013-04-23 17:22:363646 if (webview())
3647 webview()->showContextMenu();
[email protected]be1af0662014-07-29 19:55:513648 has_host_context_menu_location_ = false;
[email protected]47822262013-04-23 17:22:363649}
3650
[email protected]310ebd6302011-10-10 19:06:283651void RenderViewImpl::OnEnableViewSourceMode() {
[email protected]5a7b15a2011-08-22 22:48:183652 if (!webview())
3653 return;
3654 WebFrame* main_frame = webview()->mainFrame();
3655 if (!main_frame)
3656 return;
3657 main_frame->enableViewSourceMode(true);
3658}
[email protected]67bfb83f2011-09-22 03:36:373659
sadrul90f88a9b2015-06-16 16:22:043660#if defined(OS_ANDROID) || defined(USE_AURA)
[email protected]f9526d12012-10-18 01:55:033661bool RenderViewImpl::didTapMultipleTargets(
timav29a8d0f62014-09-25 20:45:533662 const WebSize& inner_viewport_offset,
3663 const WebRect& touch_rect,
[email protected]f9526d12012-10-18 01:55:033664 const WebVector<WebRect>& target_rects) {
mustaq35bb250b2015-05-06 21:22:393665 DCHECK(switches::IsLinkDisambiguationPopupEnabled());
lukene23094a2014-11-23 14:12:313666
[email protected]8d3dfee62013-06-19 05:50:333667 // Never show a disambiguation popup when accessibility is enabled,
3668 // as this interferes with "touch exploration".
[email protected]95640212014-07-26 18:14:303669 AccessibilityMode accessibility_mode =
mostynbc33353232014-09-12 09:38:313670 GetMainRenderFrame()->accessibility_mode();
[email protected]95640212014-07-26 18:14:303671 bool matches_accessibility_mode_complete =
3672 (accessibility_mode & AccessibilityModeComplete) ==
3673 AccessibilityModeComplete;
3674 if (matches_accessibility_mode_complete)
[email protected]8d3dfee62013-06-19 05:50:333675 return false;
3676
timav29a8d0f62014-09-25 20:45:533677 // The touch_rect, target_rects and zoom_rect are in the outer viewport
3678 // reference frame.
[email protected]f9526d12012-10-18 01:55:033679 gfx::Rect zoom_rect;
[email protected]70221f02013-01-31 22:17:073680 float new_total_scale =
3681 DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor(
timav29a8d0f62014-09-25 20:45:533682 touch_rect, target_rects, GetSize(),
[email protected]70221f02013-01-31 22:17:073683 gfx::Rect(webview()->mainFrame()->visibleContentRect()).size(),
3684 device_scale_factor_ * webview()->pageScaleFactor(), &zoom_rect);
jbauman0ed09182015-01-30 22:33:493685 if (!new_total_scale || zoom_rect.IsEmpty())
[email protected]f9526d12012-10-18 01:55:033686 return false;
3687
[email protected]4ded1dbf2013-08-28 21:11:033688 bool handled = false;
3689 switch (renderer_preferences_.tap_multiple_targets_strategy) {
3690 case TAP_MULTIPLE_TARGETS_STRATEGY_ZOOM:
3691 handled = webview()->zoomToMultipleTargetsRect(zoom_rect);
3692 break;
3693 case TAP_MULTIPLE_TARGETS_STRATEGY_POPUP: {
[email protected]bc2804d2013-08-06 07:45:493694 gfx::Size canvas_size =
3695 gfx::ToCeiledSize(gfx::ScaleSize(zoom_rect.size(), new_total_scale));
[email protected]cb189e062014-04-23 00:57:013696 cc::SharedBitmapManager* manager =
3697 RenderThreadImpl::current()->shared_bitmap_manager();
3698 scoped_ptr<cc::SharedBitmap> shared_bitmap =
3699 manager->AllocateSharedBitmap(canvas_size);
jbauman0ed09182015-01-30 22:33:493700 CHECK(!!shared_bitmap);
[email protected]bc2804d2013-08-06 07:45:493701 {
[email protected]cb189e062014-04-23 00:57:013702 SkBitmap bitmap;
3703 SkImageInfo info = SkImageInfo::MakeN32Premul(canvas_size.width(),
3704 canvas_size.height());
3705 bitmap.installPixels(info, shared_bitmap->pixels(), info.minRowBytes());
3706 SkCanvas canvas(bitmap);
[email protected]f9526d12012-10-18 01:55:033707
[email protected]bc2804d2013-08-06 07:45:493708 // TODO(trchen): Cleanup the device scale factor mess.
3709 // device scale will be applied in WebKit
3710 // --> zoom_rect doesn't include device scale,
3711 // but WebKit will still draw on zoom_rect * device_scale_factor_
[email protected]cb189e062014-04-23 00:57:013712 canvas.scale(new_total_scale / device_scale_factor_,
3713 new_total_scale / device_scale_factor_);
3714 canvas.translate(-zoom_rect.x() * device_scale_factor_,
3715 -zoom_rect.y() * device_scale_factor_);
[email protected]f9526d12012-10-18 01:55:033716
[email protected]bcb1f022014-05-06 01:54:173717 DCHECK(webwidget_->isAcceleratedCompositingActive());
3718 // TODO(aelias): The disambiguation popup should be composited so we
3719 // don't have to call this method.
3720 webwidget_->paintCompositedDeprecated(&canvas, zoom_rect);
[email protected]bc2804d2013-08-06 07:45:493721 }
3722
timav29a8d0f62014-09-25 20:45:533723 gfx::Rect zoom_rect_in_screen =
3724 zoom_rect - gfx::Vector2d(inner_viewport_offset.width,
3725 inner_viewport_offset.height);
3726
[email protected]bc2804d2013-08-06 07:45:493727 gfx::Rect physical_window_zoom_rect = gfx::ToEnclosingRect(
timav29a8d0f62014-09-25 20:45:533728 ClientRectToPhysicalWindowRect(gfx::RectF(zoom_rect_in_screen)));
3729
[email protected]bc2804d2013-08-06 07:45:493730 Send(new ViewHostMsg_ShowDisambiguationPopup(routing_id_,
3731 physical_window_zoom_rect,
3732 canvas_size,
[email protected]cb189e062014-04-23 00:57:013733 shared_bitmap->id()));
3734 cc::SharedBitmapId id = shared_bitmap->id();
3735 disambiguation_bitmaps_[id] = shared_bitmap.release();
[email protected]4ded1dbf2013-08-28 21:11:033736 handled = true;
3737 break;
3738 }
3739 case TAP_MULTIPLE_TARGETS_STRATEGY_NONE:
3740 // No-op.
3741 break;
[email protected]f9526d12012-10-18 01:55:033742 }
[email protected]70221f02013-01-31 22:17:073743
[email protected]4ded1dbf2013-08-28 21:11:033744 return handled;
[email protected]f9526d12012-10-18 01:55:033745}
sadrul90f88a9b2015-06-16 16:22:043746#endif // defined(OS_ANDROID) || defined(USE_AURA)
[email protected]f9526d12012-10-18 01:55:033747
[email protected]b283d292013-02-21 08:40:343748unsigned RenderViewImpl::GetLocalSessionHistoryLengthForTesting() const {
3749 return history_list_length_;
3750}
3751
[email protected]cc290f902013-03-04 20:06:023752void RenderViewImpl::SetFocusAndActivateForTesting(bool enable) {
3753 if (enable) {
3754 if (has_focus())
3755 return;
3756 OnSetActive(true);
3757 OnSetFocus(true);
3758 } else {
3759 if (!has_focus())
3760 return;
3761 OnSetFocus(false);
3762 OnSetActive(false);
3763 }
3764}
3765
[email protected]3a1c8a8032013-03-18 22:35:323766void RenderViewImpl::SetDeviceScaleFactorForTesting(float factor) {
[email protected]b54fe452013-06-07 14:01:533767 ViewMsg_Resize_Params params;
3768 params.screen_info = screen_info_;
3769 params.screen_info.deviceScaleFactor = factor;
3770 params.new_size = size();
bokanf0fd2412014-10-30 15:28:553771 params.visible_viewport_size = visible_viewport_size_;
[email protected]b54fe452013-06-07 14:01:533772 params.physical_backing_size =
3773 gfx::ToCeiledSize(gfx::ScaleSize(size(), factor));
dtrainorcb7779b82014-12-04 01:08:023774 params.top_controls_shrink_blink_size = false;
3775 params.top_controls_height = 0.f;
[email protected]b54fe452013-06-07 14:01:533776 params.resizer_rect = WebRect();
mikhail.pozdnyakovf2c902a2015-04-14 08:09:123777 params.is_fullscreen_granted = is_fullscreen_granted();
mikhail.pozdnyakovc0e251b2015-04-15 06:51:123778 params.display_mode = display_mode_;
[email protected]b54fe452013-06-07 14:01:533779 OnResize(params);
[email protected]3a1c8a8032013-03-18 22:35:323780}
3781
[email protected]71e652302014-05-09 14:20:133782void RenderViewImpl::SetDeviceColorProfileForTesting(
3783 const std::vector<char>& color_profile) {
[email protected]28ed6b32014-06-08 02:16:273784 SetDeviceColorProfile(color_profile);
[email protected]71e652302014-05-09 14:20:133785}
3786
[email protected]92650162013-10-30 03:31:023787void RenderViewImpl::ForceResizeForTesting(const gfx::Size& new_size) {
bokanc007c3a2015-02-03 07:15:563788 gfx::Rect new_window_rect(rootWindowRect().x,
3789 rootWindowRect().y,
3790 new_size.width(),
3791 new_size.height());
3792 SetWindowRectSynchronously(new_window_rect);
[email protected]92650162013-10-30 03:31:023793}
3794
[email protected]5b45ad42013-10-25 00:42:043795void RenderViewImpl::UseSynchronousResizeModeForTesting(bool enable) {
3796 resizing_mode_selector_->set_is_synchronous_mode(enable);
3797}
3798
[email protected]eac2b362013-05-22 07:01:453799void RenderViewImpl::EnableAutoResizeForTesting(const gfx::Size& min_size,
3800 const gfx::Size& max_size) {
3801 OnEnableAutoResize(min_size, max_size);
3802}
3803
3804void RenderViewImpl::DisableAutoResizeForTesting(const gfx::Size& new_size) {
3805 OnDisableAutoResize(new_size);
3806}
3807
[email protected]cb189e062014-04-23 00:57:013808void RenderViewImpl::OnReleaseDisambiguationPopupBitmap(
3809 const cc::SharedBitmapId& id) {
3810 BitmapMap::iterator it = disambiguation_bitmaps_.find(id);
3811 DCHECK(it != disambiguation_bitmaps_.end());
3812 delete it->second;
3813 disambiguation_bitmaps_.erase(it);
[email protected]f9526d12012-10-18 01:55:033814}
[email protected]e9ff79c2012-10-19 21:31:263815
[email protected]6fceb912013-02-15 06:24:153816void RenderViewImpl::DidCommitCompositorFrame() {
3817 RenderWidget::DidCommitCompositorFrame();
3818 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidCommitCompositorFrame());
3819}
3820
[email protected]41225fe2013-03-29 05:32:023821void RenderViewImpl::SendUpdateFaviconURL(const std::vector<FaviconURL>& urls) {
3822 if (!urls.empty())
[email protected]50279492014-05-05 23:24:293823 Send(new ViewHostMsg_UpdateFaviconURL(routing_id_, urls));
[email protected]41225fe2013-03-29 05:32:023824}
3825
3826void RenderViewImpl::DidStopLoadingIcons() {
huangsdde9aceb2015-03-17 21:26:163827 int icon_types = WebIconURL::TypeFavicon | WebIconURL::TypeTouchPrecomposed |
3828 WebIconURL::TypeTouch;
[email protected]41225fe2013-03-29 05:32:023829
nasko2411ba372014-10-13 17:45:413830 // Favicons matter only for the top-level frame. If it is a WebRemoteFrame,
3831 // just return early.
3832 if (webview()->mainFrame()->isWebRemoteFrame())
3833 return;
3834
[email protected]41225fe2013-03-29 05:32:023835 WebVector<WebIconURL> icon_urls =
3836 webview()->mainFrame()->iconURLs(icon_types);
3837
3838 std::vector<FaviconURL> urls;
3839 for (size_t i = 0; i < icon_urls.size(); i++) {
3840 WebURL url = icon_urls[i].iconURL();
[email protected]2bd262b2014-04-16 05:31:233841 std::vector<gfx::Size> sizes;
[email protected]f34ac132014-03-20 23:02:053842 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes);
[email protected]41225fe2013-03-29 05:32:023843 if (!url.isEmpty())
[email protected]f34ac132014-03-20 23:02:053844 urls.push_back(
3845 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes));
[email protected]41225fe2013-03-29 05:32:023846 }
3847 SendUpdateFaviconURL(urls);
3848}
3849
[email protected]e9ff79c2012-10-19 21:31:263850} // namespace content