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)            &params.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)      &params.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(&params);
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, &params.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