render_view_impl.cc revision c2db58bd994c04d98e4ee2cd7565b71548655fe3
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_view_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/auto_reset.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/debug/alias.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/files/file_path.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/kill.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h" 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/child/appcache/appcache_dispatcher.h" 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/child/appcache/web_application_cache_host_impl.h" 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/child_thread.h" 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/fileapi/file_system_dispatcher.h" 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/fileapi/webfilesystem_callback_adapters.h" 37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/webplugin_delegate_impl.h" 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/quota_dispatcher.h" 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/request_extra_data.h" 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/webmessageportchannel_impl.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/clipboard_messages.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/database_messages.h" 43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/common/dom_storage/dom_storage_types.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/drag_messages.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/java_bridge_messages.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/pepper_messages.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/socket_stream_handle_data.h" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/ssl_status_serialization.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/context_menu_params.h" 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h" 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/favicon_url.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/file_chooser_params.h" 6058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/ssl_status.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/three_d_api_types.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/url_utils.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/content_renderer_client.h" 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/renderer/context_menu_client.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/document_state.h" 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/renderer/history_item_serialization.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/navigation_state.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/password_form_conversion_utils.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_observer.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_visitor.h" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/accessibility/renderer_accessibility.h" 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/accessibility/renderer_accessibility_complete.h" 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/accessibility/renderer_accessibility_focus_only.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager.h" 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager_impl.h" 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/renderer/context_menu_params_builder.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/device_orientation_dispatcher.h" 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/devtools/devtools_agent.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/disambiguation_popup_helper.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/dom_automation_controller.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/dom_storage/webstoragenamespace_impl.h" 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/drop_data_builder.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/external_popup_menu.h" 87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "content/renderer/fetchers/alt_error_page_resource_fetcher.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/geolocation_dispatcher.h" 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/gpu/input_handler_manager.h" 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/gpu/render_widget_compositor.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/idle_user_detector.h" 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/image_loading_helper.h" 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/renderer/ime_event_guard.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/input_tag_speech_dispatcher.h" 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/internal_document_state_data.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/java/java_bridge_dispatcher.h" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/load_progress_tracker.h" 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/media/audio_device_factory.h" 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/media/audio_renderer_mixer_manager.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_dependency_factory.h" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_dispatcher.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_impl.h" 10358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/media/midi_dispatcher.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/render_media_log.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/rtc_peer_connection_handler.h" 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/media/video_capture_impl_manager.h" 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_impl.h" 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_ms.h" 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_params.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/mhtml_generator.h" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/notification_provider.h" 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/render_frame_impl.h" 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_process.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h" 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/render_view_impl_params.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_view_mouse_lock_dispatcher.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_widget_fullscreen_pepper.h" 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/renderer_date_time_picker.h" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_webapplicationcachehost_impl.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_webcolorchooser_impl.h" 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/renderer/savable_resources.h" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/speech_recognition_dispatcher.h" 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/stats_collection_controller.h" 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/stats_collection_observer.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/text_input_client_observer.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/v8_value_converter_impl.h" 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/web_ui_extension.h" 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/web_ui_extension_data.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/websharedworker_proxy.h" 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/audio/audio_output_device.h" 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_renderer_mixer_input.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/filter_collection.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_switches.h" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/audio_renderer_impl.h" 135a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "media/filters/gpu_video_decoder_factories.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/data_url.h" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_util.h" 141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebCString.h" 142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebDragData.h" 143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebFileSystemType.h" 144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebHTTPBody.h" 145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebImage.h" 146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebMessagePortChannel.h" 147ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebPoint.h" 148ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebRect.h" 149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebSize.h" 150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebSocketStreamHandle.h" 151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebString.h" 152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebURL.h" 153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebURLError.h" 154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebURLRequest.h" 155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebURLResponse.h" 156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebVector.h" 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebAccessibilityObject.h" 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebColorName.h" 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDOMEvent.h" 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDOMMessageEvent.h" 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDataSource.h" 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDateTimeChooserCompletion.h" 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDateTimeChooserParams.h" 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDevToolsAgent.h" 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFileChooserParams.h" 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFileSystemCallbacks.h" 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFindOptions.h" 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFormControlElement.h" 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFormElement.h" 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 173bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebGlyphCache.h" 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebHelperPlugin.h" 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebHistoryItem.h" 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputElement.h" 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebMediaPlayerAction.h" 1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNavigationPolicy.h" 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNodeList.h" 1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPageSerializer.h" 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPlugin.h" 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginAction.h" 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h" 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginDocument.h" 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginParams.h" 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRange.h" 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSearchableFormData.h" 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSecurityOrigin.h" 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSecurityPolicy.h" 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSerializedScriptValue.h" 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSettings.h" 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebStorageQuotaCallbacks.h" 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebUserMediaClient.h" 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebWindowFeatures.h" 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/default/WebRenderTheme.h" 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/ui_base_switches_util.h" 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h" 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size_conversions.h" 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h" 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "v8/include/v8.h" 208ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/child/weburlresponse_extradata_impl.h" 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/renderer/webpreferences_renderer.h" 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <cpu-features.h> 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/android/device_telephony_info.h" 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/gpu/client/context_provider_command_buffer.h" 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/address_detector.h" 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/content_detector.h" 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/email_detector.h" 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/phone_number_detector.h" 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/android/renderer_media_player_manager.h" 221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/renderer/media/android/stream_texture_factory_android_impl.h" 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/renderer/media/android/stream_texture_factory_android_synchronous_impl.h" 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/android/webmediaplayer_android.h" 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/android/webmediaplayer_proxy_android.h" 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "skia/ext/platform_canvas.h" 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatPoint.h" 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatRect.h" 228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/web/WebHitTestResult.h" 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect_f.h" 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(GOOGLE_TV) 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/media/rtc_video_decoder_bridge_tv.h" 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/media/rtc_video_decoder_factory_tv.h" 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(port): these files are currently Windows only because they concern: 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * theming 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_win.h" 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme.h" 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/skia_utils_mac.h" 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 247bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/renderer/npapi/webplugin_delegate_proxy.h" 248bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/renderer/npapi/webplugin_impl.h" 2493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_browser_connection.h" 2503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 2513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_plugin_registry.h" 2523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_webplugin_impl.h" 2533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/plugin_module.h" 2543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 2553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebAccessibilityNotification; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebAccessibilityObject; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebApplicationCacheHost; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebApplicationCacheHostClient; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCString; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebColor; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebColorName; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebConsoleMessage; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebContextMenuData; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCookieJar; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebData; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDataSource; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDocument; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDOMEvent; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDOMMessageEvent; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDragData; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDragOperation; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDragOperationsMask; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebEditingAction; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebElement; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebExternalPopupMenu; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebExternalPopupMenuClient; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFileChooserCompletion; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFileSystem; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFileSystemCallbacks; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFindOptions; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFormControlElement; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFormElement; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFrame; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebGestureEvent; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebHistoryItem; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebHTTPBody; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebIconURL; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebImage; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputElement; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputEvent; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaPlayer; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaPlayerAction; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaPlayerClient; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMouseEvent; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNavigationPolicy; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNavigationType; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNode; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPageSerializer; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPageSerializerClient; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPeerConnection00Handler; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPeerConnection00HandlerClient; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPeerConnectionHandler; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPeerConnectionHandlerClient; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginAction; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginContainer; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginDocument; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginParams; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPoint; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPopupMenuInfo; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRange; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRect; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebReferrerPolicy; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebScriptSource; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSearchableFormData; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSecurityOrigin; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSecurityPolicy; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSerializedScriptValue; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSettings; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSharedWorker; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSize; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSocketStreamHandle; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageNamespace; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageQuotaCallbacks; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageQuotaError; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageQuotaType; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebString; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextAffinity; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextDirection; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTouchEvent; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURL; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLError; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLRequest; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLResponse; 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebUserGestureIndicator; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebVector; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebView; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebWidget; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebWindowFeatures; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit_glue::WebURLResponseExtraDataImpl; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebContentDetectionResult; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFloatPoint; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFloatRect; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebHitTestResult; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<WebKit::WebView*, RenderViewImpl*> ViewMap; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<ViewMap> g_view_map = LAZY_INSTANCE_INITIALIZER; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<int32, RenderViewImpl*> RoutingIDViewMap; 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<RoutingIDViewMap> g_routing_id_view_map = 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time, in seconds, we delay before sending content state changes (such as form 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state and scroll position) to the browser. We delay sending changes to avoid 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// spamming the browser. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To avoid having tab/session restore require sending a message to get the 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// current content state during tab closing we use a shorter timeout for the 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// foreground renderer. This means there is a small window of time from which 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content state is modified and not sent to session restore, but this is 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// better than having to wake up all renderers during shutdown. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDelaySecondsForContentStateSyncHidden = 5; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDelaySecondsForContentStateSync = 1; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const size_t kExtraCharsBeforeAndAfterSelection = 100; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The maximum number of popups that can be spawned from one page. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMaximumNumberOfUnacknowledgedPopups = 25; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const float kScalingIncrement = 0.1f; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const float kScalingIncrementForGesture = 0.01f; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delay between tapping in content and launching the associated android intent. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to allow users see what has been recognized as content. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const size_t kContentIntentDelayMilliseconds = 700; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static RenderViewImpl* (*g_create_render_view_impl)(RenderViewImplParams*) = 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void GetRedirectChain(WebDataSource* ds, std::vector<GURL>* result) { 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Replace any occurrences of swappedout:// with about:blank. 39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const WebURL& blank_url = GURL(kAboutBlankURL); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebURL> urls; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ds->redirectChain(urls); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->reserve(urls.size()); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < urls.size(); ++i) { 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (urls[i] != GURL(kSwappedOutURL)) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result->push_back(urls[i]); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result->push_back(blank_url); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If |data_source| is non-null and has an InternalDocumentStateData associated 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with it, the AltErrorPageResourceFetcher is reset. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void StopAltErrorPageFetcher(WebDataSource* data_source) { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data_source) { 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDataSource(data_source); 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (internal_data) 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_alt_error_page_fetcher(NULL); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsReload(const ViewMsg_Navigate_Params& params) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == ViewMsg_Navigate_Type::RELOAD || 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE || 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 423bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 424bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochWebReferrerPolicy RenderViewImpl::GetReferrerPolicyFromRequest( 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return request.extraData() ? 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RequestExtraData*>(request.extraData())->referrer_policy() : 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().referrerPolicy(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 433bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochReferrer RenderViewImpl::GetReferrerFromRequest( 434a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch WebFrame* frame, 435a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const WebURLRequest& request) { 436a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return Referrer(GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), 437a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GetReferrerPolicyFromRequest(frame, request)); 438a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 439a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 440bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 441bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochWebURLResponseExtraDataImpl* RenderViewImpl::GetExtraDataFromResponse( 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLResponse& response) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebURLResponseExtraDataImpl*>( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.extraData()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NOINLINE static void CrashIntentionally() { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE(shess): Crash directly rather than using NOTREACHED() so 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the signature is easier to triage in crash reports. 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile int* zero = NULL; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *zero = 0; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ADDRESS_SANITIZER) 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NOINLINE static void MaybeTriggerAsanError(const GURL& url) { 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // NOTE(rogerm): We intentionally perform an invalid heap access here in 457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // order to trigger an Address Sanitizer (ASAN) error report. 458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kCrashDomain[] = "crash"; 459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kHeapOverflow[] = "/heap-overflow"; 460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kHeapUnderflow[] = "/heap-underflow"; 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kUseAfterFree[] = "/use-after-free"; 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const int kArraySize = 5; 463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!url.DomainIs(kCrashDomain, sizeof(kCrashDomain) - 1)) 465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!url.has_path()) 468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<int[]> array(new int[kArraySize]); 471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string crash_type(url.path()); 472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int dummy = 0; 473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (crash_type == kHeapOverflow) { 474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dummy = array[kArraySize]; 475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (crash_type == kHeapUnderflow ) { 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dummy = array[-1]; 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (crash_type == kUseAfterFree) { 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int* dangling = array.get(); 479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) array.reset(); 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dummy = dangling[kArraySize / 2]; 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Make sure the assignments to the dummy value aren't optimized away. 484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::debug::Alias(&dummy); 485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // ADDRESS_SANITIZER 487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void MaybeHandleDebugURL(const GURL& url) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.SchemeIs(chrome::kChromeUIScheme)) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url == GURL(kChromeUICrashURL)) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashIntentionally(); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (url == GURL(kChromeUIKillURL)) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::KillProcess(base::GetCurrentProcessHandle(), 1, false); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (url == GURL(kChromeUIHangURL)) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;;) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (url == GURL(kChromeUIShorthangURL)) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ADDRESS_SANITIZER) 504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MaybeTriggerAsanError(url); 505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // ADDRESS_SANITIZER 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false unless this is a top-level navigation. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsTopLevelNavigation(WebFrame* frame) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame->parent() == NULL; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false unless this is a top-level navigation that crosses origins. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsNonLocalTopLevelNavigation(const GURL& url, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 516a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch WebNavigationType type, 517a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch bool is_form_post) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsTopLevelNavigation(frame)) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigations initiated within Webkit are not sent out to the external host 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the following cases. 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. The url scheme is not http/https 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. The origin of the url and the opener is the same in which case the 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener relationship is maintained. 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3. Reloads/form submits/back forward navigations 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.SchemeIs(chrome::kHttpScheme) && !url.SchemeIs(chrome::kHttpsScheme)) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != WebKit::WebNavigationTypeReload && 531a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch type != WebKit::WebNavigationTypeBackForward && !is_form_post) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The opener relationship between the new window and the parent allows the 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window to script the parent and vice versa. This is not allowed if 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the origins of the two domains are different. This can be treated as a 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top level navigation and routed back to the host. 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* opener = frame->opener(); 537a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!opener) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.GetOrigin() != GURL(opener->document().url()).GetOrigin()) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void NotifyTimezoneChange(WebKit::WebFrame* frame) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::HandleScope handle_scope; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Context::Scope context_scope(frame->mainWorldScriptContext()); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Date::DateTimeConfigurationChangeNotification(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* child = frame->firstChild(); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; child; child = child->nextSibling()) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyTimezoneChange(child); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static WindowOpenDisposition NavigationPolicyToDisposition( 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebNavigationPolicy policy) { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (policy) { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyIgnore: 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IGNORE_ACTION; 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyDownload: 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SAVE_TO_DISK; 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyCurrentTab: 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CURRENT_TAB; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyNewBackgroundTab: 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NEW_BACKGROUND_TAB; 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyNewForegroundTab: 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NEW_FOREGROUND_TAB; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyNewWindow: 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NEW_WINDOW; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyNewPopup: 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NEW_POPUP; 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unexpected WebNavigationPolicy"; 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IGNORE_ACTION; 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns true if the device scale is high enough that losing subpixel 57990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// antialiasing won't have a noticeable effect on text quality. 58090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static bool DeviceScaleEnsuresTextQuality(float device_scale_factor) { 58190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_ANDROID) 58290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // On Android, we never have subpixel antialiasing. 58390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return device_scale_factor > 1.5f; 58690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 58890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 58990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool ShouldUseFixedPositionCompositing(float device_scale_factor) { 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Compositing for fixed-position elements is dependent on 59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // device_scale_factor if no flag is set. http://crbug.com/172738 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line.HasSwitch(switches::kDisableCompositingForFixedPosition)) 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line.HasSwitch(switches::kEnableCompositingForFixedPosition)) 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return DeviceScaleEnsuresTextQuality(device_scale_factor); 60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 60390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic bool ShouldUseAcceleratedCompositingForOverflowScroll( 605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch float device_scale_factor) { 606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (command_line.HasSwitch(switches::kEnableAcceleratedOverflowScroll)) 609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return DeviceScaleEnsuresTextQuality(device_scale_factor); 612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static bool ShouldUseTransitionCompositing(float device_scale_factor) { 61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (command_line.HasSwitch(switches::kDisableCompositingForTransition)) 61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (command_line.HasSwitch(switches::kEnableCompositingForTransition)) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(ajuma): Re-enable this by default for high-DPI once the problem 624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // of excessive layer promotion caused by overlap has been addressed. 625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // http://crbug.com/178119. 626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic bool ShouldUseAcceleratedFixedRootBackground(float device_scale_factor) { 6307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 6317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (command_line.HasSwitch(switches::kDisableAcceleratedFixedRootBackground)) 6337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 6347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (command_line.HasSwitch(switches::kEnableAcceleratedFixedRootBackground)) 6367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 6377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return DeviceScaleEnsuresTextQuality(device_scale_factor); 6397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static FaviconURL::IconType ToFaviconType(WebKit::WebIconURL::Type type) { 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (type) { 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case WebKit::WebIconURL::TypeFavicon: 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::FAVICON; 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case WebKit::WebIconURL::TypeTouch: 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::TOUCH_ICON; 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case WebKit::WebIconURL::TypeTouchPrecomposed: 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::TOUCH_PRECOMPOSED_ICON; 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case WebKit::WebIconURL::TypeInvalid: 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::INVALID_ICON; 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::INVALID_ICON; 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct RenderViewImpl::PendingFileChooser { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingFileChooser(const FileChooserParams& p, WebFileChooserCompletion* c) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : params(p), 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) completion(c) { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileChooserParams params; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion* completion; // MAY BE NULL to skip callback. 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebWidgetLockTarget : public MouseLockDispatcher::LockTarget { 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WebWidgetLockTarget(WebKit::WebWidget* webwidget) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : webwidget_(webwidget) {} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLockMouseACK(bool succeeded) OVERRIDE { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (succeeded) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_->didAcquirePointerLock(); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_->didNotAcquirePointerLock(); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseLockLost() OVERRIDE { 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_->didLosePointerLock(); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HandleMouseLockedInputEvent( 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebMouseEvent &event) OVERRIDE { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The WebWidget handles mouse lock in WebKit's handleInputEvent(). 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebWidget* webwidget_; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 ExtractPostId(const WebHistoryItem& item) { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.isNull()) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.httpBody().isNull()) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return item.httpBody().identifier(); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TouchEnabled() { 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Based on the definition of chrome::kEnableTouchIcon. 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 713eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebDragData DropDataToWebDragData(const DropData& drop_data) { 714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<WebDragData::Item> item_list; 715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // These fields are currently unused when dragging into WebKit. 717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(drop_data.download_metadata.empty()); 718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(drop_data.file_contents.empty()); 719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(drop_data.file_description_filename.empty()); 720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!drop_data.text.is_null()) { 722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeString; 724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeText); 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringData = drop_data.text.string(); 726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(dcheng): Do we need to distinguish between null and empty URLs? Is it 730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // meaningful to write an empty URL to the clipboard? 731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!drop_data.url.is_empty()) { 732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeString; 734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeURIList); 735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringData = WebString::fromUTF8(drop_data.url.spec()); 736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.title = drop_data.url_title; 737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!drop_data.html.is_null()) { 741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeString; 743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeHTML); 744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringData = drop_data.html.string(); 745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.baseURL = drop_data.html_base_url; 746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<DropData::FileInfo>::const_iterator it = 750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) drop_data.filenames.begin(); 751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != drop_data.filenames.end(); 752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++it) { 753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeFilename; 755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.filenameData = it->path; 756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.displayNameData = it->display_name; 757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (std::map<base::string16, base::string16>::const_iterator it = 761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) drop_data.custom_data.begin(); 762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != drop_data.custom_data.end(); 763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++it) { 764868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeString; 766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringType = it->first; 767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringData = it->second; 768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData result; 772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.initialize(); 773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.setItems(item_list); 774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.setFilesystemId(drop_data.filesystem_id); 775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return result; 776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderViewImpl::RenderViewImpl(RenderViewImplParams* params) 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : RenderWidget(WebKit::WebPopupTypeNone, 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->screen_info, 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->swapped_out), 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webkit_preferences_(params->webkit_prefs), 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_content_state_immediately_(false), 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_bindings_(0), 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_preferred_size_changes_(false), 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_gesture_(NavigationGestureUnknown), 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opened_by_user_gesture_(true), 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_suppressed_(false), 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_(-1), 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_page_id_sent_to_browser_(-1), 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_page_id_(params->next_page_id), 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_(-1), 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_length_(0), 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_(TARGET_NONE), 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_offset_(0), 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_range_(ui::Range::InvalidRange()), 8007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 8017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) top_controls_constraints_(cc::BOTH), 8027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_is_main_frame_pinned_to_left_(false), 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_is_main_frame_pinned_to_right_(false), 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_has_main_frame_horizontal_scrollbar_(false), 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_has_main_frame_vertical_scrollbar_(false), 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookie_jar_(this), 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notification_provider_(NULL), 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_dispatcher_(NULL), 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_tag_speech_dispatcher_(NULL), 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) speech_recognition_dispatcher_(NULL), 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_orientation_dispatcher_(NULL), 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_dispatcher_(NULL), 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager_(NULL), 8157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_stream_client_(NULL), 8167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch web_user_media_client_(NULL), 817558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch midi_dispatcher_(NULL), 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devtools_agent_(NULL), 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessibility_mode_(AccessibilityModeOff), 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_(NULL), 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_bridge_dispatcher_(NULL), 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_(NULL), 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) body_background_color_(SK_ColorWHITE), 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_content_intent_id_(0), 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_player_proxy_(NULL), 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) focused_plugin_id_(-1), 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 8313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 8323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_(NULL), 8333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_last_mouse_event_target_(NULL), 8343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enumeration_completion_id_(0), 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_progress_tracker_(new LoadProgressTracker(this)), 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_storage_namespace_id_(params->session_storage_namespace_id), 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrement_shared_popup_at_destruction_(false), 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handling_select_range_(false), 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_snapshot_id_(0), 8437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) allow_partial_swap_(params->allow_partial_swap), 844bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch context_menu_source_type_(ui::MENU_SOURCE_MOUSE) { 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::Initialize(RenderViewImplParams* params) { 848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderFrameImpl* main_frame = RenderFrameImpl::Create( 849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this, params->main_frame_routing_id); 850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_render_frame_.reset(main_frame); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) routing_id_ = params->routing_id; 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_id_ = params->surface_id; 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->opener_id != MSG_ROUTING_NONE && params->is_renderer_created) 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) opener_id_ = params->opener_id; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we start with a valid next_page_id_ from the browser. 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(next_page_id_, 0); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_provider_ = new NotificationProvider(this); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_provider_ = NULL; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_ = WebView::create(this); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_)); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (command_line.HasSwitch(switches::kStatsCollectionController)) 871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stats_collection_observer_.reset(new StatsCollectionObserver(this)); 872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DeviceTelephonyInfo device_info; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string region_code = 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kNetworkCountryIso) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? command_line.GetSwitchValueASCII(switches::kNetworkCountryIso) 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : device_info.GetNetworkCountryIso(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_detectors_.push_back(linked_ptr<ContentDetector>( 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new AddressDetector())); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_detectors_.push_back(linked_ptr<ContentDetector>( 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PhoneNumberDetector(region_code))); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_detectors_.push_back(linked_ptr<ContentDetector>( 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new EmailDetector())); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->counter) { 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shared_popup_counter_ = params->counter; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only count this if it isn't swapped out upon creation. 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params->swapped_out) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_->data++; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_shared_popup_at_destruction_ = true; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_ = new SharedRenderViewCounter(0); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_shared_popup_at_destruction_ = false; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThread::Get()->AddRoute(routing_id_, this); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Take a reference on behalf of the RenderThread. This will be balanced 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when we receive ViewMsg_ClosePage. 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a popup, we must wait for the CreatingNew_ACK message before 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completing initialization. Otherwise, we can finish it now. 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_id_ == MSG_ROUTING_NONE) { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_show_ = true; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteInit(); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_view_map.Get().insert(std::make_pair(webview(), this)); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_routing_id_view_map.Get().insert(std::make_pair(routing_id_, this)); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setDeviceScaleFactor(device_scale_factor_); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->settings()->setAcceleratedCompositingForFixedPositionEnabled( 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldUseFixedPositionCompositing(device_scale_factor_)); 916eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch webview()->settings()->setAcceleratedCompositingForOverflowScrollEnabled( 917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShouldUseAcceleratedCompositingForOverflowScroll(device_scale_factor_)); 91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) webview()->settings()->setAcceleratedCompositingForTransitionEnabled( 91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShouldUseTransitionCompositing(device_scale_factor_)); 9207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch webview()->settings()->setAcceleratedCompositingForFixedRootBackgroundEnabled( 9217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShouldUseAcceleratedFixedRootBackground(device_scale_factor_)); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webkit_glue::ApplyWebPreferences(webkit_preferences_, webview()); 924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch webview()->initializeMainFrame(main_render_frame_.get()); 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (switches::IsTouchDragDropEnabled()) 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->settings()->setTouchDragDropEnabled(true); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (switches::IsTouchEditingEnabled()) 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->settings()->setTouchEditingEnabled(true); 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params->frame_name.empty()) 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->mainFrame()->setName(params->frame_name); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetRendererPrefs(params->renderer_prefs); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!media_stream_dispatcher_) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_dispatcher_ = new MediaStreamDispatcher(this); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MHTMLGenerator(this); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TextInputClientObserver(this); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 9487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_player_manager_.reset(new RendererMediaPlayerManager()); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The next group of objects all implement RenderViewObserver, so are deleted 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // along with the RenderView automatically. 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devtools_agent_ = new DevToolsAgent(this); 954a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (RenderWidgetCompositor* rwc = compositor()) { 955a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch webview()->devToolsAgent()->setLayerTreeId(rwc->GetLayerTreeId()); 956a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_ = new RenderViewMouseLockDispatcher(this); 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new ImageLoadingHelper(this); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create renderer_accessibility_ if needed. 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetAccessibilityMode(params->accessibility_mode); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IdleUserDetector(this); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kDomAutomationController)) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION; 967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (command_line.HasSwitch(switches::kStatsCollectionController)) 968868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessViewLayoutFlags(command_line); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(ENABLE_PLUGINS) 9733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch new PepperBrowserConnection(this); 974558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 975558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->renderer()->RenderViewCreated(this); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have an opener_id but we weren't created by a renderer, then 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's the browser asking us to set our opener to another RenderView. 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->opener_id != MSG_ROUTING_NONE && !params->is_renderer_created) { 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewImpl* opener_view = FromRoutingID(params->opener_id); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_view) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->setOpener(opener_view->webview()->mainFrame()); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are initially swapped out, navigate to kSwappedOutURL. 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This ensures we are in a unique origin that others cannot script. 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_swapped_out_) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToSwappedOutURL(webview()->mainFrame()); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewImpl::~RenderViewImpl() { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_.clear(); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decrement_shared_popup_at_destruction_) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_->data--; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::debug::TraceLog::GetInstance()->RemoveProcessLabel(routing_id_); 9997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If file chooser is still waiting for answer, dispatch empty answer. 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!file_chooser_completions_.empty()) { 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.front()->completion) { 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.front()->completion->didChooseFile( 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebString>()); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.pop_front(); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The date/time picker client is both a scoped_ptr member of this class and 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a RenderViewObserver. Reset it to prevent double deletion. 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_picker_client_.reset(); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure we are no longer referenced by the ViewMap or RoutingIDViewMap. 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMap* views = g_view_map.Pointer(); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(this, it->second) << "Failed to call Close?"; 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RoutingIDViewMap* routing_id_views = g_routing_id_view_map.Pointer(); 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (RoutingIDViewMap::iterator it = routing_id_views->begin(); 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != routing_id_views->end(); ++it) 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(this, it->second) << "Failed to call Close?"; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, RenderViewGone()); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct()); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*static*/ 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewImpl* RenderViewImpl::FromWebView(WebView* webview) { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMap* views = g_view_map.Pointer(); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMap::iterator it = views->find(webview); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it == views->end() ? NULL : it->second; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*static*/ 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderView* RenderView::FromWebView(WebKit::WebView* webview) { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RenderViewImpl::FromWebView(webview); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*static*/ 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderViewImpl* RenderViewImpl::FromRoutingID(int32 routing_id) { 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RoutingIDViewMap* views = g_routing_id_view_map.Pointer(); 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RoutingIDViewMap::iterator it = views->find(routing_id); 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return it == views->end() ? NULL : it->second; 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*static*/ 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderView* RenderView::FromRoutingID(int routing_id) { 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RenderViewImpl::FromRoutingID(routing_id); 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*static*/ 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderView::ForEach(RenderViewVisitor* visitor) { 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMap* views = g_view_map.Pointer(); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!visitor->Visit(it->second)) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*static*/ 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewImpl* RenderViewImpl::Create( 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 opener_id, 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RendererPreferences& renderer_prefs, 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPreferences& webkit_prefs, 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SharedRenderViewCounter* counter, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 routing_id, 1070868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 main_frame_routing_id, 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 surface_id, 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 session_storage_namespace_id, 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& frame_name, 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_renderer_created, 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool swapped_out, 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 next_page_id, 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebScreenInfo& screen_info, 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityMode accessibility_mode, 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool allow_partial_swap) { 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(routing_id != MSG_ROUTING_NONE); 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewImplParams params( 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_id, 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_prefs, 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_prefs, 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter, 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id, 1087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) main_frame_routing_id, 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id, 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace_id, 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_name, 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_renderer_created, 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swapped_out, 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_page_id, 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_info, 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accessibility_mode, 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) allow_partial_swap); 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewImpl* render_view = NULL; 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (g_create_render_view_impl) 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view = g_create_render_view_impl(¶ms); 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view = new RenderViewImpl(¶ms); 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view->Initialize(¶ms); 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_view; 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstallCreateHook( 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewImpl* (*create_render_view_impl)(RenderViewImplParams*)) { 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(!g_create_render_view_impl); 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_create_render_view_impl = create_render_view_impl; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::AddObserver(RenderViewObserver* observer) { 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::RemoveObserver(RenderViewObserver* observer) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer->RenderViewGone(); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebView* RenderViewImpl::webview() const { 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebKit::WebView*>(webwidget()); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 11273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperInstanceCreated(PepperPluginInstanceImpl* instance) { 11283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch active_pepper_instances_.insert(instance); 11293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 11303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperInstanceDeleted(PepperPluginInstanceImpl* instance) { 11323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch active_pepper_instances_.erase(instance); 11333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (pepper_last_mouse_event_target_ == instance) 11353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_last_mouse_event_target_ = NULL; 11363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_ == instance) 11373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperFocusChanged(instance, false); 11383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 11393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperDidChangeCursor( 11413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* instance, 11423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const WebKit::WebCursorInfo& cursor) { 11433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Update the cursor appearance immediately if the requesting plugin is the 11443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // one which receives the last mouse event. Otherwise, the new cursor won't be 11453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // picked up until the plugin gets the next input event. That is bad if, e.g., 11463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // the plugin would like to set an invisible cursor when there isn't any user 11473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // input for a while. 11483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (instance == pepper_last_mouse_event_target_) 11493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch didChangeCursor(cursor); 11503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 11513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperDidReceiveMouseEvent( 11533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* instance) { 11543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_last_mouse_event_target_ = instance; 11553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 11563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperFocusChanged(PepperPluginInstanceImpl* instance, 11583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool focused) { 11593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused) 11603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_ = instance; 11613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch else if (focused_pepper_plugin_ == instance) 11623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_ = NULL; 11633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UpdateTextInputType(); 11653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UpdateSelectionBounds(); 11663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 11673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperTextInputTypeChanged( 11693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* instance) { 11703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (instance != focused_pepper_plugin_) 11713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 11723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UpdateTextInputType(); 11743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (renderer_accessibility_) 11753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch renderer_accessibility_->FocusedNodeChanged(WebNode()); 11763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 11773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperCaretPositionChanged( 11793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* instance) { 11803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (instance != focused_pepper_plugin_) 11813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 11823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UpdateSelectionBounds(); 11833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 11843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperCancelComposition( 11863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* instance) { 11873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (instance != focused_pepper_plugin_) 11883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 11893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch Send(new ViewHostMsg_ImeCancelComposition(routing_id()));; 11903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) 11913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch UpdateCompositionInfo(true); 11923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 11933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 11943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 11953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperSelectionChanged( 11963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* instance) { 11973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (instance != focused_pepper_plugin_) 11983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 11993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch SyncSelectionIfRequired(); 12003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 12013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 12023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochRenderWidgetFullscreenPepper* RenderViewImpl::CreatePepperFullscreenContainer( 12033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* plugin) { 12043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GURL active_url; 12053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (webview() && webview()->mainFrame()) 12063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch active_url = GURL(webview()->mainFrame()->document().url()); 12073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RenderWidgetFullscreenPepper* widget = RenderWidgetFullscreenPepper::Create( 12083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch routing_id_, plugin, active_url, screen_info_); 12093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch widget->show(WebKit::WebNavigationPolicyIgnore); 12103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return widget; 12113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 12123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 12133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid RenderViewImpl::PepperPluginCreated(RendererPpapiHost* host) { 12143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch FOR_EACH_OBSERVER(RenderViewObserver, observers_, 12153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch DidCreatePepperPlugin(host)); 12163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 12173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 12183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool RenderViewImpl::GetPepperCaretBounds(gfx::Rect* rect) { 12193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!focused_pepper_plugin_) 12203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return false; 12213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch *rect = focused_pepper_plugin_->GetCaretBounds(); 12223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return true; 12233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 12243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 12253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool RenderViewImpl::IsPepperAcceptingCompositionEvents() const { 12263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!focused_pepper_plugin_) 12273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return false; 12283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return focused_pepper_plugin_->IsPluginAcceptingCompositionEvents(); 12293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 12303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::PluginCrashed(const base::FilePath& plugin_path, 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId plugin_pid) { 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_CrashedPlugin(routing_id_, plugin_path, plugin_pid)); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::RegisterPluginDelegate(WebPluginDelegateProxy* delegate) { 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_delegates_.insert(delegate); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the renderer is visible, set initial visibility and focus state. 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_hidden()) { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetContainerVisibility(true); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview() && webview()->isActive()) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetWindowFocus(true); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Plugins start assuming the content has focus (so that they work in 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // environments where RenderView isn't hosting them), so we always have to 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // set the initial state. See webplugin_delegate_impl.h for details. 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetContentAreaFocus(has_focus()); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UnregisterPluginDelegate( 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginDelegateProxy* delegate) { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_delegates_.erase(delegate); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::GetPluginInfo(const GURL& url, 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 1260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebPluginInfo* plugin_info, 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* actual_mime_type) { 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_GetPluginInfo( 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, url, page_url, mime_type, &found, plugin_info, 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_mime_type)); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return found; 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1269bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid RenderViewImpl::SimulateImeSetComposition( 1270bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const string16& text, 1271bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const std::vector<WebKit::WebCompositionUnderline>& underlines, 1272bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int selection_start, 1273bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int selection_end) { 1274bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch OnImeSetComposition(text, underlines, selection_start, selection_end); 1275bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 1276bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 1277bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid RenderViewImpl::SimulateImeConfirmComposition( 1278bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const string16& text, 1279bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const ui::Range& replacement_range) { 1280bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch OnImeConfirmComposition(text, replacement_range, false); 1281bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 1282bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 1283bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(OS_WIN) 1284bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) { 1285bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (focused) 1286bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch focused_plugin_id_ = plugin_id; 1287bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch else 1288bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch focused_plugin_id_ = -1; 1289bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 1290bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 1291bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 1292bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(OS_MACOSX) 1293bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid RenderViewImpl::PluginFocusChanged(bool focused, int plugin_id) { 1294bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Send(new ViewHostMsg_PluginFocusChanged(routing_id(), focused, plugin_id)); 1295bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 1296bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 1297bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid RenderViewImpl::StartPluginIme() { 1298bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch IPC::Message* msg = new ViewHostMsg_StartPluginIme(routing_id()); 1299bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // This message can be sent during event-handling, and needs to be delivered 1300bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // within that context. 1301bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch msg->set_unblock(true); 1302bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Send(msg); 1303bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 1304bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // defined(OS_MACOSX) 1305bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 1306bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 1307bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::TransferActiveWheelFlingAnimation( 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebActiveWheelFlingParameters& params) { 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->transferActiveWheelFlingAnimation(params); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::HasIMETextFocus() { 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) { 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (main_frame) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->SetActiveURL(main_frame->document().url()); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverListBase<RenderViewObserver>::Iterator it(observers_); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver* observer; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer->OnMessageReceived(message)) 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool msg_is_ok = true; 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP_EX(RenderViewImpl, message, msg_is_ok) 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Copy, OnCopy) 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Cut, OnCut) 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Delete, OnDelete) 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_ExecuteEditCommand, OnExecuteEditCommand) 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_MoveCaret, OnMoveCaret) 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Paste, OnPaste) 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_PasteAndMatchStyle, OnPasteAndMatchStyle) 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Redo, OnRedo) 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Replace, OnReplace) 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_ReplaceMisspelling, OnReplaceMisspelling) 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_ScrollFocusedEditableNodeIntoRect, 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnScrollFocusedEditableNodeIntoRect) 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_SelectAll, OnSelectAll) 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_SelectRange, OnSelectRange) 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_SetEditCommandsForNextKeyEvent, 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnSetEditCommandsForNextKeyEvent) 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Undo, OnUndo) 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Unselect, OnUnselect) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_Navigate, OnNavigate) 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_Stop, OnStop) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ReloadFrame, OnReloadFrame) 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetName, OnSetName) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetEditableSelectionOffsets, 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetEditableSelectionOffsets) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetCompositionFromExistingText, 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetCompositionFromExistingText) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ExtendSelectionAndDelete, 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnExtendSelectionAndDelete) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_CopyImageAt, OnCopyImageAt) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_Find, OnFind) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_StopFinding, OnStopFinding) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_Zoom, OnZoom) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevel, OnSetZoomLevel) 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ZoomFactor, OnZoomFactor) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForLoadingURL, 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetZoomLevelForLoadingURL) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetPageEncoding, OnSetPageEncoding) 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ResetPageEncodingToDefault, 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnResetPageEncodingToDefault) 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ScriptEvalRequest, OnScriptEvalRequest) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_PostMessageEvent, OnPostMessageEvent) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_CSSInsertRequest, OnCSSInsertRequest) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(DragMsg_TargetDragEnter, OnDragTargetDragEnter) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(DragMsg_TargetDragOver, OnDragTargetDragOver) 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(DragMsg_TargetDragLeave, OnDragTargetDragLeave) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(DragMsg_TargetDrop, OnDragTargetDrop) 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(DragMsg_SourceEndedOrMoved, OnDragSourceEndedOrMoved) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(DragMsg_SourceSystemDragEnded, 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDragSourceSystemDragEnded) 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_AllowBindings, OnAllowBindings) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetInitialFocus, OnSetInitialFocus) 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_UpdateTargetURL_ACK, OnUpdateTargetURLAck) 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_TimezoneChange, OnUpdateTimezone) 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetAltErrorPageURL, OnSetAltErrorPageURL) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_EnumerateDirectoryResponse, 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnEnumerateDirectoryResponse) 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ShouldClose, OnShouldClose) 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SwapOut, OnSwapOut) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged) 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_DisassociateFromPopupCount, 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDisassociateFromPopupCount) 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ClearFocusedNode, OnClearFocusedNode) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetBackground, OnSetBackground) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_EnablePreferredSizeChangedMode, 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnEnablePreferredSizeChangedMode) 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_EnableAutoResize, OnEnableAutoResize) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_DisableAutoResize, OnDisableAutoResize) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_DisableScrollbarsForSmallWindows, 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDisableScrollbarsForSmallWindows) 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetRendererPrefs, OnSetRendererPrefs) 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_MediaPlayerActionAt, OnMediaPlayerActionAt) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_OrientationChangeEvent, 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnOrientationChangeEvent) 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_PluginActionAt, OnPluginActionAt) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetActive, OnSetActive) 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_CustomContextMenuAction, 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnCustomContextMenuAction) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_GetAllSavableResourceLinksForCurrentPage, 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetAllSavableResourceLinksForCurrentPage) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER( 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_GetSerializedHtmlDataForCurrentPageWithLocalLinks, 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetSerializedHtmlDataForCurrentPageWithLocalLinks) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ContextMenuClosed, OnContextMenuClosed) 1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ShowContextMenu, OnShowContextMenu) 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(viettrungluu): Move to a separate message filter. 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetHistoryLengthAndPrune, 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetHistoryLengthAndPrune) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode) 14247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(JavaBridgeMsg_Init, OnJavaBridgeInit) 142690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetAccessibilityMode, OnSetAccessibilityMode) 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_DisownOpener, OnDisownOpener) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_ActivateNearestFindResult, 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnActivateNearestFindResult) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_FindMatchRects, OnFindMatchRects) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SelectPopupMenuItems, OnSelectPopupMenuItems) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_UndoScrollFocusedEditableNodeIntoView, 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUndoScrollFocusedEditableNodeIntoRect) 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_UpdateTopControlsState, 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnUpdateTopControlsState) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_PluginImeCompositionCompleted, 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginImeCompositionCompleted) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SelectPopupMenuItem, OnSelectPopupMenuItem) 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SetWindowVisibility, OnSetWindowVisibility) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_WindowFrameChanged, OnWindowFrameChanged) 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_ReleaseDisambiguationPopupDIB, 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnReleaseDisambiguationPopupDIB) 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_WindowSnapshotCompleted, 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnWindowSnapshotCompleted) 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have the super handle all other messages. 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message)) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!msg_is_ok) { 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The message had a handler, but its deserialization failed. 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Kill the renderer to avoid potential spoofing attacks. 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(false) << "Unable to deserialize message in RenderViewImpl."; 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnNavigate(const ViewMsg_Navigate_Params& params) { 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeHandleDebugURL(params.url); 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, Navigate(params.url)); 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_reload = IsReload(params); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a stale back/forward (due to a recent navigation the browser 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // didn't know about), ignore it. 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsBackForwardToStaleEntry(params, is_reload)) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap this renderer back in if necessary. 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_swapped_out_) { 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We marked the view as hidden when swapping the view out, so be sure to 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reset the visibility state before navigating to the new URL. 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setVisibilityState(visibilityState(), false); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If this is an attempt to reload while we are swapped out, we should not 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // reload swappedout://, but the previous page, which is stored in 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // params.state. Setting is_reload to false will treat this like a back 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // navigation to accomplish that. 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_reload = false; 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // We refresh timezone when a view is swapped in since timezone 14927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // can get out of sync when the system timezone is updated while 14937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the view is swapped out. 14947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NotifyTimezoneChange(webview()->mainFrame()); 14957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSwappedOut(false); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (params.should_clear_history_list) { 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK_EQ(params.pending_history_list_offset, -1); 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK_EQ(params.current_history_list_offset, -1); 1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK_EQ(params.current_history_list_length, 0); 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ = params.current_history_list_offset; 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_length_ = params.current_history_list_length; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_list_length_ >= 0) 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_.resize(history_list_length_, -1); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.pending_history_list_offset >= 0 && 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.pending_history_list_offset < history_list_length_) 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_[params.pending_history_list_offset] = params.page_id; 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->SetActiveURL(params.url); 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFrame* frame = webview()->mainFrame(); 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params.frame_to_navigate.empty()) { 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = webview()->findFrameByName( 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebString::fromUTF8(params.frame_to_navigate)); 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate; 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_reload && frame->currentHistoryItem().isNull()) { 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We cannot reload if we do not have any history state. This happens, for 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // example, when recovering from a crash. Our workaround here is a bit of 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a hack since it means that reload after a crashed tab does not cause an 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // end-to-end cache validation. 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_reload = false; 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_navigation_params_.reset(new ViewMsg_Navigate_Params(params)); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are reloading, then WebKit will use the history state of the current 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page, so we should just ignore any given history state. Otherwise, if we 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have history state, then we need to navigate to it, which corresponds to a 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back/forward navigation event. 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_reload) { 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reload_original_url = 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (params.navigation_type == 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ignore_cache = (params.navigation_type == 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE); 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reload_original_url) 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->reloadWithOverrideURL(params.url, true); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->reload(ignore_cache); 154690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else if (params.page_state.IsValid()) { 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must know the page ID of the page we are navigating back to. 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(params.page_id, -1); 154990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebHistoryItem item = PageStateToHistoryItem(params.page_state); 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!item.isNull()) { 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure we didn't save the swapped out URL in UpdateState, since the 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // browser should never be telling us to navigate to swappedout://. 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(item.urlString() != WebString::fromUTF8(kSwappedOutURL)); 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->loadHistoryItem(item); 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!params.base_url_for_data_url.is_empty()) { 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A loadData request with a specified base URL. 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type, charset, data; 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->loadData( 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebData(data.c_str(), data.length()), 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(mime_type), 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(charset), 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.base_url_for_data_url, 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.history_url_for_data_url, 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(false) << 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Invalid URL passed: " << params.url.possibly_invalid_spec(); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to the given URL. 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLRequest request(params.url); 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A session history navigation should have been accompanied by state. 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(params.page_id, -1); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (frame->isViewSourceModeEnabled()) 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.referrer.url.is_valid()) { 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString referrer = WebSecurityPolicy::generateReferrerHeader( 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.referrer.policy, 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.url, 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(params.referrer.url.spec())); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!referrer.isEmpty()) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.setHTTPHeaderField(WebString::fromUTF8("Referer"), referrer); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params.extra_headers.empty()) { 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.extra_headers.end(), "\n"); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i.GetNext(); ) { 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.addHTTPHeaderField(WebString::fromUTF8(i.name()), 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(i.values())); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.is_post) { 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.setHTTPMethod(WebString::fromUTF8("POST")); 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set post data. 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebHTTPBody http_body; 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_body.initialize(); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_body.appendData(WebData( 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const char*>( 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ¶ms.browser_initiated_post_data.front()), 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.browser_initiated_post_data.size())); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.setHTTPBody(http_body); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->loadRequest(request); 1613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If this is a cross-process navigation, the browser process will send 1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // along the proper navigation start value. 1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.browser_navigation_start.is_null() && 1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->provisionalDataSource()) { 1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // browser_navigation_start is likely before this process existed, so we 1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // can't use InterProcessTimeTicksConverter. Instead, the best we can do 1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is just ensure we don't report a bogus value in the future. 1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks navigation_start = std::min( 1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks::Now(), params.browser_navigation_start); 1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) double navigation_start_seconds = 1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (navigation_start - base::TimeTicks()).InSecondsF(); 1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->provisionalDataSource()->setNavigationStartTime( 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_start_seconds); 1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In case LoadRequest failed before DidCreateDataSource was called. 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_.reset(); 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::IsBackForwardToStaleEntry( 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_Navigate_Params& params, 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_reload) { 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure this isn't a back/forward to an entry we have already cropped 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or replaced from our history, before the browser knew about it. If so, 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a new navigation has committed in the mean time, and we can ignore this. 164090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_back_forward = !is_reload && params.page_state.IsValid(); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: if the history_list_length_ is 0 for a back/forward, we must be 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // restoring from a previous session. We'll update our state in OnNavigate. 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_back_forward || history_list_length_ <= 0) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(static_cast<int>(history_page_ids_.size()), history_list_length_); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check for whether the forward history has been cropped due to a recent 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation the browser didn't know about. 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.pending_history_list_offset >= history_list_length_) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check for whether this entry has been replaced with a new one. 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_page_id = 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_[params.pending_history_list_offset]; 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_page_id > 0 && params.page_id != expected_page_id) { 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.page_id < expected_page_id) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise we've removed an earlier entry and should have shifted all 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entries left. For now, it's ok to lazily update the list. 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Notify all live renderers when we remove entries from 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the front of the list, so that we don't hit this case. 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_[params.pending_history_list_offset] = params.page_id; 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stop loading the current page 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnStop() { 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) { 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the alt error page fetcher. If we let it continue it may complete 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and cause RenderViewHostManager to swap to this RenderView, even though 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it may no longer be active. 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopAltErrorPageFetcher(main_frame->provisionalDataSource()); 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopAltErrorPageFetcher(main_frame->dataSource()); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->stopLoading(); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reload current focused frame. 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// E.g. called by right-clicking on the frame and picking "reload this frame". 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnReloadFrame() { 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview() && webview()->focusedFrame()) { 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We always obey the cache (ignore_cache=false) here. 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evanm): perhaps we could allow shift-clicking the menu item to do 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a cache-ignoring reload of the frame. 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->focusedFrame()->reload(false); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnCopyImageAt(int x, int y) { 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->copyImageAt(WebPoint(x, y)); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnUpdateTargetURLAck() { 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if there is a targeturl waiting to be sent. 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_url_status_ == TARGET_PENDING) { 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateTargetURL(routing_id_, page_id_, 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_target_url_)); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_ = TARGET_NONE; 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnCopy() { 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebNode current_node = context_menu_node_.isNull() ? 1715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode() : context_menu_node_; 1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand(WebString::fromUTF8("Copy"), 1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_node); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnCut() { 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand(WebString::fromUTF8("Cut"), 1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnDelete() { 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand(WebString::fromUTF8("Delete"), 1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnExecuteEditCommand(const std::string& name, 1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& value) { 1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!webview() || !webview()->focusedFrame()) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand( 1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebString::fromUTF8(name), WebString::fromUTF8(value)); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnMoveCaret(const gfx::Point& point) { 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new ViewHostMsg_MoveCaret_ACK(routing_id_)); 1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->moveCaretSelectionTowardsWindowPoint(point); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnPaste() { 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand(WebString::fromUTF8("Paste"), 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnPasteAndMatchStyle() { 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->focusedFrame()->executeCommand( 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebString::fromUTF8("PasteAndMatchStyle"), GetFocusedNode()); 1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnRedo() { 1774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!webview()) 1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand(WebString::fromUTF8("Redo"), 1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnReplace(const string16& text) { 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->focusedFrame(); 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->hasSelection()) 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->selectWordAroundCaret(); 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->replaceSelection(text); 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::OnReplaceMisspelling(const string16& text) { 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFrame* frame = webview()->focusedFrame(); 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!frame->hasSelection()) 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->replaceMisspelledRange(text); 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnScrollFocusedEditableNodeIntoRect( 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Rect& rect) { 1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebNode node = GetFocusedNode(); 1806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!node.isNull()) { 1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsEditableNode(node)) { 1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->saveScrollAndScaleState(); 1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->scrollFocusedNodeIntoRect(rect); 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnSelectAll() { 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand( 1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebString::fromUTF8("SelectAll"), GetFocusedNode()); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnSelectRange(const gfx::Point& start, 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Point& end) { 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new ViewHostMsg_SelectRange_ACK(routing_id_)); 1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->selectRange(start, end); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnSetEditCommandsForNextKeyEvent( 1835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const EditCommands& edit_commands) { 1836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) edit_commands_ = edit_commands; 1837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnUndo() { 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand(WebString::fromUTF8("Undo"), 1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnUnselect() { 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect"), 1853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) 1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnCopyToFindPboard() { 1858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!webview()) 1859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Since the find pasteboard supports only plain text, this can be simpler 1862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // than the |OnCopy()| case. 1863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebFrame* frame = webview()->focusedFrame(); 1864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (frame->hasSelection()) { 1865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) string16 selection = frame->selectionAsText(); 1866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderThread::Get()->Send( 1867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new ClipboardHostMsg_FindPboardWriteStringAsync(selection)); 1868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::OnSetName(const std::string& name) { 1873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!webview()) 1874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->mainFrame()->setName(WebString::fromUTF8(name)); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetEditableSelectionOffsets(int start, int end) { 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 18812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!ShouldHandleImeEvent()) 18822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return; 188390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImeEventGuard guard(this); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setEditableSelectionOffsets(start, end); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetCompositionFromExistingText( 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start, int end, 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<WebKit::WebCompositionUnderline>& underlines) { 18902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!ShouldHandleImeEvent()) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 189290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImeEventGuard guard(this); 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setCompositionFromExistingText(start, end, underlines); 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnExtendSelectionAndDelete(int before, int after) { 18972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!ShouldHandleImeEvent()) 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 189990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ImeEventGuard guard(this); 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->extendSelectionAndDelete(before, after); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetHistoryLengthAndPrune(int history_length, 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 minimum_page_id) { 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(history_length, 0); 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(history_list_offset_ == history_list_length_ - 1); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(minimum_page_id, -1); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate the new list. 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int32> new_history_page_ids(history_length, -1); 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < history_page_ids_.size(); ++i) { 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (minimum_page_id >= 0 && history_page_ids_[i] < minimum_page_id) 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_history_page_ids.push_back(history_page_ids_[i]); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_history_page_ids.swap(history_page_ids_); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update indexes. 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_length_ = history_page_ids_.size(); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ = history_list_length_ - 1; 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetInitialFocus(bool reverse) { 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setInitialFocus(reverse); 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetInLiveResize(bool in_live_resize) { 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (in_live_resize) 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->willStartLiveResize(); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->willEndLiveResize(); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnUndoScrollFocusedEditableNodeIntoRect() { 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebNode node = GetFocusedNode(); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node.isNull() && IsEditableNode(node)) 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->restoreScrollAndScaleState(); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tell the embedding application that the URL of the active page has changed 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateURL(WebFrame* frame) { 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ds); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request = ds->request(); 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& original_request = ds->originalRequest(); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLResponse& response = ds->response(); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_FrameNavigate_Params params; 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.http_status_code = response.httpStatusCode(); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.is_post = false; 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.post_id = -1; 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.page_id = page_id_; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.frame_id = frame->identifier(); 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.socket_address.set_host(response.remoteIPAddress().utf8()); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.socket_address.set_port(response.remotePort()); 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response); 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extra_data) { 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.was_fetched_via_proxy = extra_data->was_fetched_via_proxy(); 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.was_within_same_page = navigation_state->was_within_same_page(); 1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.security_info = response.securityInfo(); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the URL to be displayed in the browser UI to the user. 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.url = GetLoadingUrl(frame); 19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!is_swapped_out_ || params.url == GURL(kSwappedOutURL)); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->document().baseURL() != params.url) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.base_url = frame->document().baseURL(); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRedirectChain(ds, ¶ms.redirects); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.should_update_history = !ds->hasUnreachableURL() && 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !response.isMultipartPayload() && (response.httpStatusCode() != 404); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.searchable_form_url = internal_data->searchable_form_url(); 1992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.searchable_form_encoding = internal_data->searchable_form_encoding(); 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PasswordForm* password_form_data = document_state->password_form_data(); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (password_form_data) 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.password_form = *password_form_data; 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.gesture = navigation_gesture_; 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_gesture_ = NavigationGestureUnknown; 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make navigation state a part of the FrameNavigate message so that commited 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry had it at all times. 200390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebHistoryItem item = frame->currentHistoryItem(); 200490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (item.isNull()) { 200590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) item.initialize(); 200690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) item.setURLString(request.url().spec().utf16()); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 200890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.page_state = HistoryItemToPageState(item); 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->parent()) { 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Top-level navigation. 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the zoom limits in case a plugin had changed them previously. This 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will also call us back which will cause us to send a message to 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update WebContentsImpl. 201658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch webview()->zoomLimitsChanged(ZoomFactorToZoomLevel(kMinimumZoomFactor), 201758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ZoomFactorToZoomLevel(kMaximumZoomFactor)); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set zoom level, but don't do it for full-page plugin since they don't use 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same zoom settings. 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomLevels::iterator host_zoom = 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_zoom_levels_.find(GURL(request.url())); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame()->document().isPluginDocument()) { 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the zoom levels for plugins. 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, 0); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host_zoom != host_zoom_levels_.end()) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, host_zoom->second); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host_zoom != host_zoom_levels_.end()) { 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This zoom level was merely recorded transiently for this load. We can 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // erase it now. If at some point we reload this page, the browser will 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send us a new, up-to-date zoom level. 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_zoom_levels_.erase(host_zoom); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update contents MIME type for main frame. 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.contents_mime_type = ds->response().mimeType().utf8(); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = navigation_state->transition_type(); 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PageTransitionIsMainFrame(params.transition)) { 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the main frame does a load, it should not be reported as a subframe 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. This can occur in the following case: 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. You're on a site with frames. 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. You do a subframe navigation. This is stored with transition type 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MANUAL_SUBFRAME. 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3. You navigate to some non-frame site, say, google.com. 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4. You navigate back to the page from step 2. Since it was initially 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MANUAL_SUBFRAME, it will be that same transition type here. 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't want that, because any navigation that changes the toplevel 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame should be tracked as a toplevel navigation (this allows us to 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update the URL bar, etc). 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = PAGE_TRANSITION_LINK; 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2057a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If the page contained a client redirect (meta refresh, document.loc...), 2058a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // set the referrer and transition appropriately. 2059a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (ds->isClientRedirect()) { 2060a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.referrer = Referrer(params.redirects[0], 2061a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetReferrerPolicyFromRequest(frame, ds->request())); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = static_cast<PageTransition>( 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition | PAGE_TRANSITION_CLIENT_REDIRECT); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bug 654101: the referrer will be empty on https->http transitions. It 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // would be nice if we could get the real referrer from somewhere. 2067a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.referrer = GetReferrerFromRequest(frame, original_request); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 method = request.httpMethod(); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EqualsASCII(method, "POST")) { 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.is_post = true; 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.post_id = ExtractPostId(item); 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the user agent override back. 2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.is_overriding_user_agent = internal_data->is_overriding_user_agent(); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Track the URL of the original request. 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.original_request_url = original_request.url(); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.history_list_was_cleared = 2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_state->history_list_was_cleared(); 2084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save some histogram data so we can compute the average memory used per 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page load of the glyphs. 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_10000("Memory.GlyphPagesPerLoad", 2088bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebGlyphCache::pageCount()); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This message needs to be sent before any of allowScripts(), 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // allowImages(), allowPlugins() is called for the new page, so that when 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these functions send a ViewHostMsg_ContentBlocked message, it arrives 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the ViewHostMsg_FrameNavigate message. 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_FrameNavigate(routing_id_, params)); 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subframe navigation: the type depends on whether this navigation 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generated a new session history entry. When they do generate a session 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history entry, it means the user initiated the navigation and we should 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mark it as such. This test checks if this is the first time UpdateURL 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has been called since WillNavigateToURL was called to initiate the load. 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_id_ > last_page_id_sent_to_browser_) 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = PAGE_TRANSITION_MANUAL_SUBFRAME; 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = PAGE_TRANSITION_AUTO_SUBFRAME; 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!navigation_state->history_list_was_cleared()); 2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.history_list_was_cleared = false; 2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_FrameNavigate(routing_id_, params)); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_page_id_sent_to_browser_ = 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(last_page_id_sent_to_browser_, page_id_); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we end up reusing this WebRequest (for example, due to a #ref click), 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we don't want the transition type to persist. Just clear it. 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_transition_type(PAGE_TRANSITION_LINK); 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tell the embedding application that the title of the active page has changed 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateTitle(WebFrame* frame, 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTextDirection title_direction) { 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore all but top level navigations. 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->parent()) 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::debug::TraceLog::GetInstance()->UpdateProcessLabel( 21297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch routing_id_, UTF16ToUTF8(title)); 21307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 shortened_title = title.substr(0, kMaxTitleChars); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateTitle(routing_id_, page_id_, shortened_title, 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_direction)); 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateEncoding(WebFrame* frame, 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& encoding_name) { 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only update main frame's encoding_name. 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame() == frame && 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_encoding_name_ != encoding_name) { 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the encoding name for later comparing. 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_encoding_name_ = encoding_name; 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateEncoding(routing_id_, last_encoding_name_)); 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends the last committed session history state to the browser so it will be 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// saved before we navigate to a new page. This must be called *before* the 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page ID has been updated so we know what it was. 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateSessionHistory(WebFrame* frame) { 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a valid page ID at this point, then it corresponds to the page 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we are navigating away from. Otherwise, this is the first navigation, so 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there is no past session history to record. 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_id_ == -1) 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebHistoryItem& item = 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->previousHistoryItem(); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendUpdateState(item); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SendUpdateState(const WebHistoryItem& item) { 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.isNull()) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send state updates for kSwappedOutURL. 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.urlString() == WebString::fromUTF8(kSwappedOutURL)) 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateState( 217290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) routing_id_, page_id_, HistoryItemToPageState(item))); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OpenURL(WebFrame* frame, 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebNavigationPolicy policy) { 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ViewHostMsg_OpenURL_Params params; 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.url = url; 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.referrer = referrer; 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.disposition = NavigationPolicyToDisposition(policy); 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.frame_id = frame->identifier(); 21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ds) { 2186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params.should_replace_current_entry = ds->replacesCurrentHistoryItem(); 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params.should_replace_current_entry = false; 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 2191bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (GetContentClient()->renderer()->AllowPopup()) 2192bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch params.user_gesture = true; 21937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 21947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (policy == WebKit::WebNavigationPolicyNewBackgroundTab || 21957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch policy == WebKit::WebNavigationPolicyNewForegroundTab || 21967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch policy == WebKit::WebNavigationPolicyNewWindow || 21977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch policy == WebKit::WebNavigationPolicyNewPopup) { 21987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebUserGestureIndicator::consumeUserGesture(); 21997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_OpenURL(routing_id_, params)); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebViewDelegate ------------------------------------------------------------ 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::LoadNavigationErrorPage( 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& failed_request, 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLError& error, 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html, 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool replace) { 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string alt_html; 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string* error_html; 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!html.empty()) { 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_html = &html; 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->renderer()->GetNavigationErrorStrings( 2219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame, failed_request, error, &alt_html, NULL); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_html = &alt_html; 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->loadHTMLString(*error_html, 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(kUnreachableWebDataURL), 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.unreachableURL, 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replace); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::RunJavaScriptMessage(JavaScriptMessageType type, 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& default_value, 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* result) { 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result_temp; 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = &result_temp; 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendAndRunNestedMessageLoop(new ViewHostMsg_RunJavaScriptMessage( 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, message, default_value, frame_url, type, &success, result)); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success; 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) { 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before WebKit asks us to show an alert (etc.), it takes care of doing the 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is particularly important that we do not call willEnterModalLoop as 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that would defer resource loads for the dialog itself. 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderThreadImpl::current()) // Will be NULL during unit tests. 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->DoNotNotifyWebKitOfModalLoop(); 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message->EnableMessagePumping(); // Runs a nested message loop. 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Send(message); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::GetWindowSnapshot(const WindowSnapshotCallback& callback) { 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id = next_snapshot_id_++; 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_snapshots_.insert(std::make_pair(id, callback)); 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_GetWindowSnapshot(routing_id_, id)); 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::OnWindowSnapshotCompleted(const int snapshot_id, 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& size, const std::vector<unsigned char>& png) { 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingSnapshotMap::iterator it = pending_snapshots_.find(snapshot_id); 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(it != pending_snapshots_.end()); 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->second.Run(size, png); 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_snapshots_.erase(it); 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit::WebViewClient ------------------------------------------------------ 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebView* RenderViewImpl::createView( 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* creator, 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request, 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebWindowFeatures& features, 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& frame_name, 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebNavigationPolicy policy) { 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check to make sure we aren't overloading on popups. 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shared_popup_counter_->data > kMaximumNumberOfUnacknowledgedPopups) 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_CreateWindow_Params params; 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_id = routing_id_; 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 2285bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (GetContentClient()->renderer()->AllowPopup()) 2286bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch params.user_gesture = true; 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.window_container_type = WindowFeaturesToContainerType(features); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.session_storage_namespace_id = session_storage_namespace_id_; 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (frame_name != "_blank") 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.frame_name = frame_name; 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_frame_id = creator->identifier(); 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_url = creator->document().url(); 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL security_url(creator->document().securityOrigin().toString().utf8()); 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!security_url.is_valid()) 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) security_url = GURL(); 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.opener_security_origin = security_url; 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_suppressed = creator->willSuppressOpenerInNewFrame(); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.disposition = NavigationPolicyToDisposition(policy); 2299a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!request.isNull()) { 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.target_url = request.url(); 2301a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.referrer = GetReferrerFromRequest(creator, request); 2302a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 2303a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.features = features; 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 routing_id = MSG_ROUTING_NONE; 2306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 main_frame_routing_id = MSG_ROUTING_NONE; 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 surface_id = 0; 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 cloned_session_storage_namespace_id; 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThread::Get()->Send( 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewHostMsg_CreateWindow(params, 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &routing_id, 2313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &main_frame_routing_id, 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &surface_id, 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &cloned_session_storage_namespace_id)); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (routing_id == MSG_ROUTING_NONE) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUserGestureIndicator::consumeUserGesture(); 23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebPreferences transferred_preferences = webkit_preferences_; 23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unless accelerated compositing has been explicitly disabled from the 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // command line (e.g. via the blacklist or about:flags) re-enable it for 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // new views that get spawned by this view. This gets around the issue that 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // background extension pages disable accelerated compositing via web prefs 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but can themselves spawn a visible render view which should be allowed 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // use gpu acceleration. 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webkit_preferences_.accelerated_compositing_enabled) { 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!command_line.HasSwitch(switches::kDisableAcceleratedCompositing)) 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transferred_preferences.accelerated_compositing_enabled = true; 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* view = RenderViewImpl::Create( 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_, 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transferred_preferences, 2339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shared_popup_counter_.get(), 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id, 2341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) main_frame_routing_id, 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id, 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cloned_session_storage_namespace_id, 23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), // WebCore will take care of setting the correct name. 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_info_, 23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accessibility_mode_, 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) allow_partial_swap_); 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->opened_by_user_gesture_ = params.user_gesture; 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record whether the creator frame is trying to suppress the opener field. 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->opener_suppressed_ = params.opener_suppressed; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy over the alternate error page URL so we can have alt error pages in 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the new render view (we don't need the browser to send the URL back down). 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->alternate_error_page_url_ = alternate_error_page_url_; 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view->webview(); 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebWidget* RenderViewImpl::createPopupMenu(WebKit::WebPopupType popup_type) { 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget* widget = 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::Create(routing_id_, popup_type, screen_info_); 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget->webwidget(); 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebExternalPopupMenu* RenderViewImpl::createExternalPopupMenu( 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPopupMenuInfo& popup_menu_info, 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebExternalPopupMenuClient* popup_menu_client) { 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An IPC message is sent to the browser to build and display the actual 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // popup. The user could have time to click a different select by the time 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the popup is shown. In that case external_popup_menu_ is non NULL. 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // By returning NULL in that case, we instruct WebKit to cancel that new 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // popup. So from the user perspective, only the first one will show, and 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will have to close the first one before another one can be shown. 2378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (external_popup_menu_) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_.reset( 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ExternalPopupMenu(this, popup_menu_info, popup_menu_client)); 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return external_popup_menu_.get(); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebStorageNamespace* RenderViewImpl::createSessionStorageNamespace() { 2386bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch CHECK(session_storage_namespace_id_ != kInvalidSessionStorageNamespaceId); 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new WebStorageNamespaceImpl(session_storage_namespace_id_); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didAddMessageToConsole( 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebConsoleMessage& message, const WebString& source_name, 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned source_line) { 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::LogSeverity log_severity = logging::LOG_VERBOSE; 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (message.level) { 23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebConsoleMessage::LevelDebug: 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_severity = logging::LOG_VERBOSE; 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebConsoleMessage::LevelLog: 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_severity = logging::LOG_INFO; 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebConsoleMessage::LevelWarning: 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_severity = logging::LOG_WARNING; 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebConsoleMessage::LevelError: 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_severity = logging::LOG_ERROR; 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2411bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Send(new ViewHostMsg_AddMessageToConsole(routing_id_, 2412bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<int32>(log_severity), 2413bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch message.text, 2414bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<int32>(source_line), 2415bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch source_name)); 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::printPage(WebFrame* frame) { 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPage(frame, handling_input_event_)); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter* RenderViewImpl::notificationPresenter() { 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification_provider_; 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::enumerateChosenDirectory( 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& path, 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion* chooser_completion) { 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = enumeration_completion_id_++; 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enumeration_completions_[id] = chooser_completion; 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Send(new ViewHostMsg_EnumerateDirectory( 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id, 2435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath::FromUTF16Unsafe(path))); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::initializeHelperPluginWebFrame( 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebHelperPlugin* plugin) { 2440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch plugin->initializeFrame(main_render_frame_.get()); 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didStartLoading() { 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_) { 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "didStartLoading called while loading"; 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = true; 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidStartLoading(routing_id_)); 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStartLoading()); 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didStopLoading() { 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading_) { 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "DidStopLoading called while not loading"; 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = false; 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: For now we're doing the safest thing, and sending out notification 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when done loading. This currently isn't an issue as the favicon is only 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // displayed when done loading. Ideally we would send notification when 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finished parsing the head, but webkit doesn't support that yet. 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The feed discovery code would also benefit from access to the head. 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidStopLoading(routing_id_)); 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_progress_tracker_ != NULL) 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_progress_tracker_->DidStopLoading(); 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DidStopLoadingIcons(); 2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStopLoading()); 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didChangeLoadProgress(WebFrame* frame, 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double load_progress) { 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_progress_tracker_ != NULL) 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_progress_tracker_->DidChangeLoadProgress(frame, load_progress); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didCancelCompositionOnSelectionChange() { 24862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_ImeCancelComposition(routing_id())); 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didChangeSelection(bool is_empty_selection) { 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!handling_input_event_ && !handling_select_range_) 24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_empty_selection) 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_.clear(); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncSelectionIfRequired(); 24977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UpdateTextInputType(); 24987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 24992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch UpdateTextInputState(false, true); 25007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didExecuteCommand(const WebString& command_name) { 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name = UTF16ToUTF8(command_name); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWithASCII(name, "Move", true) || 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartsWithASCII(name, "Insert", true) || 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartsWithASCII(name, "Delete", true)) 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->RecordUserMetrics(name); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::handleCurrentKeyboardEvent() { 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (edit_commands_.empty()) 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->focusedFrame(); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EditCommands::iterator it = edit_commands_.begin(); 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EditCommands::iterator end = edit_commands_.end(); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_execute_command = false; 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; it != end; ++it) { 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In gtk and cocoa, it's possible to bind multiple edit commands to one 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // key (but it's the exception). Once one edit command is not executed, it 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // seems safest to not execute the rest. 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->executeCommand(WebString::fromUTF8(it->name), 2529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebString::fromUTF8(it->value), 2530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetFocusedNode())) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_execute_command = true; 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return did_execute_command; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebColorChooser* RenderViewImpl::createColorChooser( 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebColorChooserClient* client, 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebColor& initial_color) { 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererWebColorChooserImpl* color_chooser = 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RendererWebColorChooserImpl(this, client); 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser->Open(static_cast<SkColor>(initial_color)); 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return color_chooser; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::runFileChooser( 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebFileChooserParams& params, 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion* chooser_completion) { 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not open the file dialog in a hidden RenderView. 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_hidden()) 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileChooserParams ipc_params; 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.directory) 2555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ipc_params.mode = FileChooserParams::UploadFolder; 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (params.multiSelect) 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.mode = FileChooserParams::OpenMultiple; 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (params.saveAs) 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.mode = FileChooserParams::Save; 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.mode = FileChooserParams::Open; 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.title = params.title; 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.default_file_name = 2564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath::FromUTF16Unsafe(params.initialValue); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.accept_types.reserve(params.acceptTypes.size()); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < params.acceptTypes.size(); ++i) 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.accept_types.push_back(params.acceptTypes[i]); 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 25697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ipc_params.capture = params.useMediaCapture; 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ScheduleFileChooser(ipc_params, chooser_completion); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::runModalAlertDialog(WebFrame* frame, 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& message) { 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_ALERT, 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().url(), 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::runModalConfirmDialog(WebFrame* frame, 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& message) { 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_CONFIRM, 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().url(), 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::runModalPromptDialog(WebFrame* frame, 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& message, 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& default_value, 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString* actual_value) { 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result; 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_PROMPT, 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_value, 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().url(), 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result); 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ok) 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_value->assign(result); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ok; 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::runModalBeforeUnloadDialog( 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebString& message) { 2610a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool is_reload = false; 2611a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 2612a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (ds) 2613a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) is_reload = (ds->navigationType() == WebKit::WebNavigationTypeReload); 2614a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return runModalBeforeUnloadDialog(frame, is_reload, message); 2615a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 2616a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool RenderViewImpl::runModalBeforeUnloadDialog( 2618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WebFrame* frame, bool is_reload, const WebString& message) { 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are swapping out, we have already run the beforeunload handler. 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Fix OnSwapOut to clear the frame without running beforeunload 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // at all, to avoid running it twice. 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_swapped_out_) 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is an ignored return value, but is included so we can accept the same 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response as RunJavaScriptMessage. 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ignored_result; 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendAndRunNestedMessageLoop(new ViewHostMsg_RunBeforeUnloadConfirm( 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, frame->document().url(), message, is_reload, 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &success, &ignored_result)); 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success; 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::showContextMenu( 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebContextMenuData& data) { 263790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ContextMenuParams params = ContextMenuParamsBuilder::Build(data); 26387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.source_type = context_menu_source_type_; 2639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (context_menu_source_type_ == ui::MENU_SOURCE_TOUCH_EDIT_MENU) { 26407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.x = touch_editing_context_menu_location_.x(); 26417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.y = touch_editing_context_menu_location_.y(); 26427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Plugins, e.g. PDF, don't currently update the render view when their 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // selected text changes, but the context menu params do contain the updated 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // selection. If that's the case, update the render view's state just prior 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to showing the context menu. 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(asvitkine): http://crbug.com/152432 26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldUpdateSelectionTextFromContextMenuParams(selection_text_, 26502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_text_offset_, 26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_range_, 26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params)) { 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_ = params.selection_text; 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(asvitkine): Text offset and range is not available in this case. 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_offset_ = 0; 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_range_ = ui::Range(0, selection_text_.length()); 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_SelectionChanged(routing_id_, 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_, 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_offset_, 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_range_)); 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame is NULL if invoked by BlockedPlugin. 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame) 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.frame_id = frame->identifier(); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Serializing a GURL longer than kMaxURLChars will fail, so don't do 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it. We replace it with an empty GURL so the appropriate items are disabled 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the context menu. 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jcivelli): http://crbug.com/45160 This prevents us from saving large 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data encoded images. We should have a way to save them. 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.src_url.spec().size() > kMaxURLChars) 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.src_url = GURL(); 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_node_ = data.node; 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect start_rect; 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect end_rect; 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSelectionBounds(&start_rect, &end_rect); 26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.selection_start = gfx::Point(start_rect.x(), start_rect.bottom()); 26812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.selection_end = gfx::Point(end_rect.right(), end_rect.bottom()); 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ContextMenu(routing_id_, params)); 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidRequestShowContextMenu(frame, data)); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::setStatusText(const WebString& text) { 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateTargetURL(const GURL& url, 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& fallback_url) { 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL latest_url = url.is_empty() ? fallback_url : url; 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (latest_url == target_url_) 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the browser to display a destination link. 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_url_status_ == TARGET_INFLIGHT || 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_ == TARGET_PENDING) { 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a request in-flight, save the URL to be sent when we 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receive an ACK to the in-flight request. We can happily overwrite 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any existing pending sends. 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_target_url_ = latest_url; 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_ = TARGET_PENDING; 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLs larger than |kMaxURLChars| cannot be sent through IPC - 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // see |ParamTraits<GURL>|. 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (latest_url.possibly_invalid_spec().size() > kMaxURLChars) 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) latest_url = GURL(); 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateTargetURL(routing_id_, page_id_, latest_url)); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_ = latest_url; 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_ = TARGET_INFLIGHT; 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::RectF RenderViewImpl::ClientRectToPhysicalWindowRect( 27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::RectF& rect) const { 27202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF window_rect = rect; 27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_rect.Scale(device_scale_factor_ * webview()->pageScaleFactor()); 27222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window_rect; 27232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::StartNavStateSyncTimerIfNecessary() { 27262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No need to update state if no page has committed yet. 27272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (page_id_ == -1) 27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delay; 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_content_state_immediately_) 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay = 0; 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (is_hidden()) 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay = kDelaySecondsForContentStateSyncHidden; 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay = kDelaySecondsForContentStateSync; 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nav_state_sync_timer_.IsRunning()) { 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The timer is already running. If the delay of the timer maches the amount 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we want to delay by, then return. Otherwise stop the timer so that it 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets started with the right delay. 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nav_state_sync_timer_.GetCurrentDelay().InSeconds() == delay) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nav_state_sync_timer_.Stop(); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this, 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RenderViewImpl::SyncNavigationState); 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::setMouseOverURL(const WebURL& url) { 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_over_url_ = GURL(url); 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTargetURL(mouse_over_url_, focus_url_); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::setKeyboardFocusURL(const WebURL& url) { 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_url_ = GURL(url); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTargetURL(focus_url_, mouse_over_url_); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::startDragging(WebFrame* frame, 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebDragData& data, 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperationsMask mask, 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebImage& image, 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPoint& webImageOffset) { 2766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DropData drop_data(DropDataBuilder::Build(data)); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data.referrer_policy = frame->document().referrerPolicy(); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Vector2d imageOffset(webImageOffset.x, webImageOffset.y); 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new DragHostMsg_StartDragging(routing_id_, 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data, 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask, 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image.getSkBitmap(), 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) imageOffset, 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_)); 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::acceptsLoadDrops() { 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.can_accept_load_drops; 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::focusNext() { 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_TakeFocus(routing_id_, false)); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::focusPrevious() { 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_TakeFocus(routing_id_, true)); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::focusedNodeChanged(const WebNode& node) { 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_FocusedNodeChanged(routing_id_, IsEditableNode(node))); 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusedNodeChanged(node)); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::numberOfWheelEventHandlersChanged(unsigned num_handlers) { 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidChangeNumWheelEvents(routing_id_, num_handlers)); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didUpdateLayout() { 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't always want to set up a timer, only if we've been put in that 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mode by getting a |ViewMsg_EnablePreferredSizeChangedMode| 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message. 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!send_preferred_size_changes_ || !webview()) 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (check_preferred_size_timer_.IsRunning()) 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check_preferred_size_timer_.Start(FROM_HERE, 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(0), this, 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RenderViewImpl::CheckPreferredSize); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::navigateBackForwardSoon(int offset) { 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_GoToEntryAtOffset(routing_id_, offset)); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::historyBackListCount() { 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return history_list_offset_ < 0 ? 0 : history_list_offset_; 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::historyForwardListCount() { 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return history_list_length_ - historyBackListCount() - 1; 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::postAccessibilityNotification( 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebAccessibilityObject& obj, 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebAccessibilityNotification notification) { 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (renderer_accessibility_) { 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_->HandleWebAccessibilityNotification( 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj, notification); 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didUpdateInspectorSetting(const WebString& key, 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& value) { 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateInspectorSetting(routing_id_, 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.utf8(), 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.utf8())); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit::WebWidgetClient ---------------------------------------------------- 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFocus() { 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jcivelli): when https://bugs.webkit.org/show_bug.cgi?id=33389 is fixed 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we won't have to test for user gesture anymore and we can 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // move that code back to render_widget.cc 28472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (WebUserGestureIndicator::isProcessingUserGesture() && 2848868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !RenderThreadImpl::current()->layout_test_mode()) { 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_Focus(routing_id_)); 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didBlur() { 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jcivelli): see TODO above in didFocus(). 28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (WebUserGestureIndicator::isProcessingUserGesture() && 2856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !RenderThreadImpl::current()->layout_test_mode()) { 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_Blur(routing_id_)); 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We are supposed to get a single call to Show for a newly created RenderView 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that was created via RenderViewImpl::CreateWebView. So, we wait until this 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// point to dispatch the ShowView message. 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This method provides us with the information about how to display the newly 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created RenderView (i.e., as a blocked popup or as a new tab). 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::show(WebNavigationPolicy policy) { 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (did_show_) { 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When supports_multiple_windows is disabled, popups are reusing 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same view. In some scenarios, this makes WebKit to call show() twice. 287290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (webkit_preferences_.supports_multiple_windows) 287390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED() << "received extraneous Show call"; 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_show_ = true; 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(opener_id_ != MSG_ROUTING_NONE); 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force new windows to a popup if they were not opened with a user gesture. 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opened_by_user_gesture_) { 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We exempt background tabs for compat with older versions of Chrome. 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(darin): This seems bogus. These should have a user gesture, so 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we probably don't need this check. 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy != WebKit::WebNavigationPolicyNewBackgroundTab) 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy = WebKit::WebNavigationPolicyNewPopup; 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: initial_pos_ may still have its default values at this point, but 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser process will impose a default position otherwise. 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ShowView(opener_id_, routing_id_, 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationPolicyToDisposition(policy), initial_pos_, 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opened_by_user_gesture_)); 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPendingWindowRect(initial_pos_); 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::runModal() { 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(did_show_) << "should already have shown the view"; 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must keep WebKit's shared timer running in this case in order to allow 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showModalDialog to function properly. 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(darin): WebKit should really be smarter about suppressing events and 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // timers so that we do not need to manage the shared timer in such a heavy 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handed manner. 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderThreadImpl::current()) // Will be NULL during unit tests. 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->DoNotSuspendWebKitSharedTimer(); 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendAndRunNestedMessageLoop(new ViewHostMsg_RunModal( 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, opener_id_)); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::enterFullScreen() { 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ToggleFullscreen(routing_id_, true)); 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::exitFullScreen() { 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ToggleFullscreen(routing_id_, false)); 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::requestPointerLock() { 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get()); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::requestPointerUnlock() { 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get()); 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::isPointerLocked() { 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_lock_dispatcher_->IsMouseLockedTo( 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_mouse_lock_target_.get()); 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didActivateCompositor(int input_handler_identifier) { 29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_MACOSX) // many events are unhandled - http://crbug.com/138003 29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InputHandlerManager* input_handler_manager = 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderThreadImpl::current()->input_handler_manager(); 294190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_handler_manager) { 294290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_manager->AddInputHandler( 294390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) routing_id_, 294490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) compositor_->GetInputHandler(), 294590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AsWeakPtr()); 294690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::didActivateCompositor(input_handler_identifier); 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didHandleGestureEvent( 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebGestureEvent& event, 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool event_cancelled) { 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidget::didHandleGestureEvent(event, event_cancelled); 29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidHandleGestureEvent(event)); 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2960a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid RenderViewImpl::initializeLayerTreeView() { 2961a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch RenderWidget::initializeLayerTreeView(); 2962a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch RenderWidgetCompositor* rwc = compositor(); 2963a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!rwc || !webview() || !webview()->devToolsAgent()) 2964a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return; 2965a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch webview()->devToolsAgent()->setLayerTreeId(rwc->GetLayerTreeId()); 2966a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2967a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit::WebFrameClient ----------------------------------------------------- 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2970ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochWebKit::WebPlugin* RenderViewImpl::createPlugin(WebFrame* frame, 2971ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const WebPluginParams& params) { 2972bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 29732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebSharedWorker* RenderViewImpl::createSharedWorker( 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebURL& url, const WebString& name, 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long document_id) { 2979bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 2980bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return NULL; 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer* RenderViewImpl::createMediaPlayer( 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebKit::WebURL& url, WebMediaPlayerClient* client) { 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, WillCreateMediaPlayer(frame, client)); 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 29897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_WEBRTC) 29907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnsureMediaStreamClient(); 29917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if !defined(GOOGLE_TV) 29927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (media_stream_client_->IsMediaStream(url)) { 2993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) 2994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool found_neon = 2995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0; 2996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Platform.WebRtcNEONFound", found_neon); 2997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) 29987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new WebMediaPlayerMS( 29997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch frame, client, AsWeakPtr(), media_stream_client_, new RenderMediaLog()); 30002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // !defined(GOOGLE_TV) 30027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // defined(ENABLE_WEBRTC) 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelHost* gpu_channel_host = 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->EstablishGpuChannelSync( 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE); 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gpu_channel_host) { 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to establish GPU channel for media player"; 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<cc::ContextProvider> context_provider = 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderThreadImpl::current()->OffscreenContextProviderForMainThread(); 30157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!context_provider.get()) { 30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Failed to get context3d for media player"; 30172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!media_player_proxy_) { 3021eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch media_player_proxy_ = new WebMediaPlayerProxyAndroid( 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, media_player_manager_.get()); 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3024ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3025ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<StreamTextureFactory> stream_texture_factory; 3026ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (UsingSynchronousRendererCompositor()) { 3027ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch stream_texture_factory.reset(new StreamTextureFactorySynchronousImpl); 3028ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 3029ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch stream_texture_factory.reset(new StreamTextureFactoryImpl( 3030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch context_provider->Context3d(), gpu_channel_host, routing_id_)); 3031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 3032ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3033eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<WebMediaPlayerAndroid> web_media_player_android( 3034eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new WebMediaPlayerAndroid( 3035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) frame, 3036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) client, 30377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AsWeakPtr(), 3038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) media_player_manager_.get(), 3039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) media_player_proxy_, 3040ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch stream_texture_factory.release(), 3041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new RenderMediaLog())); 3042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_WEBRTC) && defined(GOOGLE_TV) 30437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (media_stream_client_->IsMediaStream(url)) { 3044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RTCVideoDecoderFactoryTv* factory = RenderThreadImpl::current() 3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ->GetMediaStreamDependencyFactory()->decoder_factory_tv(); 30467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |media_stream_client| and |factory| outlives |web_media_player_android|. 3047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!factory->AcquireDemuxer() || 3048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !web_media_player_android->InjectMediaStream( 30497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_stream_client_, 3050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) factory, 3051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind( 3052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::IgnoreResult(&RTCVideoDecoderFactoryTv::ReleaseDemuxer), 3053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Unretained(factory)))) { 3054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LOG(ERROR) << "Failed to inject media stream."; 3055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 3056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3057868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // defined(ENABLE_WEBRTC) && defined(GOOGLE_TV) 3059868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return web_media_player_android.release(); 3060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // defined(OS_ANDROID) 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<media::AudioRendererSink> sink; 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cmd_line->HasSwitch(switches::kDisableAudio)) { 3064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sink = RenderThreadImpl::current()->GetAudioRendererMixerManager()-> 3065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateInput(routing_id_); 3066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DVLOG(1) << "Using AudioRendererMixerManager-provided sink: " << sink.get(); 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3069a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch scoped_refptr<media::GpuVideoDecoderFactories> gpu_factories = 3070bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderThreadImpl::current()->GetGpuFactories( 3071bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy()); 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebMediaPlayerParams params( 3074868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), 3075eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&ContentRendererClient::DeferMediaLoad, 3076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(GetContentClient()->renderer()), 3077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<RenderView*>(this)), 3078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch sink, 3079eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gpu_factories, 3080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new RenderMediaLog()); 30817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new WebMediaPlayerImpl(frame, client, AsWeakPtr(), params); 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebApplicationCacheHost* RenderViewImpl::createApplicationCacheHost( 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, WebApplicationCacheHostClient* client) { 3086bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 3087bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return NULL; 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebCookieJar* RenderViewImpl::cookieJar(WebFrame* frame) { 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &cookie_jar_; 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RenderViewImpl::didAccessInitialDocument(WebFrame* frame) { 3095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Notify the browser process that it is no longer safe to show the pending 3096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // URL of the main frame, since a URL spoof is now possible. 3097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!frame->parent() && page_id_ == -1) 3098868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Send(new ViewHostMsg_DidAccessInitialDocument(routing_id_)); 3099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCreateFrame(WebFrame* parent, WebFrame* child) { 3102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didDisownOpener(WebKit::WebFrame* frame) { 3106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We only need to notify the browser if the active, top-level frame clears 3107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // its opener. We can ignore cases where a swapped out frame clears its 3108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // opener after hearing about it from the browser, and the browser does not 3109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (yet) care about subframe openers. 3110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_swapped_out_ || frame->parent()) 31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 31122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Notify WebContents and all its swapped out RenderViews. 31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_DidDisownOpener(routing_id_)); 31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::frameDetached(WebFrame* frame) { 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameDetached(frame)); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willClose(WebFrame* frame) { 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameWillClose(frame)); 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didChangeName(WebFrame* frame, 31262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebString& name) { 3127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 31282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::loadURLExternally( 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebURLRequest& request, 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebNavigationPolicy policy) { 3133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::Repaint(const gfx::Size& size) { 31372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnRepaint(size); 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SetEditCommandForNextKeyEvent(const std::string& name, 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value) { 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EditCommands edit_commands; 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) edit_commands.push_back(EditCommand(name, value)); 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetEditCommandsForNextKeyEvent(edit_commands); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::ClearEditCommands() { 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) edit_commands_.clear(); 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SSLStatus RenderViewImpl::GetSSLStatusOfFrame(WebKit::WebFrame* frame) const { 3152a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch std::string security_info; 3153a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (frame && frame->dataSource()) 3154a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch security_info = frame->dataSource()->response().securityInfo(); 3155a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3156a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SSLStatus ssl_status; 3157a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DeserializeSecurityInfo(security_info, 3158a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &ssl_status.cert_id, 3159a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &ssl_status.cert_status, 3160a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &ssl_status.security_bits, 3161a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &ssl_status.connection_status); 3162a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return ssl_status; 31632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::loadURLExternally( 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebURLRequest& request, 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebNavigationPolicy policy, 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& suggested_name) { 3169bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( 3173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebFrame* frame, WebDataSource::ExtraData* extraData, 3174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebURLRequest& request, WebNavigationType type, 3175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebNavigationPolicy default_policy, bool is_redirect) { 31762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request.url() != GURL(kSwappedOutURL) && 31772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetContentClient()->renderer()->HandleNavigation(frame, request, type, 31782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_policy, 31792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_redirect)) { 31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; 31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3183a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch Referrer referrer(GetReferrerFromRequest(frame, request)); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_swapped_out_) { 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request.url() != GURL(kSwappedOutURL)) { 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Targeted links may try to navigate a swapped out frame. Allow the 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser process to navigate the tab instead. Note that it is also 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // possible for non-targeted navigations (from this view) to arrive 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here just after we are swapped out. It's ok to send them to the 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser, as long as they're for the top level frame. 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Ensure this supports targeted form submissions when 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fixing http://crbug.com/101395. 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->parent() == NULL) { 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(frame, request.url(), referrer, default_policy); 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should otherwise ignore in-process iframe navigations, if they 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // arrive just after we are swapped out. 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow kSwappedOutURL to complete. 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_policy; 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Webkit is asking whether to navigate to a new URL. 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is fine normally, except if we're showing UI from one security 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // context and they're trying to navigate to a different context. 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = request.url(); 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A content initiated navigation may have originated from a link-click, 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script, drag-n-drop operation, etc. 3215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_content_initiated = static_cast<DocumentState*>(extraData)-> 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state()->is_content_initiated(); 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Experimental: 32192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If --enable-strict-site-isolation or --site-per-process is enabled, send 32202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all top-level navigations to the browser to let it swap processes when 32212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // crossing site boundaries. This is currently expected to break some script 32222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls and navigations, such as form submissions. 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 32242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool force_swap_due_to_flag = 32252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kEnableStrictSiteIsolation) || 32262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kSitePerProcess); 32272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (force_swap_due_to_flag && 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !frame->parent() && (is_content_initiated || is_redirect)) { 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString origin_str = frame->document().securityOrigin().toString(); 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL frame_url(origin_str.utf8().data()); 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cevans): revisit whether this site check is still necessary once 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crbug.com/101395 is fixed. 3233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool same_domain_or_host = 3234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::registry_controlled_domains::SameDomainOrHost( 3235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) frame_url, 3236a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) url, 3237a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); 3238a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!same_domain_or_host || frame_url.scheme() != url.scheme()) { 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(frame, url, referrer, default_policy); 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the browser is interested, then give it a chance to look at the request. 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_content_initiated) { 3246a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch bool is_form_post = ((type == WebKit::WebNavigationTypeFormSubmitted) || 3247a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch (type == WebKit::WebNavigationTypeFormResubmitted)) && 3248a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EqualsASCII(request.httpMethod(), "POST"); 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool browser_handles_request = 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.browser_handles_non_local_top_level_requests && 3251a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch IsNonLocalTopLevelNavigation(url, frame, type, is_form_post); 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!browser_handles_request) { 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_handles_request = 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.browser_handles_all_top_level_requests && 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsTopLevelNavigation(frame); 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_handles_request) { 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset these counters as the RenderView could be reused for the next 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_ = -1; 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_page_id_sent_to_browser_ = -1; 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(frame, url, referrer, default_policy); 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the frame's original request's URL rather than the document's URL for 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequent checks. For a popup, the document's URL may become the opener 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window's URL if the opener has called document.write(). 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/93517. 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL old_url(frame->dataSource()->request().url()); 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detect when we're crossing a permission-based boundary (e.g. into or out of 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an extension or app origin, leaving a WebUI page, etc). We only care about 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top-level navigations (not iframes). But we sometimes navigate to 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // about:blank to clear a tab, and we want to still allow that. 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: this is known to break POST submissions when crossing process 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundaries until http://crbug.com/101395 is fixed. This is better for 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // security than loading a WebUI, extension or app page in the wrong process. 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // POST requests don't work because this mechanism does not preserve form 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // POST data. We will need to send the request's httpBody data up to the 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser process, and issue a special POST navigation in WebKit (via 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FrameLoader::loadFrameRequest). See ResourceDispatcher and WebURLLoaderImpl 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for examples of how to send the httpBody data. 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->parent() && is_content_initiated && 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !url.SchemeIs(chrome::kAboutScheme)) { 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool send_referrer = false; 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All navigations to or from WebUI URLs or within WebUI-enabled 32922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RenderProcesses must be handled by the browser process so that the 32932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // correct bindings and data sources can be registered. 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Similarly, navigations to view-source URLs or within ViewSource mode 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must be handled by the browser process (except for reloads - those are 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // safe to leave within the renderer). 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, access to file:// URLs from non-file:// URL pages must be 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handled by the browser so that ordinary renderer processes don't get 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // blessed with file permissions. 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cumulative_bindings = RenderProcess::current()->GetEnabledBindings(); 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_initial_navigation = page_id_ == -1; 33022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool should_fork = HasWebUIScheme(url) || HasWebUIScheme(old_url) || 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cumulative_bindings & BINDINGS_POLICY_WEB_UI) || 3304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url.SchemeIs(kViewSourceScheme) || 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (frame->isViewSourceModeEnabled() && 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type != WebKit::WebNavigationTypeReload); 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!should_fork && url.SchemeIs(chrome::kFileScheme)) { 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fork non-file to file opens. Check the opener URL if this is the 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initial navigation in a newly opened window. 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL source_url(old_url); 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_initial_navigation && source_url.is_empty() && frame->opener()) 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_url = frame->opener()->top()->document().url(); 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!source_url.is_empty()); 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_fork = !source_url.SchemeIs(chrome::kFileScheme); 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!should_fork) { 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the embedder a chance. 33202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_fork = GetContentClient()->renderer()->ShouldFork( 33212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame, url, request.httpMethod().utf8(), is_initial_navigation, 3322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_redirect, &send_referrer); 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (should_fork) { 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL( 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame, url, send_referrer ? referrer : Referrer(), default_policy); 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detect when a page is "forking" a new tab that can be safely rendered in 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its own process. This is done by sites like Gmail that try to open links 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in new windows without script connections back to the original page. We 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // treat such cases as browser navigations (in which we will create a new 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer for a cross-site navigation), rather than WebKit navigations. 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the following heuristic to decide whether to fork a new page in its 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // own process: 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parent page must open a new tab to about:blank, set the new tab's 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window.opener to null, and then redirect the tab to a cross-site URL using 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // JavaScript. 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Deprecate this logic once we can rely on rel=noreferrer 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (see below). 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fork = 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must start from a tab showing about:blank, which is later redirected. 334890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) old_url == GURL(kAboutBlankURL) && 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be the first real navigation of the tab. 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) historyBackListCount() < 1 && 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) historyForwardListCount() < 1 && 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parent page must have set the child's window.opener to null before 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redirecting to the desired URL. 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->opener() == NULL && 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be a top-level frame. 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->parent() == NULL && 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must not have issued the request from this page. 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_content_initiated && 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be targeted at the current tab. 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_policy == WebKit::WebNavigationPolicyCurrentTab && 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be a JavaScript navigation, which appears as "other". 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == WebKit::WebNavigationTypeOther; 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_fork) { 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open the URL via the browser, not via WebKit. 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(frame, url, Referrer(), default_policy); 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_policy; 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( 3374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebFrame* frame, const WebURLRequest& request, WebNavigationType type, 3375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebNavigationPolicy default_policy, bool is_redirect) { 3376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return decidePolicyForNavigation(frame, 3377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->provisionalDataSource()->extraData(), 3378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request, type, default_policy, is_redirect); 3379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willSendSubmitEvent(WebKit::WebFrame* frame, 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebFormElement& form) { 3383bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willSubmitForm(WebFrame* frame, 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebFormElement& form) { 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, WillSubmitForm(frame, form)); 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCreateDataSource(WebFrame* frame, WebDataSource* ds) { 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool content_initiated = !pending_navigation_params_.get(); 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!document_state) { 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state = new DocumentState; 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ds->setExtraData(document_state); 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!content_initiated) 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateDocumentStateFromPending(document_state); 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Carry over the user agent override flag, if it exists. 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_initiated && webview() && webview()->mainFrame() && 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->dataSource()) { 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* old_document_state = 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::FromDataSource(webview()->mainFrame()->dataSource()); 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_document_state) { 3409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 3410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 3411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* old_internal_data = 3412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(old_document_state); 3413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_is_overriding_user_agent( 3414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) old_internal_data->is_overriding_user_agent()); 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rest of RenderView assumes that a WebDataSource will always have a 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-null NavigationState. 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_initiated) { 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_navigation_state( 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState::CreateContentInitiated()); 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_navigation_state(CreateNavigationStateFromPending()); 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_.reset(); 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DocumentState::referred_by_prefetcher_ is true if we are 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating from a page that used prefetching using a link on that 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. We are early enough in the request process here that we 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can still see the DocumentState of the previous page and set 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this value appropriately. 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(gavinp): catch the important case of navigation in a new 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer process. 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) { 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (WebFrame* old_frame = webview()->mainFrame()) { 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& original_request = ds->originalRequest(); 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL referrer( 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_request.httpHeaderField(WebString::fromUTF8("Referer"))); 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!referrer.is_empty() && 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::FromDataSource( 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_frame->dataSource())->was_prefetcher()) { 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; old_frame; old_frame = old_frame->traverseNext(false)) { 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* old_frame_ds = old_frame->dataSource(); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_frame_ds && referrer == GURL(old_frame_ds->request().url())) { 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_was_referred_by_prefetcher(true); 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_initiated) { 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request = ds->request(); 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (request.cachePolicy()) { 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebURLRequest::UseProtocolCachePolicy: // normal load. 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::LINK_LOAD_NORMAL); 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebURLRequest::ReloadIgnoringCacheData: // reload. 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::LINK_LOAD_RELOAD); 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebURLRequest::ReturnCacheDataElseLoad: // allow stale data. 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type( 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::LINK_LOAD_CACHE_STALE_OK); 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post. 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidCreateDataSource(frame, ds)); 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::PopulateDocumentStateFromPending( 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state) { 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_Navigate_Params& params = *pending_navigation_params_.get(); 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_request_time(params.request_time); 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 3483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 3484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params.url.SchemeIs(chrome::kJavaScriptScheme) && 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == ViewMsg_Navigate_Type::RESTORE) { 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're doing a load of a page that was restored from the last session. By 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default this prefers the cache over loading (LOAD_PREFERRING_CACHE) which 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can result in stale data for pages that are set to expire. We explicitly 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // override that by setting the policy here so that as necessary we load 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the network. 3492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_cache_policy_override( 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLRequest::UseProtocolCachePolicy); 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsReload(params)) 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::RELOAD); 349890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else if (params.page_state.IsValid()) 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::HISTORY_LOAD); 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::NORMAL_LOAD); 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_referrer_policy(params.referrer.policy); 3504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_is_overriding_user_agent(params.is_overriding_user_agent); 3505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_must_reset_scroll_and_scale_state( 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_can_load_local_resources(params.can_load_local_resources); 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationState* RenderViewImpl::CreateNavigationStateFromPending() { 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_Navigate_Params& params = *pending_navigation_params_.get(); 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* navigation_state = NULL; 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A navigation resulting from loading a javascript URL should not be treated 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as a browser initiated event. Instead, we want it to look as if the page 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiated any load resulting from JS execution. 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params.url.SchemeIs(chrome::kJavaScriptScheme)) { 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state = NavigationState::CreateBrowserInitiated( 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.page_id, 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.pending_history_list_offset, 3522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.should_clear_history_list, 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition); 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_transferred_request_child_id( 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_request_child_id); 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_transferred_request_request_id( 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_request_request_id); 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_allow_download(params.allow_download); 35292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_state->set_extra_headers(params.extra_headers); 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state = NavigationState::CreateContentInitiated(); 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return navigation_state; 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::ProcessViewLayoutFlags(const CommandLine& command_line) { 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enable_viewport = 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableViewport); 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enable_fixed_layout = 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableFixedLayout); 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->enableFixedLayoutMode(enable_fixed_layout || enable_viewport); 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If viewport tag is enabled, then the WebKit side will take care 35452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of setting the fixed layout size and page scale limits. 35462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enable_viewport) 35472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 35482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3549c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // When navigating to a new page, reset the page scale factor to be 1.0. 3550c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch webview()->setInitialPageScaleOverride(1.f); 3551c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enable_fixed_layout) { 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string str = 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kEnableFixedLayout); 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> tokens; 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(str, ',', &tokens); 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tokens.size() == 2) { 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, height; 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::StringToInt(tokens[0], &width) && 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringToInt(tokens[1], &height)) 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setFixedLayoutSize(WebSize(width, height)); 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float maxPageScaleFactor = 3565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line.HasSwitch(switches::kEnablePinch) ? 4.f : 1.f ; 3566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->setPageScaleFactorLimits(1, maxPageScaleFactor); 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didStartProvisionalLoad(WebFrame* frame) { 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 35712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In fast/loader/stop-provisional-loads.html, we abort the load before this 35732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // callback is invoked. 35742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ds) 35752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 35762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We should only navigate to swappedout:// when is_swapped_out_ is true. 35802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK((ds->request().url() != GURL(kSwappedOutURL)) || 35812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_swapped_out_) << "Heard swappedout:// when not swapped out."; 35822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the request time if WebKit has better knowledge of it. 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_state->request_time().is_null()) { 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double event_time = ds->triggeringEventTime(); 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event_time != 0.0) 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_request_time(Time::FromDoubleT(event_time)); 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start time is only set after request time. 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_start_load_time(Time::Now()); 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_top_most = !frame->parent(); 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_top_most) { 35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_gesture_ = WebUserGestureIndicator::isProcessingUserGesture() ? 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationGestureUser : NavigationGestureAuto; 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the navigation is not triggered by a user gesture, e.g. by some ajax 3599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // callback, then inherit the submitted password form from the previous 3600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // state. This fixes the no password save issue for ajax login, tracked in 3601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // [http://crbug/43219]. Note that there are still some sites that this 3602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fails for because they use some element other than a submit button to 3603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // trigger submission. 3604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (navigation_gesture_ == NavigationGestureAuto) { 3605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DocumentState* old_document_state = DocumentState::FromDataSource( 3606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->dataSource()); 3607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::PasswordForm* old_password_form = 3608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) old_document_state->password_form_data(); 3609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (old_password_form) { 3610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) document_state->set_password_form_data( 3611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make_scoped_ptr(new content::PasswordForm(*old_password_form))); 3612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (frame->parent()->isLoading()) { 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Take note of AUTO_SUBFRAME loads here, so that we can know how to 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // load an error page. See didFailProvisionalLoad. 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->navigation_state()->set_transition_type( 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_AUTO_SUBFRAME); 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidStartProvisionalLoad(frame)); 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidStartProvisionalLoadForFrame( 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, frame->identifier(), 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->parent() ? frame->parent()->identifier() : -1, 36272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_top_most, ds->request().url())); 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didReceiveServerRedirectForProvisionalLoad( 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame) { 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->parent()) 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Received a redirect on the main frame. 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* data_source = frame->provisionalDataSource(); 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data_source) { 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should only be invoked when we have a data source. 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> redirects; 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRedirectChain(data_source, &redirects); 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (redirects.size() >= 2) { 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidRedirectProvisionalLoad(routing_id_, page_id_, 36452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) redirects[redirects.size() - 2], redirects.back())); 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFailProvisionalLoad(WebFrame* frame, 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLError& error) { 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the browser that we failed a provisional load with an error. 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: It is important this notification occur before DidStopLoading so the 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SSL manager can react to the provisional load failure before being 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notified the load stopped. 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ds); 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& failed_request = ds->request(); 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidFailProvisionalLoad(frame, error)); 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool show_repost_interstitial = 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (error.reason == net::ERR_CACHE_MISS && 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EqualsASCII(failed_request.httpMethod(), "POST")); 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_DidFailProvisionalLoadWithError_Params params; 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.frame_id = frame->identifier(); 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.is_main_frame = !frame->parent(); 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.error_code = error.reason; 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->renderer()->GetNavigationErrorStrings( 3674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame, 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_request, 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error, 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ¶ms.error_description); 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.url = error.unreachableURL; 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.showing_repost_interstitial = show_repost_interstitial; 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidFailProvisionalLoadWithError( 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, params)); 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't display an error page if this is simply a cancelled load. Aside 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from being dumb, WebCore doesn't expect it and it will cause a crash. 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error.reason == net::ERR_ABORTED) 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (RenderThreadImpl::current()->layout_test_mode()) 36902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 36912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we never show errors in view source mode. 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->enableViewSourceMode(false); 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a failed back/forward/reload navigation, then we need to do a 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 'replace' load. This is necessary to avoid messing up session history. 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, we do a normal load, which simulates a 'go' navigation as far 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as session history is concerned. 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AUTO_SUBFRAME loads should always be treated as loads that do not advance 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page id. 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool replace = 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->pending_page_id() != -1 || 37087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PageTransitionCoreTypeIs(navigation_state->transition_type(), 37097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PAGE_TRANSITION_AUTO_SUBFRAME); 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we failed on a browser initiated request, then make sure that our error 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page load is regarded as the same browser initiated request. 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!navigation_state->is_content_initiated()) { 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_.reset(new ViewMsg_Navigate_Params); 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_->page_id = 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->pending_page_id(); 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_->pending_history_list_offset = 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->pending_history_list_offset(); 3719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pending_navigation_params_->should_clear_history_list = 3720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_state->history_list_was_cleared(); 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_->transition = 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->transition_type(); 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_->request_time = 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->request_time(); 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provide the user with a more helpful error page? 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (MaybeLoadAlternateErrorPage(frame, error, replace)) 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fallback to a local error page. 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNavigationErrorPage(frame, failed_request, error, std::string(), replace); 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCommitProvisionalLoad(WebFrame* frame, 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_new_navigation) { 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::FromDataSource(frame->dataSource()); 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 3740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 3741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_state->commit_load_time().is_null()) 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_commit_load_time(Time::Now()); 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (internal_data->must_reset_scroll_and_scale_state()) { 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->resetScrollAndScaleState(); 3748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_must_reset_scroll_and_scale_state(false); 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3750ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch internal_data->set_use_error_page(false); 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_new_navigation) { 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we perform a new navigation, we need to update the last committed 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session history entry with state for the page we are leaving. 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSessionHistory(frame); 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We bump our Page ID to correspond with the new session history entry. 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_ = next_page_id_++; 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't update history_page_ids_ (etc) for kSwappedOutURL, since 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we don't want to forget the entry that was there, and since we will 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // never come back to kSwappedOutURL. Note that we have to call 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateSessionHistory and update page_id_ even in this case, so that 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the current entry gets a state update and so that we don't send a 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state update to the wrong entry when we swap back in. 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetLoadingUrl(frame) != GURL(kSwappedOutURL)) { 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Advance our offset in session history, applying the length limit. 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is now no forward history. 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_++; 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_list_offset_ >= kMaxSessionHistoryEntries) 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ = kMaxSessionHistoryEntries - 1; 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_length_ = history_list_offset_ + 1; 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_.resize(history_list_length_, -1); 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_[history_list_offset_] = page_id_; 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inspect the navigation_state on this frame to see if the navigation 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // corresponds to a session history navigation... Note: |frame| may or 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may not be the toplevel frame, but for the case of capturing session 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history, the first committed frame suffices. We keep track of whether 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we've seen this commit before so that only capture session history once 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per navigation. 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we need to check if the page ID changed. In the case of a 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reload, the page ID doesn't change, and UpdateSessionHistory gets the 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous URL and the current page ID, which would be wrong. 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (navigation_state->pending_page_id() != -1 && 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->pending_page_id() != page_id_ && 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !navigation_state->request_committed()) { 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a successful session history navigation! 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSessionHistory(frame); 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_ = navigation_state->pending_page_id(); 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ = navigation_state->pending_history_list_offset(); 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the history list is valid, our list of page IDs should be correct. 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(history_list_length_ <= 0 || 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ < 0 || 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ >= history_list_length_ || 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_[history_list_offset_] == page_id_); 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCommitProvisionalLoad(frame, is_new_navigation)); 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remember that we've already processed this request, so we don't update 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the session history again. We do this regardless of whether this is 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a session history navigation, because if we attempted a session history 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation without valid HistoryItem state, WebCore will think it is a 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new navigation. 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_request_committed(true); 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateURL(frame); 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we have new encoding name. 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->parent()) { // Only for top frames. 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_thread_impl) { // Can be NULL in tests. 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_impl->histogram_customizer()-> 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewNavigatedToHost(GURL(GetLoadingUrl(frame)).host(), 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_view_map.Get().size()); 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didClearWindowObject(WebFrame* frame) { 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidClearWindowObject(frame)); 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enabled_bindings_ & BINDINGS_POLICY_DOM_AUTOMATION) { 3834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!dom_automation_controller_) 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dom_automation_controller_.reset(new DomAutomationController()); 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dom_automation_controller_->set_message_sender( 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderView*>(this)); 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dom_automation_controller_->set_routing_id(routing_id()); 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dom_automation_controller_->BindToJavascript(frame, 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "domAutomationController"); 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3842868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (enabled_bindings_ & BINDINGS_POLICY_STATS_COLLECTION) { 3844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!stats_collection_controller_.get()) 3845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stats_collection_controller_.reset(new StatsCollectionController()); 3846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stats_collection_controller_->set_message_sender( 3847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<RenderView*>(this)); 3848868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stats_collection_controller_->BindToJavascript(frame, 3849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "statsCollectionController"); 3850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCreateDocumentElement(WebFrame* frame) { 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCreateDocumentElement(frame)); 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didReceiveTitle(WebFrame* frame, const WebString& title, 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTextDirection direction) { 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTitle(frame, title, direction); 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also check whether we have new encoding name. 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::didChangeIcon(WebFrame* frame, 3867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebIconURL::Type icon_type) { 3868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (frame->parent()) 3869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!TouchEnabled() && icon_type != WebIconURL::TypeFavicon) 3872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type); 3875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<FaviconURL> urls; 3876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < icon_urls.size(); i++) { 3877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) urls.push_back(FaviconURL(icon_urls[i].iconURL(), 3878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToFaviconType(icon_urls[i].iconType()))); 3879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendUpdateFaviconURL(urls); 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFinishDocumentLoad(WebFrame* frame) { 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_finish_document_load_time(Time::Now()); 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DocumentLoadedInFrame(routing_id_, frame->identifier())); 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishDocumentLoad(frame)); 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we have new encoding name. 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didHandleOnloadEvents(WebFrame* frame) { 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame() == frame) { 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DocumentOnLoadCompletedInMainFrame(routing_id_, 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_)); 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFailLoad(WebFrame* frame, const WebURLError& error) { 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ds); 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFailLoad(frame, error)); 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& failed_request = ds->request(); 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 error_description; 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->renderer()->GetNavigationErrorStrings( 3914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame, 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_request, 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error, 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_description); 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidFailLoadWithError(routing_id_, 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->identifier(), 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_request.url(), 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !frame->parent(), 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.reason, 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_description)); 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFinishLoad(WebFrame* frame) { 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 39307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (document_state->finish_load_time().is_null()) { 39317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!frame->parent()) { 39327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TRACE_EVENT_INSTANT0("WebCore", "LoadFinished", 39337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TRACE_EVENT_SCOPE_PROCESS); 39347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_finish_load_time(Time::Now()); 39367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame)); 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidFinishLoad(routing_id_, 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->identifier(), 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ds->request().url(), 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !frame->parent())); 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didNavigateWithinPage( 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, bool is_new_navigation) { 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this was a reference fragment navigation that we initiated, then we 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could end up having a non-null pending navigation params. We just need to 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update the ExtraData on the datasource so that others who read the 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtraData will get the new NavigationState. Similarly, if we did not 39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiate this navigation, then we need to take care to reset any pre- 39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // existing navigation state to a content-initiated navigation state. 39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DidCreateDataSource conveniently takes care of this for us. 39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didCreateDataSource(frame, frame->dataSource()); 39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = 39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::FromDataSource(frame->dataSource()); 39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* new_state = document_state->navigation_state(); 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_state->set_was_within_same_page(true); 39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didCommitProvisionalLoad(frame, is_new_navigation); 39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* datasource = frame->view()->mainFrame()->dataSource(); 39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTitle(frame, datasource->pageTitle(), datasource->pageTitleDirection()); 39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didUpdateCurrentHistoryItem(WebFrame* frame) { 39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartNavStateSyncTimerIfNecessary(); 39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willSendRequest(WebFrame* frame, 39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned identifier, 39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLRequest& request, 39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLResponse& redirect_response) { 3976bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didReceiveResponse( 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, unsigned identifier, const WebURLResponse& response) { 3981bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFinishResourceLoad( 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, unsigned identifier) { 3986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 3987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDataSource(frame->dataSource()); 3988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!internal_data->use_error_page()) 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not show error page when DevTools is attached. 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (devtools_agent_->IsAttached()) 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Display error page, if appropriate. 3996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int http_status_code = internal_data->http_status_code(); 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (http_status_code == 404) { 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On 404s, try a remote search page as a fallback. 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& document_url = frame->document().url(); 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& error_page_url = 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAlternateErrorPageURL(document_url, HTTP_404); 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_page_url.is_valid()) { 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLError original_error; 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_error.domain = "http"; 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_error.reason = 404; 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_error.unreachableURL = document_url; 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_alt_error_page_fetcher( 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new AltErrorPageResourceFetcher( 4011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_page_url, frame, frame->dataSource()->request(), 4012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_error, 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RenderViewImpl::AltErrorPageFinished, 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)))); 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_domain; 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetContentClient()->renderer()->HasErrorPage( 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_status_code, &error_domain)) { 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLError error; 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.unreachableURL = frame->document().url(); 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.domain = WebString::fromUTF8(error_domain); 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.reason = http_status_code; 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNavigationErrorPage( 40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame, frame->dataSource()->request(), error, std::string(), true); 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didLoadResourceFromMemoryCache( 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebURLRequest& request, 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLResponse& response) { 4035bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didDisplayInsecureContent(WebFrame* frame) { 4039bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didRunInsecureContent( 40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebSecurityOrigin& origin, const WebURL& target) { 4044bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didExhaustMemoryAvailableForScript(WebFrame* frame) { 4048bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCreateScriptContext(WebFrame* frame, 40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Context> context, 40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int extension_group, 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int world_id) { 4055bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willReleaseScriptContext(WebFrame* frame, 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Context> context, 40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int world_id) { 4061bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::CheckPreferredSize() { 40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't always want to send the change messages over IPC, only if we've 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been put in that mode by getting a |ViewMsg_EnablePreferredSizeChangedMode| 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message. 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!send_preferred_size_changes_ || !webview()) 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4071868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::Size size = webview()->contentsPreferredMinimumSize(); 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 407358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // In the presence of zoom, these sizes are still reported as if unzoomed, 407458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // so we need to adjust. 407558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch double zoom_factor = ZoomLevelToZoomFactor(webview()->zoomLevel()); 407658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch size.set_width(static_cast<int>(size.width() * zoom_factor)); 407758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch size.set_height(static_cast<int>(size.height() * zoom_factor)); 407858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size == preferred_size_) 40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_ = size; 40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidContentsPreferredSizeChange(routing_id_, 40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_)); 40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BrowserPluginManager* RenderViewImpl::GetBrowserPluginManager() { 4088868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!browser_plugin_manager_.get()) 40892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager_ = BrowserPluginManager::Create(this); 4090868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return browser_plugin_manager_.get(); 40912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 40922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderViewImpl::EnsureMediaStreamClient() { 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!RenderThreadImpl::current()) // Will be NULL during unit tests. 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 40982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableWebRTC)) 40992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 41002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 41012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!media_stream_dispatcher_) 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_dispatcher_ = new MediaStreamDispatcher(this); 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!media_stream_client_) { 41077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaStreamImpl* media_stream_impl = new MediaStreamImpl( 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_dispatcher_, 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->GetMediaStreamDependencyFactory()); 41117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_stream_client_ = media_stream_impl; 41127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch web_user_media_client_ = media_stream_impl; 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didChangeContentsSize(WebFrame* frame, 41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebSize& size) { 41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame() != frame) 41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* frameView = frame->view(); 41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frameView) 41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_horizontal_scrollbar = frame->hasHorizontalScrollbar(); 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_vertical_scrollbar = frame->hasVerticalScrollbar(); 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_horizontal_scrollbar != cached_has_main_frame_horizontal_scrollbar_ || 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_vertical_scrollbar != cached_has_main_frame_vertical_scrollbar_) { 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidChangeScrollbarsForMainFrame( 41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, has_horizontal_scrollbar, has_vertical_scrollbar)); 41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_has_main_frame_horizontal_scrollbar_ = has_horizontal_scrollbar; 41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_has_main_frame_vertical_scrollbar_ = has_vertical_scrollbar; 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateScrollState(WebFrame* frame) { 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize offset = frame->scrollOffset(); 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize minimum_offset = frame->minimumScrollOffset(); 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize maximum_offset = frame->maximumScrollOffset(); 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_pinned_to_left = offset.width <= minimum_offset.width; 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_pinned_to_right = offset.width >= maximum_offset.width; 41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_pinned_to_left != cached_is_main_frame_pinned_to_left_ || 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_pinned_to_right != cached_is_main_frame_pinned_to_right_) { 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidChangeScrollOffsetPinningForMainFrame( 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, is_pinned_to_left, is_pinned_to_right)); 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_is_main_frame_pinned_to_left_ = is_pinned_to_left; 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_is_main_frame_pinned_to_right_ = is_pinned_to_right; 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_DidChangeScrollOffset(routing_id_)); 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didChangeScrollOffset(WebFrame* frame) { 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartNavStateSyncTimerIfNecessary(); 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame() == frame) 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateScrollState(frame); 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidChangeScrollOffset(frame)); 41662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::willInsertBody(WebKit::WebFrame* frame) { 4169bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFirstVisuallyNonEmptyLayout(WebFrame* frame) { 41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame != webview()->mainFrame()) 41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* data = 4177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDataSource(frame->dataSource()); 4178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data->set_did_first_visually_non_empty_layout(true); 4179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update body background color if necessary. 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor bg_color = webwidget_->backgroundColor(); 41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If not initialized, default to white. Note that 0 is different from black 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as black still has alpha 0xFF. 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bg_color) 41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bg_color = SK_ColorWHITE; 41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bg_color != body_background_color_) { 41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) body_background_color_ = bg_color; 4191bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Send(new ViewHostMsg_DidChangeBodyBackgroundColor( 4192bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GetRoutingID(), bg_color)); 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SendFindReply(int request_id, 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int match_count, 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ordinal, 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& selection_rect, 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_status_update) { 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_Find_Reply(routing_id_, 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_count, 42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_rect, 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ordinal, 42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status_update)); 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 42112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::ShouldUpdateSelectionTextFromContextMenuParams( 42122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& selection_text, 42132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t selection_text_offset, 42142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::Range& selection_range, 42152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ContextMenuParams& params) { 42162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 trimmed_selection_text; 42172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!selection_text.empty() && !selection_range.is_empty()) { 42182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int start = selection_range.GetMin() - selection_text_offset; 42192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t length = selection_range.length(); 42202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (start >= 0 && start + length <= selection_text.length()) { 42212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(selection_text.substr(start, length), TRIM_ALL, 42222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &trimmed_selection_text); 42232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 42242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 42252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 trimmed_params_text; 42262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(params.selection_text, TRIM_ALL, &trimmed_params_text); 42272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return trimmed_params_text != trimmed_selection_text; 42282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 42292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::reportFindInPageMatchCount(int request_id, 42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count, 42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 4233bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::reportFindInPageSelection(int request_id, 42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& selection_rect) { 4239bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::openFileSystem( 42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 42442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebFileSystemType type, 42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long long size, 42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool create, 42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileSystemCallbacks* callbacks) { 4248bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::deleteFileSystem( 42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 42532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebFileSystemType type , 42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileSystemCallbacks* callbacks) { 4255bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::requestStorageQuota( 42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebStorageQuotaType type, 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long requested_size, 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebStorageQuotaCallbacks* callbacks) { 4263bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::willCheckAndDispatchMessageEvent( 42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* sourceFrame, 42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* targetFrame, 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebSecurityOrigin target_origin, 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebDOMMessageEvent event) { 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_swapped_out_) 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params params; 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.data = event.data().toString(); 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.source_origin = event.origin(); 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target_origin.isNull()) 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.target_origin = target_origin.toString(); 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Include the routing ID for the source frame, which the browser process 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will translate into the routing ID for the equivalent frame in the target 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process. 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.source_routing_id = MSG_ROUTING_NONE; 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* source_view = FromWebView(sourceFrame->view()); 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_view) 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.source_routing_id = source_view->routing_id(); 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_RouteMessageEvent(routing_id_, params)); 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willOpenSocketStream( 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSocketStreamHandle* handle) { 4294bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willStartUsingPeerConnectionHandler( 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, WebKit::WebRTCPeerConnectionHandler* handler) { 4299bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)WebKit::WebString RenderViewImpl::acceptLanguages() { 43037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return WebString::fromUTF8(renderer_preferences_.accept_languages); 43047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 43057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString RenderViewImpl::userAgentOverride( 43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebURL& url) { 4309bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 4310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebString(); 4311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 4312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebString RenderViewImpl::doNotTrackValue(WebFrame* frame) { 4314bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 4315bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return WebKit::WebString(); 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::allowWebGL(WebFrame* frame, bool default_value) { 4319bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 4320bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return false; 43212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 43222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didLoseWebGLContext( 43242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebFrame* frame, 43252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int arb_robustness_status_code) { 4326bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 43272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 43282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit::WebPageSerializerClient implementation ------------------------------ 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didSerializeDataForFrame( 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURL& frame_url, 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebCString& data, 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPageSerializerClient::PageSerializationStatus status) { 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_SendSerializedHtmlData( 43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id(), 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url, 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.data(), 43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int32>(status))); 43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderView implementation --------------------------------------------------- 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::Send(IPC::Message* message) { 43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RenderWidget::Send(message); 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::GetRoutingID() const { 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return routing_id_; 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::GetPageId() const { 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_id_; 43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size RenderViewImpl::GetSize() const { 43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size(); 43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences& RenderViewImpl::GetWebkitPreferences() { 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_preferences_; 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::SetWebkitPreferences(const WebPreferences& preferences) { 43652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnUpdateWebPreferences(preferences); 43662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 43672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebView* RenderViewImpl::GetWebView() { 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webview(); 43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNode RenderViewImpl::GetFocusedNode() const { 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebNode(); 43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* focused_frame = webview()->focusedFrame(); 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focused_frame) { 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument doc = focused_frame->document(); 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!doc.isNull()) 43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return doc.focusedNode(); 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebNode(); 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNode RenderViewImpl::GetContextMenuNode() const { 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return context_menu_node_; 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::IsEditableNode(const WebNode& node) const { 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node.isNull()) 43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node.isContentEditable()) 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node.isElementNode()) { 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebElement& element = node.toConst<WebElement>(); 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (element.isTextFormControlElement()) 43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also return true if it has an ARIA role of 'textbox'. 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < element.attributeCount(); ++i) { 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LowerCaseEqualsASCII(element.attributeLocalName(i), "role")) { 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LowerCaseEqualsASCII(element.attributeValue(i), "textbox")) 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebPlugin* RenderViewImpl::CreatePlugin( 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, 4416ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const WebPluginInfo& info, 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebPluginParams& params) { 44183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 44193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool pepper_plugin_was_registered = false; 44203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<PluginModule> pepper_module(PluginModule::Create( 44213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch this, info, &pepper_plugin_was_registered)); 44223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (pepper_plugin_was_registered) { 44233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (pepper_module.get()) 44243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return new PepperWebPluginImpl(pepper_module.get(), params, AsWeakPtr()); 44253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 44262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4427ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return new WebPluginImpl(frame, params, info.path, AsWeakPtr()); 44283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#else 44293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return NULL; 44303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::EvaluateScript(const string16& frame_xpath, 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& jscript, 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_result) { 44372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v8::HandleScope handle_scope; 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Value> result; 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetChildFrame(frame_xpath); 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_frame) 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = web_frame->executeScriptAndReturnValue(WebScriptSource(jscript)); 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (notify_result) { 44432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue list; 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.IsEmpty() && web_frame) { 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Local<v8::Context> context = web_frame->mainWorldScriptContext(); 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Context::Scope context_scope(context); 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V8ValueConverterImpl converter; 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter.SetDateAllowed(true); 44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter.SetRegExpAllowed(true); 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* result_value = converter.FromV8Value(result, context); 44512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list.Set(0, result_value ? result_value : base::Value::CreateNullValue()); 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 44532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list.Set(0, base::Value::CreateNullValue()); 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ScriptEvalResponse(routing_id_, id, list)); 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::ShouldDisplayScrollbars(int width, int height) const { 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (!send_preferred_size_changes_ || 44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (disable_scrollbars_size_limit_.width() <= width || 44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disable_scrollbars_size_limit_.height() <= height)); 44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::GetEnabledBindings() const { 44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enabled_bindings_; 44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::GetContentStateImmediately() const { 44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return send_content_state_immediately_; 44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float RenderViewImpl::GetFilteredTimePerFrame() const { 44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return filtered_time_per_frame(); 44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::ShowContextMenu(ContextMenuClient* client, 44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ContextMenuParams& params) { 44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(client); // A null client means "internal" when we issue callbacks. 44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMenuParams our_params(params); 44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) our_params.custom_context.request_id = pending_context_menus_.Add(client); 44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ContextMenu(routing_id_, our_params)); 44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return our_params.custom_context.request_id; 44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::CancelContextMenu(int request_id) { 44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(pending_context_menus_.Lookup(request_id)); 44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_context_menus_.Remove(request_id); 44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const { 44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return visibilityState(); 44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::RunModalAlertDialog(WebKit::WebFrame* frame, 44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebString& message) { 44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runModalAlertDialog(frame, message); 44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::LoadURLExternally( 45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, 45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebURLRequest& request, 45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebNavigationPolicy policy) { 4504bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch main_render_frame_->loadURLExternally(frame, request, policy); 45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4507ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderViewImpl::DidStartLoading() { 45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didStartLoading(); 45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4511ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderViewImpl::DidStopLoading() { 45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didStopLoading(); 45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidPlay(WebKit::WebMediaPlayer* player) { 45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_MediaNotification(routing_id_, 45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<int64>(player), 45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->hasVideo(), 45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->hasAudio(), 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidPause(WebKit::WebMediaPlayer* player) { 45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_MediaNotification(routing_id_, 45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<int64>(player), 45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->hasVideo(), 45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->hasAudio(), 45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::PlayerGone(WebKit::WebMediaPlayer* player) { 45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidPause(player); 45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SyncNavigationState() { 45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebHistoryItem& item = webview()->mainFrame()->currentHistoryItem(); 45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendUpdateState(item); 45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SyncSelectionIfRequired() { 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->focusedFrame(); 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 text; 45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t offset; 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Range range; 45513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 45523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 45533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->GetSurroundingText(&text, &range); 45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = 0; // Pepper API does not support offset reporting. 45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba): cut as needed. 45563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else 45573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 45583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch { 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t location, length; 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()->caretOrSelectionRange(&location, &length)) 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range = ui::Range(location, location + length); 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (webview()->textInputInfo().type != WebKit::WebTextInputTypeNone) { 45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If current focused element is editable, we will send 100 more chars 45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before and after selection. It is for input method surrounding text 45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // feature. 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location > kExtraCharsBeforeAndAfterSelection) 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = location - kExtraCharsBeforeAndAfterSelection; 45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = 0; 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length = location + length - offset + kExtraCharsBeforeAndAfterSelection; 45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRange webrange = WebRange::fromDocumentRange(frame, offset, length); 45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webrange.isNull()) 45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = WebRange::fromDocumentRange(frame, offset, length).toPlainText(); 45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = location; 45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = frame->selectionAsText(); 45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/101435 45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In some case, frame->selectionAsText() returned text's length is not 45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equal to the length returned from webview()->caretOrSelectionRange(). 45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // So we have to set the range according to text.length(). 45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range.set_end(range.start() + text.length()); 45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sometimes we get repeated didChangeSelection calls from webkit when 45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the selection hasn't actually changed. We don't want to report these 45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because it will cause us to continually claim the X clipboard. 45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_text_offset_ != offset || 45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_range_ != range || 45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_ != text) { 45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_ = text; 45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_offset_ = offset; 45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_range_ = range; 45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_SelectionChanged(routing_id_, text, offset, range)); 45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateSelectionBounds(); 46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL RenderViewImpl::GetAlternateErrorPageURL(const GURL& failed_url, 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorPageType error_type) { 46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (failed_url.SchemeIsSecure()) { 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL that failed was secure, then the embedding web page was not 46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expecting a network attacker to be able to manipulate its contents. As 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we fetch alternate error pages over HTTP, we would be allowing a network 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attacker to manipulate the contents of the response if we tried to use 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the link doctor here. 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(); 46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Grab the base URL from the browser process. 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!alternate_error_page_url_.is_valid()) 46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(); 46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Strip query params from the failed URL. 46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL::Replacements remove_params; 46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_params.ClearUsername(); 46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_params.ClearPassword(); 46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_params.ClearQuery(); 46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_params.ClearRef(); 46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url_to_send = failed_url.ReplaceComponents(remove_params); 46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string spec_to_send = url_to_send.spec(); 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify link doctor of the url truncation by sending of "?" at the end. 46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (failed_url.has_query()) 46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spec_to_send.append("?"); 46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the query params to send to link doctor. 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string params(alternate_error_page_url_.query()); 46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("&url="); 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append(net::EscapeQueryParamValue(spec_to_send, true)); 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("&sourceid=chrome"); 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("&error="); 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (error_type) { 46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DNS_ERROR: 46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("dnserror"); 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case HTTP_404: 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("http404"); 46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CONNECTION_ERROR: 46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("connectionfailure"); 46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "unknown ErrorPageType"; 46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OK, build the final url to return. 46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL::Replacements link_doctor_params; 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_doctor_params.SetQueryStr(params); 46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = alternate_error_page_url_.ReplaceComponents(link_doctor_params); 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL RenderViewImpl::GetLoadingUrl(WebKit::WebFrame* frame) const { 46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ds->hasUnreachableURL()) 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ds->unreachableURL(); 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request = ds->request(); 46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return request.url(); 46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebPlugin* RenderViewImpl::GetWebPluginFromPluginDocument() { 46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webview()->mainFrame()->document().to<WebPluginDocument>().plugin(); 46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnFind(int request_id, 46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& search_text, 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebFindOptions& options) { 46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the plugin still exists in the document. 46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (main_frame->document().isPluginDocument() && 46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWebPluginFromPluginDocument()) { 46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (options.findNext) { 46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Just navigate back/forward. 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWebPluginFromPluginDocument()->selectFindResult(options.forward); 46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWebPluginFromPluginDocument()->startFind( 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_text, options.matchCase, request_id)) { 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send "no results". 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFindReply(request_id, 0, 0, gfx::Rect(), true); 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame_after_main = main_frame->traverseNext(true); 46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* focused_frame = webview()->focusedFrame(); 46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* search_frame = focused_frame; // start searching focused frame. 46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_frame = (frame_after_main != main_frame); 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have multiple frames, we don't want to wrap the search within the 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame, so we check here if we only have main_frame in the chain. 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool wrap_within_frame = !multi_frame; 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRect selection_rect; 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = false; 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If something is selected when we start searching it means we cannot just 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // increment the current match ordinal; we need to re-generate it. 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRange current_selection = focused_frame->selectionRange(); 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = search_frame->find( 47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, search_text, options, wrap_within_frame, &selection_rect); 47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) { 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't leave text selected as you move to the next frame. 4716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_frame->executeCommand(WebString::fromUTF8("Unselect"), 4717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the next frame, but skip the invisible ones. 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What is the next frame to search? (we might be going backwards). Note 47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that we specify wrap=true so that search_frame never becomes NULL. 47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame = options.forward ? 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame->traverseNext(true) : 47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame->traversePrevious(true); 47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (!search_frame->hasVisibleContent() && 47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame != focused_frame); 47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure selection doesn't affect the search operation in new frame. 4730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_frame->executeCommand(WebString::fromUTF8("Unselect"), 4731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have multiple frames and we have wrapped back around to the 47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focused frame, we need to search it once more allowing wrap within 47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the frame, otherwise it will report 'no match' if the focused frame has 47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reported matches, but no frames after the focused_frame contain a 47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // match for the search word(s). 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (multi_frame && search_frame == focused_frame) { 47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = search_frame->find( 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, search_text, options, true, // Force wrapping. 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &selection_rect); 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setFocusedFrame(search_frame); 47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (!result && search_frame != focused_frame); 47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (options.findNext && current_selection.isNull()) { 47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the main_frame to report the actual count. 47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->increaseMatchCount(0, request_id); 47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If nothing is found, set result to "0 of 0", otherwise, set it to 47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "-1 of 1" to indicate that we found at least one item, but we don't know 47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // yet what is active. 47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ordinal = result ? -1 : 0; // -1 here means, we might know more later. 47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int match_count = result ? 1 : 0; // 1 here means possibly more coming. 47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we find no matches then this will be our last status update. 47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise the scoping effort will send more results. 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_status_update = !result; 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFindReply(request_id, match_count, ordinal, selection_rect, 47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status_update); 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scoping effort begins, starting with the mainframe. 47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame = main_frame; 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->resetMatchCount(); 47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel all old scoping requests before starting a new one. 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame->cancelPendingScopingEffort(); 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't start another scoping effort unless at least one match has 47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been found. 47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result) { 47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start new scoping request. If the scoping function determines that it 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needs to scope, it will defer until later. 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame->scopeStringMatches(request_id, 47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_text, 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options, 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); // reset the tickmarks 47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterate to the next frame. The frame will not necessarily scope, for 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // example if it is not visible. 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame = search_frame->traverseNext(true); 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (search_frame != main_frame); 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnStopFinding(StopFindAction action) { 47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* view = webview(); 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view) 47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument doc = view->mainFrame()->document(); 47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc.isPluginDocument() && GetWebPluginFromPluginDocument()) { 47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWebPluginFromPluginDocument()->stopFind(); 48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool clear_selection = action == STOP_FIND_ACTION_CLEAR_SELECTION; 4804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (clear_selection) { 4805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect"), 4806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 4807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = view->mainFrame(); 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (frame) { 48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->stopFinding(clear_selection); 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame = frame->traverseNext(false); 48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (action == STOP_FIND_ACTION_ACTIVATE_SELECTION) { 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* focused_frame = view->focusedFrame(); 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focused_frame) { 48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument doc = focused_frame->document(); 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!doc.isNull()) { 48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebNode node = doc.focusedNode(); 48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node.isNull()) 48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.simulateClick(); 48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnActivateNearestFindResult(int request_id, 48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float x, float y) { 48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRect selection_rect; 48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ordinal = main_frame->selectNearestFindMatch(WebFloatPoint(x, y), 48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &selection_rect); 48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ordinal == -1) { 48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Something went wrong, so send a no-op reply (force the main_frame to 48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // report the current match count) in case the host is waiting for a 48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response due to rate-limiting). 48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->increaseMatchCount(0, request_id); 48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFindReply(request_id, 48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1 /* number_of_matches */, 48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ordinal, 48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_rect, 48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* final_update */); 48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnFindMatchRects(int current_version) { 48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::RectF> match_rects; 48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rects_version = main_frame->findMatchMarkersVersion(); 48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_version != rects_version) { 48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFloatRect> web_match_rects; 48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->findMatchRects(web_match_rects); 48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_rects.reserve(web_match_rects.size()); 48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < web_match_rects.size(); ++i) 48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_rects.push_back(gfx::RectF(web_match_rects[i])); 48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::RectF active_rect = main_frame->activeFindMatchRect(); 48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_FindMatchRects_Reply(routing_id_, 48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rects_version, 48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_rects, 48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_rect)); 48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnZoom(PageZoom zoom) { 48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) // Not sure if this can happen, but no harm in being safe. 48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->hidePopups(); 48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double old_zoom_level = webview()->zoomLevel(); 48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double zoom_level; 48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (zoom == PAGE_ZOOM_RESET) { 48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = 0; 48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (static_cast<int>(old_zoom_level) == old_zoom_level) { 48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Previous zoom level is a whole number, so just increment/decrement. 48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = old_zoom_level + zoom; 48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Either the user hit the zoom factor limit and thus the zoom level is now 48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not a whole number, or a plugin changed it to a custom value. We want 48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to go to the next whole number so that the user can always get back to 48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 100% with the keyboard/menu. 48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((old_zoom_level > 1 && zoom > 0) || 48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (old_zoom_level < 1 && zoom < 0)) { 48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = static_cast<int>(old_zoom_level + zoom); 48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're going towards 100%, so first go to the next whole number. 49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = static_cast<int>(old_zoom_level); 49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, zoom_level); 49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomLevelChanged(); 49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnZoomFactor(PageZoom zoom, int zoom_center_x, 49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom_center_y) { 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZoomFactorHelper(zoom, zoom_center_x, zoom_center_y, 49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kScalingIncrementForGesture); 49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::ZoomFactorHelper(PageZoom zoom, 49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom_center_x, 49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom_center_y, 49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scaling_increment) { 49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) // Not sure if this can happen, but no harm in being safe. 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double old_page_scale_factor = webview()->pageScaleFactor(); 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double page_scale_factor; 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (zoom == PAGE_ZOOM_RESET) { 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_scale_factor = 1.0; 49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_scale_factor = old_page_scale_factor + 49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (zoom > 0 ? scaling_increment : -scaling_increment); 49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_scale_factor > 0) { 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setPageScaleFactor(page_scale_factor, 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPoint(zoom_center_x, zoom_center_y)); 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetZoomLevel(double zoom_level) { 49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->hidePopups(); 49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, zoom_level); 49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomLevelChanged(); 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetZoomLevelForLoadingURL(const GURL& url, 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double zoom_level) { 49422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID) 49432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Android, page zoom isn't used, and in case of WebView, text zoom is used 49442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for legacy WebView text scaling emulation. Thus, the code that resets 49452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the zoom level from this map will be effectively resetting text zoom level. 49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_zoom_levels_[url] = zoom_level; 49472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetPageEncoding(const std::string& encoding_name) { 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setPageEncoding(WebString::fromUTF8(encoding_name)); 49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnResetPageEncodingToDefault() { 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString no_encoding; 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setPageEncoding(no_encoding); 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebFrame* RenderViewImpl::GetChildFrame(const string16& xpath) const { 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xpath.empty()) 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webview()->mainFrame(); 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // xpath string can represent a frame deep down the tree (across multiple 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame DOMs). 49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Example, /html/body/table/tbody/tr/td/iframe\n/frameset/frame[0] 49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should break into 2 xpaths 49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // /html/body/table/tbody/tr/td/iframe & /frameset/frame[0] 49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> xpaths; 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(xpath, '\n', &xpaths); 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->mainFrame(); 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<string16>::const_iterator i = xpaths.begin(); 49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame && i != xpaths.end(); ++i) { 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame = frame->findChildByExpression(*i); 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame; 49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnScriptEvalRequest(const string16& frame_xpath, 49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& jscript, 49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_result) { 4984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_INSTANT0("test_tracing", "OnScriptEvalRequest", 4985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EvaluateScript(frame_xpath, jscript, id, notify_result); 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnPostMessageEvent( 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 4991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(nasko): Support sending to subframes. 49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->mainFrame(); 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the source frame if it exists. 49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* source_frame = NULL; 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.source_routing_id != MSG_ROUTING_NONE) { 49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* source_view = FromRoutingID(params.source_routing_id); 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_view) 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_frame = source_view->webview()->mainFrame(); 50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an event with the message. The final parameter to initMessageEvent 50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is the last event ID, which is not used with postMessage. 50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDOMEvent event = frame->document().createEvent("MessageEvent"); 50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDOMMessageEvent msg_event = event.to<WebDOMMessageEvent>(); 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_event.initMessageEvent("message", 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |canBubble| and |cancellable| are always false 50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, false, 50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSerializedScriptValue::fromString(params.data), 50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.source_origin, source_frame, ""); 50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must pass in the target_origin to do the security check on this side, 50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since it may have changed since the original postMessage call was made. 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSecurityOrigin target_origin; 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params.target_origin.empty()) { 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_origin = 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSecurityOrigin::createFromString(WebString(params.target_origin)); 50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->dispatchMessageEventWithOriginCheck(target_origin, msg_event); 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnCSSInsertRequest(const string16& frame_xpath, 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& css) { 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetChildFrame(frame_xpath); 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().insertUserStyleSheet( 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(css), 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument::UserStyleAuthorLevel); 50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnAllowBindings(int enabled_bindings_flags) { 50342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((enabled_bindings_flags & BINDINGS_POLICY_WEB_UI) && 50352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !(enabled_bindings_ & BINDINGS_POLICY_WEB_UI)) { 50362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderThread::Get()->RegisterExtension(WebUIExtension::Get()); 50372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new WebUIExtensionData(this); 50382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 50392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_bindings_ |= enabled_bindings_flags; 50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep track of the total bindings accumulated in this process. 50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcess::current()->AddBindings(enabled_bindings_flags); 50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5046eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderViewImpl::OnDragTargetDragEnter(const DropData& drop_data, 50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& client_point, 50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& screen_point, 50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperationsMask ops, 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key_modifiers) { 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperation operation = webview()->dragTargetDragEnter( 5052eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DropDataToWebDragData(drop_data), 50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_point, 50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_point, 50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ops, 50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_modifiers); 50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new DragHostMsg_UpdateDragCursor(routing_id_, operation)); 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragTargetDragOver(const gfx::Point& client_point, 50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& screen_point, 50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperationsMask ops, 50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key_modifiers) { 50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperation operation = webview()->dragTargetDragOver( 50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_point, 50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_point, 50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ops, 50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_modifiers); 50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new DragHostMsg_UpdateDragCursor(routing_id_, operation)); 50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragTargetDragLeave() { 50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragTargetDragLeave(); 50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragTargetDrop(const gfx::Point& client_point, 50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& screen_point, 50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key_modifiers) { 50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragTargetDrop(client_point, screen_point, key_modifiers); 50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new DragHostMsg_TargetDrop_ACK(routing_id_)); 50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragSourceEndedOrMoved(const gfx::Point& client_point, 50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& screen_point, 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ended, 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperation op) { 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ended) { 50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragSourceEndedAt(client_point, screen_point, op); 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragSourceMovedTo(client_point, screen_point, op); 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragSourceSystemDragEnded() { 50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragSourceSystemDragEnded(); 50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnUpdateWebPreferences(const WebPreferences& prefs) { 51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_preferences_ = prefs; 5103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webkit_glue::ApplyWebPreferences(webkit_preferences_, webview()); 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnUpdateTimezone() { 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyTimezoneChange(webview()->mainFrame()); 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetAltErrorPageURL(const GURL& url) { 51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alternate_error_page_url_ = url; 51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnCustomContextMenuAction( 51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CustomContextMenuContext& custom_context, 51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned action) { 51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_context.request_id) { 51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External context menu request, look in our map. 51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMenuClient* client = 51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_context_menus_.Lookup(custom_context.request_id); 51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client) 51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->OnMenuAction(custom_context.request_id, action); 51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal request, forward to WebKit. 51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->performCustomContextMenuAction(action); 51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnEnumerateDirectoryResponse( 51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 51322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>& paths) { 51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!enumeration_completions_[id]) 51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebString> ws_file_names(paths.size()); 51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < paths.size(); ++i) 5138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ws_file_names[i] = paths[i].AsUTF16Unsafe(); 51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enumeration_completions_[id]->didChooseFile(ws_file_names); 51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enumeration_completions_.erase(id); 51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnFileChooserResponse( 51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::SelectedFileInfo>& files) { 51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This could happen if we navigated to a different page before the user 51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closed the chooser. 51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.empty()) 51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert Chrome's SelectedFileInfo list to WebKit's. 51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFileChooserCompletion::SelectedFileInfo> selected_files( 51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) files.size()); 51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < files.size(); ++i) { 51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion::SelectedFileInfo selected_file; 5156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch selected_file.path = files[i].local_path.AsUTF16Unsafe(); 5157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch selected_file.displayName = 5158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath(files[i].display_name).AsUTF16Unsafe(); 51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_files[i] = selected_file; 51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.front()->completion) 51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.front()->completion->didChooseFile( 51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_files); 51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.pop_front(); 51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there are more pending file chooser requests, schedule one now. 51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_chooser_completions_.empty()) { 51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_RunFileChooser(routing_id_, 51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.front()->params)); 51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnEnableAutoResize(const gfx::Size& min_size, 51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& max_size) { 51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(disable_scrollbars_size_limit_.IsEmpty()); 51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 51792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_resize_mode_ = true; 51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->enableAutoResizeMode(min_size, max_size); 51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDisableAutoResize(const gfx::Size& new_size) { 51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(disable_scrollbars_size_limit_.IsEmpty()); 51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 51872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_resize_mode_ = false; 51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->disableAutoResizeMode(); 51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 519090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!new_size.IsEmpty()) { 519190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Resize(new_size, 519290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) physical_backing_size_, 519390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) overdraw_bottom_height_, 519490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resizer_rect_, 519590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_fullscreen_, 519690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NO_RESIZE_ACK); 519790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnEnablePreferredSizeChangedMode() { 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_preferred_size_changes_) 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_preferred_size_changes_ = true; 52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start off with an initial preferred size notification (in case 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |didUpdateLayout| was already called). 52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didUpdateLayout(); 52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDisableScrollbarsForSmallWindows( 52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& disable_scrollbar_size_limit) { 52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disable_scrollbars_size_limit_ = disable_scrollbar_size_limit; 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetRendererPrefs( 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RendererPreferences& renderer_prefs) { 52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double old_zoom_level = renderer_preferences_.default_zoom_level; 52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_ = renderer_prefs; 52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateFontRenderingFromRendererPrefs(); 52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_DEFAULT_RENDER_THEME) || defined(TOOLKIT_GTK) 52222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (renderer_prefs.use_custom_colors) { 52232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebColorName name = WebKit::WebColorWebkitFocusRingColor; 52242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::setNamedColors(&name, &renderer_prefs.focus_ring_color, 1); 52252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::setCaretBlinkInterval(renderer_prefs.caret_blink_interval); 52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 52272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::instance()->SetScrollbarColors( 52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_prefs.thumb_inactive_color, 52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_prefs.thumb_active_color, 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_prefs.track_color); 52312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(TOOLKIT_GTK) 52322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webview()) { 52342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(TOOLKIT_GTK) 52352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->setScrollbarColors( 52362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.thumb_inactive_color, 52372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.thumb_active_color, 52382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.track_color); 52392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(TOOLKIT_GTK) 52402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->setSelectionColors( 52412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.active_selection_bg_color, 52422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.active_selection_fg_color, 52432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.inactive_selection_bg_color, 52442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.inactive_selection_fg_color); 52452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->themeChanged(); 52462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(USE_DEFAULT_RENDER_THEME) || defined(TOOLKIT_GTK) 52492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (RenderThreadImpl::current()) // Will be NULL during unit tests. 52512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderThreadImpl::current()->SetFlingCurveParameters( 52522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.touchpad_fling_profile, 52532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.touchscreen_fling_profile); 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the zoom level for this page matches the old zoom default, and this 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not a plugin, update the zoom level to match the new default. 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview() && !webview()->mainFrame()->document().isPluginDocument() && 52582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !ZoomValuesEqual(old_zoom_level, 52592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_preferences_.default_zoom_level) && 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZoomValuesEqual(webview()->zoomLevel(), old_zoom_level)) { 52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, renderer_preferences_.default_zoom_level); 52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomLevelChanged(); 52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnMediaPlayerActionAt(const gfx::Point& location, 52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMediaPlayerAction& action) { 52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->performMediaPlayerAction(action, location); 52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnOrientationChangeEvent(int orientation) { 52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->sendOrientationChangeEvent(orientation); 52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnPluginActionAt(const gfx::Point& location, 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPluginAction& action) { 52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->performPluginAction(action, location); 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnGetAllSavableResourceLinksForCurrentPage( 52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url) { 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare list to storage all savable resource links. 52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> resources_list; 52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> referrer_urls_list; 52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebKit::WebReferrerPolicy> referrer_policies_list; 52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> frames_list; 528990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SavableResourcesResult result(&resources_list, 529090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &referrer_urls_list, 529190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &referrer_policies_list, 529290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &frames_list); 52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // webkit/ doesn't know about Referrer. 529590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!GetAllSavableResourceLinksForCurrentPage( 52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview(), 52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_url, 52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result, 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const char**>(GetSavableSchemes()))) { 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If something is wrong when collecting all savable resource links, 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send empty list to embedder(browser) to tell it failed. 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer_urls_list.clear(); 53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer_policies_list.clear(); 53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_list.clear(); 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_list.clear(); 53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Referrer> referrers_list; 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(referrer_urls_list.size(), referrer_policies_list.size()); 53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < referrer_urls_list.size(); ++i) { 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrers_list.push_back( 53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(referrer_urls_list[i], referrer_policies_list[i])); 53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send result of all savable resource links to embedder. 53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_SendCurrentPageAllSavableResourceLinks(routing_id(), 53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_list, 53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrers_list, 53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_list)); 53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnGetSerializedHtmlDataForCurrentPageWithLocalLinks( 53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& links, 53242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>& local_paths, 53252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& local_directory_name) { 53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert std::vector of GURLs to WebVector<WebURL> 53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebURL> weburl_links(links); 53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Convert std::vector of base::FilePath to WebVector<WebString> 53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebString> webstring_paths(local_paths.size()); 53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < local_paths.size(); i++) 5333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch webstring_paths[i] = local_paths[i].AsUTF16Unsafe(); 53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPageSerializer::serialize(webview()->mainFrame(), true, this, weburl_links, 53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webstring_paths, 5337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_directory_name.AsUTF16Unsafe()); 53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnShouldClose() { 53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); 53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_close = webview()->dispatchBeforeUnloadEvent(); 53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); 53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ShouldClose_ACK(routing_id_, should_close, 53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) before_unload_start_time, 53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) before_unload_end_time)); 53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewImpl::OnSwapOut() { 53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only run unload if we're not swapped out yet, but send the ack either way. 53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_swapped_out_) { 53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap this RenderView out so the tab can navigate to a page rendered by a 53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different process. This involves running the unload handler and clearing 53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page. Once WasSwappedOut is called, we also allow this process to 53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exit if there are no other active RenderViews in it. 53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send an UpdateState message before we get swapped out. 53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncNavigationState(); 53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronously run the unload handler before sending the ACK. 53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dispatchUnloadEvent(); 53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap out and stop sending any IPC messages that are not ACKs. 53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSwappedOut(true); 53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Now that we're swapped out and filtering IPC messages, stop loading to 5367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // ensure that no other in-progress navigation continues. We do this here 5368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // to avoid sending a DidStopLoading message to the browser process. 5369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnStop(); 5370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace the page with a blank dummy URL. The unload handler will not be 53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // run a second time, thanks to a check in FrameLoader::stopLoading. 53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Need to add a better way to do this that avoids running the 53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // beforeunload handler. For now, we just run it a second time silently. 53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToSwappedOutURL(webview()->mainFrame()); 53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let WebKit know that this view is hidden so it can drop resources and 53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stop compositing. 53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setVisibilityState(WebKit::WebPageVisibilityStateHidden, false); 53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new ViewHostMsg_SwapOut_ACK(routing_id_)); 53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::NavigateToSwappedOutURL(WebKit::WebFrame* frame) { 53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use loadRequest instead of loadHTMLString because the former commits 53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synchronously. Otherwise a new navigation can interrupt the navigation 53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to kSwappedOutURL. If that happens to be to the page we had been 53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showing, then WebKit will never send a commit and we'll be left spinning. 53902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(is_swapped_out_); 53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL swappedOutURL(kSwappedOutURL); 53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLRequest request(swappedOutURL); 53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->loadRequest(request); 53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnClosePage() { 53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, ClosePage()); 53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): We'd rather use webview()->Close() here, but that currently 53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sets the WebView's delegate_ to NULL, preventing any JavaScript dialogs 54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the onunload handler from appearing. For now, we're bypassing that and 54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calling the FrameLoader's CloseURL method directly. This should be 54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // revisited to avoid having two ways to close a page. Having a single way 54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to close that can run onunload is also useful for fixing 54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://b/issue?id=753080. 54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dispatchUnloadEvent(); 54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ClosePage_ACK(routing_id_)); 54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnThemeChanged() { 54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Aura doesn't care if we switch themes. 54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::NativeThemeWin::instance()->CloseHandles(); 54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->themeChanged(); 54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // defined(OS_WIN) 54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(port): we don't support theming on non-Windows platforms yet 54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDisassociateFromPopupCount() { 54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decrement_shared_popup_at_destruction_) 54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_->data--; 54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_ = new SharedRenderViewCounter(0); 54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_shared_popup_at_destruction_ = false; 54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::MaybeLoadAlternateErrorPage(WebFrame* frame, 54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLError& error, 54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool replace) { 54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only show alternate error pages in the main frame. They are 54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intended to assist the user when navigating, so there is not much 54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value in showing them for failed subframes. Ideally, we would be 54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // able to use the TYPED transition type for this, but that flag is 54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not preserved across page reloads. 54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->parent()) 54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the alternate error page service if this is a DNS failure or 54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // connection failure. 54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ec = error.reason; 54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ec != net::ERR_NAME_NOT_RESOLVED && 54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec != net::ERR_CONNECTION_FAILED && 54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec != net::ERR_CONNECTION_REFUSED && 54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec != net::ERR_ADDRESS_UNREACHABLE && 54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec != net::ERR_CONNECTION_TIMED_OUT) { 54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& error_page_url = GetAlternateErrorPageURL(error.unreachableURL, 54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec == net::ERR_NAME_NOT_RESOLVED ? DNS_ERROR : CONNECTION_ERROR); 54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!error_page_url.is_valid()) 54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 5458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebURLRequest& failed_request = ds->request(); 5459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load an empty page first so there is an immediate response to the error, 54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and then kick off a request for the alternate error page. 54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->loadHTMLString(std::string(), 54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(kUnreachableWebDataURL), 54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.unreachableURL, 54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replace); 54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, create a fetcher for the error page and associate it with the data 54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // source we just created via the LoadHTMLString call. That way if another 54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation occurs, the fetcher will get destroyed. 5470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 5471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDataSource(frame->provisionalDataSource()); 5472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_alt_error_page_fetcher( 54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new AltErrorPageResourceFetcher( 5474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_page_url, frame, failed_request, error, 54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RenderViewImpl::AltErrorPageFinished, 54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)))); 54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::AltErrorPageFinished(WebFrame* frame, 5481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebURLRequest& original_request, 54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLError& original_error, 54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html) { 54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here, we replace the blank page we loaded previously. 54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we failed to download the alternate error page, LoadNavigationErrorPage 54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will simply display a default error page. 5487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadNavigationErrorPage(frame, original_request, original_error, html, true); 54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnMoveOrResizeStarted() { 54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->hidePopups(); 54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 549590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderViewImpl::OnResize(const ViewMsg_Resize_Params& params) { 54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) { 54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->hidePopups(); 54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_preferred_size_changes_) { 54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->setCanHaveScrollbars( 550090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShouldDisplayScrollbars(params.new_size.width(), 550190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.new_size.height())); 55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateScrollState(webview()->mainFrame()); 55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 550690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderWidget::OnResize(params); 55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::WillInitiatePaint() { 55103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 55113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Notify all of our instances that we started painting. This is used for 55123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // internal bookkeeping only, so we know that the set can not change under 55133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // us. 55143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 55153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) 55163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->ViewWillInitiatePaint(); 55173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidInitiatePaint() { 55213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 55223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Notify all instances that we painted. The same caveats apply as for 55233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // ViewFlushedPaint regarding instances closing themselves, so we take 55243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // similar precautions. 55253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginSet plugins = active_pepper_instances_; 55263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) { 55273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (active_pepper_instances_.find(*i) != active_pepper_instances_.end()) 55283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->ViewInitiatedPaint(); 55293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 55303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidFlushPaint() { 55343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 55353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Notify all instances that we flushed. This will call into the plugin, and 55363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // we it may ask to close itself as a result. This will, in turn, modify our 55373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // set, possibly invalidating the iterator. So we iterate on a copy that 55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // won't change out from under us. 55393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginSet plugins = active_pepper_instances_; 55403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) { 55413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // The copy above makes sure our iterator is never invalid if some plugins 55423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // are destroyed. But some plugin may decide to close all of its views in 55433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // response to a paint in one of them, so we need to make sure each one is 55443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // still "current" before using it. 55453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // 55463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // It's possible that a plugin was destroyed, but another one was created 55473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // with the same address. In this case, we'll call ViewFlushedPaint on that 55483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // new plugin. But that's OK for this particular case since we're just 55493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // notifying all of our instances that the view flushed, and the new one is 55503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // one of our instances. 55513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // 55523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // What about the case where a new one is created in a callback at a new 55533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // address and we don't issue the callback? We're still OK since this 55543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // callback is used for flush callbacks and we could not have possibly 55553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // started a new paint (ViewWillInitiatePaint) for the new plugin while 55563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // processing a previous paint for an existing one. 55573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (active_pepper_instances_.find(*i) != active_pepper_instances_.end()) 55583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->ViewFlushedPaint(); 55593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 55603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the RenderWidget is closing down then early-exit, otherwise we'll crash. 55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See crbug.com/112921. 55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a provisional frame we are between the start and commit stages 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of loading and we don't want to save stats. 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_frame->provisionalDataSource()) { 55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = main_frame->dataSource(); 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 5574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* data = 5575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 5576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (data->did_first_visually_non_empty_layout() && 5577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !data->did_first_visually_non_empty_paint()) { 5578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data->set_did_first_visually_non_empty_paint(true); 5579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new ViewHostMsg_DidFirstVisuallyNonEmptyPaint(routing_id_, 5580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) page_id_)); 5581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jar): The following code should all be inside a method, probably in 55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigatorState. 55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time now = Time::Now(); 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_state->first_paint_time().is_null()) { 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_first_paint_time(now); 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_state->first_paint_after_load_time().is_null() && 55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !document_state->finish_load_time().is_null()) { 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_first_paint_after_load_time(now); 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 559658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* RenderViewImpl::GetBitmapForOptimizedPluginPaint( 559758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Rect& paint_bounds, 559858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TransportDIB** dib, 559958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch gfx::Rect* location, 560058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch gfx::Rect* clip, 560158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch float* scale_factor) { 56023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 56033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 56043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) { 56053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* instance = *i; 56063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // In Flash fullscreen , the plugin contents should be painted onto the 56073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // fullscreen widget instead of the web page. 56083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!instance->FlashIsFullscreenOrPending() && 56093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch instance->GetBitmapForOptimizedPluginPaint(paint_bounds, dib, location, 56103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch clip, scale_factor)) 56113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return *i; 56123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 56133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 56143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return NULL; 56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Vector2d RenderViewImpl::GetScrollOffset() { 56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize scroll_offset = webview()->mainFrame()->scrollOffset(); 56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Vector2d(scroll_offset.width, scroll_offset.height); 56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnClearFocusedNode() { 56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->clearFocusedNode(); 56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetBackground(const SkBitmap& background) { 56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setIsTransparent(!background.empty()); 56302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (compositor_) 56312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_->setHasTransparentBackground(!background.empty()); 56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBackground(background); 56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { 56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accessibility_mode_ == new_mode) 56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessibility_mode_ = new_mode; 56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (renderer_accessibility_) { 56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete renderer_accessibility_; 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_ = NULL; 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accessibility_mode_ == AccessibilityModeComplete) 56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_ = new RendererAccessibilityComplete(this); 56467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(OS_ANDROID) 56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (accessibility_mode_ == AccessibilityModeEditableTextOnly) 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_ = new RendererAccessibilityFocusOnly(this); 56497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetActive(bool active) { 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setIsActive(active); 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5656bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS) && defined(OS_MACOSX) 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetWindowFocus(active); 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetWindowVisibility(bool visible) { 5667bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS) 56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform plugins that their container has changed visibility. 56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetContainerVisibility(visible); 56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5674bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnWindowFrameChanged(const gfx::Rect& window_frame, 56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& view_frame) { 5679bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS) 56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform plugins that their window's frame has changed. 56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->WindowFrameChanged(window_frame, view_frame); 56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5686bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnPluginImeCompositionCompleted(const string16& text, 56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_id) { 56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebPluginDelegateProxy is responsible for figuring out if this event 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // applies to it or not, so inform all the delegates. 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->ImeCompositionCompleted(text, plugin_id); 56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::Close() { 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to grab a pointer to the doomed WebView before we destroy it. 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* doomed = webview(); 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::Close(); 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_view_map.Get().erase(doomed); 57062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_routing_id_view_map.Get().erase(routing_id_); 57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidHandleKeyEvent() { 57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearEditCommands(); 57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) { 5714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_menu_source_type_ = ui::MENU_SOURCE_MOUSE; 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_.event_source = 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE; 57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_.event_location = 57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(event.globalX, event.globalY); 57193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 57203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 57213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // This method is called for every mouse event that the render view receives. 57223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // And then the mouse event is forwarded to WebKit, which dispatches it to the 57233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // event target. Potentially a Pepper plugin will receive the event. 57243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // In order to tell whether a plugin gets the last mouse event and which it 57253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // is, we set |pepper_last_mouse_event_target_| to NULL here. If a plugin gets 57263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // the event, it will notify us via DidReceiveMouseEvent() and set itself as 57273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // |pepper_last_mouse_event_target_|. 57283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_last_mouse_event_target_ = NULL; 57293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the mouse is locked, only the current owner of the mouse lock can 57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process mouse events. 57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_lock_dispatcher_->WillHandleMouseEvent(event); 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RenderViewImpl::WillHandleKeyEvent(const WebKit::WebKeyboardEvent& event) { 5737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_menu_source_type_ = ui::MENU_SOURCE_KEYBOARD; 57387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 57397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 57407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::WillHandleGestureEvent( 57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebGestureEvent& event) { 5743eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_menu_source_type_ = ui::MENU_SOURCE_TOUCH; 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_.event_source = 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH; 57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_.event_location = 57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(event.globalX, event.globalY); 57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidHandleMouseEvent(const WebMouseEvent& event) { 57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleMouseEvent(event)); 57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidHandleTouchEvent(const WebTouchEvent& event) { 57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleTouchEvent(event)); 57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::HasTouchEventHandlersAt(const gfx::Point& point) const { 57602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 57612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 57622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return webview()->hasTouchEventHandlersAt(point); 57632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 57642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnWasHidden() { 57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::OnWasHidden(); 57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 57697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Inform RendererMediaPlayerManager to release all media player resources. 57702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unless some audio is playing. 57712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If something is in progress the resource will not be freed, it will 57722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // only be freed once the tab is destroyed or if the user navigates away 57732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // via WebMediaPlayerAndroid::Destroy 57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_player_manager_->ReleaseMediaResources(); 5775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_WEBRTC) 5777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderThreadImpl::current()->video_capture_impl_manager()-> 5778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuspendDevices(true); 5779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5782b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (webview()) 57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setVisibilityState(visibilityState(), false); 57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform PPAPI plugins that their page is no longer visible. 57873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 57883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) 57893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->PageVisibilityChanged(false); 57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform NPAPI plugins that their container is no longer visible. 57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetContainerVisibility(false); 57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 5799bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnWasShown(bool needs_repainting) { 58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::OnWasShown(needs_repainting); 58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC) 5806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderThreadImpl::current()->video_capture_impl_manager()-> 5807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuspendDevices(false); 5808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 5809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5810b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (webview()) 58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setVisibilityState(visibilityState(), false); 58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform PPAPI plugins that their page is visible. 58153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 58163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) 58173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->PageVisibilityChanged(true); 58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform NPAPI plugins that their container is now visible. 58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetContainerVisibility(true); 58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 5827bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL RenderViewImpl::GetURLForGraphicsContext3D() { 58312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(webview()); 58322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webview()->mainFrame()) 58332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL(webview()->mainFrame()->document().url()); 58342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 58352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL("chrome://gpu/RenderViewImpl::CreateGraphicsContext3D"); 58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::ForceCompositingModeEnabled() { 58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_preferences_.force_compositing_mode; 58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetFocus(bool enable) { 58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::OnSetFocus(enable); 58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS) 58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview() && webview()->isActive()) { 58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all NPAPI plugins. 58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderWidget's call to setFocus can cause the underlying webview's 58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // activation state to change just like a call to setIsActive. 58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable) 58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetWindowFocus(true); 58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetContentAreaFocus(enable); 58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all Pepper plugins. 58613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 58623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) 58633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->SetContentAreaFocus(enable); 58643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all BrowserPlugins of the RenderView's focus state. 5866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (browser_plugin_manager_.get()) 5867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager_->UpdateFocusState(); 58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnImeSetComposition( 58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text, 58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<WebKit::WebCompositionUnderline>& underlines, 58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_start, 58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_end) { 58753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 58763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a PPAPI plugin has focus, we bypass WebKit. 58783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!IsPepperAcceptingCompositionEvents()) { 58793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_composition_text_ = text; 58803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else { 58813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // TODO(kinaba) currently all composition events are sent directly to 58823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // plugins. Use DOM event mechanism after WebKit is made aware about 58833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // plugins that support composition. 58843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // The code below mimics the behavior of WebCore::Editor::setComposition. 58853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 58863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Empty -> nonempty: composition started. 58873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (pepper_composition_text_.empty() && !text.empty()) 58883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleCompositionStart(string16()); 58893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Nonempty -> empty: composition canceled. 58903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!pepper_composition_text_.empty() && text.empty()) 58913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleCompositionEnd(string16()); 58923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_composition_text_ = text; 58933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Nonempty: composition is ongoing. 58943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!pepper_composition_text_.empty()) { 58953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleCompositionUpdate( 58963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_composition_text_, underlines, selection_start, 58973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch selection_end); 58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 59013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 59033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(OS_WIN) 59043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // When a plug-in has focus, we create platform-specific IME data used by 59053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // our IME emulator and send it directly to the focused plug-in, i.e. we 59063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // bypass WebKit. (WebPluginDelegate dispatches this IME data only when its 59073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // instance ID is the same one as the specified ID.) 59083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_plugin_id_ >= 0) { 59093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::vector<int> clauses; 59103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::vector<int> target; 59113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (size_t i = 0; i < underlines.size(); ++i) { 59123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch clauses.push_back(underlines[i].startOffset); 59133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch clauses.push_back(underlines[i].endOffset); 59143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (underlines[i].thick) { 59153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch target.clear(); 59163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch target.push_back(underlines[i].startOffset); 59173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch target.push_back(underlines[i].endOffset); 59183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::set<WebPluginDelegateProxy*>::iterator it; 59213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (it = plugin_delegates_.begin(); it != plugin_delegates_.end(); ++it) { 59223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*it)->ImeCompositionUpdated(text, clauses, target, selection_end, 59233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_plugin_id_); 59243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5927bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // OS_WIN 5928bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 59293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RenderWidget::OnImeSetComposition(text, 59303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch underlines, 59313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch selection_start, 59323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch selection_end); 59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderViewImpl::OnImeConfirmComposition(const string16& text, 59367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const ui::Range& replacement_range, 59377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool keep_selection) { 59383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 59393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a PPAPI plugin has focus, we bypass WebKit. 59413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Here, text.empty() has a special meaning. It means to commit the last 59423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // update of composition text (see 59433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // RenderWidgetHost::ImeConfirmComposition()). 59443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const string16& last_text = text.empty() ? pepper_composition_text_ : text; 59453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 59463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // last_text is empty only when both text and pepper_composition_text_ is. 59473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Ignore it. 59483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (last_text.empty()) 59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 59503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 59513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!IsPepperAcceptingCompositionEvents()) { 59523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (size_t i = 0; i < text.size(); ++i) { 59533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch WebKit::WebKeyboardEvent char_event; 59543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.type = WebKit::WebInputEvent::Char; 59553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.timeStampSeconds = base::Time::Now().ToDoubleT(); 59563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.modifiers = 0; 59573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.windowsKeyCode = last_text[i]; 59583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.nativeKeyCode = last_text[i]; 59593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.text[0] = last_text[i]; 59603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.unmodifiedText[0] = last_text[i]; 59613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (webwidget()) 59623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch webwidget()->handleInputEvent(char_event); 59633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else { 59653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Mimics the order of events sent by WebKit. 59663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // See WebCore::Editor::setComposition() for the corresponding code. 59673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleCompositionEnd(last_text); 59683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleTextInput(last_text); 59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_composition_text_.clear(); 59713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 59723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(OS_WIN) 59743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Same as OnImeSetComposition(), we send the text from IMEs directly to 59753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // plug-ins. When we send IME text directly to plug-ins, we should not send 59763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // it to WebKit to prevent WebKit from controlling IMEs. 59773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // TODO(thakis): Honor |replacement_range| for plugins? 59783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_plugin_id_ >= 0) { 59793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::set<WebPluginDelegateProxy*>::iterator it; 59803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (it = plugin_delegates_.begin(); 59813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch it != plugin_delegates_.end(); ++it) { 59823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*it)->ImeCompositionCompleted(text, focused_plugin_id_); 59833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 59853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 5986bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // OS_WIN 5987bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 59883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (replacement_range.IsValid() && webview()) { 59893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Select the text in |replacement_range|, it will then be replaced by 59903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // text added by the call to RenderWidget::OnImeConfirmComposition(). 59913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (WebFrame* frame = webview()->focusedFrame()) { 59923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch WebRange webrange = WebRange::fromDocumentRange( 59933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch frame, replacement_range.start(), replacement_range.length()); 59943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!webrange.isNull()) 59953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch frame->selectRange(webrange); 59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RenderWidget::OnImeConfirmComposition(text, 59993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch replacement_range, 60003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch keep_selection); 60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::SetDeviceScaleFactor(float device_scale_factor) { 60042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidget::SetDeviceScaleFactor(device_scale_factor); 60052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webview()) { 60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setDeviceScaleFactor(device_scale_factor); 60072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->settings()->setAcceleratedCompositingForFixedPositionEnabled( 60082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldUseFixedPositionCompositing(device_scale_factor_)); 6009eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch webview()->settings()->setAcceleratedCompositingForOverflowScrollEnabled( 6010eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShouldUseAcceleratedCompositingForOverflowScroll(device_scale_factor_)); 601190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) webview()->settings()->setAcceleratedCompositingForTransitionEnabled( 601290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShouldUseTransitionCompositing(device_scale_factor_)); 60137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch webview()->settings()-> 60147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch setAcceleratedCompositingForFixedRootBackgroundEnabled( 60157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShouldUseAcceleratedFixedRootBackground(device_scale_factor_)); 60162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 60172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_resize_mode_) 60182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutoResizeCompositor(); 6019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6020868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (browser_plugin_manager_.get()) 6021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager_->UpdateDeviceScaleFactor(device_scale_factor_); 60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextInputType RenderViewImpl::GetTextInputType() { 60253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 60263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) 60273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return focused_pepper_plugin_->text_input_type(); 60283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 60293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return RenderWidget::GetTextInputType(); 60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::GetSelectionBounds(gfx::Rect* start, gfx::Rect* end) { 60333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 60343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) http://crbug.com/101101 60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current Pepper IME API does not handle selection bounds. So we simply 60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the caret position as an empty range for now. It will be updated 60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after Pepper API equips features related to surrounding text retrieval. 60393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch gfx::Rect caret = focused_pepper_plugin_->GetCaretBounds(); 60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start = caret; 60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end = caret; 60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::GetSelectionBounds(start, end); 60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) 60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::GetCompositionCharacterBounds( 60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Rect>* bounds) { 60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(bounds); 60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->clear(); 60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 60553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 6056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 6057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 60583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 60593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t start_offset = 0; 60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t character_count = 0; 60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()->compositionRange(&start_offset, &character_count)) 60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (character_count == 0) 60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame = webview()->focusedFrame(); 60705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->reserve(character_count); 60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebRect webrect; 60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < character_count; ++i) { 60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->firstRectForCharacterRange(start_offset + i, 1, webrect)) { 60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Could not retrieve character rectangle at " << i; 60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->clear(); 60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->push_back(webrect); 60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderViewImpl::GetCompositionRange(ui::Range* range) { 60863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 60873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 6088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 6089eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 60903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 6091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderWidget::GetCompositionRange(range); 6092eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 60937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 6094eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::CanComposeInline() { 60963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 60973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) 60983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return IsPepperAcceptingCompositionEvents(); 60993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 61003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return true; 61012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 61022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstrumentWillBeginFrame() { 61042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 61052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 61062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()->devToolsAgent()) 61072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 61082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->devToolsAgent()->didBeginFrame(); 61092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 61102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstrumentDidBeginFrame() { 61122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 61132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 61142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()->devToolsAgent()) 61152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 61162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(jamesr/caseq): Decide if this needs to be renamed. 61172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->devToolsAgent()->didComposite(); 61182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 61192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstrumentDidCancelFrame() { 61212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 61222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 61232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()->devToolsAgent()) 61242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 61252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->devToolsAgent()->didCancelFrame(); 61262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 61272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstrumentWillComposite() { 61292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 61302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 61312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()->devToolsAgent()) 61322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 61332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->devToolsAgent()->willComposite(); 61342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 61352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::AllowPartialSwap() const { 61372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return allow_partial_swap_; 61385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::ScheduleFileChooser( 61415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params, 61425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion* completion) { 61435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kMaximumPendingFileChooseRequests = 4; 61445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.size() > kMaximumPendingFileChooseRequests) { 61455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This sanity check prevents too many file choose requests from getting 61465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // queued which could DoS the user. Getting these is most likely a 61475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // programming error (there are many ways to DoS the user so it's not 61485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // considered a "real" security check), either in JS requesting many file 61495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // choosers to pop up, or in a plugin. 61505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 61515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) we might possibly want to require a user gesture to open 61525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a file picker, which will address this issue in a better way. 61535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 61545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.push_back(linked_ptr<PendingFileChooser>( 61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PendingFileChooser(params, completion))); 61585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.size() == 1) { 61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actually show the browse dialog when this is the first request. 61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_RunFileChooser(routing_id_, params)); 61615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebGeolocationClient* RenderViewImpl::geolocationClient() { 61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!geolocation_dispatcher_) 61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_dispatcher_ = new GeolocationDispatcher(this); 61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return geolocation_dispatcher_; 61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebSpeechInputController* RenderViewImpl::speechInputController( 61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebSpeechInputListener* listener) { 61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_INPUT_SPEECH) 61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!input_tag_speech_dispatcher_) 61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_tag_speech_dispatcher_ = 61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new InputTagSpeechDispatcher(this, listener); 61775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 61785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return input_tag_speech_dispatcher_; 61795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebSpeechRecognizer* RenderViewImpl::speechRecognizer() { 61825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!speech_recognition_dispatcher_) 61835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) speech_recognition_dispatcher_ = new SpeechRecognitionDispatcher(this); 61845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return speech_recognition_dispatcher_; 61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebDeviceOrientationClient* RenderViewImpl::deviceOrientationClient() { 61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!device_orientation_dispatcher_) 61895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_orientation_dispatcher_ = new DeviceOrientationDispatcher(this); 61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return device_orientation_dispatcher_; 61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::zoomLimitsChanged(double minimum_level, 61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double maximum_level) { 61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now, don't remember plugin zoom values. We don't want to mix them with 61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal web content (i.e. a fixed layout plugin would usually want them 61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different). 61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remember = !webview()->mainFrame()->document().isPluginDocument(); 61995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int minimum_percent = static_cast<int>( 620158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ZoomLevelToZoomFactor(minimum_level) * 100); 62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maximum_percent = static_cast<int>( 620358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ZoomLevelToZoomFactor(maximum_level) * 100); 62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateZoomLimits( 62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, minimum_percent, maximum_percent, remember)); 62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::zoomLevelChanged() { 62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remember = !webview()->mainFrame()->document().isPluginDocument(); 62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float zoom_level = webview()->zoomLevel(); 62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, ZoomLevelChanged()); 62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the browser which url got zoomed so it can update the menu and the 62165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // saved values if necessary 62175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidZoomURL( 62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, zoom_level, remember, 62195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(webview()->mainFrame()->document().url()))); 62205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochdouble RenderViewImpl::zoomLevelToZoomFactor(double zoom_level) const { 622358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return ZoomLevelToZoomFactor(zoom_level); 622458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 622558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 622658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochdouble RenderViewImpl::zoomFactorToZoomLevel(double factor) const { 622758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return ZoomFactorToZoomLevel(factor); 622858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 622958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::registerProtocolHandler(const WebString& scheme, 62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& base_url, 62325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& url, 62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& title) { 62342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL base(base_url); 62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL absolute_url = base.Resolve(UTF16ToUTF8(url)); 62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base.GetOrigin() != absolute_url.GetOrigin()) { 62385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_RegisterProtocolHandler(routing_id_, 62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16ToUTF8(scheme), 62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) absolute_url, 62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title, 62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture)); 62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebPageVisibilityState RenderViewImpl::visibilityState() const { 62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPageVisibilityState current_state = is_hidden() ? 62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPageVisibilityStateHidden : 62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPageVisibilityStateVisible; 62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPageVisibilityState override_state = current_state; 62525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetContentClient()->renderer()-> 62535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShouldOverridePageVisibilityState(this, 62545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &override_state)) 62555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return override_state; 62565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_state; 62575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebUserMediaClient* RenderViewImpl::userMediaClient() { 62607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnsureMediaStreamClient(); 62617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return web_user_media_client_; 62625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 626458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochWebKit::WebMIDIClient* RenderViewImpl::webMIDIClient() { 626558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (!midi_dispatcher_) 626658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch midi_dispatcher_ = new MIDIDispatcher(this); 626758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return midi_dispatcher_; 626858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 626958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::draggableRegionsChanged() { 62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 62725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, 62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DraggableRegionsChanged(webview()->mainFrame())); 62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 62785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentDetectionResult RenderViewImpl::detectContentAround( 62795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebHitTestResult& touch_hit) { 62805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!touch_hit.isNull()); 62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!touch_hit.node().isNull()); 62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(touch_hit.node().isTextNode()); 62835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process the position with all the registered content detectors until 62855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a match is found. Priority is provided by their relative order. 62865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ContentDetectorList::const_iterator it = content_detectors_.begin(); 62875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != content_detectors_.end(); ++it) { 62885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentDetector::Result content = (*it)->FindTappedContent(touch_hit); 62895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content.valid) { 62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebContentDetectionResult(content.content_boundaries, 62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16(content.text), content.intent_url); 62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebContentDetectionResult(); 62955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::scheduleContentIntent(const WebURL& intent) { 62985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Introduce a short delay so that the user can notice the content. 6299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 6301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&RenderViewImpl::LaunchAndroidContentIntent, 6302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), 6303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) intent, 6304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_content_intent_id_), 63055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kContentIntentDelayMilliseconds)); 63065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::cancelScheduledContentIntents() { 63095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++expected_content_intent_id_; 63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::LaunchAndroidContentIntent(const GURL& intent, 63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t request_id) { 63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request_id != expected_content_intent_id_) 63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the content highlighting if any. 63185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduleComposite(); 63195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intent.is_empty()) 63215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_StartContentIntent(routing_id_, intent)); 63225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 63242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::openDateTimeChooser( 63252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebDateTimeChooserParams& params, 63262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebDateTimeChooserCompletion* completion) { 63272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_picker_client_.reset( 63282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new RendererDateTimePicker(this, params, completion)); 63292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return date_time_picker_client_->Open(); 63302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 63312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 63322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_ANDROID) 63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 63355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSelectPopupMenuItem(int selected_index) { 63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (external_popup_menu_ == NULL) { 63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Crash reports from the field indicate that we can be notified with a 63385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL external popup menu (we probably get notified twice). 63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If you hit this please file a bug against jcivelli and include the page 63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and steps to repro. 63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_->DidSelectItem(selected_index); 63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_.reset(); 63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 63485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 63505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSelectPopupMenuItems( 63515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool canceled, 63525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<int>& selected_indices) { 63535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive more than one of these calls if the user presses 63545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a select faster than it takes for the show-select-popup IPC message to make 63555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it to the browser UI thread. Ignore the extra-messages. 63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug. 6357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!external_popup_menu_) 63585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_->DidSelectItems(canceled, selected_indices); 63615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_.reset(); 63625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 63645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnContextMenuClosed( 63665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CustomContextMenuContext& custom_context) { 63675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_context.request_id) { 63685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External request, should be in our map. 63695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMenuClient* client = 63705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_context_menus_.Lookup(custom_context.request_id); 63715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client) { 63725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->OnMenuClosed(custom_context.request_id); 63735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_context_menus_.Remove(custom_context.request_id); 63745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 63765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal request, forward to WebKit. 63775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_node_.reset(); 63785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewImpl::OnShowContextMenu(const gfx::Point& location) { 6382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_menu_source_type_ = ui::MENU_SOURCE_TOUCH_EDIT_MENU; 63837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_editing_context_menu_location_ = location; 6384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (webview()) 6385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->showContextMenu(); 6386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 6387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnEnableViewSourceMode() { 63895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 63905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 63915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 63925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_frame) 63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 63945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->enableViewSourceMode(true); 63955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 63985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnJavaBridgeInit() { 63995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!java_bridge_dispatcher_); 64005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_bridge_dispatcher_ = new JavaBridgeDispatcher(this); 64015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 640290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 64035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::OnDisownOpener() { 64052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 64062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 64072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 64092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (main_frame && main_frame->opener()) 64102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_frame->setOpener(NULL); 64112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 64122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 64145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::didTapMultipleTargets( 64155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebGestureEvent& event, 64165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebVector<WebRect>& target_rects) { 64177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Never show a disambiguation popup when accessibility is enabled, 64187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // as this interferes with "touch exploration". 64197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (accessibility_mode_ == AccessibilityModeComplete) 64207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 64217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 64225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect finger_rect( 64235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.x - event.data.tap.width / 2, event.y - event.data.tap.height / 2, 64245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.data.tap.width, event.data.tap.height); 64255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect zoom_rect; 64262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float new_total_scale = 64272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor( 64282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finger_rect, target_rects, GetSize(), 64292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(webview()->mainFrame()->visibleContentRect()).size(), 64302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor_ * webview()->pageScaleFactor(), &zoom_rect); 64312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!new_total_scale) 64325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 64335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch TapMultipleTargetsStrategy multitarget_strategy = 64352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch renderer_preferences_.tap_multiple_targets_strategy; 64362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (multitarget_strategy == TAP_MULTIPLE_TARGETS_STRATEGY_ZOOM) { 64372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return webview()->zoomToMultipleTargetsRect(zoom_rect); 64382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } else if (multitarget_strategy == TAP_MULTIPLE_TARGETS_STRATEGY_POPUP) { 64392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::Size canvas_size = 64402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::ToCeiledSize(gfx::ScaleSize(zoom_rect.size(), new_total_scale)); 64412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch TransportDIB* transport_dib = NULL; 64422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 64432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_ptr<skia::PlatformCanvas> canvas( 64442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch RenderProcess::current()->GetDrawingCanvas(&transport_dib, 64452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::Rect(canvas_size))); 64462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!canvas) 64472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return false; 64482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 64492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // TODO(trchen): Cleanup the device scale factor mess. 64502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // device scale will be applied in WebKit 64512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // --> zoom_rect doesn't include device scale, 64522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // but WebKit will still draw on zoom_rect * device_scale_factor_ 64532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch canvas->scale(new_total_scale / device_scale_factor_, 64542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new_total_scale / device_scale_factor_); 64552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch canvas->translate(-zoom_rect.x() * device_scale_factor_, 64562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch -zoom_rect.y() * device_scale_factor_); 64572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 64582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch webwidget_->paint( 64592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch canvas.get(), 64602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch zoom_rect, 64612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebWidget::ForceSoftwareRenderingAndIgnoreGPUResidentContent); 64622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 64632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 64642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::Rect physical_window_zoom_rect = gfx::ToEnclosingRect( 64652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ClientRectToPhysicalWindowRect(gfx::RectF(zoom_rect))); 64662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch Send(new ViewHostMsg_ShowDisambiguationPopup(routing_id_, 64672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch physical_window_zoom_rect, 64682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch canvas_size, 64692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch transport_dib->id())); 64702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } else { 64712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return false; 64722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 64735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 64765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 64775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)unsigned RenderViewImpl::GetLocalSessionHistoryLengthForTesting() const { 64792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_list_length_; 64802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 64812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::SetFocusAndActivateForTesting(bool enable) { 64832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enable) { 64842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_focus()) 64852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 64862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetActive(true); 64872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetFocus(true); 64882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 64892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!has_focus()) 64902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 64912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetFocus(false); 64922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetActive(false); 64932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 64942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 64952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::SetDeviceScaleFactorForTesting(float factor) { 6497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ViewMsg_Resize_Params params; 6498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.screen_info = screen_info_; 6499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.screen_info.deviceScaleFactor = factor; 6500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.new_size = size(); 6501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.physical_backing_size = 6502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::ToCeiledSize(gfx::ScaleSize(size(), factor)); 6503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.overdraw_bottom_height = 0.f; 6504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.resizer_rect = WebRect(); 6505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.is_fullscreen = is_fullscreen(); 6506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnResize(params); 65072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 65082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 650990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderViewImpl::EnableAutoResizeForTesting(const gfx::Size& min_size, 651090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Size& max_size) { 651190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnEnableAutoResize(min_size, max_size); 651290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 651390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 651490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderViewImpl::DisableAutoResizeForTesting(const gfx::Size& new_size) { 651590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnDisableAutoResize(new_size); 651690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 651790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 65187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderViewImpl::SetMediaStreamClientForTesting( 65197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaStreamClient* media_stream_client) { 65207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!media_stream_client_); 65217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!web_user_media_client_); 65227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_stream_client_ = media_stream_client; 65237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 65247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 65255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnReleaseDisambiguationPopupDIB( 65265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB::Handle dib_handle) { 65275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle); 65285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcess::current()->ReleaseTransportDIB(dib); 65295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 65305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::DidCommitCompositorFrame() { 65322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidget::DidCommitCompositorFrame(); 65332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidCommitCompositorFrame()); 65342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 65352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::SendUpdateFaviconURL(const std::vector<FaviconURL>& urls) { 6537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!urls.empty()) 6538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new ViewHostMsg_UpdateFaviconURL(routing_id_, page_id_, urls)); 6539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 6540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::DidStopLoadingIcons() { 6542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int icon_types = WebIconURL::TypeFavicon; 6543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (TouchEnabled()) 6544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_types |= WebIconURL::TypeTouchPrecomposed | WebIconURL::TypeTouch; 6545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebVector<WebIconURL> icon_urls = 6547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->mainFrame()->iconURLs(icon_types); 6548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<FaviconURL> urls; 6550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < icon_urls.size(); i++) { 6551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebURL url = icon_urls[i].iconURL(); 6552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!url.isEmpty()) 6553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) urls.push_back(FaviconURL(url, 6554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToFaviconType(icon_urls[i].iconType()))); 6555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendUpdateFaviconURL(urls); 6557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 6558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 6561