render_view_impl.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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" 18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/i18n/char_iterator.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/kill.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h" 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/child/appcache/appcache_dispatcher.h" 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/child/appcache/web_application_cache_host_impl.h" 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/child_thread.h" 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/webplugin_delegate_impl.h" 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/request_extra_data.h" 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/webmessageportchannel_impl.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/clipboard_messages.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/database_messages.h" 41bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/common/dom_storage/dom_storage_types.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/drag_messages.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/java_bridge_messages.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/pepper_messages.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/socket_stream_handle_data.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/ssl_status_serialization.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/context_menu_params.h" 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h" 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/favicon_url.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/file_chooser_params.h" 5858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/ssl_status.h" 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/three_d_api_types.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/url_utils.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/content_renderer_client.h" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/renderer/context_menu_client.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/document_state.h" 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/renderer/history_item_serialization.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/navigation_state.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_observer.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_visitor.h" 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/public/renderer/web_preferences.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/accessibility/renderer_accessibility.h" 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/accessibility/renderer_accessibility_complete.h" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/accessibility/renderer_accessibility_focus_only.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager.h" 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager_impl.h" 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/renderer/context_menu_params_builder.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/device_orientation_dispatcher.h" 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/devtools/devtools_agent.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/disambiguation_popup_helper.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/dom_automation_controller.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/dom_storage/webstoragenamespace_impl.h" 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/drop_data_builder.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/external_popup_menu.h" 85a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "content/renderer/fetchers/alt_error_page_resource_fetcher.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/geolocation_dispatcher.h" 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/gpu/input_handler_manager.h" 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/gpu/render_widget_compositor.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/idle_user_detector.h" 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/image_loading_helper.h" 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/renderer/ime_event_guard.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/input_tag_speech_dispatcher.h" 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/internal_document_state_data.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/java/java_bridge_dispatcher.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/load_progress_tracker.h" 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/media/audio_device_factory.h" 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/media/audio_renderer_mixer_manager.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_dependency_factory.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_dispatcher.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_impl.h" 10158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/media/midi_dispatcher.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/render_media_log.h" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/rtc_peer_connection_handler.h" 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/media/video_capture_impl_manager.h" 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_impl.h" 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_ms.h" 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_params.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/mhtml_generator.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/notification_provider.h" 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/render_frame_impl.h" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_process.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h" 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/render_view_impl_params.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_view_mouse_lock_dispatcher.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_widget_fullscreen_pepper.h" 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/renderer_date_time_picker.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_webapplicationcachehost_impl.h" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_webcolorchooser_impl.h" 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/renderer/savable_resources.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/speech_recognition_dispatcher.h" 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/stats_collection_controller.h" 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/stats_collection_observer.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/text_input_client_observer.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/v8_value_converter_impl.h" 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/web_ui_extension.h" 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/web_ui_extension_data.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/websharedworker_proxy.h" 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/audio/audio_output_device.h" 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_renderer_mixer_input.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/filter_collection.h" 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_switches.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/audio_renderer_impl.h" 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "media/filters/gpu_video_accelerator_factories.h" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/data_url.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_util.h" 139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebCString.h" 140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebDragData.h" 141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebHTTPBody.h" 142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebImage.h" 143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebMessagePortChannel.h" 144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebPoint.h" 145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebRect.h" 146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebSize.h" 147ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebSocketStreamHandle.h" 148ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebString.h" 149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebURL.h" 150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebURLError.h" 151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebURLRequest.h" 152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebURLResponse.h" 153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebVector.h" 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebAccessibilityObject.h" 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebColorName.h" 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDOMEvent.h" 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDOMMessageEvent.h" 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDataSource.h" 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDateTimeChooserCompletion.h" 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDateTimeChooserParams.h" 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDevToolsAgent.h" 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFileChooserParams.h" 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFindOptions.h" 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFormControlElement.h" 1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFormElement.h" 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 169bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebGlyphCache.h" 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebHelperPlugin.h" 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebHistoryItem.h" 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputElement.h" 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebMediaPlayerAction.h" 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNavigationPolicy.h" 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNodeList.h" 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPageSerializer.h" 1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPlugin.h" 1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginAction.h" 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h" 1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginDocument.h" 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginParams.h" 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRange.h" 1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRuntimeFeatures.h" 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSearchableFormData.h" 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSecurityOrigin.h" 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSecurityPolicy.h" 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSerializedScriptValue.h" 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSettings.h" 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebStorageQuotaCallbacks.h" 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebUserMediaClient.h" 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebWindowFeatures.h" 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/default/WebRenderTheme.h" 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/ui_base_switches_util.h" 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h" 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size_conversions.h" 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h" 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "v8/include/v8.h" 205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/child/weburlresponse_extradata_impl.h" 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <cpu-features.h> 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/android/device_telephony_info.h" 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/gpu/client/context_provider_command_buffer.h" 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/address_detector.h" 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/content_detector.h" 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/email_detector.h" 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/android/phone_number_detector.h" 2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/renderer/android/synchronous_compositor_factory.h" 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/android/renderer_media_player_manager.h" 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/renderer/media/android/stream_texture_factory_android_impl.h" 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/android/webmediaplayer_android.h" 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/android/webmediaplayer_proxy_android.h" 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "skia/ext/platform_canvas.h" 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatPoint.h" 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatRect.h" 224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/web/WebHitTestResult.h" 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect_f.h" 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(GOOGLE_TV) 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/media/rtc_video_decoder_bridge_tv.h" 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/media/rtc_video_decoder_factory_tv.h" 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(port): these files are currently Windows only because they concern: 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * theming 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_win.h" 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme.h" 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/skia_utils_mac.h" 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 243bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/renderer/npapi/webplugin_delegate_proxy.h" 244bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/renderer/npapi/webplugin_impl.h" 2453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_browser_connection.h" 2463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 2473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_plugin_registry.h" 2483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_webplugin_impl.h" 2493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/plugin_module.h" 2503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 2513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebAccessibilityNotification; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebAccessibilityObject; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebApplicationCacheHost; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebApplicationCacheHostClient; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCString; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebColor; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebColorName; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebConsoleMessage; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebContextMenuData; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCookieJar; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebData; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDataSource; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDocument; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDOMEvent; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDOMMessageEvent; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDragData; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDragOperation; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDragOperationsMask; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebEditingAction; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebElement; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebExternalPopupMenu; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebExternalPopupMenuClient; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFileChooserCompletion; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFindOptions; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFormControlElement; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFormElement; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFrame; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebGestureEvent; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebHistoryItem; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebHTTPBody; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebIconURL; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebImage; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputElement; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputEvent; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaPlayer; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaPlayerAction; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaPlayerClient; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMouseEvent; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNavigationPolicy; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNavigationType; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebNode; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPageSerializer; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPageSerializerClient; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPeerConnection00Handler; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPeerConnection00HandlerClient; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPeerConnectionHandler; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPeerConnectionHandlerClient; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginAction; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginContainer; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginDocument; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginParams; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPoint; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPopupMenuInfo; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRange; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRect; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebReferrerPolicy; 3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using WebKit::WebRuntimeFeatures; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebScriptSource; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSearchableFormData; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSecurityOrigin; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSecurityPolicy; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSerializedScriptValue; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSettings; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSharedWorker; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSize; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSocketStreamHandle; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageNamespace; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageQuotaCallbacks; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageQuotaError; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageQuotaType; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebString; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextAffinity; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextDirection; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTouchEvent; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURL; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLError; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLRequest; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLResponse; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebUserGestureIndicator; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebVector; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebView; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebWidget; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebWindowFeatures; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit_glue::WebURLResponseExtraDataImpl; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebContentDetectionResult; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFloatPoint; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFloatRect; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebHitTestResult; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<WebKit::WebView*, RenderViewImpl*> ViewMap; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<ViewMap> g_view_map = LAZY_INSTANCE_INITIALIZER; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<int32, RenderViewImpl*> RoutingIDViewMap; 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<RoutingIDViewMap> g_routing_id_view_map = 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time, in seconds, we delay before sending content state changes (such as form 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state and scroll position) to the browser. We delay sending changes to avoid 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// spamming the browser. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To avoid having tab/session restore require sending a message to get the 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// current content state during tab closing we use a shorter timeout for the 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// foreground renderer. This means there is a small window of time from which 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content state is modified and not sent to session restore, but this is 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// better than having to wake up all renderers during shutdown. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDelaySecondsForContentStateSyncHidden = 5; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDelaySecondsForContentStateSync = 1; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const size_t kExtraCharsBeforeAndAfterSelection = 100; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The maximum number of popups that can be spawned from one page. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMaximumNumberOfUnacknowledgedPopups = 25; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const float kScalingIncrement = 0.1f; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const float kScalingIncrementForGesture = 0.01f; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delay between tapping in content and launching the associated android intent. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to allow users see what has been recognized as content. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const size_t kContentIntentDelayMilliseconds = 700; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static RenderViewImpl* (*g_create_render_view_impl)(RenderViewImplParams*) = 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void GetRedirectChain(WebDataSource* ds, std::vector<GURL>* result) { 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Replace any occurrences of swappedout:// with about:blank. 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const WebURL& blank_url = GURL(kAboutBlankURL); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebURL> urls; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ds->redirectChain(urls); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->reserve(urls.size()); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < urls.size(); ++i) { 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (urls[i] != GURL(kSwappedOutURL)) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result->push_back(urls[i]); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result->push_back(blank_url); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// If |data_source| is non-null and has an InternalDocumentStateData associated 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with it, the AltErrorPageResourceFetcher is reset. 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void StopAltErrorPageFetcher(WebDataSource* data_source) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data_source) { 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDataSource(data_source); 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (internal_data) 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_alt_error_page_fetcher(NULL); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsReload(const ViewMsg_Navigate_Params& params) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == ViewMsg_Navigate_Type::RELOAD || 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE || 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 418bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 419bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochWebReferrerPolicy RenderViewImpl::GetReferrerPolicyFromRequest( 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return request.extraData() ? 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RequestExtraData*>(request.extraData())->referrer_policy() : 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().referrerPolicy(); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 427bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 428bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochReferrer RenderViewImpl::GetReferrerFromRequest( 429a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch WebFrame* frame, 430a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const WebURLRequest& request) { 431a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return Referrer(GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), 432a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GetReferrerPolicyFromRequest(frame, request)); 433a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 434a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 435bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// static 436bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochWebURLResponseExtraDataImpl* RenderViewImpl::GetExtraDataFromResponse( 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLResponse& response) { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WebURLResponseExtraDataImpl*>( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response.extraData()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NOINLINE static void CrashIntentionally() { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE(shess): Crash directly rather than using NOTREACHED() so 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the signature is easier to triage in crash reports. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile int* zero = NULL; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *zero = 0; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ADDRESS_SANITIZER) 450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NOINLINE static void MaybeTriggerAsanError(const GURL& url) { 451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // NOTE(rogerm): We intentionally perform an invalid heap access here in 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // order to trigger an Address Sanitizer (ASAN) error report. 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kCrashDomain[] = "crash"; 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kHeapOverflow[] = "/heap-overflow"; 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kHeapUnderflow[] = "/heap-underflow"; 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kUseAfterFree[] = "/use-after-free"; 457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const int kArraySize = 5; 458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!url.DomainIs(kCrashDomain, sizeof(kCrashDomain) - 1)) 460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!url.has_path()) 463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<int[]> array(new int[kArraySize]); 466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string crash_type(url.path()); 467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int dummy = 0; 468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (crash_type == kHeapOverflow) { 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dummy = array[kArraySize]; 470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (crash_type == kHeapUnderflow ) { 471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dummy = array[-1]; 472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (crash_type == kUseAfterFree) { 473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int* dangling = array.get(); 474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) array.reset(); 475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dummy = dangling[kArraySize / 2]; 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Make sure the assignments to the dummy value aren't optimized away. 479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::debug::Alias(&dummy); 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // ADDRESS_SANITIZER 482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void MaybeHandleDebugURL(const GURL& url) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.SchemeIs(chrome::kChromeUIScheme)) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url == GURL(kChromeUICrashURL)) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashIntentionally(); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (url == GURL(kChromeUIKillURL)) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::KillProcess(base::GetCurrentProcessHandle(), 1, false); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (url == GURL(kChromeUIHangURL)) { 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;;) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (url == GURL(kChromeUIShorthangURL)) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ADDRESS_SANITIZER) 499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MaybeTriggerAsanError(url); 500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // ADDRESS_SANITIZER 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false unless this is a top-level navigation. 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsTopLevelNavigation(WebFrame* frame) { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame->parent() == NULL; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false unless this is a top-level navigation that crosses origins. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsNonLocalTopLevelNavigation(const GURL& url, 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 511a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch WebNavigationType type, 512a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch bool is_form_post) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsTopLevelNavigation(frame)) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigations initiated within Webkit are not sent out to the external host 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the following cases. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. The url scheme is not http/https 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. The origin of the url and the opener is the same in which case the 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opener relationship is maintained. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3. Reloads/form submits/back forward navigations 522424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!url.SchemeIs(chrome::kHttpScheme) && !url.SchemeIs(kHttpsScheme)) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != WebKit::WebNavigationTypeReload && 526a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch type != WebKit::WebNavigationTypeBackForward && !is_form_post) { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The opener relationship between the new window and the parent allows the 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new window to script the parent and vice versa. This is not allowed if 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the origins of the two domains are different. This can be treated as a 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top level navigation and routed back to the host. 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* opener = frame->opener(); 532a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!opener) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.GetOrigin() != GURL(opener->document().url()).GetOrigin()) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void NotifyTimezoneChange(WebKit::WebFrame* frame) { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::HandleScope handle_scope; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Context::Scope context_scope(frame->mainWorldScriptContext()); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Date::DateTimeConfigurationChangeNotification(); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* child = frame->firstChild(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; child; child = child->nextSibling()) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyTimezoneChange(child); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static WindowOpenDisposition NavigationPolicyToDisposition( 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebNavigationPolicy policy) { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (policy) { 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyIgnore: 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IGNORE_ACTION; 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyDownload: 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SAVE_TO_DISK; 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyCurrentTab: 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CURRENT_TAB; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyNewBackgroundTab: 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NEW_BACKGROUND_TAB; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyNewForegroundTab: 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NEW_FOREGROUND_TAB; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyNewWindow: 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NEW_WINDOW; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebNavigationPolicyNewPopup: 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NEW_POPUP; 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unexpected WebNavigationPolicy"; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IGNORE_ACTION; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns true if the device scale is high enough that losing subpixel 57490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// antialiasing won't have a noticeable effect on text quality. 57590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static bool DeviceScaleEnsuresTextQuality(float device_scale_factor) { 57690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_ANDROID) 57790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // On Android, we never have subpixel antialiasing. 57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 57990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 58090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return device_scale_factor > 1.5f; 58190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 58290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 58390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool ShouldUseFixedPositionCompositing(float device_scale_factor) { 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Compositing for fixed-position elements is dependent on 58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // device_scale_factor if no flag is set. http://crbug.com/172738 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line.HasSwitch(switches::kDisableCompositingForFixedPosition)) 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line.HasSwitch(switches::kEnableCompositingForFixedPosition)) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return DeviceScaleEnsuresTextQuality(device_scale_factor); 59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic bool ShouldUseAcceleratedCompositingForOverflowScroll( 600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch float device_scale_factor) { 601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (command_line.HasSwitch(switches::kEnableAcceleratedOverflowScroll)) 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return DeviceScaleEnsuresTextQuality(device_scale_factor); 607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static bool ShouldUseTransitionCompositing(float device_scale_factor) { 61090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 61290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (command_line.HasSwitch(switches::kDisableCompositingForTransition)) 61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (command_line.HasSwitch(switches::kEnableCompositingForTransition)) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(ajuma): Re-enable this by default for high-DPI once the problem 619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // of excessive layer promotion caused by overlap has been addressed. 620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // http://crbug.com/178119. 621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic bool ShouldUseAcceleratedFixedRootBackground(float device_scale_factor) { 6257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 6267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (command_line.HasSwitch(switches::kDisableAcceleratedFixedRootBackground)) 6287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 6297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (command_line.HasSwitch(switches::kEnableAcceleratedFixedRootBackground)) 6317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 6327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return DeviceScaleEnsuresTextQuality(device_scale_factor); 6347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static FaviconURL::IconType ToFaviconType(WebKit::WebIconURL::Type type) { 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (type) { 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case WebKit::WebIconURL::TypeFavicon: 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::FAVICON; 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case WebKit::WebIconURL::TypeTouch: 641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::TOUCH_ICON; 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case WebKit::WebIconURL::TypeTouchPrecomposed: 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::TOUCH_PRECOMPOSED_ICON; 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case WebKit::WebIconURL::TypeInvalid: 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::INVALID_ICON; 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return FaviconURL::INVALID_ICON; 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct RenderViewImpl::PendingFileChooser { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingFileChooser(const FileChooserParams& p, WebFileChooserCompletion* c) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : params(p), 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) completion(c) { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileChooserParams params; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion* completion; // MAY BE NULL to skip callback. 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebWidgetLockTarget : public MouseLockDispatcher::LockTarget { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WebWidgetLockTarget(WebKit::WebWidget* webwidget) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : webwidget_(webwidget) {} 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLockMouseACK(bool succeeded) OVERRIDE { 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (succeeded) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_->didAcquirePointerLock(); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_->didNotAcquirePointerLock(); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseLockLost() OVERRIDE { 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_->didLosePointerLock(); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HandleMouseLockedInputEvent( 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebMouseEvent &event) OVERRIDE { 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The WebWidget handles mouse lock in WebKit's handleInputEvent(). 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebWidget* webwidget_; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 ExtractPostId(const WebHistoryItem& item) { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.isNull()) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.httpBody().isNull()) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return item.httpBody().identifier(); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TouchEnabled() { 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Based on the definition of chrome::kEnableTouchIcon. 701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebDragData DropDataToWebDragData(const DropData& drop_data) { 709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<WebDragData::Item> item_list; 710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // These fields are currently unused when dragging into WebKit. 712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(drop_data.download_metadata.empty()); 713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(drop_data.file_contents.empty()); 714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(drop_data.file_description_filename.empty()); 715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!drop_data.text.is_null()) { 717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeString; 719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeText); 720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringData = drop_data.text.string(); 721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(dcheng): Do we need to distinguish between null and empty URLs? Is it 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // meaningful to write an empty URL to the clipboard? 726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!drop_data.url.is_empty()) { 727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeString; 729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeURIList); 730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringData = WebString::fromUTF8(drop_data.url.spec()); 731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.title = drop_data.url_title; 732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!drop_data.html.is_null()) { 736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeString; 738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringType = WebString::fromUTF8(ui::Clipboard::kMimeTypeHTML); 739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringData = drop_data.html.string(); 740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.baseURL = drop_data.html_base_url; 741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 744eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<DropData::FileInfo>::const_iterator it = 745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) drop_data.filenames.begin(); 746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != drop_data.filenames.end(); 747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++it) { 748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeFilename; 750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.filenameData = it->path; 751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.displayNameData = it->display_name; 752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (std::map<base::string16, base::string16>::const_iterator it = 756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) drop_data.custom_data.begin(); 757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != drop_data.custom_data.end(); 758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++it) { 759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData::Item item; 760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.storageType = WebDragData::Item::StorageTypeString; 761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringType = it->first; 762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.stringData = it->second; 763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item_list.push_back(item); 764868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebDragData result; 767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.initialize(); 768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.setItems(item_list); 769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) result.setFilesystemId(drop_data.filesystem_id); 770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return result; 771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderViewImpl::RenderViewImpl(RenderViewImplParams* params) 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : RenderWidget(WebKit::WebPopupTypeNone, 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->screen_info, 7783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->swapped_out, 7793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params->hidden), 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webkit_preferences_(params->webkit_prefs), 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_content_state_immediately_(false), 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_bindings_(0), 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_preferred_size_changes_(false), 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_(false), 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_gesture_(NavigationGestureUnknown), 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opened_by_user_gesture_(true), 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_suppressed_(false), 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_(-1), 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_page_id_sent_to_browser_(-1), 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_page_id_(params->next_page_id), 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_(-1), 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_length_(0), 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_(TARGET_NONE), 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_offset_(0), 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_range_(ui::Range::InvalidRange()), 7967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) top_controls_constraints_(cc::BOTH), 7987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_is_main_frame_pinned_to_left_(false), 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_is_main_frame_pinned_to_right_(false), 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_has_main_frame_horizontal_scrollbar_(false), 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_has_main_frame_vertical_scrollbar_(false), 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cookie_jar_(this), 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notification_provider_(NULL), 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_dispatcher_(NULL), 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_tag_speech_dispatcher_(NULL), 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) speech_recognition_dispatcher_(NULL), 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_orientation_dispatcher_(NULL), 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_dispatcher_(NULL), 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager_(NULL), 8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_stream_client_(NULL), 8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch web_user_media_client_(NULL), 813558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch midi_dispatcher_(NULL), 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devtools_agent_(NULL), 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessibility_mode_(AccessibilityModeOff), 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_(NULL), 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_bridge_dispatcher_(NULL), 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_(NULL), 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) body_background_color_(SK_ColorWHITE), 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_content_intent_id_(0), 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_player_proxy_(NULL), 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) focused_plugin_id_(-1), 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 8273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 8283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_(NULL), 8293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_last_mouse_event_target_(NULL), 8303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enumeration_completion_id_(0), 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_progress_tracker_(new LoadProgressTracker(this)), 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_storage_namespace_id_(params->session_storage_namespace_id), 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrement_shared_popup_at_destruction_(false), 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handling_select_range_(false), 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_snapshot_id_(0), 8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) allow_partial_swap_(params->allow_partial_swap), 840bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch context_menu_source_type_(ui::MENU_SOURCE_MOUSE) { 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::Initialize(RenderViewImplParams* params) { 844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderFrameImpl* main_frame = RenderFrameImpl::Create( 845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this, params->main_frame_routing_id); 846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_render_frame_.reset(main_frame); 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) routing_id_ = params->routing_id; 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_id_ = params->surface_id; 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->opener_id != MSG_ROUTING_NONE && params->is_renderer_created) 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) opener_id_ = params->opener_id; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we start with a valid next_page_id_ from the browser. 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(next_page_id_, 0); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_provider_ = new NotificationProvider(this); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_provider_ = NULL; 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_ = WebView::create(this); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_)); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (command_line.HasSwitch(switches::kStatsCollectionController)) 867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stats_collection_observer_.reset(new StatsCollectionObserver(this)); 868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DeviceTelephonyInfo device_info; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string region_code = 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kNetworkCountryIso) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? command_line.GetSwitchValueASCII(switches::kNetworkCountryIso) 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : device_info.GetNetworkCountryIso(); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_detectors_.push_back(linked_ptr<ContentDetector>( 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new AddressDetector())); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_detectors_.push_back(linked_ptr<ContentDetector>( 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PhoneNumberDetector(region_code))); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_detectors_.push_back(linked_ptr<ContentDetector>( 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new EmailDetector())); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->counter) { 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shared_popup_counter_ = params->counter; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only count this if it isn't swapped out upon creation. 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params->swapped_out) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_->data++; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_shared_popup_at_destruction_ = true; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_ = new SharedRenderViewCounter(0); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_shared_popup_at_destruction_ = false; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThread::Get()->AddRoute(routing_id_, this); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Take a reference on behalf of the RenderThread. This will be balanced 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when we receive ViewMsg_ClosePage. 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 8993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (is_hidden_) 9003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RenderThread::Get()->WidgetHidden(); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a popup, we must wait for the CreatingNew_ACK message before 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completing initialization. Otherwise, we can finish it now. 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_id_ == MSG_ROUTING_NONE) { 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_show_ = true; 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteInit(); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_view_map.Get().insert(std::make_pair(webview(), this)); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_routing_id_view_map.Get().insert(std::make_pair(routing_id_, this)); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setDeviceScaleFactor(device_scale_factor_); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->settings()->setAcceleratedCompositingForFixedPositionEnabled( 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldUseFixedPositionCompositing(device_scale_factor_)); 914eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch webview()->settings()->setAcceleratedCompositingForOverflowScrollEnabled( 915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShouldUseAcceleratedCompositingForOverflowScroll(device_scale_factor_)); 91690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) webview()->settings()->setAcceleratedCompositingForTransitionEnabled( 91790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShouldUseTransitionCompositing(device_scale_factor_)); 9187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch webview()->settings()->setAcceleratedCompositingForFixedRootBackgroundEnabled( 9197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShouldUseAcceleratedFixedRootBackground(device_scale_factor_)); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ApplyWebPreferences(webkit_preferences_, webview()); 922eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch webview()->initializeMainFrame(main_render_frame_.get()); 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (switches::IsTouchDragDropEnabled()) 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->settings()->setTouchDragDropEnabled(true); 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (switches::IsTouchEditingEnabled()) 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->settings()->setTouchEditingEnabled(true); 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params->frame_name.empty()) 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->mainFrame()->setName(params->frame_name); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetRendererPrefs(params->renderer_prefs); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!media_stream_dispatcher_) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_dispatcher_ = new MediaStreamDispatcher(this); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MHTMLGenerator(this); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TextInputClientObserver(this); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 9467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_player_manager_.reset(new RendererMediaPlayerManager()); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The next group of objects all implement RenderViewObserver, so are deleted 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // along with the RenderView automatically. 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devtools_agent_ = new DevToolsAgent(this); 952a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (RenderWidgetCompositor* rwc = compositor()) { 953a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch webview()->devToolsAgent()->setLayerTreeId(rwc->GetLayerTreeId()); 954a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_ = new RenderViewMouseLockDispatcher(this); 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new ImageLoadingHelper(this); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create renderer_accessibility_ if needed. 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetAccessibilityMode(params->accessibility_mode); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IdleUserDetector(this); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kDomAutomationController)) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION; 965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (command_line.HasSwitch(switches::kStatsCollectionController)) 966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessViewLayoutFlags(command_line); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 970558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(ENABLE_PLUGINS) 9713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch new PepperBrowserConnection(this); 972558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 973558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->renderer()->RenderViewCreated(this); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have an opener_id but we weren't created by a renderer, then 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's the browser asking us to set our opener to another RenderView. 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params->opener_id != MSG_ROUTING_NONE && !params->is_renderer_created) { 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewImpl* opener_view = FromRoutingID(params->opener_id); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (opener_view) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->setOpener(opener_view->webview()->mainFrame()); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are initially swapped out, navigate to kSwappedOutURL. 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This ensures we are in a unique origin that others cannot script. 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_swapped_out_) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToSwappedOutURL(webview()->mainFrame()); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewImpl::~RenderViewImpl() { 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_.clear(); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decrement_shared_popup_at_destruction_) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_->data--; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::debug::TraceLog::GetInstance()->RemoveProcessLabel(routing_id_); 9977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If file chooser is still waiting for answer, dispatch empty answer. 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!file_chooser_completions_.empty()) { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.front()->completion) { 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.front()->completion->didChooseFile( 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebString>()); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.pop_front(); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The date/time picker client is both a scoped_ptr member of this class and 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a RenderViewObserver. Reset it to prevent double deletion. 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_picker_client_.reset(); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure we are no longer referenced by the ViewMap or RoutingIDViewMap. 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMap* views = g_view_map.Pointer(); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(this, it->second) << "Failed to call Close?"; 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RoutingIDViewMap* routing_id_views = g_routing_id_view_map.Pointer(); 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (RoutingIDViewMap::iterator it = routing_id_views->begin(); 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != routing_id_views->end(); ++it) 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(this, it->second) << "Failed to call Close?"; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, RenderViewGone()); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct()); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*static*/ 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewImpl* RenderViewImpl::FromWebView(WebView* webview) { 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMap* views = g_view_map.Pointer(); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMap::iterator it = views->find(webview); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it == views->end() ? NULL : it->second; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*static*/ 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderView* RenderView::FromWebView(WebKit::WebView* webview) { 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RenderViewImpl::FromWebView(webview); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*static*/ 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderViewImpl* RenderViewImpl::FromRoutingID(int32 routing_id) { 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RoutingIDViewMap* views = g_routing_id_view_map.Pointer(); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RoutingIDViewMap::iterator it = views->find(routing_id); 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return it == views->end() ? NULL : it->second; 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*static*/ 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderView* RenderView::FromRoutingID(int routing_id) { 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RenderViewImpl::FromRoutingID(routing_id); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*static*/ 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderView::ForEach(RenderViewVisitor* visitor) { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMap* views = g_view_map.Pointer(); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ViewMap::iterator it = views->begin(); it != views->end(); ++it) { 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!visitor->Visit(it->second)) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*static*/ 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderViewImpl* RenderViewImpl::Create( 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 opener_id, 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RendererPreferences& renderer_prefs, 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPreferences& webkit_prefs, 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SharedRenderViewCounter* counter, 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 routing_id, 1068868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 main_frame_routing_id, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 surface_id, 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 session_storage_namespace_id, 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& frame_name, 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_renderer_created, 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool swapped_out, 10743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool hidden, 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 next_page_id, 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebScreenInfo& screen_info, 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccessibilityMode accessibility_mode, 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool allow_partial_swap) { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(routing_id != MSG_ROUTING_NONE); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewImplParams params( 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opener_id, 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_prefs, 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_prefs, 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter, 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id, 1086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) main_frame_routing_id, 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id, 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace_id, 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_name, 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_renderer_created, 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swapped_out, 10923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) hidden, 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) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.gesture = navigation_gesture_; 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_gesture_ = NavigationGestureUnknown; 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make navigation state a part of the FrameNavigate message so that commited 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry had it at all times. 199990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebHistoryItem item = frame->currentHistoryItem(); 200090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (item.isNull()) { 200190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) item.initialize(); 200290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) item.setURLString(request.url().spec().utf16()); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 200490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.page_state = HistoryItemToPageState(item); 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->parent()) { 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Top-level navigation. 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the zoom limits in case a plugin had changed them previously. This 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will also call us back which will cause us to send a message to 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update WebContentsImpl. 201258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch webview()->zoomLimitsChanged(ZoomFactorToZoomLevel(kMinimumZoomFactor), 201358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ZoomFactorToZoomLevel(kMaximumZoomFactor)); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set zoom level, but don't do it for full-page plugin since they don't use 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same zoom settings. 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostZoomLevels::iterator host_zoom = 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_zoom_levels_.find(GURL(request.url())); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame()->document().isPluginDocument()) { 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the zoom levels for plugins. 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, 0); 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host_zoom != host_zoom_levels_.end()) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, host_zoom->second); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host_zoom != host_zoom_levels_.end()) { 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This zoom level was merely recorded transiently for this load. We can 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // erase it now. If at some point we reload this page, the browser will 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send us a new, up-to-date zoom level. 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_zoom_levels_.erase(host_zoom); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update contents MIME type for main frame. 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.contents_mime_type = ds->response().mimeType().utf8(); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = navigation_state->transition_type(); 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PageTransitionIsMainFrame(params.transition)) { 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the main frame does a load, it should not be reported as a subframe 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. This can occur in the following case: 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. You're on a site with frames. 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. You do a subframe navigation. This is stored with transition type 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MANUAL_SUBFRAME. 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3. You navigate to some non-frame site, say, google.com. 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4. You navigate back to the page from step 2. Since it was initially 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MANUAL_SUBFRAME, it will be that same transition type here. 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't want that, because any navigation that changes the toplevel 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame should be tracked as a toplevel navigation (this allows us to 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update the URL bar, etc). 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = PAGE_TRANSITION_LINK; 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If the page contained a client redirect (meta refresh, document.loc...), 2054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // set the referrer and transition appropriately. 2055a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (ds->isClientRedirect()) { 2056a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.referrer = Referrer(params.redirects[0], 2057a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetReferrerPolicyFromRequest(frame, ds->request())); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = static_cast<PageTransition>( 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition | PAGE_TRANSITION_CLIENT_REDIRECT); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bug 654101: the referrer will be empty on https->http transitions. It 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // would be nice if we could get the real referrer from somewhere. 2063a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.referrer = GetReferrerFromRequest(frame, original_request); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 method = request.httpMethod(); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (EqualsASCII(method, "POST")) { 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.is_post = true; 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.post_id = ExtractPostId(item); 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the user agent override back. 2073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.is_overriding_user_agent = internal_data->is_overriding_user_agent(); 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Track the URL of the original request. 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.original_request_url = original_request.url(); 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.history_list_was_cleared = 2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_state->history_list_was_cleared(); 2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save some histogram data so we can compute the average memory used per 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page load of the glyphs. 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_10000("Memory.GlyphPagesPerLoad", 2084bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebGlyphCache::pageCount()); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This message needs to be sent before any of allowScripts(), 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // allowImages(), allowPlugins() is called for the new page, so that when 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these functions send a ViewHostMsg_ContentBlocked message, it arrives 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the ViewHostMsg_FrameNavigate message. 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_FrameNavigate(routing_id_, params)); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subframe navigation: the type depends on whether this navigation 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generated a new session history entry. When they do generate a session 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history entry, it means the user initiated the navigation and we should 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mark it as such. This test checks if this is the first time UpdateURL 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has been called since WillNavigateToURL was called to initiate the load. 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_id_ > last_page_id_sent_to_browser_) 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = PAGE_TRANSITION_MANUAL_SUBFRAME; 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition = PAGE_TRANSITION_AUTO_SUBFRAME; 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!navigation_state->history_list_was_cleared()); 2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.history_list_was_cleared = false; 2104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_FrameNavigate(routing_id_, params)); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_page_id_sent_to_browser_ = 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(last_page_id_sent_to_browser_, page_id_); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we end up reusing this WebRequest (for example, due to a #ref click), 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we don't want the transition type to persist. Just clear it. 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_transition_type(PAGE_TRANSITION_LINK); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tell the embedding application that the title of the active page has changed 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateTitle(WebFrame* frame, 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTextDirection title_direction) { 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore all but top level navigations. 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->parent()) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::debug::TraceLog::GetInstance()->UpdateProcessLabel( 21257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch routing_id_, UTF16ToUTF8(title)); 21267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 shortened_title = title.substr(0, kMaxTitleChars); 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateTitle(routing_id_, page_id_, shortened_title, 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_direction)); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateEncoding(WebFrame* frame, 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& encoding_name) { 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only update main frame's encoding_name. 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame() == frame && 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_encoding_name_ != encoding_name) { 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the encoding name for later comparing. 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_encoding_name_ = encoding_name; 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateEncoding(routing_id_, last_encoding_name_)); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends the last committed session history state to the browser so it will be 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// saved before we navigate to a new page. This must be called *before* the 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page ID has been updated so we know what it was. 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateSessionHistory(WebFrame* frame) { 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a valid page ID at this point, then it corresponds to the page 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we are navigating away from. Otherwise, this is the first navigation, so 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there is no past session history to record. 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_id_ == -1) 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebHistoryItem& item = 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->previousHistoryItem(); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendUpdateState(item); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SendUpdateState(const WebHistoryItem& item) { 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.isNull()) 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send state updates for kSwappedOutURL. 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (item.urlString() == WebString::fromUTF8(kSwappedOutURL)) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateState( 216890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) routing_id_, page_id_, HistoryItemToPageState(item))); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OpenURL(WebFrame* frame, 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Referrer& referrer, 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebNavigationPolicy policy) { 21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ViewHostMsg_OpenURL_Params params; 21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.url = url; 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.referrer = referrer; 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.disposition = NavigationPolicyToDisposition(policy); 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.frame_id = frame->identifier(); 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ds) { 2182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params.should_replace_current_entry = ds->replacesCurrentHistoryItem(); 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params.should_replace_current_entry = false; 21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 2187bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (GetContentClient()->renderer()->AllowPopup()) 2188bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch params.user_gesture = true; 21897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 21907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (policy == WebKit::WebNavigationPolicyNewBackgroundTab || 21917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch policy == WebKit::WebNavigationPolicyNewForegroundTab || 21927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch policy == WebKit::WebNavigationPolicyNewWindow || 21937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch policy == WebKit::WebNavigationPolicyNewPopup) { 21947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebUserGestureIndicator::consumeUserGesture(); 21957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_OpenURL(routing_id_, params)); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebViewDelegate ------------------------------------------------------------ 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::LoadNavigationErrorPage( 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& failed_request, 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLError& error, 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html, 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool replace) { 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string alt_html; 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string* error_html; 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!html.empty()) { 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_html = &html; 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->renderer()->GetNavigationErrorStrings( 2215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame, failed_request, error, &alt_html, NULL); 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_html = &alt_html; 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->loadHTMLString(*error_html, 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(kUnreachableWebDataURL), 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.unreachableURL, 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replace); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::RunJavaScriptMessage(JavaScriptMessageType type, 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& default_value, 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* result) { 2230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result_temp; 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = &result_temp; 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendAndRunNestedMessageLoop(new ViewHostMsg_RunJavaScriptMessage( 2237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) routing_id_, message, default_value, frame_url, type, user_gesture, 2238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &success, result)); 2239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) WebUserGestureIndicator::consumeUserGesture(); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success; 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) { 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before WebKit asks us to show an alert (etc.), it takes care of doing the 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is particularly important that we do not call willEnterModalLoop as 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that would defer resource loads for the dialog itself. 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderThreadImpl::current()) // Will be NULL during unit tests. 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->DoNotNotifyWebKitOfModalLoop(); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message->EnableMessagePumping(); // Runs a nested message loop. 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Send(message); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::GetWindowSnapshot(const WindowSnapshotCallback& callback) { 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id = next_snapshot_id_++; 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_snapshots_.insert(std::make_pair(id, callback)); 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_GetWindowSnapshot(routing_id_, id)); 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::OnWindowSnapshotCompleted(const int snapshot_id, 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& size, const std::vector<unsigned char>& png) { 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingSnapshotMap::iterator it = pending_snapshots_.find(snapshot_id); 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(it != pending_snapshots_.end()); 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->second.Run(size, png); 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_snapshots_.erase(it); 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit::WebViewClient ------------------------------------------------------ 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebView* RenderViewImpl::createView( 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* creator, 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request, 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebWindowFeatures& features, 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& frame_name, 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebNavigationPolicy policy) { 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check to make sure we aren't overloading on popups. 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shared_popup_counter_->data > kMaximumNumberOfUnacknowledgedPopups) 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_CreateWindow_Params params; 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_id = routing_id_; 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 2284bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (GetContentClient()->renderer()->AllowPopup()) 2285bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch params.user_gesture = true; 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.window_container_type = WindowFeaturesToContainerType(features); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.session_storage_namespace_id = session_storage_namespace_id_; 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (frame_name != "_blank") 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.frame_name = frame_name; 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_frame_id = creator->identifier(); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_url = creator->document().url(); 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL security_url(creator->document().securityOrigin().toString().utf8()); 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!security_url.is_valid()) 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) security_url = GURL(); 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.opener_security_origin = security_url; 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.opener_suppressed = creator->willSuppressOpenerInNewFrame(); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.disposition = NavigationPolicyToDisposition(policy); 2298a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!request.isNull()) { 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.target_url = request.url(); 2300a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.referrer = GetReferrerFromRequest(creator, request); 2301a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 2302a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.features = features; 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 routing_id = MSG_ROUTING_NONE; 2305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 main_frame_routing_id = MSG_ROUTING_NONE; 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 surface_id = 0; 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 cloned_session_storage_namespace_id; 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThread::Get()->Send( 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewHostMsg_CreateWindow(params, 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &routing_id, 2312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &main_frame_routing_id, 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &surface_id, 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &cloned_session_storage_namespace_id)); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (routing_id == MSG_ROUTING_NONE) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUserGestureIndicator::consumeUserGesture(); 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebPreferences transferred_preferences = webkit_preferences_; 23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unless accelerated compositing has been explicitly disabled from the 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // command line (e.g. via the blacklist or about:flags) re-enable it for 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // new views that get spawned by this view. This gets around the issue that 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // background extension pages disable accelerated compositing via web prefs 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but can themselves spawn a visible render view which should be allowed 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // use gpu acceleration. 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webkit_preferences_.accelerated_compositing_enabled) { 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!command_line.HasSwitch(switches::kDisableAcceleratedCompositing)) 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transferred_preferences.accelerated_compositing_enabled = true; 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* view = RenderViewImpl::Create( 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_, 23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transferred_preferences, 2338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shared_popup_counter_.get(), 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id, 2340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) main_frame_routing_id, 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id, 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cloned_session_storage_namespace_id, 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), // WebCore will take care of setting the correct name. 23443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) true, // is_renderer_created 23453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) false, // swapped_out 23463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) false, // hidden 23473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1, // next_page_id 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) 23903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool RenderViewImpl::shouldReportDetailedMessageForSource( 23913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const WebString& source) { 23923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return GetContentClient()->renderer()->ShouldReportDetailedMessageForSource( 23933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) source); 23943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 23953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didAddMessageToConsole( 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebConsoleMessage& message, const WebString& source_name, 23983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned source_line, const WebString& stack_trace) { 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::LogSeverity log_severity = logging::LOG_VERBOSE; 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (message.level) { 24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebConsoleMessage::LevelDebug: 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_severity = logging::LOG_VERBOSE; 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebConsoleMessage::LevelLog: 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_severity = logging::LOG_INFO; 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebConsoleMessage::LevelWarning: 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_severity = logging::LOG_WARNING; 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebConsoleMessage::LevelError: 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_severity = logging::LOG_ERROR; 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2417bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Send(new ViewHostMsg_AddMessageToConsole(routing_id_, 2418bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<int32>(log_severity), 2419bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch message.text, 2420bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<int32>(source_line), 24213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) source_name, 24223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) stack_trace)); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::printPage(WebFrame* frame) { 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPage(frame, handling_input_event_)); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter* RenderViewImpl::notificationPresenter() { 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification_provider_; 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::enumerateChosenDirectory( 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& path, 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion* chooser_completion) { 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = enumeration_completion_id_++; 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enumeration_completions_[id] = chooser_completion; 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Send(new ViewHostMsg_EnumerateDirectory( 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id, 2442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath::FromUTF16Unsafe(path))); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::initializeHelperPluginWebFrame( 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebHelperPlugin* plugin) { 2447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch plugin->initializeFrame(main_render_frame_.get()); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didStartLoading() { 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_loading_) { 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "didStartLoading called while loading"; 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = true; 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidStartLoading(routing_id_)); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStartLoading()); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didStopLoading() { 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_loading_) { 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "DidStopLoading called while not loading"; 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_loading_ = false; 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: For now we're doing the safest thing, and sending out notification 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when done loading. This currently isn't an issue as the favicon is only 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // displayed when done loading. Ideally we would send notification when 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // finished parsing the head, but webkit doesn't support that yet. 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The feed discovery code would also benefit from access to the head. 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidStopLoading(routing_id_)); 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_progress_tracker_ != NULL) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_progress_tracker_->DidStopLoading(); 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DidStopLoadingIcons(); 2482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidStopLoading()); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didChangeLoadProgress(WebFrame* frame, 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double load_progress) { 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_progress_tracker_ != NULL) 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_progress_tracker_->DidChangeLoadProgress(frame, load_progress); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didCancelCompositionOnSelectionChange() { 24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_ImeCancelComposition(routing_id())); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didChangeSelection(bool is_empty_selection) { 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!handling_input_event_ && !handling_select_range_) 24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_empty_selection) 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_.clear(); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncSelectionIfRequired(); 25047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UpdateTextInputType(); 25057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 25062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch UpdateTextInputState(false, true); 25077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didExecuteCommand(const WebString& command_name) { 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name = UTF16ToUTF8(command_name); 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWithASCII(name, "Move", true) || 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartsWithASCII(name, "Insert", true) || 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartsWithASCII(name, "Delete", true)) 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->RecordUserMetrics(name); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::handleCurrentKeyboardEvent() { 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (edit_commands_.empty()) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->focusedFrame(); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EditCommands::iterator it = edit_commands_.begin(); 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EditCommands::iterator end = edit_commands_.end(); 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_execute_command = false; 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; it != end; ++it) { 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In gtk and cocoa, it's possible to bind multiple edit commands to one 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // key (but it's the exception). Once one edit command is not executed, it 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // seems safest to not execute the rest. 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->executeCommand(WebString::fromUTF8(it->name), 2536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebString::fromUTF8(it->value), 2537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetFocusedNode())) 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_execute_command = true; 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return did_execute_command; 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebColorChooser* RenderViewImpl::createColorChooser( 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebColorChooserClient* client, 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebColor& initial_color) { 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererWebColorChooserImpl* color_chooser = 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RendererWebColorChooserImpl(this, client); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_chooser->Open(static_cast<SkColor>(initial_color)); 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return color_chooser; 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::runFileChooser( 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebFileChooserParams& params, 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion* chooser_completion) { 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not open the file dialog in a hidden RenderView. 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_hidden()) 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileChooserParams ipc_params; 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.directory) 2562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ipc_params.mode = FileChooserParams::UploadFolder; 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (params.multiSelect) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.mode = FileChooserParams::OpenMultiple; 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (params.saveAs) 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.mode = FileChooserParams::Save; 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.mode = FileChooserParams::Open; 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.title = params.title; 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.default_file_name = 2571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath::FromUTF16Unsafe(params.initialValue); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.accept_types.reserve(params.acceptTypes.size()); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < params.acceptTypes.size(); ++i) 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc_params.accept_types.push_back(params.acceptTypes[i]); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 25767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ipc_params.capture = params.useMediaCapture; 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ScheduleFileChooser(ipc_params, chooser_completion); 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::runModalAlertDialog(WebFrame* frame, 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& message) { 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_ALERT, 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().url(), 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::runModalConfirmDialog(WebFrame* frame, 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& message) { 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_CONFIRM, 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().url(), 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::runModalPromptDialog(WebFrame* frame, 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& message, 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& default_value, 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString* actual_value) { 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result; 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_PROMPT, 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message, 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_value, 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().url(), 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ok) 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_value->assign(result); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ok; 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::runModalBeforeUnloadDialog( 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebString& message) { 2617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool is_reload = false; 2618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 2619a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (ds) 2620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) is_reload = (ds->navigationType() == WebKit::WebNavigationTypeReload); 2621a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return runModalBeforeUnloadDialog(frame, is_reload, message); 2622a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 2623a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2624a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool RenderViewImpl::runModalBeforeUnloadDialog( 2625a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WebFrame* frame, bool is_reload, const WebString& message) { 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are swapping out, we have already run the beforeunload handler. 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Fix OnSwapOut to clear the frame without running beforeunload 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // at all, to avoid running it twice. 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_swapped_out_) 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is an ignored return value, but is included so we can accept the same 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response as RunJavaScriptMessage. 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ignored_result; 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendAndRunNestedMessageLoop(new ViewHostMsg_RunBeforeUnloadConfirm( 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, frame->document().url(), message, is_reload, 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &success, &ignored_result)); 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success; 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::showContextMenu( 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebContextMenuData& data) { 264490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ContextMenuParams params = ContextMenuParamsBuilder::Build(data); 26457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.source_type = context_menu_source_type_; 2646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (context_menu_source_type_ == ui::MENU_SOURCE_TOUCH_EDIT_MENU) { 26477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.x = touch_editing_context_menu_location_.x(); 26487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.y = touch_editing_context_menu_location_.y(); 26497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Plugins, e.g. PDF, don't currently update the render view when their 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // selected text changes, but the context menu params do contain the updated 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // selection. If that's the case, update the render view's state just prior 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to showing the context menu. 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(asvitkine): http://crbug.com/152432 26562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldUpdateSelectionTextFromContextMenuParams(selection_text_, 26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_text_offset_, 26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection_range_, 26592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params)) { 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_ = params.selection_text; 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(asvitkine): Text offset and range is not available in this case. 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_offset_ = 0; 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_range_ = ui::Range(0, selection_text_.length()); 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_SelectionChanged(routing_id_, 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_, 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_offset_, 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_range_)); 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame is NULL if invoked by BlockedPlugin. 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame) 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.frame_id = frame->identifier(); 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Serializing a GURL longer than kMaxURLChars will fail, so don't do 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it. We replace it with an empty GURL so the appropriate items are disabled 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the context menu. 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jcivelli): http://crbug.com/45160 This prevents us from saving large 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data encoded images. We should have a way to save them. 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.src_url.spec().size() > kMaxURLChars) 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.src_url = GURL(); 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_node_ = data.node; 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect start_rect; 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect end_rect; 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSelectionBounds(&start_rect, &end_rect); 26872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.selection_start = gfx::Point(start_rect.x(), start_rect.bottom()); 26882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.selection_end = gfx::Point(end_rect.right(), end_rect.bottom()); 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ContextMenu(routing_id_, params)); 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidRequestShowContextMenu(frame, data)); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void RenderViewImpl::clearContextMenu() { 26983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) context_menu_node_.reset(); 26993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 27003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::setStatusText(const WebString& text) { 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateTargetURL(const GURL& url, 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& fallback_url) { 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL latest_url = url.is_empty() ? fallback_url : url; 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (latest_url == target_url_) 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the browser to display a destination link. 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_url_status_ == TARGET_INFLIGHT || 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_ == TARGET_PENDING) { 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a request in-flight, save the URL to be sent when we 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receive an ACK to the in-flight request. We can happily overwrite 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any existing pending sends. 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_target_url_ = latest_url; 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_ = TARGET_PENDING; 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLs larger than |kMaxURLChars| cannot be sent through IPC - 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // see |ParamTraits<GURL>|. 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (latest_url.possibly_invalid_spec().size() > kMaxURLChars) 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) latest_url = GURL(); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateTargetURL(routing_id_, page_id_, latest_url)); 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_ = latest_url; 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_url_status_ = TARGET_INFLIGHT; 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::RectF RenderViewImpl::ClientRectToPhysicalWindowRect( 27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::RectF& rect) const { 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF window_rect = rect; 27322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_rect.Scale(device_scale_factor_ * webview()->pageScaleFactor()); 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window_rect; 27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::StartNavStateSyncTimerIfNecessary() { 27372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No need to update state if no page has committed yet. 27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (page_id_ == -1) 27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delay; 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_content_state_immediately_) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay = 0; 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (is_hidden()) 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay = kDelaySecondsForContentStateSyncHidden; 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay = kDelaySecondsForContentStateSync; 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nav_state_sync_timer_.IsRunning()) { 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The timer is already running. If the delay of the timer maches the amount 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we want to delay by, then return. Otherwise stop the timer so that it 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets started with the right delay. 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nav_state_sync_timer_.GetCurrentDelay().InSeconds() == delay) 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nav_state_sync_timer_.Stop(); 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this, 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RenderViewImpl::SyncNavigationState); 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::setMouseOverURL(const WebURL& url) { 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_over_url_ = GURL(url); 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTargetURL(mouse_over_url_, focus_url_); 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::setKeyboardFocusURL(const WebURL& url) { 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_url_ = GURL(url); 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTargetURL(focus_url_, mouse_over_url_); 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::startDragging(WebFrame* frame, 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebDragData& data, 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperationsMask mask, 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebImage& image, 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPoint& webImageOffset) { 2777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DropData drop_data(DropDataBuilder::Build(data)); 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data.referrer_policy = frame->document().referrerPolicy(); 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Vector2d imageOffset(webImageOffset.x, webImageOffset.y); 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new DragHostMsg_StartDragging(routing_id_, 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data, 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask, 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image.getSkBitmap(), 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) imageOffset, 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_)); 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::acceptsLoadDrops() { 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return renderer_preferences_.can_accept_load_drops; 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::focusNext() { 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_TakeFocus(routing_id_, false)); 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::focusPrevious() { 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_TakeFocus(routing_id_, true)); 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::focusedNodeChanged(const WebNode& node) { 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_FocusedNodeChanged(routing_id_, IsEditableNode(node))); 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusedNodeChanged(node)); 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::numberOfWheelEventHandlersChanged(unsigned num_handlers) { 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidChangeNumWheelEvents(routing_id_, num_handlers)); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didUpdateLayout() { 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't always want to set up a timer, only if we've been put in that 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mode by getting a |ViewMsg_EnablePreferredSizeChangedMode| 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message. 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!send_preferred_size_changes_ || !webview()) 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (check_preferred_size_timer_.IsRunning()) 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check_preferred_size_timer_.Start(FROM_HERE, 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(0), this, 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RenderViewImpl::CheckPreferredSize); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::navigateBackForwardSoon(int offset) { 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_GoToEntryAtOffset(routing_id_, offset)); 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::historyBackListCount() { 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return history_list_offset_ < 0 ? 0 : history_list_offset_; 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::historyForwardListCount() { 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return history_list_length_ - historyBackListCount() - 1; 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::postAccessibilityNotification( 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebAccessibilityObject& obj, 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebAccessibilityNotification notification) { 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (renderer_accessibility_) { 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_->HandleWebAccessibilityNotification( 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj, notification); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didUpdateInspectorSetting(const WebString& key, 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& value) { 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateInspectorSetting(routing_id_, 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.utf8(), 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.utf8())); 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit::WebWidgetClient ---------------------------------------------------- 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFocus() { 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jcivelli): when https://bugs.webkit.org/show_bug.cgi?id=33389 is fixed 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we won't have to test for user gesture anymore and we can 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // move that code back to render_widget.cc 28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (WebUserGestureIndicator::isProcessingUserGesture() && 2859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !RenderThreadImpl::current()->layout_test_mode()) { 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_Focus(routing_id_)); 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didBlur() { 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jcivelli): see TODO above in didFocus(). 28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (WebUserGestureIndicator::isProcessingUserGesture() && 2867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !RenderThreadImpl::current()->layout_test_mode()) { 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_Blur(routing_id_)); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We are supposed to get a single call to Show for a newly created RenderView 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that was created via RenderViewImpl::CreateWebView. So, we wait until this 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// point to dispatch the ShowView message. 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This method provides us with the information about how to display the newly 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created RenderView (i.e., as a blocked popup or as a new tab). 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::show(WebNavigationPolicy policy) { 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (did_show_) { 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When supports_multiple_windows is disabled, popups are reusing 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same view. In some scenarios, this makes WebKit to call show() twice. 288390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (webkit_preferences_.supports_multiple_windows) 288490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED() << "received extraneous Show call"; 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_show_ = true; 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(opener_id_ != MSG_ROUTING_NONE); 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force new windows to a popup if they were not opened with a user gesture. 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!opened_by_user_gesture_) { 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We exempt background tabs for compat with older versions of Chrome. 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(darin): This seems bogus. These should have a user gesture, so 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we probably don't need this check. 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy != WebKit::WebNavigationPolicyNewBackgroundTab) 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy = WebKit::WebNavigationPolicyNewPopup; 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: initial_pos_ may still have its default values at this point, but 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser process will impose a default position otherwise. 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ShowView(opener_id_, routing_id_, 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationPolicyToDisposition(policy), initial_pos_, 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opened_by_user_gesture_)); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPendingWindowRect(initial_pos_); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::runModal() { 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(did_show_) << "should already have shown the view"; 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must keep WebKit's shared timer running in this case in order to allow 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showModalDialog to function properly. 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(darin): WebKit should really be smarter about suppressing events and 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // timers so that we do not need to manage the shared timer in such a heavy 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handed manner. 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RenderThreadImpl::current()) // Will be NULL during unit tests. 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->DoNotSuspendWebKitSharedTimer(); 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendAndRunNestedMessageLoop(new ViewHostMsg_RunModal( 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, opener_id_)); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::enterFullScreen() { 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ToggleFullscreen(routing_id_, true)); 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::exitFullScreen() { 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ToggleFullscreen(routing_id_, false)); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::requestPointerLock() { 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get()); 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::requestPointerUnlock() { 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get()); 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::isPointerLocked() { 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_lock_dispatcher_->IsMouseLockedTo( 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webwidget_mouse_lock_target_.get()); 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didActivateCompositor(int input_handler_identifier) { 29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_MACOSX) // many events are unhandled - http://crbug.com/138003 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InputHandlerManager* input_handler_manager = 29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderThreadImpl::current()->input_handler_manager(); 295290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_handler_manager) { 295390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) input_handler_manager->AddInputHandler( 295490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) routing_id_, 295590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) compositor_->GetInputHandler(), 295690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AsWeakPtr()); 295790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::didActivateCompositor(input_handler_identifier); 29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didHandleGestureEvent( 29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebGestureEvent& event, 29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool event_cancelled) { 29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidget::didHandleGestureEvent(event, event_cancelled); 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DidHandleGestureEvent(event)); 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2971a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid RenderViewImpl::initializeLayerTreeView() { 2972a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch RenderWidget::initializeLayerTreeView(); 2973a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch RenderWidgetCompositor* rwc = compositor(); 2974a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!rwc || !webview() || !webview()->devToolsAgent()) 2975a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return; 2976a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch webview()->devToolsAgent()->setLayerTreeId(rwc->GetLayerTreeId()); 2977a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2978a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit::WebFrameClient ----------------------------------------------------- 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer* RenderViewImpl::createMediaPlayer( 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebKit::WebURL& url, WebMediaPlayerClient* client) { 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, WillCreateMediaPlayer(frame, client)); 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 29877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_WEBRTC) 29887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnsureMediaStreamClient(); 29897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if !defined(GOOGLE_TV) 2990424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (media_stream_client_ && media_stream_client_->IsMediaStream(url)) { 2991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) 2992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool found_neon = 2993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0; 2994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Platform.WebRtcNEONFound", found_neon); 2995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) 29967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new WebMediaPlayerMS( 29977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch frame, client, AsWeakPtr(), media_stream_client_, new RenderMediaLog()); 29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // !defined(GOOGLE_TV) 30007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // defined(ENABLE_WEBRTC) 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelHost* gpu_channel_host = 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->EstablishGpuChannelSync( 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE); 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gpu_channel_host) { 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to establish GPU channel for media player"; 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<cc::ContextProvider> context_provider = 30122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderThreadImpl::current()->OffscreenContextProviderForMainThread(); 30137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!context_provider.get()) { 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Failed to get context3d for media player"; 30152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!media_player_proxy_) { 3019eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch media_player_proxy_ = new WebMediaPlayerProxyAndroid( 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, media_player_manager_.get()); 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3022ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3023ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<StreamTextureFactory> stream_texture_factory; 3024ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (UsingSynchronousRendererCompositor()) { 30253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SynchronousCompositorFactory* factory = 30263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SynchronousCompositorFactory::GetInstance(); 30273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) stream_texture_factory = factory->CreateStreamTextureFactory(routing_id_); 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(), 30413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), 3042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new RenderMediaLog())); 3043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_WEBRTC) && defined(GOOGLE_TV) 30447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (media_stream_client_->IsMediaStream(url)) { 3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RTCVideoDecoderFactoryTv* factory = RenderThreadImpl::current() 3046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ->GetMediaStreamDependencyFactory()->decoder_factory_tv(); 30477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |media_stream_client| and |factory| outlives |web_media_player_android|. 3048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!factory->AcquireDemuxer() || 3049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !web_media_player_android->InjectMediaStream( 30507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_stream_client_, 3051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) factory, 3052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind( 3053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::IgnoreResult(&RTCVideoDecoderFactoryTv::ReleaseDemuxer), 3054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Unretained(factory)))) { 3055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LOG(ERROR) << "Failed to inject media stream."; 3056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 3057868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3059868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // defined(ENABLE_WEBRTC) && defined(GOOGLE_TV) 3060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return web_media_player_android.release(); 3061868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // defined(OS_ANDROID) 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<media::AudioRendererSink> sink; 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cmd_line->HasSwitch(switches::kDisableAudio)) { 3065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sink = RenderThreadImpl::current()->GetAudioRendererMixerManager()-> 3066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateInput(routing_id_); 3067868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DVLOG(1) << "Using AudioRendererMixerManager-provided sink: " << sink.get(); 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories = 3071bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderThreadImpl::current()->GetGpuFactories( 3072bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy()); 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebMediaPlayerParams params( 3075868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), 3076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&ContentRendererClient::DeferMediaLoad, 3077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(GetContentClient()->renderer()), 3078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<RenderView*>(this)), 3079eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch sink, 3080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gpu_factories, 3081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new RenderMediaLog()); 30827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new WebMediaPlayerImpl(frame, client, AsWeakPtr(), params); 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebCookieJar* RenderViewImpl::cookieJar(WebFrame* frame) { 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &cookie_jar_; 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3089868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RenderViewImpl::didAccessInitialDocument(WebFrame* frame) { 3090868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Notify the browser process that it is no longer safe to show the pending 3091868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // URL of the main frame, since a URL spoof is now possible. 3092868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!frame->parent() && page_id_ == -1) 3093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Send(new ViewHostMsg_DidAccessInitialDocument(routing_id_)); 3094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 30962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didDisownOpener(WebKit::WebFrame* frame) { 3097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We only need to notify the browser if the active, top-level frame clears 3098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // its opener. We can ignore cases where a swapped out frame clears its 3099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // opener after hearing about it from the browser, and the browser does not 3100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (yet) care about subframe openers. 3101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_swapped_out_ || frame->parent()) 31022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 31032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Notify WebContents and all its swapped out RenderViews. 31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_DidDisownOpener(routing_id_)); 31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::frameDetached(WebFrame* frame) { 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameDetached(frame)); 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willClose(WebFrame* frame) { 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameWillClose(frame)); 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::Repaint(const gfx::Size& size) { 31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnRepaint(size); 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SetEditCommandForNextKeyEvent(const std::string& name, 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value) { 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EditCommands edit_commands; 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) edit_commands.push_back(EditCommand(name, value)); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetEditCommandsForNextKeyEvent(edit_commands); 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::ClearEditCommands() { 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) edit_commands_.clear(); 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SSLStatus RenderViewImpl::GetSSLStatusOfFrame(WebKit::WebFrame* frame) const { 3132a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch std::string security_info; 3133a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (frame && frame->dataSource()) 3134a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch security_info = frame->dataSource()->response().securityInfo(); 3135a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3136a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SSLStatus ssl_status; 3137a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DeserializeSecurityInfo(security_info, 3138a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &ssl_status.cert_id, 3139a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &ssl_status.cert_status, 3140a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &ssl_status.security_bits, 3141a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &ssl_status.connection_status); 3142a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return ssl_status; 31432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( 3146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebFrame* frame, WebDataSource::ExtraData* extraData, 3147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebURLRequest& request, WebNavigationType type, 3148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebNavigationPolicy default_policy, bool is_redirect) { 31492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request.url() != GURL(kSwappedOutURL) && 31502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetContentClient()->renderer()->HandleNavigation(frame, request, type, 31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_policy, 31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_redirect)) { 31532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; 31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3156a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch Referrer referrer(GetReferrerFromRequest(frame, request)); 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_swapped_out_) { 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request.url() != GURL(kSwappedOutURL)) { 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Targeted links may try to navigate a swapped out frame. Allow the 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser process to navigate the tab instead. Note that it is also 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // possible for non-targeted navigations (from this view) to arrive 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here just after we are swapped out. It's ok to send them to the 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser, as long as they're for the top level frame. 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Ensure this supports targeted form submissions when 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fixing http://crbug.com/101395. 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->parent() == NULL) { 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(frame, request.url(), referrer, default_policy); 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should otherwise ignore in-process iframe navigations, if they 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // arrive just after we are swapped out. 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow kSwappedOutURL to complete. 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_policy; 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Webkit is asking whether to navigate to a new URL. 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is fine normally, except if we're showing UI from one security 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // context and they're trying to navigate to a different context. 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = request.url(); 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A content initiated navigation may have originated from a link-click, 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // script, drag-n-drop operation, etc. 3188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_content_initiated = static_cast<DocumentState*>(extraData)-> 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state()->is_content_initiated(); 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Experimental: 31922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If --enable-strict-site-isolation or --site-per-process is enabled, send 31932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all top-level navigations to the browser to let it swap processes when 31942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // crossing site boundaries. This is currently expected to break some script 31952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls and navigations, such as form submissions. 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool force_swap_due_to_flag = 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kEnableStrictSiteIsolation) || 31992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line.HasSwitch(switches::kSitePerProcess); 32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (force_swap_due_to_flag && 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !frame->parent() && (is_content_initiated || is_redirect)) { 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString origin_str = frame->document().securityOrigin().toString(); 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL frame_url(origin_str.utf8().data()); 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(cevans): revisit whether this site check is still necessary once 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crbug.com/101395 is fixed. 3206a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool same_domain_or_host = 3207a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::registry_controlled_domains::SameDomainOrHost( 3208a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) frame_url, 3209a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) url, 3210a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); 3211a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!same_domain_or_host || frame_url.scheme() != url.scheme()) { 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(frame, url, referrer, default_policy); 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the browser is interested, then give it a chance to look at the request. 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_content_initiated) { 3219a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch bool is_form_post = ((type == WebKit::WebNavigationTypeFormSubmitted) || 3220a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch (type == WebKit::WebNavigationTypeFormResubmitted)) && 3221a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EqualsASCII(request.httpMethod(), "POST"); 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool browser_handles_request = 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.browser_handles_non_local_top_level_requests && 3224a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch IsNonLocalTopLevelNavigation(url, frame, type, is_form_post); 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!browser_handles_request) { 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_handles_request = 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_.browser_handles_all_top_level_requests && 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsTopLevelNavigation(frame); 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_handles_request) { 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset these counters as the RenderView could be reused for the next 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_ = -1; 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_page_id_sent_to_browser_ = -1; 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(frame, url, referrer, default_policy); 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the frame's original request's URL rather than the document's URL for 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequent checks. For a popup, the document's URL may become the opener 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window's URL if the opener has called document.write(). 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/93517. 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL old_url(frame->dataSource()->request().url()); 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detect when we're crossing a permission-based boundary (e.g. into or out of 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an extension or app origin, leaving a WebUI page, etc). We only care about 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // top-level navigations (not iframes). But we sometimes navigate to 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // about:blank to clear a tab, and we want to still allow that. 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: this is known to break POST submissions when crossing process 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundaries until http://crbug.com/101395 is fixed. This is better for 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // security than loading a WebUI, extension or app page in the wrong process. 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // POST requests don't work because this mechanism does not preserve form 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // POST data. We will need to send the request's httpBody data up to the 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser process, and issue a special POST navigation in WebKit (via 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FrameLoader::loadFrameRequest). See ResourceDispatcher and WebURLLoaderImpl 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for examples of how to send the httpBody data. 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->parent() && is_content_initiated && 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !url.SchemeIs(chrome::kAboutScheme)) { 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool send_referrer = false; 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All navigations to or from WebUI URLs or within WebUI-enabled 32652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RenderProcesses must be handled by the browser process so that the 32662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // correct bindings and data sources can be registered. 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Similarly, navigations to view-source URLs or within ViewSource mode 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must be handled by the browser process (except for reloads - those are 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // safe to leave within the renderer). 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lastly, access to file:// URLs from non-file:// URL pages must be 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handled by the browser so that ordinary renderer processes don't get 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // blessed with file permissions. 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cumulative_bindings = RenderProcess::current()->GetEnabledBindings(); 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_initial_navigation = page_id_ == -1; 32752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool should_fork = HasWebUIScheme(url) || HasWebUIScheme(old_url) || 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cumulative_bindings & BINDINGS_POLICY_WEB_UI) || 3277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url.SchemeIs(kViewSourceScheme) || 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (frame->isViewSourceModeEnabled() && 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type != WebKit::WebNavigationTypeReload); 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!should_fork && url.SchemeIs(chrome::kFileScheme)) { 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fork non-file to file opens. Check the opener URL if this is the 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initial navigation in a newly opened window. 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL source_url(old_url); 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_initial_navigation && source_url.is_empty() && frame->opener()) 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_url = frame->opener()->top()->document().url(); 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!source_url.is_empty()); 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_fork = !source_url.SchemeIs(chrome::kFileScheme); 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!should_fork) { 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Give the embedder a chance. 32932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_fork = GetContentClient()->renderer()->ShouldFork( 32942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame, url, request.httpMethod().utf8(), is_initial_navigation, 3295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) is_redirect, &send_referrer); 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (should_fork) { 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL( 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame, url, send_referrer ? referrer : Referrer(), default_policy); 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detect when a page is "forking" a new tab that can be safely rendered in 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its own process. This is done by sites like Gmail that try to open links 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in new windows without script connections back to the original page. We 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // treat such cases as browser navigations (in which we will create a new 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer for a cross-site navigation), rather than WebKit navigations. 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the following heuristic to decide whether to fork a new page in its 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // own process: 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parent page must open a new tab to about:blank, set the new tab's 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window.opener to null, and then redirect the tab to a cross-site URL using 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // JavaScript. 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Deprecate this logic once we can rely on rel=noreferrer 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (see below). 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fork = 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must start from a tab showing about:blank, which is later redirected. 332190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) old_url == GURL(kAboutBlankURL) && 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be the first real navigation of the tab. 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) historyBackListCount() < 1 && 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) historyForwardListCount() < 1 && 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parent page must have set the child's window.opener to null before 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redirecting to the desired URL. 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->opener() == NULL && 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be a top-level frame. 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->parent() == NULL && 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must not have issued the request from this page. 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_content_initiated && 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be targeted at the current tab. 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_policy == WebKit::WebNavigationPolicyCurrentTab && 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be a JavaScript navigation, which appears as "other". 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == WebKit::WebNavigationTypeOther; 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_fork) { 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open the URL via the browser, not via WebKit. 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURL(frame, url, Referrer(), default_policy); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNavigationPolicyIgnore; 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_policy; 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( 3347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebFrame* frame, const WebURLRequest& request, WebNavigationType type, 3348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebNavigationPolicy default_policy, bool is_redirect) { 3349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return decidePolicyForNavigation(frame, 3350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame->provisionalDataSource()->extraData(), 3351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request, type, default_policy, is_redirect); 3352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willSendSubmitEvent(WebKit::WebFrame* frame, 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebFormElement& form) { 33563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FOR_EACH_OBSERVER( 33573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RenderViewObserver, observers_, WillSendSubmitEvent(frame, form)); 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willSubmitForm(WebFrame* frame, 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebFormElement& form) { 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, WillSubmitForm(frame, form)); 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCreateDataSource(WebFrame* frame, WebDataSource* ds) { 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool content_initiated = !pending_navigation_params_.get(); 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!document_state) { 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state = new DocumentState; 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ds->setExtraData(document_state); 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!content_initiated) 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopulateDocumentStateFromPending(document_state); 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Carry over the user agent override flag, if it exists. 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_initiated && webview() && webview()->mainFrame() && 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->dataSource()) { 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* old_document_state = 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::FromDataSource(webview()->mainFrame()->dataSource()); 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_document_state) { 3383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 3384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 3385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* old_internal_data = 3386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(old_document_state); 3387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_is_overriding_user_agent( 3388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) old_internal_data->is_overriding_user_agent()); 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rest of RenderView assumes that a WebDataSource will always have a 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-null NavigationState. 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_initiated) { 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_navigation_state( 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState::CreateContentInitiated()); 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_navigation_state(CreateNavigationStateFromPending()); 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_.reset(); 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DocumentState::referred_by_prefetcher_ is true if we are 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating from a page that used prefetching using a link on that 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. We are early enough in the request process here that we 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can still see the DocumentState of the previous page and set 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this value appropriately. 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(gavinp): catch the important case of navigation in a new 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer process. 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) { 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (WebFrame* old_frame = webview()->mainFrame()) { 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& original_request = ds->originalRequest(); 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL referrer( 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_request.httpHeaderField(WebString::fromUTF8("Referer"))); 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!referrer.is_empty() && 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::FromDataSource( 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_frame->dataSource())->was_prefetcher()) { 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; old_frame; old_frame = old_frame->traverseNext(false)) { 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* old_frame_ds = old_frame->dataSource(); 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_frame_ds && referrer == GURL(old_frame_ds->request().url())) { 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_was_referred_by_prefetcher(true); 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_initiated) { 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request = ds->request(); 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (request.cachePolicy()) { 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebURLRequest::UseProtocolCachePolicy: // normal load. 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::LINK_LOAD_NORMAL); 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebURLRequest::ReloadIgnoringCacheData: // reload. 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::LINK_LOAD_RELOAD); 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebURLRequest::ReturnCacheDataElseLoad: // allow stale data. 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type( 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::LINK_LOAD_CACHE_STALE_OK); 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post. 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidCreateDataSource(frame, ds)); 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::PopulateDocumentStateFromPending( 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state) { 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_Navigate_Params& params = *pending_navigation_params_.get(); 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_request_time(params.request_time); 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 3457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 3458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!params.url.SchemeIs(kJavaScriptScheme) && 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == ViewMsg_Navigate_Type::RESTORE) { 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're doing a load of a page that was restored from the last session. By 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default this prefers the cache over loading (LOAD_PREFERRING_CACHE) which 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can result in stale data for pages that are set to expire. We explicitly 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // override that by setting the policy here so that as necessary we load 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the network. 3466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_cache_policy_override( 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLRequest::UseProtocolCachePolicy); 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsReload(params)) 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::RELOAD); 347290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else if (params.page_state.IsValid()) 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::HISTORY_LOAD); 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_load_type(DocumentState::NORMAL_LOAD); 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_referrer_policy(params.referrer.policy); 3478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_is_overriding_user_agent(params.is_overriding_user_agent); 3479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_must_reset_scroll_and_scale_state( 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.navigation_type == 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_can_load_local_resources(params.can_load_local_resources); 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NavigationState* RenderViewImpl::CreateNavigationStateFromPending() { 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_Navigate_Params& params = *pending_navigation_params_.get(); 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* navigation_state = NULL; 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A navigation resulting from loading a javascript URL should not be treated 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as a browser initiated event. Instead, we want it to look as if the page 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiated any load resulting from JS execution. 34923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!params.url.SchemeIs(kJavaScriptScheme)) { 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state = NavigationState::CreateBrowserInitiated( 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.page_id, 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.pending_history_list_offset, 3496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.should_clear_history_list, 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transition); 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_transferred_request_child_id( 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_request_child_id); 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_transferred_request_request_id( 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transferred_request_request_id); 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_allow_download(params.allow_download); 35032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_state->set_extra_headers(params.extra_headers); 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state = NavigationState::CreateContentInitiated(); 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return navigation_state; 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::ProcessViewLayoutFlags(const CommandLine& command_line) { 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enable_viewport = 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableViewport); 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enable_fixed_layout = 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.HasSwitch(switches::kEnableFixedLayout); 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->enableFixedLayoutMode(enable_fixed_layout || enable_viewport); 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If viewport tag is enabled, then the WebKit side will take care 35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of setting the fixed layout size and page scale limits. 35202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enable_viewport) 35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3523c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // When navigating to a new page, reset the page scale factor to be 1.0. 3524c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch webview()->setInitialPageScaleOverride(1.f); 3525c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 35262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enable_fixed_layout) { 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string str = 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kEnableFixedLayout); 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> tokens; 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(str, ',', &tokens); 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tokens.size() == 2) { 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, height; 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::StringToInt(tokens[0], &width) && 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringToInt(tokens[1], &height)) 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setFixedLayoutSize(WebSize(width, height)); 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float maxPageScaleFactor = 3539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line.HasSwitch(switches::kEnablePinch) ? 4.f : 1.f ; 3540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->setPageScaleFactorLimits(1, maxPageScaleFactor); 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didStartProvisionalLoad(WebFrame* frame) { 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 35452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In fast/loader/stop-provisional-loads.html, we abort the load before this 35472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // callback is invoked. 35482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ds) 35492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 35502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We should only navigate to swappedout:// when is_swapped_out_ is true. 35542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK((ds->request().url() != GURL(kSwappedOutURL)) || 35552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_swapped_out_) << "Heard swappedout:// when not swapped out."; 35562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the request time if WebKit has better knowledge of it. 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_state->request_time().is_null()) { 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double event_time = ds->triggeringEventTime(); 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event_time != 0.0) 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_request_time(Time::FromDoubleT(event_time)); 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start time is only set after request time. 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_start_load_time(Time::Now()); 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_top_most = !frame->parent(); 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_top_most) { 35692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_gesture_ = WebUserGestureIndicator::isProcessingUserGesture() ? 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationGestureUser : NavigationGestureAuto; 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (frame->parent()->isLoading()) { 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Take note of AUTO_SUBFRAME loads here, so that we can know how to 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // load an error page. See didFailProvisionalLoad. 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->navigation_state()->set_transition_type( 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PAGE_TRANSITION_AUTO_SUBFRAME); 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidStartProvisionalLoad(frame)); 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidStartProvisionalLoadForFrame( 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, frame->identifier(), 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->parent() ? frame->parent()->identifier() : -1, 35842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_top_most, ds->request().url())); 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didReceiveServerRedirectForProvisionalLoad( 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame) { 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->parent()) 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Received a redirect on the main frame. 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* data_source = frame->provisionalDataSource(); 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data_source) { 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should only be invoked when we have a data source. 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> redirects; 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRedirectChain(data_source, &redirects); 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (redirects.size() >= 2) { 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidRedirectProvisionalLoad(routing_id_, page_id_, 36022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) redirects[redirects.size() - 2], redirects.back())); 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFailProvisionalLoad(WebFrame* frame, 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLError& error) { 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the browser that we failed a provisional load with an error. 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: It is important this notification occur before DidStopLoading so the 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SSL manager can react to the provisional load failure before being 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notified the load stopped. 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ds); 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& failed_request = ds->request(); 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidFailProvisionalLoad(frame, error)); 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool show_repost_interstitial = 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (error.reason == net::ERR_CACHE_MISS && 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EqualsASCII(failed_request.httpMethod(), "POST")); 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_DidFailProvisionalLoadWithError_Params params; 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.frame_id = frame->identifier(); 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.is_main_frame = !frame->parent(); 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.error_code = error.reason; 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->renderer()->GetNavigationErrorStrings( 3631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame, 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_request, 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error, 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ¶ms.error_description); 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.url = error.unreachableURL; 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.showing_repost_interstitial = show_repost_interstitial; 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidFailProvisionalLoadWithError( 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, params)); 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't display an error page if this is simply a cancelled load. Aside 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from being dumb, WebCore doesn't expect it and it will cause a crash. 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error.reason == net::ERR_ABORTED) 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (RenderThreadImpl::current()->layout_test_mode()) 36472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 36482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we never show errors in view source mode. 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->enableViewSourceMode(false); 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a failed back/forward/reload navigation, then we need to do a 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 'replace' load. This is necessary to avoid messing up session history. 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, we do a normal load, which simulates a 'go' navigation as far 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as session history is concerned. 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AUTO_SUBFRAME loads should always be treated as loads that do not advance 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page id. 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool replace = 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->pending_page_id() != -1 || 36657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PageTransitionCoreTypeIs(navigation_state->transition_type(), 36667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PAGE_TRANSITION_AUTO_SUBFRAME); 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we failed on a browser initiated request, then make sure that our error 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page load is regarded as the same browser initiated request. 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!navigation_state->is_content_initiated()) { 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_.reset(new ViewMsg_Navigate_Params); 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_->page_id = 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->pending_page_id(); 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_->pending_history_list_offset = 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->pending_history_list_offset(); 3676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pending_navigation_params_->should_clear_history_list = 3677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_state->history_list_was_cleared(); 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_->transition = 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->transition_type(); 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_navigation_params_->request_time = 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->request_time(); 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provide the user with a more helpful error page? 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (MaybeLoadAlternateErrorPage(frame, error, replace)) 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fallback to a local error page. 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNavigationErrorPage(frame, failed_request, error, std::string(), replace); 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCommitProvisionalLoad(WebFrame* frame, 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_new_navigation) { 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::FromDataSource(frame->dataSource()); 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 3697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 3698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_state->commit_load_time().is_null()) 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_commit_load_time(Time::Now()); 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (internal_data->must_reset_scroll_and_scale_state()) { 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->resetScrollAndScaleState(); 3705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_must_reset_scroll_and_scale_state(false); 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3707ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch internal_data->set_use_error_page(false); 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_new_navigation) { 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When we perform a new navigation, we need to update the last committed 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session history entry with state for the page we are leaving. 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSessionHistory(frame); 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We bump our Page ID to correspond with the new session history entry. 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_ = next_page_id_++; 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't update history_page_ids_ (etc) for kSwappedOutURL, since 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we don't want to forget the entry that was there, and since we will 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // never come back to kSwappedOutURL. Note that we have to call 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateSessionHistory and update page_id_ even in this case, so that 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the current entry gets a state update and so that we don't send a 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state update to the wrong entry when we swap back in. 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetLoadingUrl(frame) != GURL(kSwappedOutURL)) { 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Advance our offset in session history, applying the length limit. 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is now no forward history. 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_++; 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (history_list_offset_ >= kMaxSessionHistoryEntries) 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ = kMaxSessionHistoryEntries - 1; 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_length_ = history_list_offset_ + 1; 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_.resize(history_list_length_, -1); 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_[history_list_offset_] = page_id_; 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inspect the navigation_state on this frame to see if the navigation 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // corresponds to a session history navigation... Note: |frame| may or 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may not be the toplevel frame, but for the case of capturing session 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history, the first committed frame suffices. We keep track of whether 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we've seen this commit before so that only capture session history once 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per navigation. 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that we need to check if the page ID changed. In the case of a 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reload, the page ID doesn't change, and UpdateSessionHistory gets the 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous URL and the current page ID, which would be wrong. 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (navigation_state->pending_page_id() != -1 && 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->pending_page_id() != page_id_ && 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !navigation_state->request_committed()) { 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a successful session history navigation! 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSessionHistory(frame); 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_ = navigation_state->pending_page_id(); 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ = navigation_state->pending_history_list_offset(); 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the history list is valid, our list of page IDs should be correct. 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(history_list_length_ <= 0 || 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ < 0 || 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_list_offset_ >= history_list_length_ || 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_page_ids_[history_list_offset_] == page_id_); 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCommitProvisionalLoad(frame, is_new_navigation)); 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remember that we've already processed this request, so we don't update 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the session history again. We do this regardless of whether this is 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a session history navigation, because if we attempted a session history 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation without valid HistoryItem state, WebCore will think it is a 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new navigation. 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigation_state->set_request_committed(true); 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateURL(frame); 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we have new encoding name. 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->parent()) { // Only for top frames. 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_thread_impl) { // Can be NULL in tests. 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_impl->histogram_customizer()-> 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewNavigatedToHost(GURL(GetLoadingUrl(frame)).host(), 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_view_map.Get().size()); 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didClearWindowObject(WebFrame* frame) { 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidClearWindowObject(frame)); 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enabled_bindings_ & BINDINGS_POLICY_DOM_AUTOMATION) { 3791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!dom_automation_controller_) 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dom_automation_controller_.reset(new DomAutomationController()); 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dom_automation_controller_->set_message_sender( 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<RenderView*>(this)); 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dom_automation_controller_->set_routing_id(routing_id()); 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dom_automation_controller_->BindToJavascript(frame, 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "domAutomationController"); 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3800868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (enabled_bindings_ & BINDINGS_POLICY_STATS_COLLECTION) { 3801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!stats_collection_controller_.get()) 3802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stats_collection_controller_.reset(new StatsCollectionController()); 3803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stats_collection_controller_->set_message_sender( 3804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<RenderView*>(this)); 3805868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stats_collection_controller_->BindToJavascript(frame, 3806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "statsCollectionController"); 3807868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCreateDocumentElement(WebFrame* frame) { 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidCreateDocumentElement(frame)); 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didReceiveTitle(WebFrame* frame, const WebString& title, 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTextDirection direction) { 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateTitle(frame, title, direction); 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also check whether we have new encoding name. 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::didChangeIcon(WebFrame* frame, 3824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebIconURL::Type icon_type) { 3825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (frame->parent()) 3826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!TouchEnabled() && icon_type != WebIconURL::TypeFavicon) 3829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type); 3832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<FaviconURL> urls; 3833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < icon_urls.size(); i++) { 3834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) urls.push_back(FaviconURL(icon_urls[i].iconURL(), 3835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToFaviconType(icon_urls[i].iconType()))); 3836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendUpdateFaviconURL(urls); 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFinishDocumentLoad(WebFrame* frame) { 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_finish_document_load_time(Time::Now()); 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DocumentLoadedInFrame(routing_id_, frame->identifier())); 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishDocumentLoad(frame)); 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we have new encoding name. 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didHandleOnloadEvents(WebFrame* frame) { 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame() == frame) { 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DocumentOnLoadCompletedInMainFrame(routing_id_, 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id_)); 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFailLoad(WebFrame* frame, const WebURLError& error) { 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ds); 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFailLoad(frame, error)); 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& failed_request = ds->request(); 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 error_description; 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->renderer()->GetNavigationErrorStrings( 3871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame, 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_request, 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error, 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_description); 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidFailLoadWithError(routing_id_, 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->identifier(), 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_request.url(), 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !frame->parent(), 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.reason, 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_description)); 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFinishLoad(WebFrame* frame) { 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 38877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (document_state->finish_load_time().is_null()) { 38887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!frame->parent()) { 38897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TRACE_EVENT_INSTANT0("WebCore", "LoadFinished", 38907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TRACE_EVENT_SCOPE_PROCESS); 38917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_finish_load_time(Time::Now()); 38937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame)); 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidFinishLoad(routing_id_, 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->identifier(), 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ds->request().url(), 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !frame->parent())); 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didNavigateWithinPage( 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, bool is_new_navigation) { 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this was a reference fragment navigation that we initiated, then we 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could end up having a non-null pending navigation params. We just need to 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // update the ExtraData on the datasource so that others who read the 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtraData will get the new NavigationState. Similarly, if we did not 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiate this navigation, then we need to take care to reset any pre- 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // existing navigation state to a content-initiated navigation state. 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DidCreateDataSource conveniently takes care of this for us. 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didCreateDataSource(frame, frame->dataSource()); 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState::FromDataSource(frame->dataSource()); 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationState* new_state = document_state->navigation_state(); 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_state->set_was_within_same_page(true); 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didCommitProvisionalLoad(frame, is_new_navigation); 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didUpdateCurrentHistoryItem(WebFrame* frame) { 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartNavStateSyncTimerIfNecessary(); 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willSendRequest(WebFrame* frame, 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned identifier, 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLRequest& request, 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLResponse& redirect_response) { 3930bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didReceiveResponse( 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, unsigned identifier, const WebURLResponse& response) { 3935bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFinishResourceLoad( 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, unsigned identifier) { 3940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 3941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDataSource(frame->dataSource()); 3942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!internal_data->use_error_page()) 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not show error page when DevTools is attached. 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (devtools_agent_->IsAttached()) 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Display error page, if appropriate. 3950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int http_status_code = internal_data->http_status_code(); 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (http_status_code == 404) { 39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On 404s, try a remote search page as a fallback. 39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& document_url = frame->document().url(); 39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& error_page_url = 39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAlternateErrorPageURL(document_url, HTTP_404); 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_page_url.is_valid()) { 39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLError original_error; 39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_error.domain = "http"; 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_error.reason = 404; 39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_error.unreachableURL = document_url; 39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_alt_error_page_fetcher( 39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new AltErrorPageResourceFetcher( 3965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_page_url, frame, frame->dataSource()->request(), 3966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) original_error, 39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RenderViewImpl::AltErrorPageFinished, 39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)))); 39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_domain; 39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetContentClient()->renderer()->HasErrorPage( 39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_status_code, &error_domain)) { 39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLError error; 39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.unreachableURL = frame->document().url(); 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.domain = WebString::fromUTF8(error_domain); 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.reason = http_status_code; 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadNavigationErrorPage( 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame, frame->dataSource()->request(), error, std::string(), true); 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didLoadResourceFromMemoryCache( 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebURLRequest& request, 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLResponse& response) { 3989bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didDisplayInsecureContent(WebFrame* frame) { 3993bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didRunInsecureContent( 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, const WebSecurityOrigin& origin, const WebURL& target) { 3998bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didExhaustMemoryAvailableForScript(WebFrame* frame) { 4002bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didCreateScriptContext(WebFrame* frame, 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Context> context, 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int extension_group, 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int world_id) { 4009bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willReleaseScriptContext(WebFrame* frame, 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Context> context, 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int world_id) { 4015bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::CheckPreferredSize() { 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't always want to send the change messages over IPC, only if we've 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been put in that mode by getting a |ViewMsg_EnablePreferredSizeChangedMode| 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message. 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!send_preferred_size_changes_ || !webview()) 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::Size size = webview()->contentsPreferredMinimumSize(); 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // In the presence of zoom, these sizes are still reported as if unzoomed, 402858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // so we need to adjust. 402958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch double zoom_factor = ZoomLevelToZoomFactor(webview()->zoomLevel()); 403058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch size.set_width(static_cast<int>(size.width() * zoom_factor)); 403158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch size.set_height(static_cast<int>(size.height() * zoom_factor)); 403258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size == preferred_size_) 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_ = size; 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidContentsPreferredSizeChange(routing_id_, 40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size_)); 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BrowserPluginManager* RenderViewImpl::GetBrowserPluginManager() { 4042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!browser_plugin_manager_.get()) 40432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager_ = BrowserPluginManager::Create(this); 4044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return browser_plugin_manager_.get(); 40452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 40462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderViewImpl::EnsureMediaStreamClient() { 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!RenderThreadImpl::current()) // Will be NULL during unit tests. 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 40522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableWebRTC)) 40532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 40542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 40552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!media_stream_dispatcher_) 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_dispatcher_ = new MediaStreamDispatcher(this); 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!media_stream_client_) { 40617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaStreamImpl* media_stream_impl = new MediaStreamImpl( 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_stream_dispatcher_, 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->GetMediaStreamDependencyFactory()); 40657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_stream_client_ = media_stream_impl; 40667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch web_user_media_client_ = media_stream_impl; 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didChangeContentsSize(WebFrame* frame, 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebSize& size) { 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame() != frame) 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* frameView = frame->view(); 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frameView) 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_horizontal_scrollbar = frame->hasHorizontalScrollbar(); 40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_vertical_scrollbar = frame->hasVerticalScrollbar(); 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_horizontal_scrollbar != cached_has_main_frame_horizontal_scrollbar_ || 40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_vertical_scrollbar != cached_has_main_frame_vertical_scrollbar_) { 40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidChangeScrollbarsForMainFrame( 40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, has_horizontal_scrollbar, has_vertical_scrollbar)); 40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_has_main_frame_horizontal_scrollbar_ = has_horizontal_scrollbar; 40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_has_main_frame_vertical_scrollbar_ = has_vertical_scrollbar; 40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::UpdateScrollState(WebFrame* frame) { 40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize offset = frame->scrollOffset(); 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize minimum_offset = frame->minimumScrollOffset(); 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize maximum_offset = frame->maximumScrollOffset(); 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_pinned_to_left = offset.width <= minimum_offset.width; 40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_pinned_to_right = offset.width >= maximum_offset.width; 40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_pinned_to_left != cached_is_main_frame_pinned_to_left_ || 41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_pinned_to_right != cached_is_main_frame_pinned_to_right_) { 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidChangeScrollOffsetPinningForMainFrame( 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, is_pinned_to_left, is_pinned_to_right)); 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_is_main_frame_pinned_to_left_ = is_pinned_to_left; 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cached_is_main_frame_pinned_to_right_ = is_pinned_to_right; 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ViewHostMsg_DidChangeScrollOffset(routing_id_)); 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didChangeScrollOffset(WebFrame* frame) { 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartNavStateSyncTimerIfNecessary(); 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()->mainFrame() == frame) 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateScrollState(frame); 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, observers_, DidChangeScrollOffset(frame)); 41202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::willInsertBody(WebKit::WebFrame* frame) { 4123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didFirstVisuallyNonEmptyLayout(WebFrame* frame) { 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame != webview()->mainFrame()) 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* data = 4131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDataSource(frame->dataSource()); 4132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data->set_did_first_visually_non_empty_layout(true); 4133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update body background color if necessary. 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor bg_color = webwidget_->backgroundColor(); 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If not initialized, default to white. Note that 0 is different from black 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as black still has alpha 0xFF. 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bg_color) 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bg_color = SK_ColorWHITE; 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bg_color != body_background_color_) { 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) body_background_color_ = bg_color; 4145bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Send(new ViewHostMsg_DidChangeBodyBackgroundColor( 4146bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GetRoutingID(), bg_color)); 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SendFindReply(int request_id, 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int match_count, 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ordinal, 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& selection_rect, 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_status_update) { 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_Find_Reply(routing_id_, 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_count, 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_rect, 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ordinal, 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status_update)); 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 41652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::ShouldUpdateSelectionTextFromContextMenuParams( 41662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& selection_text, 41672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t selection_text_offset, 41682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::Range& selection_range, 41692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ContextMenuParams& params) { 41702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 trimmed_selection_text; 41712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!selection_text.empty() && !selection_range.is_empty()) { 41722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int start = selection_range.GetMin() - selection_text_offset; 41732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t length = selection_range.length(); 41742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (start >= 0 && start + length <= selection_text.length()) { 41752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(selection_text.substr(start, length), TRIM_ALL, 41762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &trimmed_selection_text); 41772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 41782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 41792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 trimmed_params_text; 41802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(params.selection_text, TRIM_ALL, &trimmed_params_text); 41812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return trimmed_params_text != trimmed_selection_text; 41822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 41832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::reportFindInPageMatchCount(int request_id, 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count, 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update) { 4187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // TODO(jam): switch PepperPluginInstanceImpl to take a RenderFrame 4188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) main_render_frame_->reportFindInPageMatchCount( 4189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request_id, count, final_update); 41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::reportFindInPageSelection(int request_id, 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& selection_rect) { 4195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // TODO(jam): switch PepperPluginInstanceImpl to take a RenderFrame 4196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) main_render_frame_->reportFindInPageSelection( 4197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request_id, active_match_ordinal, selection_rect); 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::requestStorageQuota( 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame, 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebStorageQuotaType type, 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long requested_size, 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebStorageQuotaCallbacks* callbacks) { 4205bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::willCheckAndDispatchMessageEvent( 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* sourceFrame, 42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* targetFrame, 42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebSecurityOrigin target_origin, 42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebDOMMessageEvent event) { 42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_swapped_out_) 42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewMsg_PostMessage_Params params; 42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.data = event.data().toString(); 42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.source_origin = event.origin(); 42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target_origin.isNull()) 42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.target_origin = target_origin.toString(); 42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Include the routing ID for the source frame, which the browser process 42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will translate into the routing ID for the equivalent frame in the target 42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process. 42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.source_routing_id = MSG_ROUTING_NONE; 42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* source_view = FromWebView(sourceFrame->view()); 42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_view) 42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.source_routing_id = source_view->routing_id(); 42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_RouteMessageEvent(routing_id_, params)); 42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willOpenSocketStream( 42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSocketStreamHandle* handle) { 4236bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::willStartUsingPeerConnectionHandler( 42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, WebKit::WebRTCPeerConnectionHandler* handler) { 4241bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)WebKit::WebString RenderViewImpl::acceptLanguages() { 42457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return WebString::fromUTF8(renderer_preferences_.accept_languages); 42467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 42477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString RenderViewImpl::userAgentOverride( 42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, 42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebURL& url) { 4251bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 4252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebString(); 4253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 4254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebString RenderViewImpl::doNotTrackValue(WebFrame* frame) { 4256bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 4257bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return WebKit::WebString(); 42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::allowWebGL(WebFrame* frame, bool default_value) { 4261bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 4262bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return false; 42632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 42642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::didLoseWebGLContext( 42662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebFrame* frame, 42672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int arb_robustness_status_code) { 4268bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NOTREACHED(); 42692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 42702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit::WebPageSerializerClient implementation ------------------------------ 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::didSerializeDataForFrame( 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURL& frame_url, 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebCString& data, 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPageSerializerClient::PageSerializationStatus status) { 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_SendSerializedHtmlData( 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id(), 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url, 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.data(), 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int32>(status))); 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderView implementation --------------------------------------------------- 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::Send(IPC::Message* message) { 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RenderWidget::Send(message); 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::GetRoutingID() const { 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return routing_id_; 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::GetPageId() const { 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_id_; 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size RenderViewImpl::GetSize() const { 42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size(); 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPreferences& RenderViewImpl::GetWebkitPreferences() { 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_preferences_; 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::SetWebkitPreferences(const WebPreferences& preferences) { 43072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnUpdateWebPreferences(preferences); 43082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 43092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebView* RenderViewImpl::GetWebView() { 43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webview(); 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNode RenderViewImpl::GetFocusedNode() const { 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebNode(); 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* focused_frame = webview()->focusedFrame(); 43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focused_frame) { 43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument doc = focused_frame->document(); 43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!doc.isNull()) 43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return doc.focusedNode(); 43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebNode(); 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNode RenderViewImpl::GetContextMenuNode() const { 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return context_menu_node_; 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::IsEditableNode(const WebNode& node) const { 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node.isNull()) 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node.isContentEditable()) 43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node.isElementNode()) { 43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebElement& element = node.toConst<WebElement>(); 43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (element.isTextFormControlElement()) 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also return true if it has an ARIA role of 'textbox'. 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < element.attributeCount(); ++i) { 43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LowerCaseEqualsASCII(element.attributeLocalName(i), "role")) { 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LowerCaseEqualsASCII(element.attributeValue(i), "textbox")) 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebPlugin* RenderViewImpl::CreatePlugin( 43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, 4358ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const WebPluginInfo& info, 43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebPluginParams& params) { 43603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 43613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool pepper_plugin_was_registered = false; 43623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<PluginModule> pepper_module(PluginModule::Create( 43633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch this, info, &pepper_plugin_was_registered)); 43643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (pepper_plugin_was_registered) { 43653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (pepper_module.get()) 43663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return new PepperWebPluginImpl(pepper_module.get(), params, AsWeakPtr()); 43673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 43682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4369ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return new WebPluginImpl(frame, params, info.path, AsWeakPtr()); 43703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#else 43713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return NULL; 43723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::EvaluateScript(const string16& frame_xpath, 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& jscript, 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_result) { 43792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v8::HandleScope handle_scope; 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Handle<v8::Value> result; 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetChildFrame(frame_xpath); 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_frame) 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = web_frame->executeScriptAndReturnValue(WebScriptSource(jscript)); 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (notify_result) { 43852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue list; 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.IsEmpty() && web_frame) { 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Local<v8::Context> context = web_frame->mainWorldScriptContext(); 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::Context::Scope context_scope(context); 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V8ValueConverterImpl converter; 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter.SetDateAllowed(true); 43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter.SetRegExpAllowed(true); 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* result_value = converter.FromV8Value(result, context); 43932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list.Set(0, result_value ? result_value : base::Value::CreateNullValue()); 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 43952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list.Set(0, base::Value::CreateNullValue()); 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ScriptEvalResponse(routing_id_, id, list)); 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::ShouldDisplayScrollbars(int width, int height) const { 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (!send_preferred_size_changes_ || 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (disable_scrollbars_size_limit_.width() <= width || 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disable_scrollbars_size_limit_.height() <= height)); 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::GetEnabledBindings() const { 44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enabled_bindings_; 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::GetContentStateImmediately() const { 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return send_content_state_immediately_; 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float RenderViewImpl::GetFilteredTimePerFrame() const { 44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return filtered_time_per_frame(); 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderViewImpl::ShowContextMenu(ContextMenuClient* client, 44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ContextMenuParams& params) { 44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(client); // A null client means "internal" when we issue callbacks. 44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMenuParams our_params(params); 44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) our_params.custom_context.request_id = pending_context_menus_.Add(client); 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ContextMenu(routing_id_, our_params)); 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return our_params.custom_context.request_id; 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::CancelContextMenu(int request_id) { 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(pending_context_menus_.Lookup(request_id)); 44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_context_menus_.Remove(request_id); 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const { 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return visibilityState(); 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::RunModalAlertDialog(WebKit::WebFrame* frame, 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebString& message) { 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runModalAlertDialog(frame, message); 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::LoadURLExternally( 44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebURLRequest& request, 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebNavigationPolicy policy) { 4446bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch main_render_frame_->loadURLExternally(frame, request, policy); 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4449ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderViewImpl::DidStartLoading() { 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didStartLoading(); 44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4453ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RenderViewImpl::DidStopLoading() { 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didStopLoading(); 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidPlay(WebKit::WebMediaPlayer* player) { 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_MediaNotification(routing_id_, 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<int64>(player), 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->hasVideo(), 44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->hasAudio(), 44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true)); 44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidPause(WebKit::WebMediaPlayer* player) { 44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_MediaNotification(routing_id_, 44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<int64>(player), 44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->hasVideo(), 44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->hasAudio(), 44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::PlayerGone(WebKit::WebMediaPlayer* player) { 44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidPause(player); 44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SyncNavigationState() { 44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebHistoryItem& item = webview()->mainFrame()->currentHistoryItem(); 44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendUpdateState(item); 44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::SyncSelectionIfRequired() { 44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->focusedFrame(); 44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 text; 44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t offset; 44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Range range; 44933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 44943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 44953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->GetSurroundingText(&text, &range); 44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = 0; // Pepper API does not support offset reporting. 44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba): cut as needed. 44983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else 44993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 45003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch { 45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t location, length; 45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()->caretOrSelectionRange(&location, &length)) 45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range = ui::Range(location, location + length); 45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (webview()->textInputInfo().type != WebKit::WebTextInputTypeNone) { 45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If current focused element is editable, we will send 100 more chars 45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before and after selection. It is for input method surrounding text 45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // feature. 45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (location > kExtraCharsBeforeAndAfterSelection) 45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = location - kExtraCharsBeforeAndAfterSelection; 45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = 0; 45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length = location + length - offset + kExtraCharsBeforeAndAfterSelection; 45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRange webrange = WebRange::fromDocumentRange(frame, offset, length); 45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webrange.isNull()) 45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = WebRange::fromDocumentRange(frame, offset, length).toPlainText(); 45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset = location; 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = frame->selectionAsText(); 45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/101435 45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In some case, frame->selectionAsText() returned text's length is not 45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equal to the length returned from webview()->caretOrSelectionRange(). 45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // So we have to set the range according to text.length(). 45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range.set_end(range.start() + text.length()); 45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sometimes we get repeated didChangeSelection calls from webkit when 45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the selection hasn't actually changed. We don't want to report these 45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because it will cause us to continually claim the X clipboard. 45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_text_offset_ != offset || 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_range_ != range || 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_ != text) { 45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_ = text; 45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_text_offset_ = offset; 45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_range_ = range; 45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_SelectionChanged(routing_id_, text, offset, range)); 45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateSelectionBounds(); 45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL RenderViewImpl::GetAlternateErrorPageURL(const GURL& failed_url, 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorPageType error_type) { 45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (failed_url.SchemeIsSecure()) { 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL that failed was secure, then the embedding web page was not 45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expecting a network attacker to be able to manipulate its contents. As 45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we fetch alternate error pages over HTTP, we would be allowing a network 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attacker to manipulate the contents of the response if we tried to use 45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the link doctor here. 45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(); 45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Grab the base URL from the browser process. 45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!alternate_error_page_url_.is_valid()) 45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(); 45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Strip query params from the failed URL. 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL::Replacements remove_params; 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_params.ClearUsername(); 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_params.ClearPassword(); 45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_params.ClearQuery(); 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_params.ClearRef(); 45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url_to_send = failed_url.ReplaceComponents(remove_params); 45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string spec_to_send = url_to_send.spec(); 45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify link doctor of the url truncation by sending of "?" at the end. 45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (failed_url.has_query()) 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spec_to_send.append("?"); 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the query params to send to link doctor. 45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string params(alternate_error_page_url_.query()); 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("&url="); 45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append(net::EscapeQueryParamValue(spec_to_send, true)); 45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("&sourceid=chrome"); 45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("&error="); 45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (error_type) { 45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DNS_ERROR: 45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("dnserror"); 45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case HTTP_404: 45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("http404"); 45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CONNECTION_ERROR: 45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.append("connectionfailure"); 45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "unknown ErrorPageType"; 45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OK, build the final url to return. 45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL::Replacements link_doctor_params; 45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_doctor_params.SetQueryStr(params); 45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = alternate_error_page_url_.ReplaceComponents(link_doctor_params); 45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL RenderViewImpl::GetLoadingUrl(WebKit::WebFrame* frame) const { 46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ds->hasUnreachableURL()) 46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ds->unreachableURL(); 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLRequest& request = ds->request(); 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return request.url(); 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebPlugin* RenderViewImpl::GetWebPluginFromPluginDocument() { 46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webview()->mainFrame()->document().to<WebPluginDocument>().plugin(); 46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnFind(int request_id, 46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& search_text, 46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebFindOptions& options) { 46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the plugin still exists in the document. 46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (main_frame->document().isPluginDocument() && 46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWebPluginFromPluginDocument()) { 46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (options.findNext) { 46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Just navigate back/forward. 46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWebPluginFromPluginDocument()->selectFindResult(options.forward); 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWebPluginFromPluginDocument()->startFind( 46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_text, options.matchCase, request_id)) { 46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send "no results". 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFindReply(request_id, 0, 0, gfx::Rect(), true); 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame_after_main = main_frame->traverseNext(true); 46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* focused_frame = webview()->focusedFrame(); 46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* search_frame = focused_frame; // start searching focused frame. 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool multi_frame = (frame_after_main != main_frame); 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have multiple frames, we don't want to wrap the search within the 46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame, so we check here if we only have main_frame in the chain. 46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool wrap_within_frame = !multi_frame; 46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRect selection_rect; 46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = false; 46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If something is selected when we start searching it means we cannot just 46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // increment the current match ordinal; we need to re-generate it. 46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRange current_selection = focused_frame->selectionRange(); 46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = search_frame->find( 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, search_text, options, wrap_within_frame, &selection_rect); 46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) { 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't leave text selected as you move to the next frame. 4658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_frame->executeCommand(WebString::fromUTF8("Unselect"), 4659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the next frame, but skip the invisible ones. 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What is the next frame to search? (we might be going backwards). Note 46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that we specify wrap=true so that search_frame never becomes NULL. 46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame = options.forward ? 46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame->traverseNext(true) : 46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame->traversePrevious(true); 46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (!search_frame->hasVisibleContent() && 46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame != focused_frame); 46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure selection doesn't affect the search operation in new frame. 4672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) search_frame->executeCommand(WebString::fromUTF8("Unselect"), 4673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have multiple frames and we have wrapped back around to the 46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focused frame, we need to search it once more allowing wrap within 46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the frame, otherwise it will report 'no match' if the focused frame has 46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reported matches, but no frames after the focused_frame contain a 46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // match for the search word(s). 46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (multi_frame && search_frame == focused_frame) { 46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = search_frame->find( 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, search_text, options, true, // Force wrapping. 46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &selection_rect); 46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setFocusedFrame(search_frame); 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (!result && search_frame != focused_frame); 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (options.findNext && current_selection.isNull()) { 46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the main_frame to report the actual count. 46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->increaseMatchCount(0, request_id); 46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If nothing is found, set result to "0 of 0", otherwise, set it to 46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "-1 of 1" to indicate that we found at least one item, but we don't know 46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // yet what is active. 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ordinal = result ? -1 : 0; // -1 here means, we might know more later. 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int match_count = result ? 1 : 0; // 1 here means possibly more coming. 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we find no matches then this will be our last status update. 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise the scoping effort will send more results. 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_status_update = !result; 47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFindReply(request_id, match_count, ordinal, selection_rect, 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status_update); 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scoping effort begins, starting with the mainframe. 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame = main_frame; 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->resetMatchCount(); 47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel all old scoping requests before starting a new one. 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame->cancelPendingScopingEffort(); 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't start another scoping effort unless at least one match has 47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been found. 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result) { 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start new scoping request. If the scoping function determines that it 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needs to scope, it will defer until later. 47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame->scopeStringMatches(request_id, 47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_text, 47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options, 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); // reset the tickmarks 47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterate to the next frame. The frame will not necessarily scope, for 47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // example if it is not visible. 47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_frame = search_frame->traverseNext(true); 47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (search_frame != main_frame); 47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnStopFinding(StopFindAction action) { 47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* view = webview(); 47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view) 47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument doc = view->mainFrame()->document(); 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc.isPluginDocument() && GetWebPluginFromPluginDocument()) { 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWebPluginFromPluginDocument()->stopFind(); 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool clear_selection = action == STOP_FIND_ACTION_CLEAR_SELECTION; 4746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (clear_selection) { 4747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect"), 4748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFocusedNode()); 4749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = view->mainFrame(); 47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (frame) { 47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->stopFinding(clear_selection); 47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame = frame->traverseNext(false); 47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (action == STOP_FIND_ACTION_ACTIVATE_SELECTION) { 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* focused_frame = view->focusedFrame(); 47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focused_frame) { 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument doc = focused_frame->document(); 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!doc.isNull()) { 47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebNode node = doc.focusedNode(); 47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node.isNull()) 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.simulateClick(); 47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnActivateNearestFindResult(int request_id, 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float x, float y) { 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRect selection_rect; 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ordinal = main_frame->selectNearestFindMatch(WebFloatPoint(x, y), 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &selection_rect); 47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ordinal == -1) { 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Something went wrong, so send a no-op reply (force the main_frame to 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // report the current match count) in case the host is waiting for a 47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response due to rate-limiting). 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->increaseMatchCount(0, request_id); 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFindReply(request_id, 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1 /* number_of_matches */, 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ordinal, 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_rect, 47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* final_update */); 47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnFindMatchRects(int current_version) { 47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::RectF> match_rects; 48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rects_version = main_frame->findMatchMarkersVersion(); 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_version != rects_version) { 48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFloatRect> web_match_rects; 48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->findMatchRects(web_match_rects); 48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_rects.reserve(web_match_rects.size()); 48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < web_match_rects.size(); ++i) 48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_rects.push_back(gfx::RectF(web_match_rects[i])); 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::RectF active_rect = main_frame->activeFindMatchRect(); 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_FindMatchRects_Reply(routing_id_, 48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rects_version, 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) match_rects, 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_rect)); 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnZoom(PageZoom zoom) { 48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) // Not sure if this can happen, but no harm in being safe. 48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->hidePopups(); 48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double old_zoom_level = webview()->zoomLevel(); 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double zoom_level; 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (zoom == PAGE_ZOOM_RESET) { 48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = 0; 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (static_cast<int>(old_zoom_level) == old_zoom_level) { 48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Previous zoom level is a whole number, so just increment/decrement. 48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = old_zoom_level + zoom; 48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Either the user hit the zoom factor limit and thus the zoom level is now 48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not a whole number, or a plugin changed it to a custom value. We want 48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to go to the next whole number so that the user can always get back to 48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 100% with the keyboard/menu. 48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((old_zoom_level > 1 && zoom > 0) || 48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (old_zoom_level < 1 && zoom < 0)) { 48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = static_cast<int>(old_zoom_level + zoom); 48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're going towards 100%, so first go to the next whole number. 48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoom_level = static_cast<int>(old_zoom_level); 48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, zoom_level); 48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomLevelChanged(); 48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnZoomFactor(PageZoom zoom, int zoom_center_x, 48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom_center_y) { 48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZoomFactorHelper(zoom, zoom_center_x, zoom_center_y, 48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kScalingIncrementForGesture); 48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::ZoomFactorHelper(PageZoom zoom, 48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom_center_x, 48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int zoom_center_y, 48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scaling_increment) { 48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) // Not sure if this can happen, but no harm in being safe. 48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double old_page_scale_factor = webview()->pageScaleFactor(); 48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double page_scale_factor; 48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (zoom == PAGE_ZOOM_RESET) { 48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_scale_factor = 1.0; 48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_scale_factor = old_page_scale_factor + 48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (zoom > 0 ? scaling_increment : -scaling_increment); 48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_scale_factor > 0) { 48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setPageScaleFactor(page_scale_factor, 48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPoint(zoom_center_x, zoom_center_y)); 48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetZoomLevel(double zoom_level) { 48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->hidePopups(); 48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, zoom_level); 48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomLevelChanged(); 48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetZoomLevelForLoadingURL(const GURL& url, 48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double zoom_level) { 48842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID) 48852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Android, page zoom isn't used, and in case of WebView, text zoom is used 48862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for legacy WebView text scaling emulation. Thus, the code that resets 48872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the zoom level from this map will be effectively resetting text zoom level. 48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_zoom_levels_[url] = zoom_level; 48892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetPageEncoding(const std::string& encoding_name) { 48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setPageEncoding(WebString::fromUTF8(encoding_name)); 48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnResetPageEncodingToDefault() { 48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString no_encoding; 48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setPageEncoding(no_encoding); 48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebFrame* RenderViewImpl::GetChildFrame(const string16& xpath) const { 49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xpath.empty()) 49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webview()->mainFrame(); 49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // xpath string can represent a frame deep down the tree (across multiple 49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame DOMs). 49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Example, /html/body/table/tbody/tr/td/iframe\n/frameset/frame[0] 49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should break into 2 xpaths 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // /html/body/table/tbody/tr/td/iframe & /frameset/frame[0] 49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16> xpaths; 49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(xpath, '\n', &xpaths); 49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->mainFrame(); 49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<string16>::const_iterator i = xpaths.begin(); 49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame && i != xpaths.end(); ++i) { 49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame = frame->findChildByExpression(*i); 49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame; 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnScriptEvalRequest(const string16& frame_xpath, 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& jscript, 49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_result) { 4926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_INSTANT0("test_tracing", "OnScriptEvalRequest", 4927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EvaluateScript(frame_xpath, jscript, id, notify_result); 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnPostMessageEvent( 49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewMsg_PostMessage_Params& params) { 4933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(nasko): Support sending to subframes. 49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = webview()->mainFrame(); 49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the source frame if it exists. 49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* source_frame = NULL; 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.source_routing_id != MSG_ROUTING_NONE) { 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* source_view = FromRoutingID(params.source_routing_id); 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source_view) 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_frame = source_view->webview()->mainFrame(); 49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an event with the message. The final parameter to initMessageEvent 49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is the last event ID, which is not used with postMessage. 49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDOMEvent event = frame->document().createEvent("MessageEvent"); 49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDOMMessageEvent msg_event = event.to<WebDOMMessageEvent>(); 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg_event.initMessageEvent("message", 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |canBubble| and |cancellable| are always false 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, false, 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSerializedScriptValue::fromString(params.data), 49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.source_origin, source_frame, ""); 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must pass in the target_origin to do the security check on this side, 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since it may have changed since the original postMessage call was made. 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSecurityOrigin target_origin; 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!params.target_origin.empty()) { 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_origin = 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSecurityOrigin::createFromString(WebString(params.target_origin)); 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->dispatchMessageEventWithOriginCheck(target_origin, msg_event); 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnCSSInsertRequest(const string16& frame_xpath, 49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& css) { 49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetChildFrame(frame_xpath); 49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().insertUserStyleSheet( 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(css), 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument::UserStyleAuthorLevel); 49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnAllowBindings(int enabled_bindings_flags) { 49762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((enabled_bindings_flags & BINDINGS_POLICY_WEB_UI) && 49772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !(enabled_bindings_ & BINDINGS_POLICY_WEB_UI)) { 49783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // WebUI uses <dialog> which is not yet enabled by default in Chrome. 49793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebRuntimeFeatures::enableDialogElement(true); 49803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 49812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderThread::Get()->RegisterExtension(WebUIExtension::Get()); 49822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new WebUIExtensionData(this); 49832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 49842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_bindings_ |= enabled_bindings_flags; 49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep track of the total bindings accumulated in this process. 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcess::current()->AddBindings(enabled_bindings_flags); 49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderViewImpl::OnDragTargetDragEnter(const DropData& drop_data, 49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& client_point, 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& screen_point, 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperationsMask ops, 49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key_modifiers) { 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperation operation = webview()->dragTargetDragEnter( 4997eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DropDataToWebDragData(drop_data), 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_point, 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_point, 50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ops, 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_modifiers); 50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new DragHostMsg_UpdateDragCursor(routing_id_, operation)); 50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragTargetDragOver(const gfx::Point& client_point, 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& screen_point, 50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperationsMask ops, 50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key_modifiers) { 50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperation operation = webview()->dragTargetDragOver( 50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_point, 50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_point, 50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ops, 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_modifiers); 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new DragHostMsg_UpdateDragCursor(routing_id_, operation)); 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragTargetDragLeave() { 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragTargetDragLeave(); 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragTargetDrop(const gfx::Point& client_point, 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& screen_point, 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key_modifiers) { 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragTargetDrop(client_point, screen_point, key_modifiers); 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new DragHostMsg_TargetDrop_ACK(routing_id_)); 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragSourceEndedOrMoved(const gfx::Point& client_point, 50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& screen_point, 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ended, 50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragOperation op) { 50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ended) { 50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragSourceEndedAt(client_point, screen_point, op); 50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragSourceMovedTo(client_point, screen_point, op); 50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDragSourceSystemDragEnded() { 50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dragSourceSystemDragEnded(); 50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnUpdateWebPreferences(const WebPreferences& prefs) { 50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_preferences_ = prefs; 50483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ApplyWebPreferences(webkit_preferences_, webview()); 50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnUpdateTimezone() { 50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyTimezoneChange(webview()->mainFrame()); 50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetAltErrorPageURL(const GURL& url) { 50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alternate_error_page_url_ = url; 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnCustomContextMenuAction( 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CustomContextMenuContext& custom_context, 50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned action) { 50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_context.request_id) { 50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External context menu request, look in our map. 50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMenuClient* client = 50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_context_menus_.Lookup(custom_context.request_id); 50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client) 50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->OnMenuAction(custom_context.request_id, action); 50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal request, forward to WebKit. 50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->performCustomContextMenuAction(action); 50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnEnumerateDirectoryResponse( 50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 50772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>& paths) { 50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!enumeration_completions_[id]) 50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebString> ws_file_names(paths.size()); 50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < paths.size(); ++i) 5083eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ws_file_names[i] = paths[i].AsUTF16Unsafe(); 50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enumeration_completions_[id]->didChooseFile(ws_file_names); 50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enumeration_completions_.erase(id); 50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnFileChooserResponse( 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::SelectedFileInfo>& files) { 50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This could happen if we navigated to a different page before the user 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closed the chooser. 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.empty()) 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert Chrome's SelectedFileInfo list to WebKit's. 50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFileChooserCompletion::SelectedFileInfo> selected_files( 50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) files.size()); 50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < files.size(); ++i) { 51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion::SelectedFileInfo selected_file; 5101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch selected_file.path = files[i].local_path.AsUTF16Unsafe(); 5102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch selected_file.displayName = 5103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath(files[i].display_name).AsUTF16Unsafe(); 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_files[i] = selected_file; 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.front()->completion) 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.front()->completion->didChooseFile( 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_files); 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.pop_front(); 51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there are more pending file chooser requests, schedule one now. 51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_chooser_completions_.empty()) { 51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_RunFileChooser(routing_id_, 51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.front()->params)); 51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnEnableAutoResize(const gfx::Size& min_size, 51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& max_size) { 51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(disable_scrollbars_size_limit_.IsEmpty()); 51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 51242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_resize_mode_ = true; 51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->enableAutoResizeMode(min_size, max_size); 51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDisableAutoResize(const gfx::Size& new_size) { 51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(disable_scrollbars_size_limit_.IsEmpty()); 51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 51322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_resize_mode_ = false; 51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->disableAutoResizeMode(); 51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 513590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!new_size.IsEmpty()) { 513690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Resize(new_size, 513790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) physical_backing_size_, 513890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) overdraw_bottom_height_, 513990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resizer_rect_, 514090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) is_fullscreen_, 514190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NO_RESIZE_ACK); 514290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnEnablePreferredSizeChangedMode() { 51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_preferred_size_changes_) 51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_preferred_size_changes_ = true; 51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start off with an initial preferred size notification (in case 51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |didUpdateLayout| was already called). 51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didUpdateLayout(); 51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDisableScrollbarsForSmallWindows( 51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& disable_scrollbar_size_limit) { 51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disable_scrollbars_size_limit_ = disable_scrollbar_size_limit; 51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetRendererPrefs( 51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RendererPreferences& renderer_prefs) { 51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double old_zoom_level = renderer_preferences_.default_zoom_level; 51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_preferences_ = renderer_prefs; 51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateFontRenderingFromRendererPrefs(); 51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_DEFAULT_RENDER_THEME) || defined(TOOLKIT_GTK) 51672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (renderer_prefs.use_custom_colors) { 51682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebColorName name = WebKit::WebColorWebkitFocusRingColor; 51692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::setNamedColors(&name, &renderer_prefs.focus_ring_color, 1); 51702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::setCaretBlinkInterval(renderer_prefs.caret_blink_interval); 51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 51722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::NativeTheme::instance()->SetScrollbarColors( 51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_prefs.thumb_inactive_color, 51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_prefs.thumb_active_color, 51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_prefs.track_color); 51762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(TOOLKIT_GTK) 51772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webview()) { 51792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(TOOLKIT_GTK) 51802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->setScrollbarColors( 51812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.thumb_inactive_color, 51822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.thumb_active_color, 51832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.track_color); 51842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(TOOLKIT_GTK) 51852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->setSelectionColors( 51862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.active_selection_bg_color, 51872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.active_selection_fg_color, 51882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.inactive_selection_bg_color, 51892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.inactive_selection_fg_color); 51902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->themeChanged(); 51912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(USE_DEFAULT_RENDER_THEME) || defined(TOOLKIT_GTK) 51942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (RenderThreadImpl::current()) // Will be NULL during unit tests. 51962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderThreadImpl::current()->SetFlingCurveParameters( 51972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.touchpad_fling_profile, 51982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_prefs.touchscreen_fling_profile); 51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the zoom level for this page matches the old zoom default, and this 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not a plugin, update the zoom level to match the new default. 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview() && !webview()->mainFrame()->document().isPluginDocument() && 52032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !ZoomValuesEqual(old_zoom_level, 52042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_preferences_.default_zoom_level) && 52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZoomValuesEqual(webview()->zoomLevel(), old_zoom_level)) { 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setZoomLevel(false, renderer_preferences_.default_zoom_level); 52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zoomLevelChanged(); 52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnMediaPlayerActionAt(const gfx::Point& location, 52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMediaPlayerAction& action) { 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->performMediaPlayerAction(action, location); 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnOrientationChangeEvent(int orientation) { 52183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, 52193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) observers_, 52203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) OrientationChangeEvent(orientation)); 52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->sendOrientationChangeEvent(orientation); 52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnPluginActionAt(const gfx::Point& location, 52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPluginAction& action) { 52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->performPluginAction(action, location); 52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnGetAllSavableResourceLinksForCurrentPage( 52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url) { 52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare list to storage all savable resource links. 52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> resources_list; 52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> referrer_urls_list; 52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebKit::WebReferrerPolicy> referrer_policies_list; 52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> frames_list; 523790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SavableResourcesResult result(&resources_list, 523890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &referrer_urls_list, 523990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &referrer_policies_list, 524090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &frames_list); 52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // webkit/ doesn't know about Referrer. 524390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!GetAllSavableResourceLinksForCurrentPage( 52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview(), 52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_url, 52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result, 52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const char**>(GetSavableSchemes()))) { 52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If something is wrong when collecting all savable resource links, 52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // send empty list to embedder(browser) to tell it failed. 52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer_urls_list.clear(); 52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer_policies_list.clear(); 52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_list.clear(); 52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_list.clear(); 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Referrer> referrers_list; 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(referrer_urls_list.size(), referrer_policies_list.size()); 52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < referrer_urls_list.size(); ++i) { 52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrers_list.push_back( 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(referrer_urls_list[i], referrer_policies_list[i])); 52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send result of all savable resource links to embedder. 52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_SendCurrentPageAllSavableResourceLinks(routing_id(), 52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources_list, 52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrers_list, 52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frames_list)); 52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnGetSerializedHtmlDataForCurrentPageWithLocalLinks( 52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& links, 52722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>& local_paths, 52732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& local_directory_name) { 52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert std::vector of GURLs to WebVector<WebURL> 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebURL> weburl_links(links); 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Convert std::vector of base::FilePath to WebVector<WebString> 52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebString> webstring_paths(local_paths.size()); 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < local_paths.size(); i++) 5281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch webstring_paths[i] = local_paths[i].AsUTF16Unsafe(); 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPageSerializer::serialize(webview()->mainFrame(), true, this, weburl_links, 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webstring_paths, 5285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch local_directory_name.AsUTF16Unsafe()); 52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnShouldClose() { 52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); 52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_close = webview()->dispatchBeforeUnloadEvent(); 52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); 52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ShouldClose_ACK(routing_id_, should_close, 52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) before_unload_start_time, 52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) before_unload_end_time)); 52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewImpl::OnSwapOut() { 52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only run unload if we're not swapped out yet, but send the ack either way. 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_swapped_out_) { 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap this RenderView out so the tab can navigate to a page rendered by a 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different process. This involves running the unload handler and clearing 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page. Once WasSwappedOut is called, we also allow this process to 53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exit if there are no other active RenderViews in it. 53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send an UpdateState message before we get swapped out. 53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncNavigationState(); 53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronously run the unload handler before sending the ACK. 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dispatchUnloadEvent(); 53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap out and stop sending any IPC messages that are not ACKs. 53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSwappedOut(true); 53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Now that we're swapped out and filtering IPC messages, stop loading to 5315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // ensure that no other in-progress navigation continues. We do this here 5316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // to avoid sending a DidStopLoading message to the browser process. 5317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnStop(); 5318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace the page with a blank dummy URL. The unload handler will not be 53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // run a second time, thanks to a check in FrameLoader::stopLoading. 53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): Need to add a better way to do this that avoids running the 53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // beforeunload handler. For now, we just run it a second time silently. 53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToSwappedOutURL(webview()->mainFrame()); 53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let WebKit know that this view is hidden so it can drop resources and 53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stop compositing. 53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setVisibilityState(WebKit::WebPageVisibilityStateHidden, false); 53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new ViewHostMsg_SwapOut_ACK(routing_id_)); 53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::NavigateToSwappedOutURL(WebKit::WebFrame* frame) { 53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use loadRequest instead of loadHTMLString because the former commits 53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synchronously. Otherwise a new navigation can interrupt the navigation 53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to kSwappedOutURL. If that happens to be to the page we had been 53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // showing, then WebKit will never send a commit and we'll be left spinning. 53382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(is_swapped_out_); 53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL swappedOutURL(kSwappedOutURL); 53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebURLRequest request(swappedOutURL); 53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->loadRequest(request); 53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnClosePage() { 53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, ClosePage()); 53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(creis): We'd rather use webview()->Close() here, but that currently 53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sets the WebView's delegate_ to NULL, preventing any JavaScript dialogs 53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the onunload handler from appearing. For now, we're bypassing that and 53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calling the FrameLoader's CloseURL method directly. This should be 53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // revisited to avoid having two ways to close a page. Having a single way 53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to close that can run onunload is also useful for fixing 53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://b/issue?id=753080. 53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->dispatchUnloadEvent(); 53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_ClosePage_ACK(routing_id_)); 53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnThemeChanged() { 53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Aura doesn't care if we switch themes. 53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::NativeThemeWin::instance()->CloseHandles(); 53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->themeChanged(); 53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // defined(OS_WIN) 53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(port): we don't support theming on non-Windows platforms yet 53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnDisassociateFromPopupCount() { 53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decrement_shared_popup_at_destruction_) 53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_->data--; 53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_popup_counter_ = new SharedRenderViewCounter(0); 53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrement_shared_popup_at_destruction_ = false; 53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::MaybeLoadAlternateErrorPage(WebFrame* frame, 53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLError& error, 53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool replace) { 53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only show alternate error pages in the main frame. They are 53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intended to assist the user when navigating, so there is not much 53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value in showing them for failed subframes. Ideally, we would be 53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // able to use the TYPED transition type for this, but that flag is 53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not preserved across page reloads. 53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame->parent()) 53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the alternate error page service if this is a DNS failure or 53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // connection failure. 53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ec = error.reason; 53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ec != net::ERR_NAME_NOT_RESOLVED && 53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec != net::ERR_CONNECTION_FAILED && 53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec != net::ERR_CONNECTION_REFUSED && 53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec != net::ERR_ADDRESS_UNREACHABLE && 53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec != net::ERR_CONNECTION_TIMED_OUT) { 53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& error_page_url = GetAlternateErrorPageURL(error.unreachableURL, 54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ec == net::ERR_NAME_NOT_RESOLVED ? DNS_ERROR : CONNECTION_ERROR); 54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!error_page_url.is_valid()) 54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 5406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebURLRequest& failed_request = ds->request(); 5407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load an empty page first so there is an immediate response to the error, 54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and then kick off a request for the alternate error page. 54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->loadHTMLString(std::string(), 54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(kUnreachableWebDataURL), 54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error.unreachableURL, 54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replace); 54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, create a fetcher for the error page and associate it with the data 54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // source we just created via the LoadHTMLString call. That way if another 54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation occurs, the fetcher will get destroyed. 5418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* internal_data = 5419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDataSource(frame->provisionalDataSource()); 5420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal_data->set_alt_error_page_fetcher( 54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new AltErrorPageResourceFetcher( 5422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) error_page_url, frame, failed_request, error, 54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RenderViewImpl::AltErrorPageFinished, 54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)))); 54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::AltErrorPageFinished(WebFrame* frame, 5429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebURLRequest& original_request, 54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebURLError& original_error, 54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html) { 54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here, we replace the blank page we loaded previously. 54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we failed to download the alternate error page, LoadNavigationErrorPage 54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will simply display a default error page. 5435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadNavigationErrorPage(frame, original_request, original_error, html, true); 54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnMoveOrResizeStarted() { 54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->hidePopups(); 54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 544390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderViewImpl::OnResize(const ViewMsg_Resize_Params& params) { 54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) { 54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->hidePopups(); 54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_preferred_size_changes_) { 54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->mainFrame()->setCanHaveScrollbars( 544890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShouldDisplayScrollbars(params.new_size.width(), 544990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.new_size.height())); 54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateScrollState(webview()->mainFrame()); 54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderWidget::OnResize(params); 54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::WillInitiatePaint() { 54583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 54593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Notify all of our instances that we started painting. This is used for 54603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // internal bookkeeping only, so we know that the set can not change under 54613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // us. 54623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 54633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) 54643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->ViewWillInitiatePaint(); 54653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidInitiatePaint() { 54693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 54703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Notify all instances that we painted. The same caveats apply as for 54713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // ViewFlushedPaint regarding instances closing themselves, so we take 54723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // similar precautions. 54733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginSet plugins = active_pepper_instances_; 54743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) { 54753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (active_pepper_instances_.find(*i) != active_pepper_instances_.end()) 54763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->ViewInitiatedPaint(); 54773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 54783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidFlushPaint() { 54823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 54833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Notify all instances that we flushed. This will call into the plugin, and 54843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // we it may ask to close itself as a result. This will, in turn, modify our 54853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // set, possibly invalidating the iterator. So we iterate on a copy that 54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // won't change out from under us. 54873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginSet plugins = active_pepper_instances_; 54883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) { 54893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // The copy above makes sure our iterator is never invalid if some plugins 54903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // are destroyed. But some plugin may decide to close all of its views in 54913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // response to a paint in one of them, so we need to make sure each one is 54923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // still "current" before using it. 54933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // 54943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // It's possible that a plugin was destroyed, but another one was created 54953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // with the same address. In this case, we'll call ViewFlushedPaint on that 54963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // new plugin. But that's OK for this particular case since we're just 54973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // notifying all of our instances that the view flushed, and the new one is 54983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // one of our instances. 54993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // 55003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // What about the case where a new one is created in a callback at a new 55013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // address and we don't issue the callback? We're still OK since this 55023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // callback is used for flush callbacks and we could not have possibly 55033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // started a new paint (ViewWillInitiatePaint) for the new plugin while 55043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // processing a previous paint for an existing one. 55053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (active_pepper_instances_.find(*i) != active_pepper_instances_.end()) 55063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->ViewFlushedPaint(); 55073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 55083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the RenderWidget is closing down then early-exit, otherwise we'll crash. 55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See crbug.com/112921. 55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we have a provisional frame we are between the start and commit stages 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of loading and we don't want to save stats. 55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_frame->provisionalDataSource()) { 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDataSource* ds = main_frame->dataSource(); 55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 5522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData* data = 5523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 5524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (data->did_first_visually_non_empty_layout() && 5525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !data->did_first_visually_non_empty_paint()) { 5526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data->set_did_first_visually_non_empty_paint(true); 5527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new ViewHostMsg_DidFirstVisuallyNonEmptyPaint(routing_id_, 5528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) page_id_)); 5529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jar): The following code should all be inside a method, probably in 55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigatorState. 55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time now = Time::Now(); 55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_state->first_paint_time().is_null()) { 55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_first_paint_time(now); 55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_state->first_paint_after_load_time().is_null() && 55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !document_state->finish_load_time().is_null()) { 55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_state->set_first_paint_after_load_time(now); 55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 554458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* RenderViewImpl::GetBitmapForOptimizedPluginPaint( 554558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Rect& paint_bounds, 554658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TransportDIB** dib, 554758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch gfx::Rect* location, 554858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch gfx::Rect* clip, 554958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch float* scale_factor) { 55503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 55513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 55523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) { 55533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperPluginInstanceImpl* instance = *i; 55543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // In Flash fullscreen , the plugin contents should be painted onto the 55553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // fullscreen widget instead of the web page. 55563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!instance->FlashIsFullscreenOrPending() && 55573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch instance->GetBitmapForOptimizedPluginPaint(paint_bounds, dib, location, 55583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch clip, scale_factor)) 55593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return *i; 55603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 55613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 55623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return NULL; 55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Vector2d RenderViewImpl::GetScrollOffset() { 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize scroll_offset = webview()->mainFrame()->scrollOffset(); 55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Vector2d(scroll_offset.width, scroll_offset.height); 55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnClearFocusedNode() { 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->clearFocusedNode(); 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetBackground(const SkBitmap& background) { 55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setIsTransparent(!background.empty()); 55782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (compositor_) 55792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_->setHasTransparentBackground(!background.empty()); 55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBackground(background); 55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { 55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accessibility_mode_ == new_mode) 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessibility_mode_ = new_mode; 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (renderer_accessibility_) { 55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete renderer_accessibility_; 55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_ = NULL; 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accessibility_mode_ == AccessibilityModeComplete) 55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_ = new RendererAccessibilityComplete(this); 55947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(OS_ANDROID) 55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (accessibility_mode_ == AccessibilityModeEditableTextOnly) 55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) renderer_accessibility_ = new RendererAccessibilityFocusOnly(this); 55977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetActive(bool active) { 56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview()) 56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setIsActive(active); 56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5604bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS) && defined(OS_MACOSX) 56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetWindowFocus(active); 56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetWindowVisibility(bool visible) { 5615bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS) 56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform plugins that their container has changed visibility. 56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetContainerVisibility(visible); 56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5622bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnWindowFrameChanged(const gfx::Rect& window_frame, 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& view_frame) { 5627bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS) 56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform plugins that their window's frame has changed. 56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->WindowFrameChanged(window_frame, view_frame); 56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5634bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnPluginImeCompositionCompleted(const string16& text, 56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_id) { 56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebPluginDelegateProxy is responsible for figuring out if this event 56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // applies to it or not, so inform all the delegates. 56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->ImeCompositionCompleted(text, plugin_id); 56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::Close() { 56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to grab a pointer to the doomed WebView before we destroy it. 56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* doomed = webview(); 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::Close(); 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_view_map.Get().erase(doomed); 56542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_routing_id_view_map.Get().erase(routing_id_); 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidHandleKeyEvent() { 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearEditCommands(); 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) { 5662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_menu_source_type_ = ui::MENU_SOURCE_MOUSE; 56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_.event_source = 56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE; 56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_.event_location = 56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(event.globalX, event.globalY); 56673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 56683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 56693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // This method is called for every mouse event that the render view receives. 56703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // And then the mouse event is forwarded to WebKit, which dispatches it to the 56713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // event target. Potentially a Pepper plugin will receive the event. 56723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // In order to tell whether a plugin gets the last mouse event and which it 56733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // is, we set |pepper_last_mouse_event_target_| to NULL here. If a plugin gets 56743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // the event, it will notify us via DidReceiveMouseEvent() and set itself as 56753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // |pepper_last_mouse_event_target_|. 56763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_last_mouse_event_target_ = NULL; 56773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the mouse is locked, only the current owner of the mouse lock can 56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process mouse events. 56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_lock_dispatcher_->WillHandleMouseEvent(event); 56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RenderViewImpl::WillHandleKeyEvent(const WebKit::WebKeyboardEvent& event) { 5685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_menu_source_type_ = ui::MENU_SOURCE_KEYBOARD; 56867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 56877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 56887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::WillHandleGestureEvent( 56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebGestureEvent& event) { 5691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_menu_source_type_ = ui::MENU_SOURCE_TOUCH; 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_.event_source = 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH; 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible_drag_event_info_.event_location = 56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(event.globalX, event.globalY); 56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidHandleMouseEvent(const WebMouseEvent& event) { 57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleMouseEvent(event)); 57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::DidHandleTouchEvent(const WebTouchEvent& event) { 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleTouchEvent(event)); 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::HasTouchEventHandlersAt(const gfx::Point& point) const { 57082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 57092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 57102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return webview()->hasTouchEventHandlersAt(point); 57112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 57122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnWasHidden() { 57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::OnWasHidden(); 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 57177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Inform RendererMediaPlayerManager to release all media player resources. 57182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unless some audio is playing. 57192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If something is in progress the resource will not be freed, it will 57202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // only be freed once the tab is destroyed or if the user navigates away 57212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // via WebMediaPlayerAndroid::Destroy 57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_player_manager_->ReleaseMediaResources(); 5723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_WEBRTC) 5725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderThreadImpl::current()->video_capture_impl_manager()-> 5726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuspendDevices(true); 5727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5730b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (webview()) 57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setVisibilityState(visibilityState(), false); 57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform PPAPI plugins that their page is no longer visible. 57353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 57363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) 57373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->PageVisibilityChanged(false); 57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform NPAPI plugins that their container is no longer visible. 57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetContainerVisibility(false); 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 5747bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnWasShown(bool needs_repainting) { 57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::OnWasShown(needs_repainting); 57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) && defined(ENABLE_WEBRTC) 5754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderThreadImpl::current()->video_capture_impl_manager()-> 5755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuspendDevices(false); 5756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 5757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5758b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (webview()) 57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setVisibilityState(visibilityState(), false); 57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform PPAPI plugins that their page is visible. 57633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 57643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) 57653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->PageVisibilityChanged(true); 57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform NPAPI plugins that their container is now visible. 57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetContainerVisibility(true); 57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 5775bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL RenderViewImpl::GetURLForGraphicsContext3D() { 57792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(webview()); 57802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webview()->mainFrame()) 57812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL(webview()->mainFrame()->document().url()); 57822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 57832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL("chrome://gpu/RenderViewImpl::CreateGraphicsContext3D"); 57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::ForceCompositingModeEnabled() { 57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_preferences_.force_compositing_mode; 57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSetFocus(bool enable) { 57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::OnSetFocus(enable); 57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5793bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(ENABLE_PLUGINS) 57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webview() && webview()->isActive()) { 57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all NPAPI plugins. 57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<WebPluginDelegateProxy*>::iterator plugin_it; 57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (plugin_it = plugin_delegates_.begin(); 57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_it != plugin_delegates_.end(); ++plugin_it) { 57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderWidget's call to setFocus can cause the underlying webview's 58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // activation state to change just like a call to setIsActive. 58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable) 58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetWindowFocus(true); 58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*plugin_it)->SetContentAreaFocus(enable); 58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all Pepper plugins. 58093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 58103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch i != active_pepper_instances_.end(); ++i) 58113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*i)->SetContentAreaFocus(enable); 58123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify all BrowserPlugins of the RenderView's focus state. 5814868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (browser_plugin_manager_.get()) 5815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager_->UpdateFocusState(); 58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnImeSetComposition( 58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& text, 58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<WebKit::WebCompositionUnderline>& underlines, 58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_start, 58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_end) { 58233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 58243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a PPAPI plugin has focus, we bypass WebKit. 58263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!IsPepperAcceptingCompositionEvents()) { 58273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_composition_text_ = text; 58283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else { 58293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // TODO(kinaba) currently all composition events are sent directly to 58303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // plugins. Use DOM event mechanism after WebKit is made aware about 58313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // plugins that support composition. 58323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // The code below mimics the behavior of WebCore::Editor::setComposition. 58333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 58343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Empty -> nonempty: composition started. 58353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (pepper_composition_text_.empty() && !text.empty()) 58363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleCompositionStart(string16()); 58373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Nonempty -> empty: composition canceled. 58383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!pepper_composition_text_.empty() && text.empty()) 58393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleCompositionEnd(string16()); 58403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_composition_text_ = text; 58413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Nonempty: composition is ongoing. 58423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!pepper_composition_text_.empty()) { 58433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleCompositionUpdate( 58443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_composition_text_, underlines, selection_start, 58453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch selection_end); 58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 58493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 58503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 58513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(OS_WIN) 58523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // When a plug-in has focus, we create platform-specific IME data used by 58533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // our IME emulator and send it directly to the focused plug-in, i.e. we 58543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // bypass WebKit. (WebPluginDelegate dispatches this IME data only when its 58553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // instance ID is the same one as the specified ID.) 58563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_plugin_id_ >= 0) { 58573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::vector<int> clauses; 58583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::vector<int> target; 58593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (size_t i = 0; i < underlines.size(); ++i) { 58603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch clauses.push_back(underlines[i].startOffset); 58613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch clauses.push_back(underlines[i].endOffset); 58623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (underlines[i].thick) { 58633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch target.clear(); 58643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch target.push_back(underlines[i].startOffset); 58653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch target.push_back(underlines[i].endOffset); 58663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 58673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 58683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::set<WebPluginDelegateProxy*>::iterator it; 58693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (it = plugin_delegates_.begin(); it != plugin_delegates_.end(); ++it) { 58703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*it)->ImeCompositionUpdated(text, clauses, target, selection_end, 58713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_plugin_id_); 58723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 58733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5875bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // OS_WIN 5876bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 58773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RenderWidget::OnImeSetComposition(text, 58783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch underlines, 58793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch selection_start, 58803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch selection_end); 58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderViewImpl::OnImeConfirmComposition(const string16& text, 58847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const ui::Range& replacement_range, 58857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool keep_selection) { 58863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 58873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a PPAPI plugin has focus, we bypass WebKit. 58893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Here, text.empty() has a special meaning. It means to commit the last 58903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // update of composition text (see 58913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // RenderWidgetHost::ImeConfirmComposition()). 58923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const string16& last_text = text.empty() ? pepper_composition_text_ : text; 58933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 58943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // last_text is empty only when both text and pepper_composition_text_ is. 58953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Ignore it. 58963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (last_text.empty()) 58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 58983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 58993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!IsPepperAcceptingCompositionEvents()) { 5900424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::i18n::UTF16CharIterator iterator(&last_text); 5901424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int32 i = 0; 5902424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) while (iterator.Advance()) { 59033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch WebKit::WebKeyboardEvent char_event; 59043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.type = WebKit::WebInputEvent::Char; 59053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.timeStampSeconds = base::Time::Now().ToDoubleT(); 59063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.modifiers = 0; 59073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.windowsKeyCode = last_text[i]; 59083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch char_event.nativeKeyCode = last_text[i]; 5909424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 5910424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const int32 char_start = i; 5911424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (; i < iterator.array_pos(); ++i) { 5912424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) char_event.text[i - char_start] = last_text[i]; 5913424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) char_event.unmodifiedText[i - char_start] = last_text[i]; 5914424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 5915424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 59163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (webwidget()) 59173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch webwidget()->handleInputEvent(char_event); 59183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else { 59203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Mimics the order of events sent by WebKit. 59213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // See WebCore::Editor::setComposition() for the corresponding code. 59223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleCompositionEnd(last_text); 59233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch focused_pepper_plugin_->HandleTextInput(last_text); 59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pepper_composition_text_.clear(); 59263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 59273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(OS_WIN) 59293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Same as OnImeSetComposition(), we send the text from IMEs directly to 59303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // plug-ins. When we send IME text directly to plug-ins, we should not send 59313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // it to WebKit to prevent WebKit from controlling IMEs. 59323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // TODO(thakis): Honor |replacement_range| for plugins? 59333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_plugin_id_ >= 0) { 59343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::set<WebPluginDelegateProxy*>::iterator it; 59353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch for (it = plugin_delegates_.begin(); 59363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch it != plugin_delegates_.end(); ++it) { 59373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch (*it)->ImeCompositionCompleted(text, focused_plugin_id_); 59383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 59393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return; 59403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 5941bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // OS_WIN 5942bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // ENABLE_PLUGINS 59433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (replacement_range.IsValid() && webview()) { 59443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Select the text in |replacement_range|, it will then be replaced by 59453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // text added by the call to RenderWidget::OnImeConfirmComposition(). 59463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (WebFrame* frame = webview()->focusedFrame()) { 59473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch WebRange webrange = WebRange::fromDocumentRange( 59483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch frame, replacement_range.start(), replacement_range.length()); 59493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!webrange.isNull()) 59503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch frame->selectRange(webrange); 59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RenderWidget::OnImeConfirmComposition(text, 59543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch replacement_range, 59553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch keep_selection); 59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::SetDeviceScaleFactor(float device_scale_factor) { 59592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidget::SetDeviceScaleFactor(device_scale_factor); 59602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webview()) { 59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webview()->setDeviceScaleFactor(device_scale_factor); 59622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->settings()->setAcceleratedCompositingForFixedPositionEnabled( 59632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldUseFixedPositionCompositing(device_scale_factor_)); 5964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch webview()->settings()->setAcceleratedCompositingForOverflowScrollEnabled( 5965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShouldUseAcceleratedCompositingForOverflowScroll(device_scale_factor_)); 596690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) webview()->settings()->setAcceleratedCompositingForTransitionEnabled( 596790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ShouldUseTransitionCompositing(device_scale_factor_)); 59687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch webview()->settings()-> 59697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch setAcceleratedCompositingForFixedRootBackgroundEnabled( 59707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShouldUseAcceleratedFixedRootBackground(device_scale_factor_)); 59712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 59722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_resize_mode_) 59732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutoResizeCompositor(); 5974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5975868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (browser_plugin_manager_.get()) 5976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager_->UpdateDeviceScaleFactor(device_scale_factor_); 59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextInputType RenderViewImpl::GetTextInputType() { 59803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 59813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) 59823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return focused_pepper_plugin_->text_input_type(); 59833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 59843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return RenderWidget::GetTextInputType(); 59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::GetSelectionBounds(gfx::Rect* start, gfx::Rect* end) { 59883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 59893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) http://crbug.com/101101 59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current Pepper IME API does not handle selection bounds. So we simply 59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the caret position as an empty range for now. It will be updated 59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after Pepper API equips features related to surrounding text retrieval. 59943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch gfx::Rect caret = focused_pepper_plugin_->GetCaretBounds(); 59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start = caret; 59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end = caret; 59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::GetSelectionBounds(start, end); 60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) 60045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::GetCompositionCharacterBounds( 60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Rect>* bounds) { 60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(bounds); 60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->clear(); 60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 60103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 6011eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 6012eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 60133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 60143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t start_offset = 0; 60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t character_count = 0; 60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()->compositionRange(&start_offset, &character_count)) 60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (character_count == 0) 60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame = webview()->focusedFrame(); 60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->reserve(character_count); 60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebRect webrect; 60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < character_count; ++i) { 60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame->firstRectForCharacterRange(start_offset + i, 1, webrect)) { 60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Could not retrieve character rectangle at " << i; 60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->clear(); 60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->push_back(webrect); 60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6040eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderViewImpl::GetCompositionRange(ui::Range* range) { 60413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 60423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) { 6043eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 6044eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 60453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 6046eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderWidget::GetCompositionRange(range); 6047eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 60487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 6049eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::CanComposeInline() { 60513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(ENABLE_PLUGINS) 60523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (focused_pepper_plugin_) 60533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return IsPepperAcceptingCompositionEvents(); 60543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 60553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return true; 60562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 60572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstrumentWillBeginFrame() { 60592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 60602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 60612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()->devToolsAgent()) 60622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 60632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->devToolsAgent()->didBeginFrame(); 60642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 60652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstrumentDidBeginFrame() { 60672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 60682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 60692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()->devToolsAgent()) 60702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 60712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(jamesr/caseq): Decide if this needs to be renamed. 60722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->devToolsAgent()->didComposite(); 60732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 60742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstrumentDidCancelFrame() { 60762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 60772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 60782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()->devToolsAgent()) 60792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 60802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->devToolsAgent()->didCancelFrame(); 60812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 60822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::InstrumentWillComposite() { 60842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 60852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 60862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()->devToolsAgent()) 60872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 60882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webview()->devToolsAgent()->willComposite(); 60892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 60902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::AllowPartialSwap() const { 60922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return allow_partial_swap_; 60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::ScheduleFileChooser( 60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChooserParams& params, 60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFileChooserCompletion* completion) { 60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kMaximumPendingFileChooseRequests = 4; 60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.size() > kMaximumPendingFileChooseRequests) { 61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This sanity check prevents too many file choose requests from getting 61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // queued which could DoS the user. Getting these is most likely a 61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // programming error (there are many ways to DoS the user so it's not 61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // considered a "real" security check), either in JS requesting many file 61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // choosers to pop up, or in a plugin. 61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw) we might possibly want to require a user gesture to open 61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a file picker, which will address this issue in a better way. 61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_chooser_completions_.push_back(linked_ptr<PendingFileChooser>( 61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PendingFileChooser(params, completion))); 61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_chooser_completions_.size() == 1) { 61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actually show the browse dialog when this is the first request. 61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_RunFileChooser(routing_id_, params)); 61165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebGeolocationClient* RenderViewImpl::geolocationClient() { 61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!geolocation_dispatcher_) 61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_dispatcher_ = new GeolocationDispatcher(this); 61235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return geolocation_dispatcher_; 61245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebSpeechInputController* RenderViewImpl::speechInputController( 61275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebSpeechInputListener* listener) { 61285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_INPUT_SPEECH) 61295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!input_tag_speech_dispatcher_) 61305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_tag_speech_dispatcher_ = 61315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new InputTagSpeechDispatcher(this, listener); 61325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 61335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return input_tag_speech_dispatcher_; 61345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebSpeechRecognizer* RenderViewImpl::speechRecognizer() { 61375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!speech_recognition_dispatcher_) 61385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) speech_recognition_dispatcher_ = new SpeechRecognitionDispatcher(this); 61395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return speech_recognition_dispatcher_; 61405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebDeviceOrientationClient* RenderViewImpl::deviceOrientationClient() { 61435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!device_orientation_dispatcher_) 61445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_orientation_dispatcher_ = new DeviceOrientationDispatcher(this); 61455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return device_orientation_dispatcher_; 61465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::zoomLimitsChanged(double minimum_level, 61495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double maximum_level) { 61505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now, don't remember plugin zoom values. We don't want to mix them with 61515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal web content (i.e. a fixed layout plugin would usually want them 61525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different). 61535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remember = !webview()->mainFrame()->document().isPluginDocument(); 61545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int minimum_percent = static_cast<int>( 615658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ZoomLevelToZoomFactor(minimum_level) * 100); 61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int maximum_percent = static_cast<int>( 615858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ZoomLevelToZoomFactor(maximum_level) * 100); 61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_UpdateZoomLimits( 61615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, minimum_percent, maximum_percent, remember)); 61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::zoomLevelChanged() { 61655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remember = !webview()->mainFrame()->document().isPluginDocument(); 61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float zoom_level = webview()->zoomLevel(); 61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, ZoomLevelChanged()); 61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the browser which url got zoomed so it can update the menu and the 61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // saved values if necessary 61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_DidZoomURL( 61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, zoom_level, remember, 61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(webview()->mainFrame()->document().url()))); 61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 617758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochdouble RenderViewImpl::zoomLevelToZoomFactor(double zoom_level) const { 617858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return ZoomLevelToZoomFactor(zoom_level); 617958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 618058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 618158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochdouble RenderViewImpl::zoomFactorToZoomLevel(double factor) const { 618258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return ZoomFactorToZoomLevel(factor); 618358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 618458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::registerProtocolHandler(const WebString& scheme, 61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& base_url, 61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& url, 61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& title) { 61892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL base(base_url); 61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL absolute_url = base.Resolve(UTF16ToUTF8(url)); 61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base.GetOrigin() != absolute_url.GetOrigin()) { 61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_RegisterProtocolHandler(routing_id_, 61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16ToUTF8(scheme), 61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) absolute_url, 61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title, 61995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_gesture)); 62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebPageVisibilityState RenderViewImpl::visibilityState() const { 62035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPageVisibilityState current_state = is_hidden() ? 62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPageVisibilityStateHidden : 62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPageVisibilityStateVisible; 62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPageVisibilityState override_state = current_state; 62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetContentClient()->renderer()-> 62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShouldOverridePageVisibilityState(this, 62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &override_state)) 62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return override_state; 62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_state; 62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebUserMediaClient* RenderViewImpl::userMediaClient() { 62157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnsureMediaStreamClient(); 62167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return web_user_media_client_; 62175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 621958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochWebKit::WebMIDIClient* RenderViewImpl::webMIDIClient() { 622058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (!midi_dispatcher_) 622158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch midi_dispatcher_ = new MIDIDispatcher(this); 622258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return midi_dispatcher_; 622358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 622458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 62255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::draggableRegionsChanged() { 62265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 62275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewObserver, 62285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 62295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DraggableRegionsChanged(webview()->mainFrame())); 62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentDetectionResult RenderViewImpl::detectContentAround( 62345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebHitTestResult& touch_hit) { 62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!touch_hit.isNull()); 62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!touch_hit.node().isNull()); 62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(touch_hit.node().isTextNode()); 62385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process the position with all the registered content detectors until 62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a match is found. Priority is provided by their relative order. 62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ContentDetectorList::const_iterator it = content_detectors_.begin(); 62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != content_detectors_.end(); ++it) { 62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentDetector::Result content = (*it)->FindTappedContent(touch_hit); 62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content.valid) { 62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebContentDetectionResult(content.content_boundaries, 62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16(content.text), content.intent_url); 62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebContentDetectionResult(); 62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::scheduleContentIntent(const WebURL& intent) { 62535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Introduce a short delay so that the user can notice the content. 6254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 62555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 6256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&RenderViewImpl::LaunchAndroidContentIntent, 6257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), 6258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) intent, 6259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_content_intent_id_), 62605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kContentIntentDelayMilliseconds)); 62615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::cancelScheduledContentIntents() { 62645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++expected_content_intent_id_; 62655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::LaunchAndroidContentIntent(const GURL& intent, 62685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t request_id) { 62695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request_id != expected_content_intent_id_) 62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the content highlighting if any. 62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduleComposite(); 62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intent.is_empty()) 62765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_StartContentIntent(routing_id_, intent)); 62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RenderViewImpl::openDateTimeChooser( 62802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebDateTimeChooserParams& params, 62812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebDateTimeChooserCompletion* completion) { 62822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) date_time_picker_client_.reset( 62832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new RendererDateTimePicker(this, params, completion)); 62842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return date_time_picker_client_->Open(); 62852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 62862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_ANDROID) 62885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSelectPopupMenuItem(int selected_index) { 62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (external_popup_menu_ == NULL) { 62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Crash reports from the field indicate that we can be notified with a 62935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL external popup menu (we probably get notified twice). 62945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If you hit this please file a bug against jcivelli and include the page 62955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and steps to repro. 62965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 62975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 62985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_->DidSelectItem(selected_index); 63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_.reset(); 63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 63035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 63055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnSelectPopupMenuItems( 63065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool canceled, 63075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<int>& selected_indices) { 63085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible to receive more than one of these calls if the user presses 63095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a select faster than it takes for the show-select-popup IPC message to make 63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it to the browser UI thread. Ignore the extra-messages. 63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug. 6312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!external_popup_menu_) 63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_->DidSelectItems(canceled, selected_indices); 63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_popup_menu_.reset(); 63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 63195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnContextMenuClosed( 63215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CustomContextMenuContext& custom_context) { 63225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (custom_context.request_id) { 63235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External request, should be in our map. 63245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMenuClient* client = 63255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_context_menus_.Lookup(custom_context.request_id); 63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client) { 63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->OnMenuClosed(custom_context.request_id); 63285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_context_menus_.Remove(custom_context.request_id); 63295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 63315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal request, forward to WebKit. 63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_node_.reset(); 63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderViewImpl::OnShowContextMenu(const gfx::Point& location) { 6337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context_menu_source_type_ = ui::MENU_SOURCE_TOUCH_EDIT_MENU; 63387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touch_editing_context_menu_location_ = location; 6339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (webview()) 6340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->showContextMenu(); 6341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 6342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnEnableViewSourceMode() { 63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!webview()) 63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 63475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_frame) 63485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 63495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_frame->enableViewSourceMode(true); 63505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_ANDROID) 63535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnJavaBridgeInit() { 63545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!java_bridge_dispatcher_); 63555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_bridge_dispatcher_ = new JavaBridgeDispatcher(this); 63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 63585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::OnDisownOpener() { 63602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webview()) 63612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 63622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 63632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFrame* main_frame = webview()->mainFrame(); 63642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (main_frame && main_frame->opener()) 63652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_frame->setOpener(NULL); 63662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 63672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 63685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 63695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderViewImpl::didTapMultipleTargets( 63705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebGestureEvent& event, 63715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebVector<WebRect>& target_rects) { 63727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Never show a disambiguation popup when accessibility is enabled, 63737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // as this interferes with "touch exploration". 63747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (accessibility_mode_ == AccessibilityModeComplete) 63757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 63767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 63775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect finger_rect( 63785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.x - event.data.tap.width / 2, event.y - event.data.tap.height / 2, 63795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.data.tap.width, event.data.tap.height); 63805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect zoom_rect; 63812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float new_total_scale = 63822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor( 63832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finger_rect, target_rects, GetSize(), 63842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(webview()->mainFrame()->visibleContentRect()).size(), 63852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor_ * webview()->pageScaleFactor(), &zoom_rect); 63862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!new_total_scale) 63875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 63885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6389424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool handled = false; 6390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) switch (renderer_preferences_.tap_multiple_targets_strategy) { 6391424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case TAP_MULTIPLE_TARGETS_STRATEGY_ZOOM: 6392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) handled = webview()->zoomToMultipleTargetsRect(zoom_rect); 6393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 6394424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case TAP_MULTIPLE_TARGETS_STRATEGY_POPUP: { 63952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::Size canvas_size = 63962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::ToCeiledSize(gfx::ScaleSize(zoom_rect.size(), new_total_scale)); 63972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch TransportDIB* transport_dib = NULL; 63982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 63992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_ptr<skia::PlatformCanvas> canvas( 64002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch RenderProcess::current()->GetDrawingCanvas(&transport_dib, 64012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::Rect(canvas_size))); 6402424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!canvas) { 6403424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) handled = false; 6404424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 6405424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 64062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 64072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // TODO(trchen): Cleanup the device scale factor mess. 64082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // device scale will be applied in WebKit 64092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // --> zoom_rect doesn't include device scale, 64102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // but WebKit will still draw on zoom_rect * device_scale_factor_ 64112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch canvas->scale(new_total_scale / device_scale_factor_, 64122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new_total_scale / device_scale_factor_); 64132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch canvas->translate(-zoom_rect.x() * device_scale_factor_, 64142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch -zoom_rect.y() * device_scale_factor_); 64152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 64162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch webwidget_->paint( 64172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch canvas.get(), 64182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch zoom_rect, 64192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebWidget::ForceSoftwareRenderingAndIgnoreGPUResidentContent); 64202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 64212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 64222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::Rect physical_window_zoom_rect = gfx::ToEnclosingRect( 64232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ClientRectToPhysicalWindowRect(gfx::RectF(zoom_rect))); 64242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch Send(new ViewHostMsg_ShowDisambiguationPopup(routing_id_, 64252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch physical_window_zoom_rect, 64262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch canvas_size, 64272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch transport_dib->id())); 6428424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) handled = true; 6429424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 6430424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 6431424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case TAP_MULTIPLE_TARGETS_STRATEGY_NONE: 6432424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // No-op. 6433424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 64342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 64355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6436424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return handled; 64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 64395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)unsigned RenderViewImpl::GetLocalSessionHistoryLengthForTesting() const { 64412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history_list_length_; 64422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 64432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::SetFocusAndActivateForTesting(bool enable) { 64452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enable) { 64462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_focus()) 64472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 64482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetActive(true); 64492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetFocus(true); 64502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 64512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!has_focus()) 64522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 64532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetFocus(false); 64542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSetActive(false); 64552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 64562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 64572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::SetDeviceScaleFactorForTesting(float factor) { 6459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ViewMsg_Resize_Params params; 6460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.screen_info = screen_info_; 6461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.screen_info.deviceScaleFactor = factor; 6462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.new_size = size(); 6463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.physical_backing_size = 6464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::ToCeiledSize(gfx::ScaleSize(size(), factor)); 6465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.overdraw_bottom_height = 0.f; 6466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.resizer_rect = WebRect(); 6467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.is_fullscreen = is_fullscreen(); 6468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnResize(params); 64692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 64702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 647190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderViewImpl::EnableAutoResizeForTesting(const gfx::Size& min_size, 647290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Size& max_size) { 647390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnEnableAutoResize(min_size, max_size); 647490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 647590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 647690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderViewImpl::DisableAutoResizeForTesting(const gfx::Size& new_size) { 647790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OnDisableAutoResize(new_size); 647890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 647990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 64807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RenderViewImpl::SetMediaStreamClientForTesting( 64817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaStreamClient* media_stream_client) { 64827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!media_stream_client_); 64837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!web_user_media_client_); 64847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media_stream_client_ = media_stream_client; 64857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 64867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 64875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderViewImpl::OnReleaseDisambiguationPopupDIB( 64885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB::Handle dib_handle) { 64895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle); 64905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcess::current()->ReleaseTransportDIB(dib); 64915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 64925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderViewImpl::DidCommitCompositorFrame() { 64942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidget::DidCommitCompositorFrame(); 64952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidCommitCompositorFrame()); 64962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 64972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::SendUpdateFaviconURL(const std::vector<FaviconURL>& urls) { 6499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!urls.empty()) 6500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Send(new ViewHostMsg_UpdateFaviconURL(routing_id_, page_id_, urls)); 6501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 6502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RenderViewImpl::DidStopLoadingIcons() { 6504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int icon_types = WebIconURL::TypeFavicon; 6505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (TouchEnabled()) 6506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) icon_types |= WebIconURL::TypeTouchPrecomposed | WebIconURL::TypeTouch; 6507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebVector<WebIconURL> icon_urls = 6509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webview()->mainFrame()->iconURLs(icon_types); 6510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<FaviconURL> urls; 6512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < icon_urls.size(); i++) { 6513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebURL url = icon_urls[i].iconURL(); 6514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!url.isEmpty()) 6515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) urls.push_back(FaviconURL(url, 6516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToFaviconType(icon_urls[i].iconType()))); 6517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendUpdateFaviconURL(urls); 6519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 6520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 6522