1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/render_frame_impl.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <map> 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <string> 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/auto_reset.h" 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/command_line.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/debug/alias.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/debug/asan_invalid_access.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/debug/dump_without_crashing.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/i18n/char_iterator.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/histogram.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/process/kill.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/process/process.h" 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/string16.h" 20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/strings/utf_string_conversions.h" 21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/time/time.h" 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/child/appcache/appcache_dispatcher.h" 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/child/plugin_messages.h" 24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/child/quota_dispatcher.h" 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/child/request_extra_data.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/child/service_worker/service_worker_network_provider.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/child/service_worker/service_worker_provider_context.h" 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/child/service_worker/web_service_worker_provider_impl.h" 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/child/web_socket_stream_handle_impl.h" 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/child/web_url_request_util.h" 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/child/webmessageportchannel_impl.h" 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/child/websocket_bridge.h" 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/child/weburlresponse_extradata_impl.h" 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/common/clipboard_messages.h" 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/frame_messages.h" 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/input_messages.h" 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/service_worker/service_worker_types.h" 38bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/common/socket_stream_handle_data.h" 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/common/swapped_out_messages.h" 40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/common/view_messages.h" 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/common/bindings_policy.h" 42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/common/content_constants.h" 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/common/content_switches.h" 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/context_menu_params.h" 45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/common/url_constants.h" 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_utils.h" 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/renderer/browser_plugin_delegate.h" 48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/renderer/content_renderer_client.h" 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/renderer/context_menu_client.h" 50bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/renderer/document_state.h" 51bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/renderer/navigation_state.h" 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer.h" 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/accessibility/renderer_accessibility.h" 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/renderer/accessibility/renderer_accessibility_complete.h" 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/renderer/accessibility/renderer_accessibility_focus_only.h" 56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/browser_plugin/browser_plugin.h" 57bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/browser_plugin/browser_plugin_manager.h" 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/child_frame_compositing_helper.h" 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/context_menu_params_builder.h" 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/renderer/devtools/devtools_agent.h" 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/dom_automation_controller.h" 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/renderer/dom_utils.h" 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/renderer/external_popup_menu.h" 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/renderer/geolocation_dispatcher.h" 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/renderer/history_controller.h" 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/renderer/history_serialization.h" 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/renderer/image_loading_helper.h" 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/renderer/ime_event_guard.h" 69bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/internal_document_state_data.h" 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/renderer/manifest/manifest_manager.h" 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/renderer/media/audio_renderer_mixer_manager.h" 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/renderer/media/crypto/encrypted_media_player_support_impl.h" 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/renderer/media/media_stream_dispatcher.h" 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/media/media_stream_renderer_factory.h" 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/renderer/media/midi_dispatcher.h" 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/renderer/media/render_media_log.h" 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/renderer/media/user_media_client_impl.h" 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/renderer/media/webcontentdecryptionmodule_impl.h" 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/renderer/media/webmediaplayer_ms.h" 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/renderer/notification_permission_dispatcher.h" 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/renderer/notification_provider.h" 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/renderer/npapi/plugin_channel_host.h" 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/renderer/push_messaging_dispatcher.h" 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/renderer/render_frame_proxy.h" 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/render_process.h" 86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/render_thread_impl.h" 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/render_view_impl.h" 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/render_widget_fullscreen_pepper.h" 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/renderer/renderer_webapplicationcachehost_impl.h" 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/renderer/renderer_webcolorchooser_impl.h" 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/renderer/screen_orientation/screen_orientation_dispatcher.h" 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/shared_worker_repository.h" 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/v8_value_converter_impl.h" 94bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/websharedworker_proxy.h" 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "media/base/audio_renderer_mixer_input.h" 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webmediaplayer_impl.h" 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webmediaplayer_params.h" 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/filters/gpu_video_accelerator_factories.h" 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/data_url.h" 100bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "net/base/net_errors.h" 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "net/http/http_util.h" 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" 104bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebString.h" 105bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebURL.h" 106bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebURLError.h" 107bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebURLResponse.h" 108bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebVector.h" 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "third_party/WebKit/public/web/WebColorSuggestion.h" 110bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebDocument.h" 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebGlyphCache.h" 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h" 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" 114bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebNavigationPolicy.h" 115bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebPlugin.h" 116bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebPluginParams.h" 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/WebKit/public/web/WebRange.h" 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebSearchableFormData.h" 120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebSecurityOrigin.h" 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSecurityPolicy.h" 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSurroundingText.h" 123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 124bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebView.h" 125bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/npapi/webplugin_impl.h" 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/pepper/pepper_browser_connection.h" 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/pepper/pepper_webplugin_impl.h" 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/pepper/plugin_module.h" 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_WEBRTC) 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/renderer/media/rtc_peer_connection_handler.h" 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_ANDROID) 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <cpu-features.h> 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/common/gpu/client/context_provider_command_buffer.h" 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/renderer/android/synchronous_compositor_factory.h" 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/renderer/java/gin_java_bridge_dispatcher.h" 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/media/android/renderer_media_player_manager.h" 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/renderer/media/android/stream_texture_factory_impl.h" 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/renderer/media/android/webmediaplayer_android.h" 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_BROWSER_CDMS) 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/media/crypto/renderer_cdm_manager.h" 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebContextMenuData; 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebData; 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDataSource; 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDocument; 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebElement; 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using blink::WebExternalPopupMenu; 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using blink::WebExternalPopupMenuClient; 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebHistoryItem; 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebHTTPBody; 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing blink::WebLocalFrame; 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using blink::WebMediaPlayer; 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using blink::WebMediaPlayerClient; 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebNavigationPolicy; 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebNavigationType; 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebNode; 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginParams; 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using blink::WebPopupMenuInfo; 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing blink::WebRange; 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebReferrerPolicy; 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebScriptSource; 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSearchableFormData; 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSecurityOrigin; 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebSecurityPolicy; 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebServiceWorkerProvider; 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebStorageQuotaCallbacks; 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURL; 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLError; 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest; 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLResponse; 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebUserGestureIndicator; 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector; 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebView; 187bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochusing base::Time; 188bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochusing base::TimeDelta; 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kDefaultAcceptHeader[] = 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/" 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "*;q=0.8"; 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kAcceptHeader[] = "Accept"; 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst size_t kExtraCharsBeforeAndAfterSelection = 100; 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef std::map<int, RenderFrameImpl*> RoutingIDFrameMap; 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap; 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int64 ExtractPostId(const WebHistoryItem& item) { 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (item.isNull()) 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return -1; 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (item.httpBody().isNull()) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return -1; 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return item.httpBody().identifier(); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebURLResponseExtraDataImpl* GetExtraDataFromResponse( 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebURLResponse& response) { 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return static_cast<WebURLResponseExtraDataImpl*>(response.extraData()); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GetRedirectChain(WebDataSource* ds, std::vector<GURL>* result) { 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Replace any occurrences of swappedout:// with about:blank. 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const WebURL& blank_url = GURL(url::kAboutBlankURL); 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebVector<WebURL> urls; 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ds->redirectChain(urls); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result->reserve(urls.size()); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < urls.size(); ++i) { 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (urls[i] != GURL(kSwappedOutURL)) 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result->push_back(urls[i]); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result->push_back(blank_url); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Returns the original request url. If there is no redirect, the original 2380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// url is the same as ds->request()->url(). If the WebDataSource belongs to a 2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// frame was loaded by loadData, the original url will be ds->unreachableURL() 2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic GURL GetOriginalRequestURL(WebDataSource* ds) { 2410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // WebDataSource has unreachable URL means that the frame is loaded through 2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // blink::WebFrame::loadData(), and the base URL will be in the redirect 2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // chain. However, we never visited the baseURL. So in this case, we should 2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // use the unreachable URL as the original URL. 2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (ds->hasUnreachableURL()) 2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return ds->unreachableURL(); 2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::vector<GURL> redirects; 2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetRedirectChain(ds, &redirects); 2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!redirects.empty()) 2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return redirects.at(0); 2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return ds->originalRequest().url(); 2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NOINLINE static void CrashIntentionally() { 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NOTE(shess): Crash directly rather than using NOTREACHED() so 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // that the signature is easier to triage in crash reports. 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volatile int* zero = NULL; 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *zero = 0; 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NOINLINE static void MaybeTriggerAsanError(const GURL& url) { 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NOTE(rogerm): We intentionally perform an invalid heap access here in 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // order to trigger an Address Sanitizer (ASAN) error report. 267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char kCrashDomain[] = "crash"; 268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char kHeapOverflow[] = "/heap-overflow"; 269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char kHeapUnderflow[] = "/heap-underflow"; 270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char kUseAfterFree[] = "/use-after-free"; 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(SYZYASAN) 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char kCorruptHeapBlock[] = "/corrupt-heap-block"; 273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char kCorruptHeap[] = "/corrupt-heap"; 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!url.DomainIs(kCrashDomain, sizeof(kCrashDomain) - 1)) 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!url.has_path()) 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string crash_type(url.path()); 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (crash_type == kHeapOverflow) { 284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::debug::AsanHeapOverflow(); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (crash_type == kHeapUnderflow ) { 286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::debug::AsanHeapUnderflow(); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (crash_type == kUseAfterFree) { 288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::debug::AsanHeapUseAfterFree(); 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(SYZYASAN) 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (crash_type == kCorruptHeapBlock) { 291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::debug::AsanCorruptHeapBlock(); 292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else if (crash_type == kCorruptHeap) { 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::debug::AsanCorruptHeap(); 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif // ADDRESS_SANITIZER || SYZYASAN 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static void MaybeHandleDebugURL(const GURL& url) { 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!url.SchemeIs(kChromeUIScheme)) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (url == GURL(kChromeUICrashURL)) { 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CrashIntentionally(); 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (url == GURL(kChromeUIDumpURL)) { 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This URL will only correctly create a crash dump file if content is 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // hosted in a process that has correctly called 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // base::debug::SetDumpWithoutCrashingFunction. Refer to the documentation 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // of base::debug::DumpWithoutCrashing for more details. 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::debug::DumpWithoutCrashing(); 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (url == GURL(kChromeUIKillURL)) { 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::KillProcess(base::GetCurrentProcessHandle(), 1, false); 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (url == GURL(kChromeUIHangURL)) { 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (;;) { 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (url == GURL(kChromeUIShorthangURL)) { 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MaybeTriggerAsanError(url); 322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif // ADDRESS_SANITIZER || SYZYASAN 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns false unless this is a top-level navigation. 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static bool IsTopLevelNavigation(WebFrame* frame) { 327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return frame->parent() == NULL; 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns false unless this is a top-level navigation that crosses origins. 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static bool IsNonLocalTopLevelNavigation(const GURL& url, 332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebFrame* frame, 333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebNavigationType type, 334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_form_post) { 335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!IsTopLevelNavigation(frame)) 336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Navigations initiated within Webkit are not sent out to the external host 339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // in the following cases. 340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 1. The url scheme is not http/https 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 2. The origin of the url and the opener is the same in which case the 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // opener relationship is maintained. 343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 3. Reloads/form submits/back forward navigations 344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!url.SchemeIs(url::kHttpScheme) && !url.SchemeIs(url::kHttpsScheme)) 345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (type != blink::WebNavigationTypeReload && 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) type != blink::WebNavigationTypeBackForward && !is_form_post) { 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The opener relationship between the new window and the parent allows the 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // new window to script the parent and vice versa. This is not allowed if 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the origins of the two domains are different. This can be treated as a 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // top level navigation and routed back to the host. 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blink::WebFrame* opener = frame->opener(); 354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!opener) 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (url.GetOrigin() != GURL(opener->document().url()).GetOrigin()) 358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NULL; 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochRenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int32 routing_id) { 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(routing_id != MSG_ROUTING_NONE); 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (g_create_render_frame_impl) 3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return g_create_render_frame_impl(render_view, routing_id); 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return new RenderFrameImpl(render_view, routing_id); 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)RenderFrameImpl* RenderFrameImpl::FromRoutingID(int32 routing_id) { 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RoutingIDFrameMap::iterator iter = 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) g_routing_id_frame_map.Get().find(routing_id); 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (iter != g_routing_id_frame_map.Get().end()) 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return iter->second; 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static 3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderFrameImpl::CreateFrame(int routing_id, int parent_routing_id) { 3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(nasko): For now, this message is only sent for subframes, as the 3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // top level frame is created when the RenderView is created through the 3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // ViewMsg_New IPC. 3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CHECK_NE(MSG_ROUTING_NONE, parent_routing_id); 3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameProxy* proxy = RenderFrameProxy::FromRoutingID(parent_routing_id); 3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // If the browser is sending a valid parent routing id, it should already be 3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // created and registered. 3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CHECK(proxy); 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blink::WebRemoteFrame* parent_web_frame = proxy->web_frame(); 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Create the RenderFrame and WebLocalFrame, linking the two. 4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameImpl* render_frame = 4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderFrameImpl::Create(proxy->render_view(), routing_id); 4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blink::WebLocalFrame* web_frame = 4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_web_frame->createLocalChild("", render_frame); 4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) render_frame->SetWebFrame(web_frame); 4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) render_frame->Initialize(); 4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) { 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return RenderFrameImpl::FromWebFrame(web_frame); 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RenderFrameImpl* RenderFrameImpl::FromWebFrame(blink::WebFrame* web_frame) { 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMap::iterator iter = g_frame_map.Get().find(web_frame); 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (iter != g_frame_map.Get().end()) 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return iter->second; 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderFrameImpl::InstallCreateHook( 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(!g_create_render_frame_impl); 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch g_create_render_frame_impl = create_render_frame_impl; 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 431bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// RenderFrameImpl ---------------------------------------------------------- 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : frame_(NULL), 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_(render_view->AsWeakPtr()), 435424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) routing_id_(routing_id), 436424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_swapped_out_(false), 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_frame_proxy_(NULL), 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_detaching_(false), 439effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cookie_jar_(this), 440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_offset_(0), 441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_range_(gfx::Range::InvalidRange()), 4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch handling_select_range_(false), 4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) notification_permission_dispatcher_(NULL), 444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) notification_provider_(NULL), 445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_user_media_client_(NULL), 446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) midi_dispatcher_(NULL), 447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_ANDROID) 448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) media_player_manager_(NULL), 449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_BROWSER_CDMS) 451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cdm_manager_(NULL), 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(VIDEO_HOLE) 454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch contains_media_player_(false), 455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) geolocation_dispatcher_(NULL), 457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch push_messaging_dispatcher_(NULL), 458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) screen_orientation_dispatcher_(NULL), 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manifest_manager_(NULL), 460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accessibility_mode_(AccessibilityModeOff), 461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch renderer_accessibility_(NULL), 462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_factory_(this) { 463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::pair<RoutingIDFrameMap::iterator, bool> result = 464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) g_routing_id_frame_map.Get().insert(std::make_pair(routing_id_, this)); 465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CHECK(result.second) << "Inserting a duplicate item."; 466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderThread::Get()->AddRoute(routing_id_, this); 468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_->RegisterRenderFrame(this); 470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_ANDROID) 472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new GinJavaBridgeDispatcher(this); 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 4740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(ENABLE_NOTIFICATIONS) 4760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch notification_provider_ = new NotificationProvider(this); 4770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manifest_manager_ = new ManifestManager(this); 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameImpl::~RenderFrameImpl() { 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); 485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(VIDEO_HOLE) 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (contains_media_player_) 488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_->UnregisterVideoHoleFrame(this); 489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_->UnregisterRenderFrame(this); 492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) g_routing_id_frame_map.Get().erase(routing_id_); 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderThread::Get()->RemoveRoute(routing_id_); 494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::SetWebFrame(blink::WebLocalFrame* web_frame) { 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!frame_); 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert( 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::make_pair(web_frame, this)); 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(result.second) << "Inserting a duplicate item."; 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_ = web_frame; 504a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid RenderFrameImpl::Initialize() { 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new PepperBrowserConnection(this); 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new SharedWorkerRepository(this); 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 512e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!frame_->parent()) 513e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new ImageLoadingHelper(this); 514e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We delay calling this until we have the WebFrame so that any observer or 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // embedder can call GetWebFrame on any RenderFrame. 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetContentClient()->renderer()->RenderFrameCreated(this); 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderWidget* RenderFrameImpl::GetRenderWidget() { 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_.get(); 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) { 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidCreatePepperPlugin(host)); 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperDidChangeCursor( 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance, 532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebCursorInfo& cursor) { 533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Update the cursor appearance immediately if the requesting plugin is the 534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // one which receives the last mouse event. Otherwise, the new cursor won't be 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // picked up until the plugin gets the next input event. That is bad if, e.g., 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the plugin would like to set an invisible cursor when there isn't any user 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // input for a while. 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance == render_view_->pepper_last_mouse_event_target()) 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->didChangeCursor(cursor); 540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperDidReceiveMouseEvent( 543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->set_pepper_last_mouse_event_target(instance); 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperTextInputTypeChanged( 548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance != render_view_->focused_pepper_plugin()) 550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5521675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch GetRenderWidget()->UpdateTextInputType(); 553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (renderer_accessibility()) 554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch renderer_accessibility()->FocusedNodeChanged(WebNode()); 555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperCaretPositionChanged( 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance != render_view_->focused_pepper_plugin()) 560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->UpdateSelectionBounds(); 562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperCancelComposition( 565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance != render_view_->focused_pepper_plugin()) 567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new InputHostMsg_ImeCancelComposition(render_view_->GetRoutingID()));; 569a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX) || defined(USE_AURA) 570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->UpdateCompositionInfo(true); 571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperSelectionChanged( 575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance != render_view_->focused_pepper_plugin()) 577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SyncSelectionIfRequired(); 579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer( 582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* plugin) { 583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GURL active_url; 584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (render_view_->webview() && render_view_->webview()->mainFrame()) 585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) active_url = GURL(render_view_->webview()->mainFrame()->document().url()); 586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderWidgetFullscreenPepper* widget = RenderWidgetFullscreenPepper::Create( 587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->routing_id(), plugin, active_url, 588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->screenInfo()); 589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) widget->show(blink::WebNavigationPolicyIgnore); 590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return widget; 591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool RenderFrameImpl::IsPepperAcceptingCompositionEvents() const { 594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!render_view_->focused_pepper_plugin()) 595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_->focused_pepper_plugin()-> 597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IsPluginAcceptingCompositionEvents(); 598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PluginCrashed(const base::FilePath& plugin_path, 601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessId plugin_pid) { 602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(jam): dispatch this IPC in RenderFrameHost and switch to use 603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // routing_id_ as a result. 604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new FrameHostMsg_PluginCrashed(routing_id_, plugin_path, plugin_pid)); 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::SimulateImeSetComposition( 608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<blink::WebCompositionUnderline>& underlines, 610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int selection_start, 611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int selection_end) { 612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->OnImeSetComposition( 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) text, underlines, selection_start, selection_end); 614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::SimulateImeConfirmComposition( 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Range& replacement_range) { 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->OnImeConfirmComposition(text, replacement_range, false); 620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::OnImeSetComposition( 624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<blink::WebCompositionUnderline>& underlines, 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int selection_start, 627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int selection_end) { 628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When a PPAPI plugin has focus, we bypass WebKit. 629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!IsPepperAcceptingCompositionEvents()) { 630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_composition_text_ = text; 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(kinaba) currently all composition events are sent directly to 633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // plugins. Use DOM event mechanism after WebKit is made aware about 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // plugins that support composition. 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The code below mimics the behavior of WebCore::Editor::setComposition. 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Empty -> nonempty: composition started. 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pepper_composition_text_.empty() && !text.empty()) { 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleCompositionStart( 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Nonempty -> empty: composition canceled. 643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!pepper_composition_text_.empty() && text.empty()) { 644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleCompositionEnd( 645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_composition_text_ = text; 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Nonempty: composition is ongoing. 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!pepper_composition_text_.empty()) { 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleCompositionUpdate( 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_composition_text_, underlines, selection_start, 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) selection_end); 653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::OnImeConfirmComposition( 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Range& replacement_range, 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool keep_selection) { 661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When a PPAPI plugin has focus, we bypass WebKit. 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Here, text.empty() has a special meaning. It means to commit the last 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // update of composition text (see 664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RenderWidgetHost::ImeConfirmComposition()). 665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& last_text = text.empty() ? pepper_composition_text_ 666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : text; 667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // last_text is empty only when both text and pepper_composition_text_ is. 669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ignore it. 670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (last_text.empty()) 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!IsPepperAcceptingCompositionEvents()) { 674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::i18n::UTF16CharIterator iterator(&last_text); 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int32 i = 0; 676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (iterator.Advance()) { 677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebKeyboardEvent char_event; 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.type = blink::WebInputEvent::Char; 679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.timeStampSeconds = base::Time::Now().ToDoubleT(); 680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.modifiers = 0; 681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.windowsKeyCode = last_text[i]; 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.nativeKeyCode = last_text[i]; 683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const int32 char_start = i; 685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (; i < iterator.array_pos(); ++i) { 686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.text[i - char_start] = last_text[i]; 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.unmodifiedText[i - char_start] = last_text[i]; 688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (GetRenderWidget()->webwidget()) 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->webwidget()->handleInputEvent(char_event); 692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Mimics the order of events sent by WebKit. 695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See WebCore::Editor::setComposition() for the corresponding code. 696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleCompositionEnd(last_text); 697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleTextInput(last_text); 698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_composition_text_.clear(); 700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // ENABLE_PLUGINS 703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 704116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMediaStreamDispatcher* RenderFrameImpl::GetMediaStreamDispatcher() { 705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!web_user_media_client_) 706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeUserMediaClient(); 707116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_user_media_client_ ? 708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_user_media_client_->media_stream_dispatcher() : NULL; 709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool RenderFrameImpl::Send(IPC::Message* message) { 712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (is_detaching_) { 713424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delete message; 714424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 715424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 7165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (frame_->parent() == NULL && 7175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (is_swapped_out_ || render_view_->is_swapped_out())) { 718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { 719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delete message; 720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 7225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // In most cases, send IPCs through the proxy when swapped out. In some 724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // calls the associated RenderViewImpl routing id is used to send 725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // messages, so don't use the proxy. 726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (render_frame_proxy_ && message->routing_id() == routing_id_) 727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return render_frame_proxy_->Send(message); 728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 729424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 730424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return RenderThread::Get()->Send(message); 731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX) || defined(OS_ANDROID) 7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameImpl::DidHideExternalPopupMenu() { 7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // We need to clear external_popup_menu_ as soon as ExternalPopupMenu::close 7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // is called. Otherwise, createExternalPopupMenu() for new popup will fail. 7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci external_popup_menu_.reset(); 7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { 7425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(kenrb): document() should not be null, but as a transitional step 7435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // we have RenderFrameProxy 'wrapping' a RenderFrameImpl, passing messages 7445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // to this method. This happens for a top-level remote frame, where a 7455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // document-less RenderFrame is replaced by a RenderFrameProxy but kept 7465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // around and is still able to receive messages. 7475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!frame_->document().isNull()) 7485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetContentClient()->SetActiveURL(frame_->document().url()); 749010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ObserverListBase<RenderFrameObserver>::Iterator it(observers_); 751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameObserver* observer; 752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) { 753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (observer->OnMessageReceived(msg)) 754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool handled = true; 758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(RenderFrameImpl, msg) 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_Navigate, OnNavigate) 760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_BeforeUnload, OnBeforeUnload) 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut) 76203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_Stop, OnStop) 7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_ContextMenuClosed, OnContextMenuClosed) 7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_CustomContextMenuAction, 7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCustomContextMenuAction) 766effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_Undo, OnUndo) 767effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_Redo, OnRedo) 768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Cut, OnCut) 769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Copy, OnCopy) 770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(InputMsg_Paste, OnPaste) 771effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_PasteAndMatchStyle, OnPasteAndMatchStyle) 772effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_Delete, OnDelete) 773effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_SelectAll, OnSelectAll) 774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_SelectRange, OnSelectRange) 775effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_Unselect, OnUnselect) 776c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_Replace, OnReplace) 777c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_ReplaceMisspelling, OnReplaceMisspelling) 778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(InputMsg_ExtendSelectionAndDelete, 779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnExtendSelectionAndDelete) 780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(InputMsg_SetCompositionFromExistingText, 781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnSetCompositionFromExistingText) 782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_CSSInsertRequest, OnCSSInsertRequest) 783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_JavaScriptExecuteRequest, 784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnJavaScriptExecuteRequest) 7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(FrameMsg_JavaScriptExecuteRequestForTests, 7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnJavaScriptExecuteRequestForTests) 787effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(FrameMsg_SetEditableSelectionOffsets, 788effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OnSetEditableSelectionOffsets) 7896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_SetupTransitionView, OnSetupTransitionView) 7906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_BeginExitTransition, OnBeginExitTransition) 791f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload) 792f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_TextSurroundingSelectionRequest, 793f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnTextSurroundingSelectionRequest) 7946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL, 7956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnAddStyleSheetByURL) 796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode, 797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnSetAccessibilityMode) 7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener) 7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID) 8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems) 8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_MACOSX) 8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem) 803effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) 804effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return handled; 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { 8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", 8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_, "url", params.url.possibly_invalid_spec()); 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MaybeHandleDebugURL(params.url); 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!render_view_->webview()) 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 817f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FOR_EACH_OBSERVER( 818f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewObserver, render_view_->observers_, Navigate(params.url)); 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_reload = RenderViewImpl::IsReload(params); 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebURLRequest::CachePolicy cache_policy = 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebURLRequest::UseProtocolCachePolicy; 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If this is a stale back/forward (due to a recent navigation the browser 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // didn't know about), ignore it. 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_->IsBackForwardToStaleEntry(params, is_reload)) 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Swap this renderer back in if necessary. 8305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (render_view_->is_swapped_out_ && 8315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetWebFrame() == render_view_->webview()->mainFrame()) { 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We marked the view as hidden when swapping the view out, so be sure to 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // reset the visibility state before navigating to the new URL. 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->webview()->setVisibilityState( 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->visibilityState(), false); 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If this is an attempt to reload while we are swapped out, we should not 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // reload swappedout://, but the previous page, which is stored in 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // params.state. Setting is_reload to false will treat this like a back 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigation to accomplish that. 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_reload = false; 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cache_policy = WebURLRequest::ReloadIgnoringCacheData; 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We refresh timezone when a view is swapped in since timezone 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // can get out of sync when the system timezone is updated while 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the view is swapped out. 847a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderThreadImpl::NotifyTimezoneChange(); 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->SetSwappedOut(false); 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_swapped_out_ = false; 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (params.should_clear_history_list) { 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(params.pending_history_list_offset, -1); 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(params.current_history_list_offset, -1); 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(params.current_history_list_length, 0); 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_offset_ = params.current_history_list_offset; 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_length_ = params.current_history_list_length; 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_->history_list_length_ >= 0) { 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_page_ids_.resize( 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_length_, -1); 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (params.pending_history_list_offset >= 0 && 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.pending_history_list_offset < render_view_->history_list_length_) { 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_page_ids_[params.pending_history_list_offset] = 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.page_id; 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetContentClient()->SetActiveURL(params.url); 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebFrame* frame = frame_; 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!params.frame_to_navigate.empty()) { 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(nasko): Move this lookup to the browser process. 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame = render_view_->webview()->findFrameByName( 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString::fromUTF8(params.frame_to_navigate)); 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate; 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) { 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We cannot reload if we do not have any history state. This happens, for 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // example, when recovering from a crash. 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_reload = false; 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cache_policy = WebURLRequest::ReloadIgnoringCacheData; 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_.reset( 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new FrameMsg_Navigate_Params(params)); 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we are reloading, then WebKit will use the history state of the current 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page, so we should just ignore any given history state. Otherwise, if we 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have history state, then we need to navigate to it, which corresponds to a 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // back/forward navigation event. 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (is_reload) { 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool reload_original_url = 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (params.navigation_type == 8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool ignore_cache = (params.navigation_type == 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (reload_original_url) 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->reloadWithOverrideURL(params.url, true); 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->reload(ignore_cache); 9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (params.page_state.IsValid()) { 9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We must know the page ID of the page we are navigating back to. 9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(params.page_id, -1); 9085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<HistoryEntry> entry = 9095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PageStateToHistoryEntry(params.page_state); 9105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (entry) { 9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ensure we didn't save the swapped out URL in UpdateState, since the 9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // browser should never be telling us to navigate to swappedout://. 9135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); 9145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu render_view_->history_controller()->GoToEntry(entry.Pass(), cache_policy); 9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (!params.base_url_for_data_url.is_empty()) { 9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A loadData request with a specified base URL. 9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string mime_type, charset, data; 9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { 9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->loadData( 9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebData(data.c_str(), data.length()), 9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString::fromUTF8(mime_type), 9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString::fromUTF8(charset), 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.base_url_for_data_url, 9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.history_url_for_data_url, 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false); 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(false) << 9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Invalid URL passed: " << params.url.possibly_invalid_spec(); 9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the given URL. 9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebURLRequest request(params.url); 9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A session history navigation should have been accompanied by state. 9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(params.page_id, -1); 9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (frame->isViewSourceModeEnabled()) 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad); 9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (params.referrer.url.is_valid()) { 9425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString referrer = WebSecurityPolicy::generateReferrerHeader( 9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.referrer.policy, 9445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.url, 9455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString::fromUTF8(params.referrer.url.spec())); 9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!referrer.isEmpty()) 9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.setHTTPReferrer(referrer, params.referrer.policy); 9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!params.extra_headers.empty()) { 9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), 9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.extra_headers.end(), "\n"); 9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i.GetNext(); ) { 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.addHTTPHeaderField(WebString::fromUTF8(i.name()), 9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString::fromUTF8(i.values())); 9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (params.is_post) { 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.setHTTPMethod(WebString::fromUTF8("POST")); 9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set post data. 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebHTTPBody http_body; 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) http_body.initialize(); 9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* data = NULL; 9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (params.browser_initiated_post_data.size()) { 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data = reinterpret_cast<const char*>( 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ¶ms.browser_initiated_post_data.front()); 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) http_body.appendData( 9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebData(data, params.browser_initiated_post_data.size())); 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.setHTTPBody(http_body); 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Record this before starting the load, we need a lower bound of this time 976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // to sanitize the navigationStart override set below. 977116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->loadRequest(request); 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 980116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The browser provides the navigation_start time to bootstrap the 981116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Navigation Timing information for the browser-initiated navigations. In 982116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // case of cross-process navigations, this carries over the time of 983116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // finishing the onbeforeunload handler of the previous page. 984116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!params.browser_navigation_start.is_null()); 985116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (frame->provisionalDataSource()) { 986116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |browser_navigation_start| is likely before this process existed, so we 987116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // can't use InterProcessTimeTicksConverter. We need at least to ensure 988116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // that the browser-side navigation start we set is not later than the one 989116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // on the renderer side. 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks navigation_start = std::min( 991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.browser_navigation_start, renderer_navigation_start); 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double navigation_start_seconds = 9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (navigation_start - base::TimeTicks()).InSecondsF(); 9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->provisionalDataSource()->setNavigationStartTime( 9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_start_seconds); 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In case LoadRequest failed before DidCreateDataSource was called. 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_.reset(); 10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1003116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameImpl::BindServiceRegistry( 1004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::ScopedMessagePipeHandle service_provider_handle) { 1005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_registry_.BindRemoteServiceProvider(service_provider_handle.Pass()); 1006116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1007116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::OnBeforeUnload() { 10091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::OnBeforeUnload", 10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_); 10114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // TODO(creis): Right now, this is only called on the main frame. Make the 10124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // browser process send dispatchBeforeUnloadEvent to every frame that needs 10134ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // it. 1014a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(!frame_->parent()); 1015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); 10174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch bool proceed = frame_->dispatchBeforeUnloadEvent(); 1018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); 1019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed, 1020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) before_unload_start_time, 1021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) before_unload_end_time)); 1022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameImpl::OnSwapOut(int proxy_routing_id) { 10251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::OnSwapOut", "id", routing_id_); 1026cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameProxy* proxy = NULL; 10275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_site_per_process = 10285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess); 102903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool is_main_frame = !frame_->parent(); 1030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only run unload if we're not swapped out yet, but send the ack either way. 1032effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!is_swapped_out_ || !render_view_->is_swapped_out_) { 1033effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Swap this RenderFrame out so the frame can navigate to a page rendered by 1034effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // a different process. This involves running the unload handler and 103503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // clearing the page. We also allow this process to exit if there are no 103603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // other active RenderFrames in it. 10375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Send an UpdateState message before we get swapped out. Create the 1039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // RenderFrameProxy as well so its routing id is registered for receiving 1040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // IPC messages. 10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->SyncNavigationState(); 1042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch proxy = RenderFrameProxy::CreateProxyToReplaceFrame(this, 1043116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch proxy_routing_id); 10445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Synchronously run the unload handler before sending the ACK. 1046e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // TODO(creis): Call dispatchUnloadEvent unconditionally here to support 1047e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // unload on subframes as well. 104803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (is_main_frame) 1049e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch frame_->dispatchUnloadEvent(); 10505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Swap out and stop sending any IPC messages that are not ACKs. 10525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(nasko): Do we need RenderFrameImpl::is_swapped_out_ anymore? 105303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (is_main_frame) 1054effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_->SetSwappedOut(true); 10555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_swapped_out_ = true; 10565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now that we're swapped out and filtering IPC messages, stop loading to 10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ensure that no other in-progress navigation continues. We do this here 10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to avoid sending a DidStopLoading message to the browser process. 10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(creis): Should we be stopping all frames here and using 10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // StopAltErrorPageFetcher with RenderView::OnStop, or just stopping this 10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // frame? 106303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OnStop(); 10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Transfer settings such as initial drawing parameters to the remote frame 10661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // that will replace this frame. 106703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!is_main_frame) 10681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci proxy->web_frame()->initializeFromFrame(frame_); 1069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Replace the page with a blank dummy URL. The unload handler will not be 10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // run a second time, thanks to a check in FrameLoader::stopLoading. 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(creis): Need to add a better way to do this that avoids running the 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // beforeunload handler. For now, we just run it a second time silently. 107403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!is_site_per_process || is_main_frame) 10755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) render_view_->NavigateToSwappedOutURL(frame_); 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1077effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Let WebKit know that this view is hidden so it can drop resources and 1078effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // stop compositing. 1079effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // TODO(creis): Support this for subframes as well. 108003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (is_main_frame) { 1081effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_->webview()->setVisibilityState( 1082effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch blink::WebPageVisibilityStateHidden, false); 1083effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1086effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // It is now safe to show modal dialogs again. 1087effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // TODO(creis): Deal with modal dialogs from subframes. 108803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (is_main_frame) 1089effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_->suppress_dialogs_until_swap_out_ = false; 1090effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); 1092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Now that all of the cleanup is complete and the browser side is notified, 1094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // start using the RenderFrameProxy, if one is created. 10955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (proxy) { 109603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!is_main_frame) { 10975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) frame_->swap(proxy->web_frame()); 10985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (is_site_per_process) { 10995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(nasko): delete the frame here, since we've replaced it with a 11005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // proxy. 11015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 11025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 11035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) set_render_frame_proxy(proxy); 11045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 11055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 110603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 110703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Safe to exit if no one else is using the process. 110803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (is_main_frame) 110903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) render_view_->WasSwappedOut(); 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameImpl::OnContextMenuClosed( 11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CustomContextMenuContext& custom_context) { 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (custom_context.request_id) { 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // External request, should be in our map. 11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContextMenuClient* client = 11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_context_menus_.Lookup(custom_context.request_id); 11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (client) { 11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client->OnMenuClosed(custom_context.request_id); 11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_context_menus_.Remove(custom_context.request_id); 11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 11235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (custom_context.link_followed.is_valid()) { 11245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) frame_->sendPings( 11255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DomUtils::ExtractParentAnchorNode(context_menu_node_), 11265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) custom_context.link_followed); 11275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Internal request, forward to WebKit. 1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context_menu_node_.reset(); 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameImpl::OnCustomContextMenuAction( 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CustomContextMenuContext& custom_context, 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned action) { 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (custom_context.request_id) { 11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // External context menu request, look in our map. 11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContextMenuClient* client = 11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_context_menus_.Lookup(custom_context.request_id); 11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (client) 11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client->OnMenuAction(custom_context.request_id, action); 11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Internal request, forward to WebKit. 11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->webview()->performCustomContextMenuAction(action); 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnUndo() { 1149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->executeCommand(WebString::fromUTF8("Undo"), GetFocusedElement()); 1150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnRedo() { 1153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->executeCommand(WebString::fromUTF8("Redo"), GetFocusedElement()); 1154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::OnCut() { 1157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_->executeCommand(WebString::fromUTF8("Cut"), GetFocusedElement()); 1159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::OnCopy() { 1162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebNode current_node = context_menu_node_.isNull() ? 1164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetFocusedElement() : context_menu_node_; 1165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_->executeCommand(WebString::fromUTF8("Copy"), current_node); 1166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::OnPaste() { 1169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_->executeCommand(WebString::fromUTF8("Paste"), GetFocusedElement()); 1171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnPasteAndMatchStyle() { 1174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->executeCommand( 1176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebString::fromUTF8("PasteAndMatchStyle"), GetFocusedElement()); 1177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_MACOSX) 1180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnCopyToFindPboard() { 1181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Since the find pasteboard supports only plain text, this can be simpler 1182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // than the |OnCopy()| case. 1183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (frame_->hasSelection()) { 1184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::string16 selection = frame_->selectionAsText(); 1185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RenderThread::Get()->Send( 1186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new ClipboardHostMsg_FindPboardWriteStringAsync(selection)); 1187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 1190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnDelete() { 1192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->executeCommand(WebString::fromUTF8("Delete"), GetFocusedElement()); 1193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnSelectAll() { 1196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->executeCommand(WebString::fromUTF8("SelectAll"), GetFocusedElement()); 1198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnSelectRange(const gfx::Point& start, 1201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::Point& end) { 1202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This IPC is dispatched by RenderWidgetHost, so use its routing id. 1203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Send(new ViewHostMsg_SelectRange_ACK(GetRenderWidget()->routing_id())); 1204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->selectRange(start, end); 1207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnUnselect() { 1210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->executeCommand(WebString::fromUTF8("Unselect"), GetFocusedElement()); 1212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::OnReplace(const base::string16& text) { 1215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!frame_->hasSelection()) 1216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_->selectWordAroundCaret(); 1217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_->replaceSelection(text); 1219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::OnReplaceMisspelling(const base::string16& text) { 1222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!frame_->hasSelection()) 1223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 1224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_->replaceMisspelledRange(text); 1226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::OnCSSInsertRequest(const std::string& css) { 1229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_->document().insertStyleSheet(WebString::fromUTF8(css)); 1230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::OnJavaScriptExecuteRequest( 1233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& jscript, 1234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int id, 1235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool notify_result) { 1236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TRACE_EVENT_INSTANT0("test_tracing", "OnJavaScriptExecuteRequest", 1237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TRACE_EVENT_SCOPE_THREAD); 1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 1240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::Handle<v8::Value> result = 1241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_->executeScriptAndReturnValue(WebScriptSource(jscript)); 12421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HandleJavascriptExecutionResult(jscript, id, notify_result, result); 12441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameImpl::OnJavaScriptExecuteRequestForTests( 12471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::string16& jscript, 12481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int id, 12491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool notify_result) { 12501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_INSTANT0("test_tracing", "OnJavaScriptExecuteRequestForTests", 12511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT_SCOPE_THREAD); 12521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 12541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v8::Handle<v8::Value> result = 12551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_->executeScriptAndReturnValueForTests(WebScriptSource(jscript)); 12561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HandleJavascriptExecutionResult(jscript, id, notify_result, result); 12581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 12591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 12601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameImpl::HandleJavascriptExecutionResult( 12611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::string16& jscript, 12621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int id, 12631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool notify_result, 12641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v8::Handle<v8::Value> result) { 1265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (notify_result) { 1266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ListValue list; 1267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!result.IsEmpty()) { 1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::Local<v8::Context> context = frame_->mainWorldScriptContext(); 1269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::Context::Scope context_scope(context); 1270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) V8ValueConverterImpl converter; 1271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) converter.SetDateAllowed(true); 1272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) converter.SetRegExpAllowed(true); 1273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Value* result_value = converter.FromV8Value(result, context); 1274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) list.Set(0, result_value ? result_value : base::Value::CreateNullValue()); 1275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 1276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) list.Set(0, base::Value::CreateNullValue()); 1277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameHostMsg_JavaScriptExecuteResponse(routing_id_, id, list)); 1279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnSetEditableSelectionOffsets(int start, int end) { 1283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoReset<bool> handling_select_range(&handling_select_range_, true); 1284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GetRenderWidget()->ShouldHandleImeEvent()) 1285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 1286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ImeEventGuard guard(GetRenderWidget()); 1287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->setEditableSelectionOffsets(start, end); 1288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnSetCompositionFromExistingText( 1291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int start, int end, 1292effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::vector<blink::WebCompositionUnderline>& underlines) { 1293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GetRenderWidget()->ShouldHandleImeEvent()) 1294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 1295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ImeEventGuard guard(GetRenderWidget()); 1296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->setCompositionFromExistingText(start, end, underlines); 1297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::OnExtendSelectionAndDelete(int before, int after) { 1300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GetRenderWidget()->ShouldHandleImeEvent()) 1301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 1302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ImeEventGuard guard(GetRenderWidget()); 1303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_->extendSelectionAndDelete(before, after); 1304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1306116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { 1307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (accessibility_mode_ == new_mode) 1308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 1309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch accessibility_mode_ = new_mode; 1310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (renderer_accessibility_) { 1311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete renderer_accessibility_; 1312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch renderer_accessibility_ = NULL; 1313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (accessibility_mode_ == AccessibilityModeOff) 1315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 1316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (accessibility_mode_ & AccessibilityModeFlagFullTree) 1318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch renderer_accessibility_ = new RendererAccessibilityComplete(this); 1319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(OS_ANDROID) 1320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 1321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch renderer_accessibility_ = new RendererAccessibilityFocusOnly(this); 1322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 1323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameImpl::OnDisownOpener() { 13261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(creis): We should only see this for main frames for now. To support 13271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // disowning the opener on subframes, we will need to move WebContentsImpl's 13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // opener_ to FrameTreeNode. 13291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(!frame_->parent()); 13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (frame_->opener()) 13321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_->setOpener(NULL); 13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID) 13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameImpl::OnSelectPopupMenuItems( 13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool canceled, 13381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<int>& selected_indices) { 13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // It is possible to receive more than one of these calls if the user presses 13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // a select faster than it takes for the show-select-popup IPC message to make 13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // it to the browser UI thread. Ignore the extra-messages. 13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug. 13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!external_popup_menu_) 13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci external_popup_menu_->DidSelectItems(canceled, selected_indices); 13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci external_popup_menu_.reset(); 13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX) 13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameImpl::OnSelectPopupMenuItem(int selected_index) { 13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (external_popup_menu_ == NULL) 13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci external_popup_menu_->DidSelectItem(selected_index); 13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci external_popup_menu_.reset(); 13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1360e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid RenderFrameImpl::OnReload(bool ignore_cache) { 1361e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch frame_->reload(ignore_cache); 1362e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 1363e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RenderFrameImpl::OnTextSurroundingSelectionRequest(size_t max_length) { 1365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blink::WebSurroundingText surroundingText; 1366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) surroundingText.initialize(frame_->selectionRange(), max_length); 1367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (surroundingText.isNull()) { 1369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |surroundingText| might not be correctly initialized, for example if 1370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |frame_->selectionRange().isNull()|, in other words, if there was no 1371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // selection. 1372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new FrameHostMsg_TextSurroundingSelectionResponse( 1373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) routing_id_, base::string16(), 0, 0)); 1374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 1375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new FrameHostMsg_TextSurroundingSelectionResponse( 1378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) routing_id_, 1379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) surroundingText.textContent(), 1380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) surroundingText.startOffsetInTextContent(), 1381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) surroundingText.endOffsetInTextContent())); 1382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 13846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void RenderFrameImpl::OnAddStyleSheetByURL(const std::string& url) { 13856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) frame_->addStyleSheetByURL(WebString::fromUTF8(url)); 13866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 13876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 13886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderFrameImpl::OnSetupTransitionView(const std::string& markup) { 13896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) frame_->document().setIsTransitionDocument(); 13906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) frame_->navigateToSandboxedMarkup(WebData(markup.data(), markup.length())); 13916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 13926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 13936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderFrameImpl::OnBeginExitTransition(const std::string& css_selector) { 13946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) frame_->document().setIsTransitionDocument(); 13956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) frame_->document().beginExitTransition(WebString::fromUTF8(css_selector)); 13966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 13976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool RenderFrameImpl::ShouldUpdateSelectionTextFromContextMenuParams( 13995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& selection_text, 14005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t selection_text_offset, 14015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Range& selection_range, 14025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ContextMenuParams& params) { 14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 trimmed_selection_text; 14045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!selection_text.empty() && !selection_range.is_empty()) { 14055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int start = selection_range.GetMin() - selection_text_offset; 14065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t length = selection_range.length(); 14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (start >= 0 && start + length <= selection_text.length()) { 1408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(selection_text.substr(start, length), base::TRIM_ALL, 1409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &trimmed_selection_text); 14105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 trimmed_params_text; 1413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(params.selection_text, base::TRIM_ALL, 1414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &trimmed_params_text); 14155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return trimmed_params_text != trimmed_selection_text; 14165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool RenderFrameImpl::RunJavaScriptMessage(JavaScriptMessageType type, 1419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& message, 1420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::string16& default_value, 1421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& frame_url, 1422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16* result) { 1423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Don't allow further dialogs if we are waiting to swap out, since the 1424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // PageGroupLoadDeferrer in our stack prevents it. 1425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (render_view()->suppress_dialogs_until_swap_out_) 1426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 1427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool success = false; 1429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16 result_temp; 1430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!result) 1431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result = &result_temp; 1432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view()->SendAndRunNestedMessageLoop( 1434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new FrameHostMsg_RunJavaScriptMessage( 1435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch routing_id_, message, default_value, frame_url, type, &success, 1436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result)); 1437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return success; 1438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 14405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid RenderFrameImpl::LoadNavigationErrorPage( 14415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const WebURLRequest& failed_request, 14425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const WebURLError& error, 14435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool replace) { 14445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string error_html; 14455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetContentClient()->renderer()->GetNavigationErrorStrings( 14465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu render_view(), frame_, failed_request, error, &error_html, NULL); 14475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu frame_->loadHTMLString(error_html, 14495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GURL(kUnreachableWebDataURL), 14505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu error.unreachableURL, 14515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu replace); 14525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 14535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameImpl::DidCommitCompositorFrame() { 1455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER( 1456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameObserver, observers_, DidCommitCompositorFrame()); 1457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderView* RenderFrameImpl::GetRenderView() { 14605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_.get(); 1461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int RenderFrameImpl::GetRoutingID() { 1464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return routing_id_; 1465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 14671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciblink::WebLocalFrame* RenderFrameImpl::GetWebFrame() { 14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(frame_); 14695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame_; 14705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 14715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebPreferences& RenderFrameImpl::GetWebkitPreferences() { 1473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_->GetWebkitPreferences(); 1474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int RenderFrameImpl::ShowContextMenu(ContextMenuClient* client, 1477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const ContextMenuParams& params) { 14785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(client); // A null client means "internal" when we issue callbacks. 14795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContextMenuParams our_params(params); 14805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) our_params.custom_context.request_id = pending_context_menus_.Add(client); 14815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameHostMsg_ContextMenu(routing_id_, our_params)); 14825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return our_params.custom_context.request_id; 1483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::CancelContextMenu(int request_id) { 14865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(pending_context_menus_.Lookup(request_id)); 14875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pending_context_menus_.Remove(request_id); 1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)blink::WebNode RenderFrameImpl::GetContextMenuNode() const { 1491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return context_menu_node_; 1492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)blink::WebPlugin* RenderFrameImpl::CreatePlugin( 1495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 1496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const WebPluginInfo& info, 1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebPluginParams& params) { 1498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ(frame_, frame); 1499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 1500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool pepper_plugin_was_registered = false; 1501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_refptr<PluginModule> pepper_module(PluginModule::Create( 1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, info, &pepper_plugin_was_registered)); 1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pepper_plugin_was_registered) { 1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pepper_module.get()) { 15055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new PepperWebPluginImpl(pepper_module.get(), params, this); 1506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_CHROMEOS) 1509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(WARNING) << "Pepper module/plugin creation failed."; 1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 1511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(jam): change to take RenderFrame. 15135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new WebPluginImpl(frame, params, info.path, render_view_, this); 1514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 1515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 1516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 1517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 1518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::LoadURLExternally(blink::WebLocalFrame* frame, 1521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebURLRequest& request, 1522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebNavigationPolicy policy) { 1523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 15240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch loadURLExternally(frame, request, policy, WebString()); 1525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1527effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::ExecuteJavaScript(const base::string16& javascript) { 1528effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OnJavaScriptExecuteRequest(javascript, 0, false); 1529effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1530effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1531116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceRegistry* RenderFrameImpl::GetServiceRegistry() { 1532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return &service_registry_; 1533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool RenderFrameImpl::IsFTPDirectoryListing() { 15365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebURLResponseExtraDataImpl* extra_data = 15375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetExtraDataFromResponse(frame_->dataSource()->response()); 15385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return extra_data ? extra_data->is_ftp_directory_listing() : false; 15395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 15405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 154103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void RenderFrameImpl::AttachGuest(int element_instance_id) { 154203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) render_view_->GetBrowserPluginManager()->Attach(element_instance_id); 154303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 154403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// blink::WebFrameClient implementation ---------------------------------------- 15467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebPlugin* RenderFrameImpl::createPlugin( 1548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 1549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebPluginParams& params) { 1550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ(frame_, frame); 1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPlugin* plugin = NULL; 1552bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (GetContentClient()->renderer()->OverrideCreatePlugin( 1553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, frame, params, &plugin)) { 1554bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return plugin; 1555bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1556bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (base::UTF16ToUTF8(params.mimeType) == kBrowserPluginMimeType) { 15581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BrowserPluginDelegate> browser_plugin_delegate( 15591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetContentClient()->renderer()->CreateBrowserPluginDelegate( 15601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, std::string())); 1561bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( 15621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_.get(), frame, browser_plugin_delegate.Pass()); 1563bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1564bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 1566bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebPluginInfo info; 1567bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string mime_type; 1568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool found = false; 1569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new FrameHostMsg_GetPluginInfo( 1570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) routing_id_, params.url, frame->top()->document().url(), 1571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.mimeType.utf8(), &found, &info, &mime_type)); 1572bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!found) 1573bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return NULL; 1574bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1575a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (info.type == content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN) { 15761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BrowserPluginDelegate> browser_plugin_delegate( 15771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetContentClient()->renderer()->CreateBrowserPluginDelegate( 15781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, base::UTF16ToUTF8(params.mimeType))); 1579a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( 15801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_.get(), frame, browser_plugin_delegate.Pass()); 1581a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 1582a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1583a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1584bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebPluginParams params_to_use = params; 1585bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch params_to_use.mimeType = WebString::fromUTF8(mime_type); 1586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return CreatePlugin(frame, info, params_to_use); 1587bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#else 1588bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return NULL; 1589bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif // defined(ENABLE_PLUGINS) 15907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 15917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer( 1593c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 1594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url, 1595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayerClient* client) { 15961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return createMediaPlayer(frame, url, client, NULL); 15971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 15981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciblink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer( 16001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebLocalFrame* frame, 16011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebURL& url, 16021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebMediaPlayerClient* client, 16031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebContentDecryptionModule* initial_cdm) { 1604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(VIDEO_HOLE) 1605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!contains_media_player_) { 1606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_->RegisterVideoHoleFrame(this); 1607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch contains_media_player_ = true; 1608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // defined(VIDEO_HOLE) 1610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) blink::WebMediaStream web_stream( 1612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url)); 1613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!web_stream.isNull()) 1614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return CreateWebMediaPlayerForMediaStream(url, client); 1615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_ANDROID) 16171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return CreateAndroidWebMediaPlayer(url, client, initial_cdm); 1618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else 16191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderThreadImpl* render_thread = RenderThreadImpl::current(); 16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media::WebMediaPlayerParams params( 1621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&ContentRendererClient::DeferMediaLoad, 1622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(GetContentClient()->renderer()), 1623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<RenderFrame*>(this)), 16241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_thread->GetAudioRendererMixerManager()->CreateInput( 16251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_->routing_id_, routing_id_), 16261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *render_thread->GetAudioHardwareConfig(), 16271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new RenderMediaLog(), 16281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_thread->GetGpuFactories(), 16291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_thread->GetMediaThreadTaskRunner(), 16301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_thread->compositor_message_loop_proxy(), 16311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&EncryptedMediaPlayerSupportImpl::Create), 16321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci initial_cdm); 16331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new media::WebMediaPlayerImpl(frame, 16341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client, 16351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_.GetWeakPtr(), 16361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params); 1637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // defined(OS_ANDROID) 16387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 16397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1640effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochblink::WebContentDecryptionModule* 1641effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochRenderFrameImpl::createContentDecryptionModule( 1642c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 1643effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const blink::WebSecurityOrigin& security_origin, 1644effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const blink::WebString& key_system) { 1645effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!frame_ || frame_ == frame); 1646effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return WebContentDecryptionModuleImpl::Create( 1647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 1648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frame, 1649f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#elif defined(ENABLE_BROWSER_CDMS) 1650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetCdmManager(), 1651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 1652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) security_origin, 1653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key_system); 1654effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1655effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost( 1657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 1658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebApplicationCacheHostClient* client) { 1659bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!frame || !frame->view()) 1660bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return NULL; 1661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 1662bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return new RendererWebApplicationCacheHostImpl( 1663bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderViewImpl::FromWebView(frame->view()), client, 1664bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderThreadImpl::current()->appcache_dispatcher()->backend_proxy()); 16657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 16667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebWorkerPermissionClientProxy* 1668c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochRenderFrameImpl::createWorkerPermissionClientProxy( 1669c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame) { 16700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!frame || !frame->view()) 16710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return NULL; 1672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 16730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return GetContentClient()->renderer()->CreateWorkerPermissionClientProxy( 16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, frame); 16750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 16760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 167703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)WebExternalPopupMenu* RenderFrameImpl::createExternalPopupMenu( 167803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const WebPopupMenuInfo& popup_menu_info, 167903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WebExternalPopupMenuClient* popup_menu_client) { 16801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX) || defined(OS_ANDROID) 16811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // An IPC message is sent to the browser to build and display the actual 16821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // popup. The user could have time to click a different select by the time 16831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the popup is shown. In that case external_popup_menu_ is non NULL. 16841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // By returning NULL in that case, we instruct Blink to cancel that new 16851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // popup. So from the user perspective, only the first one will show, and 16861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // will have to close the first one before another one can be shown. 16871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (external_popup_menu_) 16881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 16891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci external_popup_menu_.reset( 16901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new ExternalPopupMenu(this, popup_menu_info, popup_menu_client)); 16911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (render_view_->screen_metrics_emulator_) { 16921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_->SetExternalPopupOriginAdjustmentsForEmulation( 16931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci external_popup_menu_.get(), 16941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view_->screen_metrics_emulator_.get()); 16951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 16961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return external_popup_menu_.get(); 16971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 16981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 16991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 170003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 170103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1702c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochblink::WebCookieJar* RenderFrameImpl::cookieJar(blink::WebLocalFrame* frame) { 1703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 17045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return &cookie_jar_; 17057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 17067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebServiceWorkerProvider* RenderFrameImpl::createServiceWorkerProvider( 1708c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame) { 1709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 1710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // At this point we should have non-null data source. 1711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(frame->dataSource()); 1712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!ChildThread::current()) 1713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; // May be null in some tests. 1714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ServiceWorkerNetworkProvider* provider = 1715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ServiceWorkerNetworkProvider::FromDocumentState( 1716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DocumentState::FromDataSource(frame->dataSource())); 17171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return new WebServiceWorkerProviderImpl( 1718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ChildThread::current()->thread_safe_sender(), 1719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) provider ? provider->context() : NULL); 17201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 17211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1722c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didAccessInitialDocument(blink::WebLocalFrame* frame) { 1723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 17245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Notify the browser process that it is no longer safe to show the pending 17255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // URL of the main frame, since a URL spoof is now possible. 17265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!frame->parent() && render_view_->page_id_ == -1) 17275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Send(new FrameHostMsg_DidAccessInitialDocument(routing_id_)); 17287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 17297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebFrame* RenderFrameImpl::createChildFrame( 1731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* parent, 1732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& name) { 17335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Synchronously notify the browser of a child frame creation to get the 17345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // routing_id for the RenderFrame. 1735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int child_routing_id = MSG_ROUTING_NONE; 17365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameHostMsg_CreateChildFrame(routing_id_, 17375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(name), 1738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &child_routing_id)); 17395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Allocation of routing id failed, so we can't create a child frame. This can 17405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // happen if this RenderFrameImpl's IPCs are being filtered when in swapped 17415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // out state. 1742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (child_routing_id == MSG_ROUTING_NONE) { 17435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if !defined(OS_LINUX) 17445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // DumpWithoutCrashing() crashes on Linux in renderer processes when 17455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // breakpad and sandboxing are enabled: crbug.com/349600 17465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::Alias(parent); 17475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::Alias(&routing_id_); 17485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool render_view_is_swapped_out = GetRenderWidget()->is_swapped_out(); 17495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::Alias(&render_view_is_swapped_out); 17505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool render_view_is_closing = GetRenderWidget()->closing(); 17515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::Alias(&render_view_is_closing); 17525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::Alias(&is_swapped_out_); 17535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::DumpWithoutCrashing(); 17545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif 17555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 17564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1758a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Create the RenderFrame and WebLocalFrame, linking the two. 17595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameImpl* child_render_frame = RenderFrameImpl::Create( 1760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_.get(), child_routing_id); 1761c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* web_frame = WebLocalFrame::create(child_render_frame); 17625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_render_frame->SetWebFrame(web_frame); 17634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1764a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Add the frame to the frame tree and initialize it. 1765a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch parent->appendChild(web_frame); 1766a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch child_render_frame->Initialize(); 1767a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 17684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return web_frame; 17697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 17707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1771c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didDisownOpener(blink::WebLocalFrame* frame) { 1772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 1773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // We only need to notify the browser if the active, top-level frame clears 1774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // its opener. We can ignore cases where a swapped out frame clears its 1775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // opener after hearing about it from the browser, and the browser does not 1776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // (yet) care about subframe openers. 1777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (render_view_->is_swapped_out_ || frame->parent()) 1778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 1779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Notify WebContents and all its swapped out RenderViews. 1781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Send(new FrameHostMsg_DidDisownOpener(routing_id_)); 17827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 17837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1784f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { 1785f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // NOTE: This function is called on the frame that is being detached and not 1786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the parent frame. This is different from createChildFrame() which is 1787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // called on the parent frame. 1788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(!is_detaching_); 1789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 1790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 17915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_subframe = !!frame->parent(); 17925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameHostMsg_Detach(routing_id_)); 1794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 17955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be 17965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // sent before setting |is_detaching_| to true. In contrast, Observers 17975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should only be notified afterwards so they cannot call back into here and 17985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have IPCs fired off. 17995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_detaching_ = true; 1800424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 18015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 18025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FrameDetached(frame)); 18034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We need to clean up subframes by removing them from the map and deleting 18055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the RenderFrameImpl. In contrast, the main frame is owned by its 18065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // containing RenderViewHost (so that they have the same lifetime), so only 18075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // removal from the map is needed and no deletion. 18085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMap::iterator it = g_frame_map.Get().find(frame); 18095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(it != g_frame_map.Get().end()); 18105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(it->second, this); 18115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_frame_map.Get().erase(it); 18125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (is_subframe) 18145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->parent()->removeChild(frame); 18155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |frame| is invalid after here. 1817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) frame->close(); 1818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (is_subframe) { 18205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete this; 18215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Object is invalid after this point. 18224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::frameFocused() { 1826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameHostMsg_FrameFocused(routing_id_)); 1827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::willClose(blink::WebFrame* frame) { 1830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 18315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FOR_EACH_OBSERVER(RenderFrameObserver, observers_, FrameWillClose()); 18335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 18345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FrameWillClose(frame)); 18357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1837c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didChangeName(blink::WebLocalFrame* frame, 1838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& name) { 1839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 1840bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!render_view_->renderer_preferences_.report_frame_name_changes) 1841bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 1842bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidChangeName(name)); 18447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 18457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 18464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderFrameImpl::didMatchCSS( 1847c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 1848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<blink::WebString>& newly_matching_selectors, 1849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<blink::WebString>& stopped_matching_selectors) { 1850a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 18515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 18525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 18535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidMatchCSS(frame, 18545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu newly_matching_selectors, 18555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu stopped_matching_selectors)); 18564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 18574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1858c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool RenderFrameImpl::shouldReportDetailedMessageForSource( 1859c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebString& source) { 1860c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetContentClient()->renderer()->ShouldReportDetailedMessageForSource( 1861c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch source); 1862c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1863c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1864c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didAddMessageToConsole( 1865c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebConsoleMessage& message, 1866c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebString& source_name, 1867c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unsigned source_line, 1868c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebString& stack_trace) { 1869c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch logging::LogSeverity log_severity = logging::LOG_VERBOSE; 1870c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch switch (message.level) { 1871c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case blink::WebConsoleMessage::LevelDebug: 1872c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch log_severity = logging::LOG_VERBOSE; 1873c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 1874c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case blink::WebConsoleMessage::LevelLog: 1875c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case blink::WebConsoleMessage::LevelInfo: 1876c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch log_severity = logging::LOG_INFO; 1877c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 1878c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case blink::WebConsoleMessage::LevelWarning: 1879c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch log_severity = logging::LOG_WARNING; 1880c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 1881c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case blink::WebConsoleMessage::LevelError: 1882c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch log_severity = logging::LOG_ERROR; 1883c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 1884c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch default: 1885c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NOTREACHED(); 1886c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 1887c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1888c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (shouldReportDetailedMessageForSource(source_name)) { 1889c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FOR_EACH_OBSERVER( 18905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RenderFrameObserver, observers_, 1891c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DetailedConsoleMessageAdded(message.text, 1892c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch source_name, 1893c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch stack_trace, 1894c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch source_line, 1895c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<int32>(log_severity))); 1896c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 1897c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1898c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Send(new FrameHostMsg_AddMessageToConsole(routing_id_, 1899c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<int32>(log_severity), 1900c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message.text, 1901c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<int32>(source_line), 1902c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch source_name)); 1903c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1904c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 19057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::loadURLExternally( 1906c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 1907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLRequest& request, 1908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNavigationPolicy policy, 1909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& suggested_name) { 1910a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 1911bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Referrer referrer(RenderViewImpl::GetReferrerFromRequest(frame, request)); 1912f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (policy == blink::WebNavigationPolicyDownload) { 1913424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DownloadUrl(render_view_->GetRoutingID(), 1914424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request.url(), referrer, 19151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci suggested_name)); 1916bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } else { 1917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OpenURL(frame, request.url(), referrer, policy); 1918bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 19197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 19207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( 19225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const NavigationPolicyInfo& info) { 19235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(!frame_ || frame_ == info.frame); 19245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return DecidePolicyForNavigation(this, info); 19253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 19263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1927c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochblink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame( 1928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebFrame* frame) { 1929a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(!frame_ || frame_ == frame); 1930a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return render_view_->history_controller()->GetItemForNewChildFrame(this); 1931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 1932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1933c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::willSendSubmitEvent(blink::WebLocalFrame* frame, 1934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebFormElement& form) { 1935a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 19365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 19375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 19385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WillSendSubmitEvent(frame, form)); 19397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 19407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::willSubmitForm(blink::WebLocalFrame* frame, 1942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebFormElement& form) { 1943a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 1944bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState* document_state = 1945bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState::FromDataSource(frame->provisionalDataSource()); 1946bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NavigationState* navigation_state = document_state->navigation_state(); 1947bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData* internal_data = 1948bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData::FromDocumentState(document_state); 1949bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 19501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ui::PageTransitionCoreTypeIs(navigation_state->transition_type(), 19511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK)) { 19521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci navigation_state->set_transition_type(ui::PAGE_TRANSITION_FORM_SUBMIT); 1953bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1954bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1955bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Save these to be processed when the ensuing navigation is committed. 1956bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebSearchableFormData web_searchable_form_data(form); 1957bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->set_searchable_form_url(web_searchable_form_data.url()); 1958bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->set_searchable_form_encoding( 1959bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch web_searchable_form_data.encoding().utf8()); 1960bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 19615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 19625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WillSubmitForm(frame, form)); 19637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 19647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame, 1966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDataSource* datasource) { 1967a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 1968a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1969bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 1970bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * pending_navigation_params_ 1971bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * webview 1972bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Needed methods: 1973bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * PopulateDocumentStateFromPending 1974bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * CreateNavigationStateFromPending 19757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didCreateDataSource(frame, datasource); 1976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1977a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Create the serviceworker's per-document network observing object. 1978a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<ServiceWorkerNetworkProvider> 1979a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) network_provider(new ServiceWorkerNetworkProvider()); 1980a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ServiceWorkerNetworkProvider::AttachToDocumentState( 1981a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DocumentState::FromDataSource(datasource), 1982a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) network_provider.Pass()); 19837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 19847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 19855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, 19865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_transition_navigation) { 1987a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 19888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 19898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // In fast/loader/stop-provisional-loads.html, we abort the load before this 19918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // callback is invoked. 19928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!ds) 19938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 19948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT2("navigation", "RenderFrameImpl::didStartProvisionalLoad", 19961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_, "url", ds->request().url().string().utf8()); 19978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 19988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We should only navigate to swappedout:// when is_swapped_out_ is true. 20008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CHECK((ds->request().url() != GURL(kSwappedOutURL)) || 20015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_swapped_out_ || 20028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) render_view_->is_swapped_out()) << 20038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Heard swappedout:// when not swapped out."; 20048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Update the request time if WebKit has better knowledge of it. 20068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (document_state->request_time().is_null()) { 20078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) double event_time = ds->triggeringEventTime(); 20088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (event_time != 0.0) 20098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) document_state->set_request_time(Time::FromDoubleT(event_time)); 20108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 20118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Start time is only set after request time. 20138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) document_state->set_start_load_time(Time::Now()); 20148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool is_top_most = !frame->parent(); 20168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_top_most) { 20178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) render_view_->set_navigation_gesture( 20188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebUserGestureIndicator::isProcessingUserGesture() ? 20198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigationGestureUser : NavigationGestureAuto); 20208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else if (ds->replacesCurrentHistoryItem()) { 20218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Subframe navigations that don't add session history items must be 20228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we 20238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // handle loading of error pages. 20248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) document_state->navigation_state()->set_transition_type( 20251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_AUTO_SUBFRAME); 20268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 20278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 20295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidStartProvisionalLoad(frame)); 20305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidStartProvisionalLoad()); 20315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Send(new FrameHostMsg_DidStartProvisionalLoadForFrame( 20335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) routing_id_, ds->request().url(), is_transition_navigation)); 20347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 20357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 20367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( 2037c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame) { 2038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2039a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_view_->history_controller()->RemoveChildrenForRedirect(this); 20407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 20417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2042c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didFailProvisionalLoad(blink::WebLocalFrame* frame, 2043c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebURLError& error) { 20441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::didFailProvisionalLoad", 20451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_); 2046a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 20475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 20485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ds); 20495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebURLRequest& failed_request = ds->request(); 20515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Notify the browser that we failed a provisional load with an error. 20535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // 20545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Note: It is important this notification occur before DidStopLoading so the 20555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // SSL manager can react to the provisional load failure before being 20565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // notified the load stopped. 20575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // 20585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 20595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidFailProvisionalLoad(frame, error)); 20605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 20615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidFailProvisionalLoad(error)); 20625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool show_repost_interstitial = 20645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (error.reason == net::ERR_CACHE_MISS && 20655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EqualsASCII(failed_request.httpMethod(), "POST")); 20665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameHostMsg_DidFailProvisionalLoadWithError_Params params; 20685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.error_code = error.reason; 20695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetContentClient()->renderer()->GetNavigationErrorStrings( 20705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_.get(), 20715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame, 20725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) failed_request, 20735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error, 20745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL, 20755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ¶ms.error_description); 20765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.url = error.unreachableURL; 20775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.showing_repost_interstitial = show_repost_interstitial; 20785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameHostMsg_DidFailProvisionalLoadWithError( 20795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) routing_id_, params)); 20805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Don't display an error page if this is simply a cancelled load. Aside 20825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // from being dumb, WebCore doesn't expect it and it will cause a crash. 20835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error.reason == net::ERR_ABORTED) 20845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 20855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Don't display "client blocked" error page if browser has asked us not to. 20875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error.reason == net::ERR_BLOCKED_BY_CLIENT && 20885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->renderer_preferences_.disable_client_blocked_error_page) { 20895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 20905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 20915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Allow the embedder to suppress an error page. 20935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetContentClient()->renderer()->ShouldSuppressErrorPage(this, 20945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error.unreachableURL)) { 20955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 20965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 20975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (RenderThreadImpl::current() && 20995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderThreadImpl::current()->layout_test_mode()) { 21005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 21015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 21025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure we never show errors in view source mode. 21045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->enableViewSourceMode(false); 21055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 21075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 21085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If this is a failed back/forward/reload navigation, then we need to do a 21105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 'replace' load. This is necessary to avoid messing up session history. 21115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Otherwise, we do a normal load, which simulates a 'go' navigation as far 21125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // as session history is concerned. 21135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 21145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // AUTO_SUBFRAME loads should always be treated as loads that do not advance 21155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the page id. 21165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 21175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): This should also take the failed navigation's replacement 21185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // state into account, if a location.replace() failed. 21195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool replace = 21205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->pending_page_id() != -1 || 21211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransitionCoreTypeIs(navigation_state->transition_type(), 21221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_AUTO_SUBFRAME); 21235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we failed on a browser initiated request, then make sure that our error 21255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page load is regarded as the same browser initiated request. 21265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!navigation_state->is_content_initiated()) { 21275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_.reset( 21285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new FrameMsg_Navigate_Params); 21295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_->page_id = 21305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->pending_page_id(); 21315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_->pending_history_list_offset = 21325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->pending_history_list_offset(); 21335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_->should_clear_history_list = 21345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->history_list_was_cleared(); 21355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_->transition = 21365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->transition_type(); 21375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_->request_time = 21385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) document_state->request_time(); 21395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->pending_navigation_params_->should_replace_current_entry = 21405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) replace; 21415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 21425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Load an error page. 21445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LoadNavigationErrorPage(failed_request, error, replace); 21457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 21467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didCommitProvisionalLoad( 2148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 2149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebHistoryItem& item, 2150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebHistoryCommitType commit_type) { 21511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT2("navigation", "RenderFrameImpl::didCommitProvisionalLoad", 21521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_, 21531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "url", GetLoadingUrl().possibly_invalid_spec()); 2154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 21555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DocumentState* document_state = 21565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DocumentState::FromDataSource(frame->dataSource()); 21575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 2158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // When we perform a new navigation, we need to update the last committed 2160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // session history entry with state for the page we are leaving. Do this 2161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // before updating the HistoryController state. 2162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_->UpdateSessionHistory(frame); 2163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_view_->history_controller()->UpdateForCommit(this, item, commit_type, 2165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch navigation_state->was_within_same_page()); 2166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 21675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InternalDocumentStateData* internal_data = 21685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 21695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (document_state->commit_load_time().is_null()) 21715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) document_state->set_commit_load_time(Time::Now()); 21725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (internal_data->must_reset_scroll_and_scale_state()) { 21745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->webview()->resetScrollAndScaleState(); 21755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) internal_data->set_must_reset_scroll_and_scale_state(false); 21765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 21775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) internal_data->set_use_error_page(false); 21785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_new_navigation = commit_type == blink::WebStandardCommit; 21805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (is_new_navigation) { 21815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We bump our Page ID to correspond with the new session history entry. 21825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->page_id_ = render_view_->next_page_id_++; 21835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Don't update history_page_ids_ (etc) for kSwappedOutURL, since 21855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // we don't want to forget the entry that was there, and since we will 21865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // never come back to kSwappedOutURL. Note that we have to call 21875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // UpdateSessionHistory and update page_id_ even in this case, so that 21885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the current entry gets a state update and so that we don't send a 21895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // state update to the wrong entry when we swap back in. 2190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (GetLoadingUrl() != GURL(kSwappedOutURL)) { 21915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Advance our offset in session history, applying the length limit. 21925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There is now no forward history. 21935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_offset_++; 21945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries) 21955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1; 21965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_length_ = 21975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_offset_ + 1; 21985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_page_ids_.resize( 21995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_length_, -1); 22005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_page_ids_[render_view_->history_list_offset_] = 22015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->page_id_; 22025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 22035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 22045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Inspect the navigation_state on this frame to see if the navigation 22055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // corresponds to a session history navigation... Note: |frame| may or 22065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // may not be the toplevel frame, but for the case of capturing session 22075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // history, the first committed frame suffices. We keep track of whether 22085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // we've seen this commit before so that only capture session history once 22095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // per navigation. 22105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 22115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note that we need to check if the page ID changed. In the case of a 22125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // reload, the page ID doesn't change, and UpdateSessionHistory gets the 22135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // previous URL and the current page ID, which would be wrong. 22145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (navigation_state->pending_page_id() != -1 && 22155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->pending_page_id() != render_view_->page_id_ && 22165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !navigation_state->request_committed()) { 22175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This is a successful session history navigation! 22185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->page_id_ = navigation_state->pending_page_id(); 22195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_offset_ = 22215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->pending_history_list_offset(); 22225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the history list is valid, our list of page IDs should be correct. 22245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(render_view_->history_list_length_ <= 0 || 22255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_offset_ < 0 || 22265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_offset_ >= 22275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_list_length_ || 22285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->history_page_ids_[render_view_->history_list_offset_] 22295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) == render_view_->page_id_); 22305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 22315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 22325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new FrameHostMsg_DidAssignPageId(routing_id_, render_view_->page_id_)); 22341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, 2236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DidCommitProvisionalLoad(frame, is_new_navigation)); 22375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 22385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidCommitProvisionalLoad(is_new_navigation)); 22395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!frame->parent()) { // Only for top frames. 2241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); 2242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (render_thread_impl) { // Can be NULL in tests. 2243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) render_thread_impl->histogram_customizer()-> 2244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewNavigatedToHost(GURL(GetLoadingUrl()).host(), 2245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderViewImpl::GetRenderViewCount()); 2246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 2247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 2248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 22495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Remember that we've already processed this request, so we don't update 22505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the session history again. We do this regardless of whether this is 22515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // a session history navigation, because if we attempted a session history 22525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigation without valid HistoryItem state, WebCore will think it is a 22535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // new navigation. 22545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->set_request_committed(true); 22555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendDidCommitProvisionalLoad(frame); 22575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Check whether we have new encoding name. 2259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 22607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 22617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameImpl::didClearWindowObject(blink::WebLocalFrame* frame) { 2263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2264bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 2265bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * enabled_bindings_ 2266bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * dom_automation_controller_ 2267bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * stats_collection_controller_ 2268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_->didClearWindowObject(frame); 2270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (render_view_->GetEnabledBindings() & BINDINGS_POLICY_DOM_AUTOMATION) 2272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DomAutomationController::Install(this, frame); 2273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidClearWindowObject()); 22757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 22767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didCreateDocumentElement(blink::WebLocalFrame* frame) { 2278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2280bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Notify the browser about non-blank documents loading in the top frame. 2281bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL url = frame->document().url(); 2282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (url.is_valid() && url.spec() != url::kAboutBlankURL) { 2283bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Check if webview()->mainFrame() is the same as the 2284bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // frame->tree()->top(). 2285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) blink::WebFrame* main_frame = render_view_->webview()->mainFrame(); 2286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (frame == main_frame) { 2287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For now, don't remember plugin zoom values. We don't want to mix them 2288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // with normal web content (i.e. a fixed layout plugin would usually want 2289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // them different). 2290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DocumentAvailableInMainFrame( 2291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_->GetRoutingID(), 2292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) main_frame->document().isPluginDocument())); 2293424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 2294bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2295bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 22965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 22975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidCreateDocumentElement(frame)); 22987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 22997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didReceiveTitle(blink::WebLocalFrame* frame, 2301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& title, 2302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebTextDirection direction) { 2303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ignore all but top level navigations. 2305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!frame->parent()) { 2306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::string16 title16 = title; 2307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::debug::TraceLog::GetInstance()->UpdateProcessLabel( 2308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) routing_id_, base::UTF16ToUTF8(title16)); 2309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::string16 shortened_title = title16.substr(0, kMaxTitleChars); 2311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new FrameHostMsg_UpdateTitle(routing_id_, 2312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) render_view_->page_id_, 2313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) shortened_title, direction)); 2314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Also check whether we have new encoding name. 2317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 23187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 23197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didChangeIcon(blink::WebLocalFrame* frame, 2321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIconURL::Type icon_type) { 2322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2323bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Investigate wheather implementation should move here. 23247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didChangeIcon(frame, icon_type); 23257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 23267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didFinishDocumentLoad(blink::WebLocalFrame* frame) { 23281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::didFinishDocumentLoad", 23291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_); 2330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 23315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 23325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 23335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) document_state->set_finish_document_load_time(Time::Now()); 23345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameHostMsg_DidFinishDocumentLoad(routing_id_)); 23365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 23385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidFinishDocumentLoad(frame)); 2339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishDocumentLoad()); 2340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 23415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Check whether we have new encoding name. 2342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 23437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 23447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didHandleOnloadEvents(blink::WebLocalFrame* frame) { 2346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!frame->parent()) 2348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Send(new FrameHostMsg_DocumentOnLoadCompleted(routing_id_)); 23497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 23507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didFailLoad(blink::WebLocalFrame* frame, 2352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLError& error) { 23531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::didFailLoad", 23541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_); 2355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2356bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. No state needed. 23575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 23585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ds); 23595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 23615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidFailLoad(frame, error)); 23625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebURLRequest& failed_request = ds->request(); 23645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 error_description; 23655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetContentClient()->renderer()->GetNavigationErrorStrings( 23665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_.get(), 23675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame, 23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) failed_request, 23695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error, 23705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL, 23715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &error_description); 23725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameHostMsg_DidFailLoadWithError(routing_id_, 23735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) failed_request.url(), 23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error.reason, 23755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error_description)); 23767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 23777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didFinishLoad(blink::WebLocalFrame* frame) { 23791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::didFinishLoad", 23801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_); 2381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 2383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 2384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (document_state->finish_load_time().is_null()) { 2385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!frame->parent()) { 2386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TRACE_EVENT_INSTANT0("WebCore", "LoadFinished", 2387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TRACE_EVENT_SCOPE_PROCESS); 2388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) document_state->set_finish_load_time(Time::Now()); 2390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 23935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DidFinishLoad(frame)); 2394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishLoad()); 2395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Don't send this message while the frame is swapped out. 2397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_swapped_out()) 2398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 2399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameHostMsg_DidFinishLoad(routing_id_, 2401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ds->request().url())); 24027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 24037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didNavigateWithinPage(blink::WebLocalFrame* frame, 2405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebHistoryItem& item, 2406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebHistoryCommitType commit_type) { 24071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::didNavigateWithinPage", 24081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_); 2409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(!frame_ || frame_ == frame); 2410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If this was a reference fragment navigation that we initiated, then we 2411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // could end up having a non-null pending navigation params. We just need to 2412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // update the ExtraData on the datasource so that others who read the 2413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ExtraData will get the new NavigationState. Similarly, if we did not 2414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // initiate this navigation, then we need to take care to reset any pre- 2415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // existing navigation state to a content-initiated navigation state. 2416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // DidCreateDataSource conveniently takes care of this for us. 2417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch didCreateDataSource(frame, frame->dataSource()); 2418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DocumentState* document_state = 2420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DocumentState::FromDataSource(frame->dataSource()); 2421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NavigationState* new_state = document_state->navigation_state(); 2422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new_state->set_was_within_same_page(true); 2423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch didCommitProvisionalLoad(frame, item, commit_type); 2425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didUpdateCurrentHistoryItem(blink::WebLocalFrame* frame) { 2428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2429bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed methods: 2430bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * StartNavStateSyncTimerIfNecessary 24317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didUpdateCurrentHistoryItem(frame); 24327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 24337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 24346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void RenderFrameImpl::addNavigationTransitionData( 24356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const blink::WebString& allowed_destination_host_pattern, 24366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const blink::WebString& selector, 24376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const blink::WebString& markup) { 24386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Send(new FrameHostMsg_AddNavigationTransitionData( 24396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) routing_id_, allowed_destination_host_pattern.utf8(), selector.utf8(), 24406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) markup.utf8())); 24416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 24426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2443116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameImpl::didChangeThemeColor() { 24446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (frame_->parent()) 24456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 24466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new FrameHostMsg_DidChangeThemeColor( 2448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch routing_id_, frame_->document().themeColor())); 24496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 24506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 24515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderFrameImpl::requestNotificationPermission( 24525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const blink::WebSecurityOrigin& origin, 24535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blink::WebNotificationPermissionCallback* callback) { 24545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!notification_permission_dispatcher_) { 24555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) notification_permission_dispatcher_ = 24565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new NotificationPermissionDispatcher(this); 24575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 24585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 24595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) notification_permission_dispatcher_->RequestPermission(origin, callback); 24605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 24615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebNotificationPresenter* RenderFrameImpl::notificationPresenter() { 24630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return notification_provider_; 2464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 2465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 246623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void RenderFrameImpl::didChangeSelection(bool is_empty_selection) { 2467effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GetRenderWidget()->handling_input_event() && !handling_select_range_) 2468effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 2469effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2470effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (is_empty_selection) 2471effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_.clear(); 2472effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 24731675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // UpdateTextInputType should be called before SyncSelectionIfRequired. 24741675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // UpdateTextInputType may send TextInputTypeChanged to notify the focus 2475effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // was changed, and SyncSelectionIfRequired may send SelectionChanged 2476effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // to notify the selection was changed. Focus change should be notified 2477effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // before selection change. 24781675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch GetRenderWidget()->UpdateTextInputType(); 2479effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SyncSelectionIfRequired(); 24801675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#if defined(OS_ANDROID) 24811675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch GetRenderWidget()->UpdateTextInputState(RenderWidget::NO_SHOW_IME, 24821675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch RenderWidget::FROM_NON_IME); 24831675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#endif 248423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 248523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochblink::WebColorChooser* RenderFrameImpl::createColorChooser( 2487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebColorChooserClient* client, 2488c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebColor& initial_color, 2489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebVector<blink::WebColorSuggestion>& suggestions) { 2490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RendererWebColorChooserImpl* color_chooser = 2491a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new RendererWebColorChooserImpl(this, client); 2492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<content::ColorSuggestion> color_suggestions; 2493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (size_t i = 0; i < suggestions.size(); i++) { 2494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch color_suggestions.push_back(content::ColorSuggestion(suggestions[i])); 2495c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch color_chooser->Open(static_cast<SkColor>(initial_color), color_suggestions); 2497c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return color_chooser; 2498c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2499c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::runModalAlertDialog(const blink::WebString& message) { 2501c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_ALERT, 2502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message, 2503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16(), 2504c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_->document().url(), 2505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NULL); 2506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool RenderFrameImpl::runModalConfirmDialog(const blink::WebString& message) { 2509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_CONFIRM, 2510c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message, 2511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16(), 2512c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_->document().url(), 2513c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NULL); 2514c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2515c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2516c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool RenderFrameImpl::runModalPromptDialog( 2517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebString& message, 2518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebString& default_value, 2519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebString* actual_value) { 2520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16 result; 2521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool ok = RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_PROMPT, 2522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message, 2523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch default_value, 2524c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame_->document().url(), 2525c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &result); 2526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (ok) 2527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch actual_value->assign(result); 2528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return ok; 2529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool RenderFrameImpl::runModalBeforeUnloadDialog( 2532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_reload, 2533c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebString& message) { 2534c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If we are swapping out, we have already run the beforeunload handler. 2535c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(creis): Fix OnSwapOut to clear the frame without running beforeunload 2536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // at all, to avoid running it twice. 2537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (render_view()->is_swapped_out_) 2538c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 2539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Don't allow further dialogs if we are waiting to swap out, since the 2541c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // PageGroupLoadDeferrer in our stack prevents it. 2542c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (render_view()->suppress_dialogs_until_swap_out_) 2543c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 2544c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool success = false; 2546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This is an ignored return value, but is included so we can accept the same 2547c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // response as RunJavaScriptMessage. 2548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16 ignored_result; 2549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch render_view()->SendAndRunNestedMessageLoop( 2550c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new FrameHostMsg_RunBeforeUnloadConfirm( 2551c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch routing_id_, frame_->document().url(), message, is_reload, 2552c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &success, &ignored_result)); 2553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return success; 2554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 2555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::showContextMenu(const blink::WebContextMenuData& data) { 2557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ContextMenuParams params = ContextMenuParamsBuilder::Build(data); 2558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.source_type = GetRenderWidget()->context_menu_source_type(); 2559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetRenderWidget()->OnShowHostContextMenu(¶ms); 25605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (GetRenderWidget()->has_host_context_menu_location()) { 25615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.x = GetRenderWidget()->host_context_menu_location().x(); 25625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.y = GetRenderWidget()->host_context_menu_location().y(); 25635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Plugins, e.g. PDF, don't currently update the render view when their 2566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // selected text changes, but the context menu params do contain the updated 2567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // selection. If that's the case, update the render view's state just prior 2568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to showing the context menu. 2569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(asvitkine): http://crbug.com/152432 2570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (ShouldUpdateSelectionTextFromContextMenuParams( 2571effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_, selection_text_offset_, selection_range_, params)) { 2572effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_ = params.selection_text; 2573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(asvitkine): Text offset and range is not available in this case. 2574effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_offset_ = 0; 2575effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_range_ = gfx::Range(0, selection_text_.length()); 2576effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This IPC is dispatched by RenderWidetHost, so use its routing ID. 2577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new ViewHostMsg_SelectionChanged( 2578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetRenderWidget()->routing_id(), selection_text_, 2579effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_offset_, selection_range_)); 2580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Serializing a GURL longer than kMaxURLChars will fail, so don't do 2583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // it. We replace it with an empty GURL so the appropriate items are disabled 2584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // in the context menu. 2585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(jcivelli): http://crbug.com/45160 This prevents us from saving large 2586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // data encoded images. We should have a way to save them. 2587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (params.src_url.spec().size() > GetMaxURLChars()) 2588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.src_url = GURL(); 2589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context_menu_node_ = data.node; 2590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_ANDROID) 2592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect start_rect; 2593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect end_rect; 2594effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetRenderWidget()->GetSelectionBounds(&start_rect, &end_rect); 2595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.selection_start = gfx::Point(start_rect.x(), start_rect.bottom()); 2596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.selection_end = gfx::Point(end_rect.right(), end_rect.bottom()); 2597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 2598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameHostMsg_ContextMenu(routing_id_, params)); 2600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::clearContextMenu() { 2603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context_menu_node_.reset(); 2604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 26067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::willSendRequest( 2607c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 26087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned identifier, 2609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLRequest& request, 2610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& redirect_response) { 2611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2612bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // The request my be empty during tests. 2613bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (request.url().isEmpty()) 2614bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 2615bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 261646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Set the first party for cookies url if it has not been set yet (new 261746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // requests). For redirects, it is updated by WebURLLoaderImpl. 261846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (request.firstPartyForCookies().isEmpty()) { 26195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel) { 262046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request.setFirstPartyForCookies(request.url()); 262146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 26225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(nasko): When the top-level frame is remote, there is no document. 26235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This is broken and should be fixed to propagate the first party. 26245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebFrame* top = frame->top(); 26255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (top->isWebLocalFrame()) { 26265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) request.setFirstPartyForCookies( 26275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) frame->top()->document().firstPartyForCookies()); 26285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 262946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 263046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 263146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2632bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebFrame* top_frame = frame->top(); 26335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(nasko): Hack around asking about top-frame data source. This means 26345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // for out-of-process iframes we are treating the current frame as the 26355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // top-level frame, which is wrong. 26365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!top_frame || top_frame->isWebRemoteFrame()) 2637bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch top_frame = frame; 2638bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDataSource* provisional_data_source = top_frame->provisionalDataSource(); 2639bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDataSource* top_data_source = top_frame->dataSource(); 2640bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDataSource* data_source = 2641bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch provisional_data_source ? provisional_data_source : top_data_source; 2642bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 26431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PageTransition transition_type = ui::PAGE_TRANSITION_LINK; 2644bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState* document_state = DocumentState::FromDataSource(data_source); 2645bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(document_state); 2646bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData* internal_data = 2647bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData::FromDocumentState(document_state); 2648bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NavigationState* navigation_state = document_state->navigation_state(); 2649bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch transition_type = navigation_state->transition_type(); 2650bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2651bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL request_url(request.url()); 2652bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL new_url; 2653bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (GetContentClient()->renderer()->WillSendRequest( 2654bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch frame, 2655bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch transition_type, 2656bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request_url, 2657bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.firstPartyForCookies(), 2658bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch &new_url)) { 2659bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setURL(WebURL(new_url)); 2660bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2661bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2662bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (internal_data->is_cache_policy_override_set()) 2663bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setCachePolicy(internal_data->cache_policy_override()); 2664bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2665bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // The request's extra data may indicate that we should set a custom user 2666bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // agent. This needs to be done here, after WebKit is through with setting the 266703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // user agent on its own. Similarly, it may indicate that we should set an 266803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // X-Requested-With header. This must be done here to avoid breaking CORS 266903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // checks. 2670bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebString custom_user_agent; 267103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WebString requested_with; 2672bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (request.extraData()) { 2673effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RequestExtraData* old_extra_data = 267403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static_cast<RequestExtraData*>(request.extraData()); 2675bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 267603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) custom_user_agent = old_extra_data->custom_user_agent(); 2677bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!custom_user_agent.isNull()) { 2678bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (custom_user_agent.isEmpty()) 2679bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.clearHTTPHeaderField("User-Agent"); 2680bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch else 2681bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setHTTPHeaderField("User-Agent", custom_user_agent); 2682bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 268303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 268403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) requested_with = old_extra_data->requested_with(); 268503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!requested_with.isNull()) { 268603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (requested_with.isEmpty()) 268703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request.clearHTTPHeaderField("X-Requested-With"); 268803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) else 268903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request.setHTTPHeaderField("X-Requested-With", requested_with); 269003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 2691bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2692bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 269346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Add the default accept header for frame request if it has not been set 269446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // already. 26955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if ((request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || 26965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) request.frameType() == blink::WebURLRequest::FrameTypeNested) && 269746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request.httpHeaderField(WebString::fromUTF8(kAcceptHeader)).isEmpty()) { 269846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request.setHTTPHeaderField(WebString::fromUTF8(kAcceptHeader), 269946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebString::fromUTF8(kDefaultAcceptHeader)); 270046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 270146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Add an empty HTTP origin header for non GET methods if none is currently 2703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // present. 2704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch request.addHTTPOriginIfNeeded(WebString()); 2705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Attach |should_replace_current_entry| state to requests so that, should 2707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // this navigation later require a request transfer, all state is preserved 2708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // when it is re-created in the new process. 2709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool should_replace_current_entry = false; 2710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (navigation_state->is_content_initiated()) { 2711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_replace_current_entry = data_source->replacesCurrentHistoryItem(); 2712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 2713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If the navigation is browser-initiated, the NavigationState contains the 2714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // correct value instead of the WebDataSource. 2715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(davidben): Avoid this awkward duplication of state. See comment on 2717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // NavigationState::should_replace_current_entry(). 2718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_replace_current_entry = 2719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) navigation_state->should_replace_current_entry(); 2720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int provider_id = kInvalidServiceWorkerProviderId; 27235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || 27245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) request.frameType() == blink::WebURLRequest::FrameTypeNested) { 2725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |provisionalDataSource| may be null in some content::ResourceFetcher 2726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // use cases, we don't hook those requests. 2727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (frame->provisionalDataSource()) { 2728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ServiceWorkerNetworkProvider* provider = 2729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ServiceWorkerNetworkProvider::FromDocumentState( 2730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DocumentState::FromDataSource(frame->provisionalDataSource())); 2731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) provider_id = provider->provider_id(); 2732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else if (frame->dataSource()) { 2734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ServiceWorkerNetworkProvider* provider = 2735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ServiceWorkerNetworkProvider::FromDocumentState( 2736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DocumentState::FromDataSource(frame->dataSource())); 2737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) provider_id = provider->provider_id(); 2738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebFrame* parent = frame->parent(); 27415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int parent_routing_id = MSG_ROUTING_NONE; 27425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!parent) { 27435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_routing_id = -1; 27445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (parent->isWebLocalFrame()) { 27455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_routing_id = FromWebFrame(parent)->GetRoutingID(); 27465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 27475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_routing_id = RenderFrameProxy::FromWebFrame(parent)->routing_id(); 27485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 27495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2750effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch RequestExtraData* extra_data = new RequestExtraData(); 2751effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_visibility_state(render_view_->visibilityState()); 2752effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_custom_user_agent(custom_user_agent); 275303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) extra_data->set_requested_with(requested_with); 2754effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_render_frame_id(routing_id_); 2755effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_is_main_frame(frame == top_frame); 2756effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_frame_origin( 2757effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL(frame->document().securityOrigin().toString())); 2758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_parent_is_main_frame(frame->parent() == top_frame); 2759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_parent_render_frame_id(parent_routing_id); 2760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_allow_download(navigation_state->allow_download()); 2761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_transition_type(transition_type); 2762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_should_replace_current_entry(should_replace_current_entry); 2763effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_transferred_request_child_id( 2764effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch navigation_state->transferred_request_child_id()); 2765effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_transferred_request_request_id( 2766effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch navigation_state->transferred_request_request_id()); 2767effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extra_data->set_service_worker_provider_id(provider_id); 2768effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch request.setExtraData(extra_data); 2769bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2770bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState* top_document_state = 2771bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState::FromDataSource(top_data_source); 2772558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (top_document_state) { 2773558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // TODO(gavinp): separate out prefetching and prerender field trials 2774558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // if the rel=prerender rel type is sticking around. 27755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (request.requestContext() == WebURLRequest::RequestContextPrefetch) 2776558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch top_document_state->set_was_prefetcher(true); 2777558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 2778bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2779bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // This is an instance where we embed a copy of the routing id 2780bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // into the data portion of the message. This can cause problems if we 2781bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // don't register this id on the browser side, since the download manager 2782bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // expects to find a RenderViewHost based off the id. 2783424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request.setRequestorID(render_view_->GetRoutingID()); 2784bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setHasUserGesture(WebUserGestureIndicator::isProcessingUserGesture()); 2785bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2786bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!navigation_state->extra_headers().empty()) { 2787bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch for (net::HttpUtil::HeadersIterator i( 2788bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_state->extra_headers().begin(), 2789bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_state->extra_headers().end(), "\n"); 2790bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch i.GetNext(); ) { 27915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (LowerCaseEqualsASCII(i.name(), "referer")) { 27925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString referrer = WebSecurityPolicy::generateReferrerHeader( 27935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebReferrerPolicyDefault, 27945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.url(), 27955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString::fromUTF8(i.values())); 27965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.setHTTPReferrer(referrer, blink::WebReferrerPolicyDefault); 27975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 27985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.setHTTPHeaderField(WebString::fromUTF8(i.name()), 27995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebString::fromUTF8(i.values())); 28005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2801bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2802bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2803bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2804bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!render_view_->renderer_preferences_.enable_referrers) 28055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.setHTTPReferrer(WebString(), blink::WebReferrerPolicyDefault); 28067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 28077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 28087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didReceiveResponse( 2809c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 28107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned identifier, 2811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response) { 2812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2813bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Only do this for responses that correspond to a provisional data source 2814bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // of the top-most frame. If we have a provisional data source, then we 2815bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // can't have any sub-resources yet, so we know that this response must 2816bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // correspond to a frame load. 2817bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!frame->provisionalDataSource() || frame->parent()) 2818bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 2819bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2820bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // If we are in view source mode, then just let the user see the source of 2821bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // the server's error page. 2822bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (frame->isViewSourceModeEnabled()) 2823bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 2824bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2825bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState* document_state = 2826bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState::FromDataSource(frame->provisionalDataSource()); 2827bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int http_status_code = response.httpStatusCode(); 2828bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2829bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Record page load flags. 28305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response); 2831bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (extra_data) { 2832bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_was_fetched_via_spdy( 2833bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->was_fetched_via_spdy()); 2834bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_was_npn_negotiated( 2835bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->was_npn_negotiated()); 2836bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_npn_negotiated_protocol( 2837bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->npn_negotiated_protocol()); 2838bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_was_alternate_protocol_available( 2839bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->was_alternate_protocol_available()); 2840bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_connection_info( 2841bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->connection_info()); 2842bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_was_fetched_via_proxy( 2843bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->was_fetched_via_proxy()); 2844bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2845bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData* internal_data = 2846bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData::FromDocumentState(document_state); 2847bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->set_http_status_code(http_status_code); 2848bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Whether or not the http status code actually corresponds to an error is 2849bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // only checked when the page is done loading, if |use_error_page| is 2850bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // still true. 2851bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->set_use_error_page(true); 28527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 28537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2854c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didFinishResourceLoad(blink::WebLocalFrame* frame, 28557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned identifier) { 2856a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 28575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InternalDocumentStateData* internal_data = 28585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu InternalDocumentStateData::FromDataSource(frame->dataSource()); 28595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!internal_data->use_error_page()) 28605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 28615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 28625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Do not show error page when DevTools is attached. 28635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (render_view_->devtools_agent_->IsAttached()) 28645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 28655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 28665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Display error page, if appropriate. 28675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string error_domain = "http"; 28685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int http_status_code = internal_data->http_status_code(); 28695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (GetContentClient()->renderer()->HasErrorPage( 28705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu http_status_code, &error_domain)) { 28715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebURLError error; 28725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu error.unreachableURL = frame->document().url(); 28735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu error.domain = WebString::fromUTF8(error_domain); 28745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu error.reason = http_status_code; 28755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LoadNavigationErrorPage(frame->dataSource()->request(), error, true); 28765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 28777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 28787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 28797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didLoadResourceFromMemoryCache( 2880c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 2881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLRequest& request, 2882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response) { 2883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2884bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // The recipients of this message have no use for data: URLs: they don't 2885bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // affect the page's insecure content list and are not in the disk cache. To 2886bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // prevent large (1M+) data: URLs from crashing in the IPC system, we simply 2887bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // filter them out here. 2888bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL url(request.url()); 28891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (url.SchemeIs(url::kDataScheme)) 2890bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 2891bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2892bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Let the browser know we loaded a resource from the memory cache. This 2893bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // message is needed to display the correct SSL indicators. 2894424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DidLoadResourceFromMemoryCache( 2895424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), 2896bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch url, 2897bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch response.securityInfo(), 2898bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.httpMethod().utf8(), 2899bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch response.mimeType().utf8(), 29005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebURLRequestToResourceType(request))); 29017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2903c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didDisplayInsecureContent(blink::WebLocalFrame* frame) { 2904a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2905424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DidDisplayInsecureContent( 2906424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID())); 29077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 29097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didRunInsecureContent( 2910c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 2911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebSecurityOrigin& origin, 2912f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& target) { 2913a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2914424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DidRunInsecureContent( 2915424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), 2916bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch origin.toString().utf8(), 2917bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch target)); 29187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2920c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didAbortLoading(blink::WebLocalFrame* frame) { 2921a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 29224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 29234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (frame != render_view_->webview()->mainFrame()) 29244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 29254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PluginChannelHost::Broadcast( 29264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new PluginHostMsg_DidAbortLoading(render_view_->GetRoutingID())); 29274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 29284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 29294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didCreateScriptContext(blink::WebLocalFrame* frame, 29317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) v8::Handle<v8::Context> context, 29327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int extension_group, 29337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int world_id) { 2934a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2935bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GetContentClient()->renderer()->DidCreateScriptContext( 29367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) frame, context, extension_group, world_id); 29377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::willReleaseScriptContext(blink::WebLocalFrame* frame, 29407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) v8::Handle<v8::Context> context, 29417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int world_id) { 2942a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2943a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2944a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, 2945a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) observers_, 2946a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WillReleaseScriptContext(context, world_id)); 29477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2949c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didFirstVisuallyNonEmptyLayout( 2950c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame) { 2951a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2952010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (frame->parent()) 2953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 2954010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2955010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InternalDocumentStateData* data = 2956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InternalDocumentStateData::FromDataSource(frame->dataSource()); 2957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) data->set_did_first_visually_non_empty_layout(true); 2958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_ANDROID) 2960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetRenderWidget()->DidChangeBodyBackgroundColor( 2961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_view_->webwidget_->backgroundColor()); 2962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 29635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 29645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetRenderWidget()->QueueMessage( 29655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new FrameHostMsg_DidFirstVisuallyNonEmptyPaint(routing_id_), 29665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); 29677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2969c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didChangeScrollOffset(blink::WebLocalFrame* frame) { 2970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2971bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed methods: 2972bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * StartNavStateSyncTimerIfNecessary 29737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didChangeScrollOffset(frame); 29747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2976c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::willInsertBody(blink::WebLocalFrame* frame) { 2977a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 2978424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!frame->parent()) { 2979424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_WillInsertBody( 2980424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID())); 2981424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 29827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 29847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::reportFindInPageMatchCount(int request_id, 29857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int count, 29867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool final_update) { 2987bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int active_match_ordinal = -1; // -1 = don't update active match ordinal 2988bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!count) 2989bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch active_match_ordinal = 0; 2990bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2991424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_Find_Reply( 2992424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), request_id, count, 2993424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Rect(), active_match_ordinal, final_update)); 2994bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2995bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2996bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid RenderFrameImpl::reportFindInPageSelection( 2997bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int request_id, 2998bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int active_match_ordinal, 2999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRect& selection_rect) { 3000424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_Find_Reply( 3001424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), request_id, -1, selection_rect, 3002424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) active_match_ordinal, false)); 30037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 30047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::requestStorageQuota( 3006c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 3007f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebStorageQuotaType type, 30087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long requested_size, 30095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebStorageQuotaCallbacks callbacks) { 3010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 3011bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebSecurityOrigin origin = frame->document().securityOrigin(); 3012bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (origin.isUnique()) { 3013bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Unique origins cannot store persistent state. 30145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callbacks.didFail(blink::WebStorageQuotaErrorAbort); 3015bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 3016bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 3017bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ChildThread::current()->quota_dispatcher()->RequestStorageQuota( 301803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) render_view_->GetRoutingID(), 301903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GURL(origin.toString()), 302003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static_cast<storage::StorageType>(type), 302103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) requested_size, 3022bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(callbacks)); 30237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 30247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::willOpenSocketStream( 3026f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSocketStreamHandle* handle) { 3027a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebSocketStreamHandleImpl* impl = 3028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<WebSocketStreamHandleImpl*>(handle); 3029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) impl->SetUserData(handle, new SocketStreamHandleData(routing_id_)); 30307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 30317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 303246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RenderFrameImpl::willOpenWebSocket(blink::WebSocketHandle* handle) { 303346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebSocketBridge* impl = static_cast<WebSocketBridge*>(handle); 303446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) impl->set_render_frame_id(routing_id_); 303546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 303646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 30375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liublink::WebGeolocationClient* RenderFrameImpl::geolocationClient() { 303846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!geolocation_dispatcher_) 303946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) geolocation_dispatcher_ = new GeolocationDispatcher(this); 304046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return geolocation_dispatcher_; 30415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 30425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3043116680a4aac90f2aa7413d9095a592090648e557Ben Murdochblink::WebPushClient* RenderFrameImpl::pushClient() { 3044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!push_messaging_dispatcher_) 3045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch push_messaging_dispatcher_ = new PushMessagingDispatcher(this); 3046116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return push_messaging_dispatcher_; 3047116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3048116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 30497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::willStartUsingPeerConnectionHandler( 3050c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 3051f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCPeerConnectionHandler* handler) { 3052a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 3053bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#if defined(ENABLE_WEBRTC) 3054bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch static_cast<RTCPeerConnectionHandler*>(handler)->associateWithFrame(frame); 3055bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif 30567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 30577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liublink::WebUserMediaClient* RenderFrameImpl::userMediaClient() { 3059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!web_user_media_client_) 3060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeUserMediaClient(); 3061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return web_user_media_client_; 30625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 30635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 30645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liublink::WebMIDIClient* RenderFrameImpl::webMIDIClient() { 3065f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!midi_dispatcher_) 3066f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) midi_dispatcher_ = new MidiDispatcher(this); 3067f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return midi_dispatcher_; 30685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 30695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 30707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RenderFrameImpl::willCheckAndDispatchMessageEvent( 3071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) blink::WebLocalFrame* source_frame, 3072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) blink::WebFrame* target_frame, 3073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) blink::WebSecurityOrigin target_origin, 3074f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDOMMessageEvent event) { 3075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(!frame_ || frame_ == target_frame); 3076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!render_view_->is_swapped_out_) 3078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 3079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ViewMsg_PostMessage_Params params; 30815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.is_data_raw_string = false; 3082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.data = event.data().toString(); 3083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.source_origin = event.origin(); 3084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!target_origin.isNull()) 3085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.target_origin = target_origin.toString(); 3086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) blink::WebMessagePortChannelArray channels = event.releaseChannels(); 3088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!channels.isEmpty()) { 3089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<int> message_port_ids(channels.size()); 3090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Extract the port IDs from the channel array. 3091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < channels.size(); ++i) { 3092010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebMessagePortChannelImpl* webchannel = 3093010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<WebMessagePortChannelImpl*>(channels[i]); 3094010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) message_port_ids[i] = webchannel->message_port_id(); 3095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) webchannel->QueueMessages(); 3096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_NE(message_port_ids[i], MSG_ROUTING_NONE); 3097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.message_port_ids = message_port_ids; 3099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Include the routing ID for the source frame (if one exists), which the 3102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // browser process will translate into the routing ID for the equivalent 3103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // frame in the target process. 3104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.source_routing_id = MSG_ROUTING_NONE; 3105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (source_frame) { 3106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderViewImpl* source_view = 3107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderViewImpl::FromWebView(source_frame->view()); 3108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (source_view) 3109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) params.source_routing_id = source_view->routing_id(); 3110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Send(new ViewHostMsg_RouteMessageEvent(render_view_->routing_id_, params)); 3113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 31147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 31157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochblink::WebString RenderFrameImpl::userAgentOverride(blink::WebLocalFrame* frame, 3117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebURL& url) { 3118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 3119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!render_view_->webview() || !render_view_->webview()->mainFrame() || 3120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch render_view_->renderer_preferences_.user_agent_override.empty()) { 3121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return blink::WebString(); 3122bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 3123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3124bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // If we're in the middle of committing a load, the data source we need 3125bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // will still be provisional. 3126bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebFrame* main_frame = render_view_->webview()->mainFrame(); 3127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDataSource* data_source = NULL; 3128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (main_frame->provisionalDataSource()) 3129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_source = main_frame->provisionalDataSource(); 3130bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch else 3131bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_source = main_frame->dataSource(); 3132bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData* internal_data = data_source ? 3134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData::FromDataSource(data_source) : NULL; 3135bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (internal_data && internal_data->is_overriding_user_agent()) 3136bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return WebString::fromUTF8( 3137bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch render_view_->renderer_preferences_.user_agent_override); 3138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return blink::WebString(); 31397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 31407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochblink::WebString RenderFrameImpl::doNotTrackValue(blink::WebLocalFrame* frame) { 3142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 3143bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (render_view_->renderer_preferences_.enable_do_not_track) 3144bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return WebString::fromUTF8("1"); 3145bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return WebString(); 31467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 31477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool RenderFrameImpl::allowWebGL(blink::WebLocalFrame* frame, 3149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool default_value) { 3150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 3151bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!default_value) 3152bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return false; 3153bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3154bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch bool blocked = true; 3155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_Are3DAPIsBlocked( 3156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), 3157bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL(frame->top()->document().securityOrigin().toString()), 3158bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch THREE_D_API_TYPE_WEBGL, 3159bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch &blocked)); 3160bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return !blocked; 31617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 31627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RenderFrameImpl::didLoseWebGLContext(blink::WebLocalFrame* frame, 31647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int arb_robustness_status_code) { 3165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 3166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DidLose3DContext( 3167bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL(frame->top()->document().securityOrigin().toString()), 3168bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch THREE_D_API_TYPE_WEBGL, 3169bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch arb_robustness_status_code)); 31707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 31717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 31725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameImpl::forwardInputEvent(const blink::WebInputEvent* event) { 31735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameHostMsg_ForwardInputEvent(routing_id_, event)); 31745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 31755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)blink::WebScreenOrientationClient* 3177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderFrameImpl::webScreenOrientationClient() { 3178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!screen_orientation_dispatcher_) 3179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) screen_orientation_dispatcher_ = new ScreenOrientationDispatcher(this); 3180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return screen_orientation_dispatcher_; 3181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 3182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 31831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool RenderFrameImpl::isControlledByServiceWorker() { 31841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If we're in the middle of committing a load, the data source we need 31851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // will still be provisional. 31861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebFrame* main_frame = render_view_->webview()->mainFrame(); 31871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebDataSource* data_source = NULL; 31881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (main_frame->provisionalDataSource()) 31891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_source = main_frame->provisionalDataSource(); 31901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 31911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci data_source = main_frame->dataSource(); 31921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ServiceWorkerNetworkProvider* provider = 31931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ServiceWorkerNetworkProvider::FromDocumentState( 31941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DocumentState::FromDataSource(data_source)); 31951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return provider->context()->controller_handle_id() != 31961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kInvalidServiceWorkerHandleId; 31971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 31981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameImpl::postAccessibilityEvent(const blink::WebAXObject& obj, 32001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebAXEvent event) { 32011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HandleWebAccessibilityEvent(obj, event); 32021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 32031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 32041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RenderFrameImpl::didChangeManifest(blink::WebLocalFrame* frame) 32051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 32061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!frame_ || frame_ == frame); 32071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 32081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidChangeManifest()); 32091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 32101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderFrameImpl::DidPlay(blink::WebMediaPlayer* player) { 3212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Send(new FrameHostMsg_MediaPlayingNotification( 3213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) routing_id_, reinterpret_cast<int64>(player), player->hasVideo(), 321434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) player->hasAudio(), player->isRemote())); 3215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderFrameImpl::DidPause(blink::WebMediaPlayer* player) { 3218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Send(new FrameHostMsg_MediaPausedNotification( 3219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) routing_id_, reinterpret_cast<int64>(player))); 3220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void RenderFrameImpl::PlayerGone(blink::WebMediaPlayer* player) { 3223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DidPause(player); 3224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { 3227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_.AddObserver(observer); 3228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { 3231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observer->RenderFrameGone(); 3232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_.RemoveObserver(observer); 3233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameImpl::OnStop() { 323603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(frame_); 323703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) frame_->stopLoading(); 323803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!frame_->parent()) 323903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, OnStop()); 324003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnStop()); 32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameImpl::WasHidden() { 3245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasHidden()); 3246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameImpl::WasShown() { 3249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasShown()); 3250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 325246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool RenderFrameImpl::IsHidden() { 325346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return GetRenderWidget()->is_hidden(); 325446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 325546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 32565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tell the embedding application that the URL of the active page has changed. 32575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RenderFrameImpl::SendDidCommitProvisionalLoad(blink::WebFrame* frame) { 3258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!frame_ || frame_ == frame); 32595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebDataSource* ds = frame->dataSource(); 32605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ds); 32615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebURLRequest& request = ds->request(); 32635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebURLResponse& response = ds->response(); 32645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 32665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 32675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InternalDocumentStateData* internal_data = 32685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InternalDocumentStateData::FromDocumentState(document_state); 32695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameHostMsg_DidCommitProvisionalLoad_Params params; 32715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.http_status_code = response.httpStatusCode(); 32721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.url_is_unreachable = ds->hasUnreachableURL(); 32735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.is_post = false; 32745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.post_id = -1; 32755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.page_id = render_view_->page_id_; 32765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // We need to track the RenderViewHost routing_id because of downstream 32775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // dependencies (crbug.com/392171 DownloadRequestHandle, SaveFileManager, 32785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // ResourceDispatcherHostImpl, MediaStreamUIProxy, 32795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // SpeechRecognitionDispatcherHost and possibly others). They look up the view 32805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // based on the ID stored in the resource requests. Once those dependencies 32815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // are unwound or moved to RenderFrameHost (crbug.com/304341) we can move the 32825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // client to be based on the routing_id of the RenderFrameHost. 32835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.render_view_routing_id = render_view_->routing_id(); 32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.socket_address.set_host(response.remoteIPAddress().utf8()); 32855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.socket_address.set_port(response.remotePort()); 32865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response); 32875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extra_data) 32885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.was_fetched_via_proxy = extra_data->was_fetched_via_proxy(); 32895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.was_within_same_page = navigation_state->was_within_same_page(); 32905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.security_info = response.securityInfo(); 32915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set the URL to be displayed in the browser UI to the user. 3293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) params.url = GetLoadingUrl(); 32945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!is_swapped_out_ || params.url == GURL(kSwappedOutURL)); 32955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (frame->document().baseURL() != params.url) 32975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.base_url = frame->document().baseURL(); 32985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetRedirectChain(ds, ¶ms.redirects); 33005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.should_update_history = !ds->hasUnreachableURL() && 33015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !response.isMultipartPayload() && (response.httpStatusCode() != 404); 33025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.searchable_form_url = internal_data->searchable_form_url(); 33045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.searchable_form_encoding = internal_data->searchable_form_encoding(); 33055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.gesture = render_view_->navigation_gesture_; 33075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->navigation_gesture_ = NavigationGestureUnknown; 33085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make navigation state a part of the DidCommitProvisionalLoad message so 33105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // that commited entry has it at all times. 33115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HistoryEntry* entry = render_view_->history_controller()->GetCurrentEntry(); 33125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (entry) 33135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params.page_state = HistoryEntryToPageState(entry); 33145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu else 33155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params.page_state = PageState::CreateFromURL(request.url()); 33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!frame->parent()) { 33185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Top-level navigation. 33195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Reset the zoom limits in case a plugin had changed them previously. This 33215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // will also call us back which will cause us to send a message to 33225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // update WebContentsImpl. 33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->webview()->zoomLimitsChanged( 33245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ZoomFactorToZoomLevel(kMinimumZoomFactor), 33255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ZoomFactorToZoomLevel(kMaximumZoomFactor)); 33265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set zoom level, but don't do it for full-page plugin since they don't use 33285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the same zoom settings. 33295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HostZoomLevels::iterator host_zoom = 33305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->host_zoom_levels_.find(GURL(request.url())); 33315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_->webview()->mainFrame()->document().isPluginDocument()) { 33325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Reset the zoom levels for plugins. 33335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->webview()->setZoomLevel(0); 33345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 33355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (host_zoom != render_view_->host_zoom_levels_.end()) 33365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->webview()->setZoomLevel(host_zoom->second); 33375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (host_zoom != render_view_->host_zoom_levels_.end()) { 33405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This zoom level was merely recorded transiently for this load. We can 33415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // erase it now. If at some point we reload this page, the browser will 33425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // send us a new, up-to-date zoom level. 33435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->host_zoom_levels_.erase(host_zoom); 33445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Update contents MIME type for main frame. 33475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.contents_mime_type = ds->response().mimeType().utf8(); 33485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.transition = navigation_state->transition_type(); 33501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ui::PageTransitionIsMainFrame(params.transition)) { 33515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the main frame does a load, it should not be reported as a subframe 33525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigation. This can occur in the following case: 33535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 1. You're on a site with frames. 33545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 2. You do a subframe navigation. This is stored with transition type 33555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // MANUAL_SUBFRAME. 33565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 3. You navigate to some non-frame site, say, google.com. 33575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 4. You navigate back to the page from step 2. Since it was initially 33585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // MANUAL_SUBFRAME, it will be that same transition type here. 33595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We don't want that, because any navigation that changes the toplevel 33605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // frame should be tracked as a toplevel navigation (this allows us to 33615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // update the URL bar, etc). 33621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.transition = ui::PAGE_TRANSITION_LINK; 33635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the page contained a client redirect (meta refresh, document.loc...), 33665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // set the referrer and transition appropriately. 33675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ds->isClientRedirect()) { 33685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.referrer = 33695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer(params.redirects[0], ds->request().referrerPolicy()); 33701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.transition = ui::PageTransitionFromInt( 33711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.transition | ui::PAGE_TRANSITION_CLIENT_REDIRECT); 33725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 33735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.referrer = RenderViewImpl::GetReferrerFromRequest( 33745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame, ds->request()); 33755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 method = request.httpMethod(); 33785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (EqualsASCII(method, "POST")) { 33795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.is_post = true; 33805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params.post_id = ExtractPostId(entry->root()); 33815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Send the user agent override back. 33845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.is_overriding_user_agent = internal_data->is_overriding_user_agent(); 33855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Track the URL of the original request. We use the first entry of the 33875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // redirect chain if it exists because the chain may have started in another 33885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // process. 33890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch params.original_request_url = GetOriginalRequestURL(ds); 33905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.history_list_was_cleared = 33925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_state->history_list_was_cleared(); 33935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Save some histogram data so we can compute the average memory used per 33955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page load of the glyphs. 33965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_10000("Memory.GlyphPagesPerLoad", 33975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebGlyphCache::pageCount()); 33985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This message needs to be sent before any of allowScripts(), 34005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // allowImages(), allowPlugins() is called for the new page, so that when 34015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // these functions send a ViewHostMsg_ContentBlocked message, it arrives 34025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // after the FrameHostMsg_DidCommitProvisionalLoad message. 34035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); 34045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 34055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Subframe navigation: the type depends on whether this navigation 34065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // generated a new session history entry. When they do generate a session 34075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // history entry, it means the user initiated the navigation and we should 34085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // mark it as such. This test checks if this is the first time 34095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // SendDidCommitProvisionalLoad has been called since WillNavigateToURL was 34105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // called to initiate the load. 34115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_->page_id_ > render_view_->last_page_id_sent_to_browser_) 34121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; 34135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 34141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; 34155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!navigation_state->history_list_was_cleared()); 34175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.history_list_was_cleared = false; 34185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Don't send this message while the subframe is swapped out. 34205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!is_swapped_out()) 34215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); 34225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 34235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->last_page_id_sent_to_browser_ = 34255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::max(render_view_->last_page_id_sent_to_browser_, 34265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_->page_id_); 34275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we end up reusing this WebRequest (for example, due to a #ref click), 34295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // we don't want the transition type to persist. Just clear it. 34301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK); 34315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 34325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebElement RenderFrameImpl::GetFocusedElement() { 3434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebDocument doc = frame_->document(); 3435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!doc.isNull()) 3436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return doc.focusedElement(); 3437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return WebElement(); 3439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::didStartLoading(bool to_different_document) { 34421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::didStartLoading", 34431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_); 3444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_->FrameDidStartLoading(frame_); 3445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new FrameHostMsg_DidStartLoading(routing_id_, to_different_document)); 34465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 34475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameImpl::didStopLoading() { 34491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TRACE_EVENT1("navigation", "RenderFrameImpl::didStopLoading", 34501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "id", routing_id_); 3451effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_->FrameDidStopLoading(frame_); 3452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new FrameHostMsg_DidStopLoading(routing_id_)); 3453effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 3454effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3455effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::didChangeLoadProgress(double load_progress) { 3456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new FrameHostMsg_DidChangeLoadProgress(routing_id_, load_progress)); 34575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 34585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3459116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameImpl::HandleWebAccessibilityEvent( 3460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const blink::WebAXObject& obj, blink::WebAXEvent event) { 3461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (renderer_accessibility_) 3462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch renderer_accessibility_->HandleWebAccessibilityEvent(obj, event); 3463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3465116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameImpl::FocusedNodeChanged(const WebNode& node) { 3466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (renderer_accessibility_) 3467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch renderer_accessibility_->FocusedNodeChanged(node); 3468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 3469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation( 3471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrame* render_frame, 34725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const NavigationPolicyInfo& info) { 3473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifdef OS_ANDROID 3474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The handlenavigation API is deprecated and will be removed once 3475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // crbug.com/325351 is resolved. 34765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (info.urlRequest.url() != GURL(kSwappedOutURL) && 3477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetContentClient()->renderer()->HandleNavigation( 3478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame, 34795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static_cast<DocumentState*>(info.extraData), 3480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_->opener_id_, 34815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.frame, 34825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.urlRequest, 34835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.navigationType, 34845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.defaultPolicy, 34855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.isRedirect)) { 3486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return blink::WebNavigationPolicyIgnore; 3487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 3489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 34905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Referrer referrer(RenderViewImpl::GetReferrerFromRequest(info.frame, 34915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.urlRequest)); 34925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 3493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 34945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_subframe = !!info.frame->parent(); 34955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 34965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (command_line.HasSwitch(switches::kSitePerProcess) && is_subframe) { 34975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // There's no reason to ignore navigations on subframes, since the swap out 34985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // logic no longer applies. 34995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 35005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (is_swapped_out_ || render_view_->is_swapped_out()) { 35015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (info.urlRequest.url() != GURL(kSwappedOutURL)) { 35025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Targeted links may try to navigate a swapped out frame. Allow the 35035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // browser process to navigate the tab instead. Note that it is also 35045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // possible for non-targeted navigations (from this view) to arrive 35055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // here just after we are swapped out. It's ok to send them to the 35065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // browser, as long as they're for the top level frame. 35075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(creis): Ensure this supports targeted form submissions when 35085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // fixing http://crbug.com/101395. 35095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (info.frame->parent() == NULL) { 35105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OpenURL(info.frame, info.urlRequest.url(), referrer, 35115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.defaultPolicy); 35125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return blink::WebNavigationPolicyIgnore; // Suppress the load here. 35135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 35145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 35155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // We should otherwise ignore in-process iframe navigations, if they 35165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // arrive just after we are swapped out. 35175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return blink::WebNavigationPolicyIgnore; 3518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 35205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Allow kSwappedOutURL to complete. 35215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return info.defaultPolicy; 3522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Webkit is asking whether to navigate to a new URL. 3526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This is fine normally, except if we're showing UI from one security 3527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // context and they're trying to navigate to a different context. 35285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& url = info.urlRequest.url(); 3529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A content initiated navigation may have originated from a link-click, 3531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // script, drag-n-drop operation, etc. 35325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_content_initiated = static_cast<DocumentState*>(info.extraData)-> 3533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) navigation_state()->is_content_initiated(); 3534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Experimental: 3536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If --enable-strict-site-isolation or --site-per-process is enabled, send 3537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // all top-level navigations to the browser to let it swap processes when 3538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // crossing site boundaries. This is currently expected to break some script 3539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // calls and navigations, such as form submissions. 3540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool force_swap_due_to_flag = 3541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) command_line.HasSwitch(switches::kEnableStrictSiteIsolation) || 3542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) command_line.HasSwitch(switches::kSitePerProcess); 3543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (force_swap_due_to_flag && 35445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) !info.frame->parent() && (is_content_initiated || info.isRedirect)) { 35455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebString origin_str = info.frame->document().securityOrigin().toString(); 3546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL frame_url(origin_str.utf8().data()); 3547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(cevans): revisit whether this site check is still necessary once 3548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // crbug.com/101395 is fixed. 3549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool same_domain_or_host = 3550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::registry_controlled_domains::SameDomainOrHost( 3551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_url, 3552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url, 3553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); 3554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!same_domain_or_host || frame_url.scheme() != url.scheme()) { 35555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OpenURL(info.frame, url, referrer, info.defaultPolicy); 3556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return blink::WebNavigationPolicyIgnore; 3557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If the browser is interested, then give it a chance to look at the request. 3561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_content_initiated) { 35625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_form_post = 35635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ((info.navigationType == blink::WebNavigationTypeFormSubmitted) || 35645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (info.navigationType == blink::WebNavigationTypeFormResubmitted)) && 35655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EqualsASCII(info.urlRequest.httpMethod(), "POST"); 3566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool browser_handles_request = 3567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_->renderer_preferences_ 3568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .browser_handles_non_local_top_level_requests 35695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) && IsNonLocalTopLevelNavigation(url, info.frame, info.navigationType, 35705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) is_form_post); 3571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!browser_handles_request) { 35725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_handles_request = IsTopLevelNavigation(info.frame) && 3573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_->renderer_preferences_ 3574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .browser_handles_all_top_level_requests; 3575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (browser_handles_request) { 35785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OpenURL(info.frame, url, referrer, info.defaultPolicy); 3579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return blink::WebNavigationPolicyIgnore; // Suppress the load here. 3580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Use the frame's original request's URL rather than the document's URL for 3584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // subsequent checks. For a popup, the document's URL may become the opener 3585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // window's URL if the opener has called document.write(). 3586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // See http://crbug.com/93517. 35875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL old_url(info.frame->dataSource()->request().url()); 3588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Detect when we're crossing a permission-based boundary (e.g. into or out of 3590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // an extension or app origin, leaving a WebUI page, etc). We only care about 3591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // top-level navigations (not iframes). But we sometimes navigate to 3592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // about:blank to clear a tab, and we want to still allow that. 3593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 3594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Note: this is known to break POST submissions when crossing process 3595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // boundaries until http://crbug.com/101395 is fixed. This is better for 3596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // security than loading a WebUI, extension or app page in the wrong process. 3597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // POST requests don't work because this mechanism does not preserve form 3598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // POST data. We will need to send the request's httpBody data up to the 3599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // browser process, and issue a special POST navigation in WebKit (via 3600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // FrameLoader::loadFrameRequest). See ResourceDispatcher and WebURLLoaderImpl 3601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // for examples of how to send the httpBody data. 36025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!info.frame->parent() && is_content_initiated && 3603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !url.SchemeIs(url::kAboutScheme)) { 3604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool send_referrer = false; 3605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // All navigations to or from WebUI URLs or within WebUI-enabled 3607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // RenderProcesses must be handled by the browser process so that the 3608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // correct bindings and data sources can be registered. 3609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Similarly, navigations to view-source URLs or within ViewSource mode 3610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // must be handled by the browser process (except for reloads - those are 3611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // safe to leave within the renderer). 3612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Lastly, access to file:// URLs from non-file:// URL pages must be 3613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // handled by the browser so that ordinary renderer processes don't get 3614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // blessed with file permissions. 3615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int cumulative_bindings = RenderProcess::current()->GetEnabledBindings(); 3616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_initial_navigation = render_view_->page_id_ == -1; 3617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool should_fork = HasWebUIScheme(url) || HasWebUIScheme(old_url) || 3618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (cumulative_bindings & BINDINGS_POLICY_WEB_UI) || 3619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) url.SchemeIs(kViewSourceScheme) || 36205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (info.frame->isViewSourceModeEnabled() && 36215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.navigationType != blink::WebNavigationTypeReload); 3622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!should_fork && url.SchemeIs(url::kFileScheme)) { 3624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Fork non-file to file opens. Check the opener URL if this is the 3625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // initial navigation in a newly opened window. 3626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL source_url(old_url); 36275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (is_initial_navigation && source_url.is_empty() && 36285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.frame->opener()) 36295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_url = info.frame->opener()->top()->document().url(); 3630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(!source_url.is_empty()); 3631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) should_fork = !source_url.SchemeIs(url::kFileScheme); 3632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!should_fork) { 3635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Give the embedder a chance. 3636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) should_fork = GetContentClient()->renderer()->ShouldFork( 36375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.frame, url, info.urlRequest.httpMethod().utf8(), 36385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) is_initial_navigation, info.isRedirect, &send_referrer); 3639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (should_fork) { 36425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OpenURL(info.frame, url, send_referrer ? referrer : Referrer(), 36435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.defaultPolicy); 3644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return blink::WebNavigationPolicyIgnore; // Suppress the load here. 3645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Detect when a page is "forking" a new tab that can be safely rendered in 3649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // its own process. This is done by sites like Gmail that try to open links 3650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // in new windows without script connections back to the original page. We 3651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // treat such cases as browser navigations (in which we will create a new 3652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // renderer for a cross-site navigation), rather than WebKit navigations. 3653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 3654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We use the following heuristic to decide whether to fork a new page in its 3655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // own process: 3656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The parent page must open a new tab to about:blank, set the new tab's 3657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // window.opener to null, and then redirect the tab to a cross-site URL using 3658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // JavaScript. 3659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 3660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(creis): Deprecate this logic once we can rely on rel=noreferrer 3661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // (see below). 3662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_fork = 3663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Must start from a tab showing about:blank, which is later redirected. 3664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) old_url == GURL(url::kAboutBlankURL) && 3665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Must be the first real navigation of the tab. 3666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_->historyBackListCount() < 1 && 3667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_view_->historyForwardListCount() < 1 && 3668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The parent page must have set the child's window.opener to null before 3669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // redirecting to the desired URL. 36705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.frame->opener() == NULL && 3671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Must be a top-level frame. 36725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.frame->parent() == NULL && 3673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Must not have issued the request from this page. 3674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_content_initiated && 3675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Must be targeted at the current tab. 36765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.defaultPolicy == blink::WebNavigationPolicyCurrentTab && 3677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Must be a JavaScript navigation, which appears as "other". 36785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) info.navigationType == blink::WebNavigationTypeOther; 3679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_fork) { 3681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Open the URL via the browser, not via WebKit. 36825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OpenURL(info.frame, url, Referrer(), info.defaultPolicy); 3683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return blink::WebNavigationPolicyIgnore; 3684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 36865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return info.defaultPolicy; 3687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3688a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RenderFrameImpl::OpenURL(WebFrame* frame, 3690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GURL& url, 3691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const Referrer& referrer, 3692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebNavigationPolicy policy) { 3693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ(frame_, frame); 3694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameHostMsg_OpenURL_Params params; 3696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.url = url; 3697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.referrer = referrer; 3698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.disposition = RenderViewImpl::NavigationPolicyToDisposition(policy); 3699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 3700a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (ds) { 3701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 3702a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigationState* navigation_state = document_state->navigation_state(); 3703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (navigation_state->is_content_initiated()) { 3704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.should_replace_current_entry = ds->replacesCurrentHistoryItem(); 3705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 3706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This is necessary to preserve the should_replace_current_entry value on 3707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // cross-process redirects, in the event it was set by a previous process. 3708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 3709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(davidben): Avoid this awkward duplication of state. See comment on 3710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // NavigationState::should_replace_current_entry(). 3711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.should_replace_current_entry = 3712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) navigation_state->should_replace_current_entry(); 3713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 3715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.should_replace_current_entry = false; 3716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 3718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (GetContentClient()->renderer()->AllowPopup()) 3719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.user_gesture = true; 3720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (policy == blink::WebNavigationPolicyNewBackgroundTab || 3722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) policy == blink::WebNavigationPolicyNewForegroundTab || 3723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) policy == blink::WebNavigationPolicyNewWindow || 3724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) policy == blink::WebNavigationPolicyNewPopup) { 3725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebUserGestureIndicator::consumeUserGesture(); 3726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new FrameHostMsg_OpenURL(routing_id_, params)); 3729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RenderFrameImpl::UpdateEncoding(WebFrame* frame, 3732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& encoding_name) { 3733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only update main frame's encoding_name. 3734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!frame->parent()) 3735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new FrameHostMsg_UpdateEncoding(routing_id_, encoding_name)); 3736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3738effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid RenderFrameImpl::SyncSelectionIfRequired() { 3739effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::string16 text; 3740effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t offset; 3741effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::Range range; 3742effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ENABLE_PLUGINS) 3743effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (render_view_->focused_pepper_plugin_) { 3744effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch render_view_->focused_pepper_plugin_->GetSurroundingText(&text, &range); 3745effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch offset = 0; // Pepper API does not support offset reporting. 3746effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // TODO(kinaba): cut as needed. 3747effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else 3748effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 3749effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch { 3750effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t location, length; 3751effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!GetRenderWidget()->webwidget()->caretOrSelectionRange( 3752effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &location, &length)) { 3753effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 3754effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 3755effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3756effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch range = gfx::Range(location, location + length); 3757effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (GetRenderWidget()->webwidget()->textInputInfo().type != 3759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch blink::WebTextInputTypeNone) { 3760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // If current focused element is editable, we will send 100 more chars 3761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // before and after selection. It is for input method surrounding text 3762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // feature. 3763effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (location > kExtraCharsBeforeAndAfterSelection) 3764effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch offset = location - kExtraCharsBeforeAndAfterSelection; 3765effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch else 3766effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch offset = 0; 3767effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch length = location + length - offset + kExtraCharsBeforeAndAfterSelection; 3768effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebRange webrange = WebRange::fromDocumentRange(frame_, offset, length); 3769effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!webrange.isNull()) 3770effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text = WebRange::fromDocumentRange( 3771effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_, offset, length).toPlainText(); 3772effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 3773effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch offset = location; 3774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch text = frame_->selectionAsText(); 3775effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // http://crbug.com/101435 3776effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // In some case, frame->selectionAsText() returned text's length is not 3777effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // equal to the length returned from webwidget()->caretOrSelectionRange(). 3778effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // So we have to set the range according to text.length(). 3779effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch range.set_end(range.start() + text.length()); 3780effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 3781effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 3782effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3783effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Sometimes we get repeated didChangeSelection calls from webkit when 3784effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // the selection hasn't actually changed. We don't want to report these 3785effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // because it will cause us to continually claim the X clipboard. 3786effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (selection_text_offset_ != offset || 3787effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_range_ != range || 3788effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_ != text) { 3789effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_ = text; 3790effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_text_offset_ = offset; 3791effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch selection_range_ = range; 3792effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This IPC is dispatched by RenderWidetHost, so use its routing ID. 3793effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Send(new ViewHostMsg_SelectionChanged( 3794effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetRenderWidget()->routing_id(), text, offset, range)); 3795effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 3796effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetRenderWidget()->UpdateSelectionBounds(); 3797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3799116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RenderFrameImpl::InitializeUserMediaClient() { 3800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!RenderThreadImpl::current()) // Will be NULL during unit tests. 3801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 3802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_ANDROID) 3804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableWebRTC)) 3805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 3806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 3807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(ENABLE_WEBRTC) 3809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!web_user_media_client_); 38101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_user_media_client_ = new UserMediaClientImpl( 3811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this, 3812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderThreadImpl::current()->GetPeerConnectionDependencyFactory(), 3813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch make_scoped_ptr(new MediaStreamDispatcher(this)).Pass()); 3814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 3815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)WebMediaPlayer* RenderFrameImpl::CreateWebMediaPlayerForMediaStream( 3818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const blink::WebURL& url, 3819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebMediaPlayerClient* client) { 3820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(ENABLE_WEBRTC) 3821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) 3822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool found_neon = 3823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0; 3824cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Platform.WebRtcNEONFound", found_neon); 3825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) 3826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return new WebMediaPlayerMS(frame_, client, weak_factory_.GetWeakPtr(), 3827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new RenderMediaLog(), 3828cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateRendererFactory()); 3829cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 3830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 3831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // defined(ENABLE_WEBRTC) 3832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<MediaStreamRendererFactory> 3835cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)RenderFrameImpl::CreateRendererFactory() { 3836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 3837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<MediaStreamRendererFactory>( 3838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MediaStreamRendererFactory()); 3839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 3840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<MediaStreamRendererFactory>( 3841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<MediaStreamRendererFactory*>(NULL)); 3842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 3843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3845f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GURL RenderFrameImpl::GetLoadingUrl() const { 3846f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebDataSource* ds = frame_->dataSource(); 3847f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (ds->hasUnreachableURL()) 3848f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return ds->unreachableURL(); 3849f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3850f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const WebURLRequest& request = ds->request(); 3851f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return request.url(); 3852f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 3853f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_ANDROID) 3855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer( 38571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebURL& url, 38581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebMediaPlayerClient* client, 38591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebContentDecryptionModule* initial_cdm) { 3860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GpuChannelHost* gpu_channel_host = 3861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderThreadImpl::current()->EstablishGpuChannelSync( 3862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE); 3863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!gpu_channel_host) { 3864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Failed to establish GPU channel for media player"; 3865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 3866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<StreamTextureFactory> stream_texture_factory; 3869116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (SynchronousCompositorFactory* factory = 3870116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SynchronousCompositorFactory::GetInstance()) { 3871f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) stream_texture_factory = factory->CreateStreamTextureFactory(routing_id_); 3872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 3873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<webkit::gpu::ContextProviderWebContext> context_provider = 3874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderThreadImpl::current()->SharedMainThreadContextProvider(); 3875010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!context_provider.get()) { 3877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Failed to get context3d for media player"; 3878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 3879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) stream_texture_factory = StreamTextureFactoryImpl::Create( 3882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_provider, gpu_channel_host, routing_id_); 3883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return new WebMediaPlayerAndroid( 3886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) frame_, 3887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) client, 3888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_factory_.GetWeakPtr(), 3889cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetMediaPlayerManager(), 3890cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetCdmManager(), 38911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci initial_cdm, 3892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) stream_texture_factory, 38931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderThreadImpl::current()->GetMediaThreadTaskRunner(), 3894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new RenderMediaLog()); 3895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)RendererMediaPlayerManager* RenderFrameImpl::GetMediaPlayerManager() { 3898116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!media_player_manager_) 3899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) media_player_manager_ = new RendererMediaPlayerManager(this); 3900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return media_player_manager_; 3901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3903f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // defined(OS_ANDROID) 3904f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3905f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_BROWSER_CDMS) 3906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)RendererCdmManager* RenderFrameImpl::GetCdmManager() { 3907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!cdm_manager_) 3908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cdm_manager_ = new RendererCdmManager(this); 3909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return cdm_manager_; 3910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3911f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // defined(ENABLE_BROWSER_CDMS) 3912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 3914