OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
117 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" | 117 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" |
118 #include "third_party/WebKit/public/platform/WebString.h" | 118 #include "third_party/WebKit/public/platform/WebString.h" |
119 #include "third_party/WebKit/public/platform/WebURL.h" | 119 #include "third_party/WebKit/public/platform/WebURL.h" |
120 #include "third_party/WebKit/public/platform/WebURLError.h" | 120 #include "third_party/WebKit/public/platform/WebURLError.h" |
121 #include "third_party/WebKit/public/platform/WebURLResponse.h" | 121 #include "third_party/WebKit/public/platform/WebURLResponse.h" |
122 #include "third_party/WebKit/public/platform/WebVector.h" | 122 #include "third_party/WebKit/public/platform/WebVector.h" |
123 #include "third_party/WebKit/public/web/WebColorSuggestion.h" | 123 #include "third_party/WebKit/public/web/WebColorSuggestion.h" |
124 #include "third_party/WebKit/public/web/WebDocument.h" | 124 #include "third_party/WebKit/public/web/WebDocument.h" |
125 #include "third_party/WebKit/public/web/WebFrameWidget.h" | 125 #include "third_party/WebKit/public/web/WebFrameWidget.h" |
126 #include "third_party/WebKit/public/web/WebGlyphCache.h" | 126 #include "third_party/WebKit/public/web/WebGlyphCache.h" |
127 #include "third_party/WebKit/public/web/WebKit.h" | |
127 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 128 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
128 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" | 129 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" |
129 #include "third_party/WebKit/public/web/WebNavigationPolicy.h" | 130 #include "third_party/WebKit/public/web/WebNavigationPolicy.h" |
130 #include "third_party/WebKit/public/web/WebPlugin.h" | 131 #include "third_party/WebKit/public/web/WebPlugin.h" |
131 #include "third_party/WebKit/public/web/WebPluginParams.h" | 132 #include "third_party/WebKit/public/web/WebPluginParams.h" |
132 #include "third_party/WebKit/public/web/WebPluginPlaceholder.h" | 133 #include "third_party/WebKit/public/web/WebPluginPlaceholder.h" |
133 #include "third_party/WebKit/public/web/WebRange.h" | 134 #include "third_party/WebKit/public/web/WebRange.h" |
134 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" | 135 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" |
135 #include "third_party/WebKit/public/web/WebScriptSource.h" | 136 #include "third_party/WebKit/public/web/WebScriptSource.h" |
136 #include "third_party/WebKit/public/web/WebSearchableFormData.h" | 137 #include "third_party/WebKit/public/web/WebSearchableFormData.h" |
137 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" | 138 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" |
138 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" | 139 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" |
140 #include "third_party/WebKit/public/web/WebSerializedScriptValue.h" | |
139 #include "third_party/WebKit/public/web/WebSurroundingText.h" | 141 #include "third_party/WebKit/public/web/WebSurroundingText.h" |
140 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" | 142 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" |
141 #include "third_party/WebKit/public/web/WebView.h" | 143 #include "third_party/WebKit/public/web/WebView.h" |
142 #include "third_party/mojo/src/mojo/edk/js/core.h" | 144 #include "third_party/mojo/src/mojo/edk/js/core.h" |
143 #include "third_party/mojo/src/mojo/edk/js/support.h" | 145 #include "third_party/mojo/src/mojo/edk/js/support.h" |
144 | 146 |
145 #if defined(ENABLE_PLUGINS) | 147 #if defined(ENABLE_PLUGINS) |
146 #include "content/renderer/npapi/webplugin_impl.h" | 148 #include "content/renderer/npapi/webplugin_impl.h" |
147 #include "content/renderer/pepper/pepper_browser_connection.h" | 149 #include "content/renderer/pepper/pepper_browser_connection.h" |
148 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" | 150 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" |
(...skipping 28 matching lines...) Expand all Loading... | |
177 #include "content/renderer/media/media_renderer_service_provider.h" | 179 #include "content/renderer/media/media_renderer_service_provider.h" |
178 #include "media/mojo/services/mojo_renderer_factory.h" | 180 #include "media/mojo/services/mojo_renderer_factory.h" |
179 #else | 181 #else |
180 #include "media/renderers/default_renderer_factory.h" | 182 #include "media/renderers/default_renderer_factory.h" |
181 #endif | 183 #endif |
182 | 184 |
183 using blink::WebContextMenuData; | 185 using blink::WebContextMenuData; |
184 using blink::WebData; | 186 using blink::WebData; |
185 using blink::WebDataSource; | 187 using blink::WebDataSource; |
186 using blink::WebDocument; | 188 using blink::WebDocument; |
189 using blink::WebDOMEvent; | |
190 using blink::WebDOMMessageEvent; | |
187 using blink::WebElement; | 191 using blink::WebElement; |
188 using blink::WebExternalPopupMenu; | 192 using blink::WebExternalPopupMenu; |
189 using blink::WebExternalPopupMenuClient; | 193 using blink::WebExternalPopupMenuClient; |
190 using blink::WebFrame; | 194 using blink::WebFrame; |
191 using blink::WebHistoryItem; | 195 using blink::WebHistoryItem; |
192 using blink::WebHTTPBody; | 196 using blink::WebHTTPBody; |
193 using blink::WebLocalFrame; | 197 using blink::WebLocalFrame; |
194 using blink::WebMediaPlayer; | 198 using blink::WebMediaPlayer; |
195 using blink::WebMediaPlayerClient; | 199 using blink::WebMediaPlayerClient; |
196 using blink::WebNavigationPolicy; | 200 using blink::WebNavigationPolicy; |
197 using blink::WebNavigationType; | 201 using blink::WebNavigationType; |
198 using blink::WebNode; | 202 using blink::WebNode; |
199 using blink::WebPluginParams; | 203 using blink::WebPluginParams; |
200 using blink::WebPopupMenuInfo; | 204 using blink::WebPopupMenuInfo; |
201 using blink::WebRange; | 205 using blink::WebRange; |
202 using blink::WebReferrerPolicy; | 206 using blink::WebReferrerPolicy; |
203 using blink::WebScriptSource; | 207 using blink::WebScriptSource; |
204 using blink::WebSearchableFormData; | 208 using blink::WebSearchableFormData; |
205 using blink::WebSecurityOrigin; | 209 using blink::WebSecurityOrigin; |
206 using blink::WebSecurityPolicy; | 210 using blink::WebSecurityPolicy; |
211 using blink::WebSerializedScriptValue; | |
207 using blink::WebServiceWorkerProvider; | 212 using blink::WebServiceWorkerProvider; |
208 using blink::WebStorageQuotaCallbacks; | 213 using blink::WebStorageQuotaCallbacks; |
209 using blink::WebString; | 214 using blink::WebString; |
210 using blink::WebURL; | 215 using blink::WebURL; |
211 using blink::WebURLError; | 216 using blink::WebURLError; |
212 using blink::WebURLRequest; | 217 using blink::WebURLRequest; |
213 using blink::WebURLResponse; | 218 using blink::WebURLResponse; |
214 using blink::WebUserGestureIndicator; | 219 using blink::WebUserGestureIndicator; |
215 using blink::WebVector; | 220 using blink::WebVector; |
216 using blink::WebView; | 221 using blink::WebView; |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1021 IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload) | 1026 IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload) |
1022 IPC_MESSAGE_HANDLER(FrameMsg_TextSurroundingSelectionRequest, | 1027 IPC_MESSAGE_HANDLER(FrameMsg_TextSurroundingSelectionRequest, |
1023 OnTextSurroundingSelectionRequest) | 1028 OnTextSurroundingSelectionRequest) |
1024 IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL, | 1029 IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL, |
1025 OnAddStyleSheetByURL) | 1030 OnAddStyleSheetByURL) |
1026 IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode, | 1031 IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode, |
1027 OnSetAccessibilityMode) | 1032 OnSetAccessibilityMode) |
1028 IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener) | 1033 IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener) |
1029 IPC_MESSAGE_HANDLER(FrameMsg_CommitNavigation, OnCommitNavigation) | 1034 IPC_MESSAGE_HANDLER(FrameMsg_CommitNavigation, OnCommitNavigation) |
1030 IPC_MESSAGE_HANDLER(FrameMsg_DidUpdateSandboxFlags, OnDidUpdateSandboxFlags) | 1035 IPC_MESSAGE_HANDLER(FrameMsg_DidUpdateSandboxFlags, OnDidUpdateSandboxFlags) |
1036 IPC_MESSAGE_HANDLER(FrameMsg_PostMessageEvent, OnPostMessageEvent) | |
1031 #if defined(OS_ANDROID) | 1037 #if defined(OS_ANDROID) |
1032 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems) | 1038 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems) |
1033 #elif defined(OS_MACOSX) | 1039 #elif defined(OS_MACOSX) |
1034 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem) | 1040 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem) |
1035 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) | 1041 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) |
1036 #endif | 1042 #endif |
1037 IPC_END_MESSAGE_MAP() | 1043 IPC_END_MESSAGE_MAP() |
1038 | 1044 |
1039 return handled; | 1045 return handled; |
1040 } | 1046 } |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1546 CHECK(!frame_->parent()); | 1552 CHECK(!frame_->parent()); |
1547 | 1553 |
1548 if (frame_->opener()) | 1554 if (frame_->opener()) |
1549 frame_->setOpener(NULL); | 1555 frame_->setOpener(NULL); |
1550 } | 1556 } |
1551 | 1557 |
1552 void RenderFrameImpl::OnDidUpdateSandboxFlags(SandboxFlags flags) { | 1558 void RenderFrameImpl::OnDidUpdateSandboxFlags(SandboxFlags flags) { |
1553 frame_->setFrameOwnerSandboxFlags(ContentToWebSandboxFlags(flags)); | 1559 frame_->setFrameOwnerSandboxFlags(ContentToWebSandboxFlags(flags)); |
1554 } | 1560 } |
1555 | 1561 |
1562 void RenderFrameImpl::OnPostMessageEvent( | |
1563 const FrameMsg_PostMessage_Params& params) { | |
1564 // Find the source frame if it exists. | |
1565 WebFrame* source_frame = NULL; | |
1566 if (params.source_view_routing_id != MSG_ROUTING_NONE) { | |
1567 // Support a legacy postMessage path for specifying a source RenderView; | |
1568 // this is currently used when sending messages to Android WebView. | |
1569 // TODO(alexmos): This path can be removed once crbug.com/473258 is fixed. | |
1570 RenderViewImpl* source_view = | |
1571 RenderViewImpl::FromRoutingID(params.source_view_routing_id); | |
1572 if (source_view) | |
1573 source_frame = source_view->webview()->mainFrame(); | |
1574 } else if (params.source_routing_id != MSG_ROUTING_NONE) { | |
1575 RenderFrameProxy* source_proxy = | |
1576 RenderFrameProxy::FromRoutingID(params.source_routing_id); | |
1577 if (source_proxy) { | |
1578 // Currently, navigating a top-level frame cross-process does not swap | |
1579 // the WebLocalFrame for a WebRemoteFrame in the frame tree, and the | |
1580 // WebRemoteFrame will not have an associated blink::Frame. If this is | |
1581 // the case for |source_proxy|, use the corresponding (swapped-out) | |
1582 // WebLocalFrame instead, so that event.source for this message can be | |
1583 // set and used properly. | |
1584 if (source_proxy->IsMainFrameDetachedFromTree()) | |
1585 source_frame = source_proxy->render_view()->webview()->mainFrame(); | |
1586 else | |
1587 source_frame = source_proxy->web_frame(); | |
1588 } | |
1589 } | |
1590 | |
1591 // If the message contained MessagePorts, create the corresponding endpoints. | |
1592 blink::WebMessagePortChannelArray channels = | |
1593 WebMessagePortChannelImpl::CreatePorts( | |
1594 params.message_ports, params.new_routing_ids, | |
1595 base::MessageLoopProxy::current().get()); | |
1596 | |
1597 WebSerializedScriptValue serialized_script_value; | |
1598 if (params.is_data_raw_string) { | |
1599 v8::HandleScope handle_scope(blink::mainThreadIsolate()); | |
1600 v8::Local<v8::Context> context = frame_->mainWorldScriptContext(); | |
1601 v8::Context::Scope context_scope(context); | |
1602 V8ValueConverterImpl converter; | |
1603 converter.SetDateAllowed(true); | |
1604 converter.SetRegExpAllowed(true); | |
1605 scoped_ptr<base::Value> value(new base::StringValue(params.data)); | |
1606 v8::Handle<v8::Value> result_value = converter.ToV8Value(value.get(), | |
1607 context); | |
1608 serialized_script_value = WebSerializedScriptValue::serialize(result_value); | |
1609 } else { | |
1610 serialized_script_value = WebSerializedScriptValue::fromString(params.data); | |
1611 } | |
1612 | |
1613 // Create an event with the message. The next-to-last parameter to | |
1614 // initMessageEvent is the last event ID, which is not used with postMessage. | |
1615 WebDOMEvent event = frame_->document().createEvent("MessageEvent"); | |
1616 WebDOMMessageEvent msg_event = event.to<WebDOMMessageEvent>(); | |
1617 msg_event.initMessageEvent("message", | |
1618 // |canBubble| and |cancellable| are always false | |
1619 false, false, | |
1620 serialized_script_value, | |
1621 params.source_origin, source_frame, "", channels); | |
1622 | |
1623 // We must pass in the target_origin to do the security check on this side, | |
1624 // since it may have changed since the original postMessage call was made. | |
1625 WebSecurityOrigin target_origin; | |
1626 if (!params.target_origin.empty()) { | |
1627 target_origin = | |
1628 WebSecurityOrigin::createFromString(WebString(params.target_origin)); | |
1629 } | |
1630 frame_->dispatchMessageEventWithOriginCheck(target_origin, msg_event); | |
1631 } | |
1632 | |
1556 #if defined(OS_ANDROID) | 1633 #if defined(OS_ANDROID) |
1557 void RenderFrameImpl::OnSelectPopupMenuItems( | 1634 void RenderFrameImpl::OnSelectPopupMenuItems( |
1558 bool canceled, | 1635 bool canceled, |
1559 const std::vector<int>& selected_indices) { | 1636 const std::vector<int>& selected_indices) { |
1560 // It is possible to receive more than one of these calls if the user presses | 1637 // It is possible to receive more than one of these calls if the user presses |
1561 // a select faster than it takes for the show-select-popup IPC message to make | 1638 // a select faster than it takes for the show-select-popup IPC message to make |
1562 // it to the browser UI thread. Ignore the extra-messages. | 1639 // it to the browser UI thread. Ignore the extra-messages. |
1563 // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug. | 1640 // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug. |
1564 if (!external_popup_menu_) | 1641 if (!external_popup_menu_) |
1565 return; | 1642 return; |
(...skipping 1886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3452 return midi_dispatcher_; | 3529 return midi_dispatcher_; |
3453 } | 3530 } |
3454 | 3531 |
3455 bool RenderFrameImpl::willCheckAndDispatchMessageEvent( | 3532 bool RenderFrameImpl::willCheckAndDispatchMessageEvent( |
3456 blink::WebLocalFrame* source_frame, | 3533 blink::WebLocalFrame* source_frame, |
3457 blink::WebFrame* target_frame, | 3534 blink::WebFrame* target_frame, |
3458 blink::WebSecurityOrigin target_origin, | 3535 blink::WebSecurityOrigin target_origin, |
3459 blink::WebDOMMessageEvent event) { | 3536 blink::WebDOMMessageEvent event) { |
3460 DCHECK(!frame_ || frame_ == target_frame); | 3537 DCHECK(!frame_ || frame_ == target_frame); |
3461 | 3538 |
3539 // Currently, a postMessage that targets a cross-process frame can be plumbed | |
3540 // either through this function or RenderFrameProxy::postMessageEvent. This | |
3541 // function is used when the target cross-process frame is a top-level frame | |
3542 // which has been swapped out. In that case, the corresponding WebLocalFrame | |
3543 // currently remains in the frame tree even in site-per-process mode (see | |
3544 // OnSwapOut). RenderFrameProxy::postMessageEvent is used in | |
3545 // --site-per-process mode for all other cases. | |
3546 // | |
3547 // TODO(alexmos, nasko): When swapped-out:// disappears, this should be | |
3548 // cleaned up so that RenderFrameProxy::postMessageEvent is the only path for | |
3549 // cross-process postMessages. | |
3462 if (!is_swapped_out_) | 3550 if (!is_swapped_out_) |
3463 return false; | 3551 return false; |
3464 | 3552 |
3465 ViewMsg_PostMessage_Params params; | 3553 CHECK(render_frame_proxy_); |
alexmos
2015/04/02 23:17:00
Am I correct in assuming the proxy_ will always ex
Charlie Reis
2015/04/06 16:18:55
I think the only way it could happen is in a befor
alexmos
2015/04/07 18:44:39
Just to summarize what we discussed offline. befo
| |
3466 params.is_data_raw_string = false; | 3554 render_frame_proxy_->postMessageEvent( |
3467 params.data = event.data().toString(); | 3555 source_frame, render_frame_proxy_->web_frame(), target_origin, event); |
3468 params.source_origin = event.origin(); | |
3469 if (!target_origin.isNull()) | |
3470 params.target_origin = target_origin.toString(); | |
3471 | |
3472 params.message_ports = | |
3473 WebMessagePortChannelImpl::ExtractMessagePortIDs(event.releaseChannels()); | |
3474 | |
3475 // Include the routing ID for the source frame (if one exists), which the | |
3476 // browser process will translate into the routing ID for the equivalent | |
3477 // frame in the target process. | |
3478 params.source_routing_id = MSG_ROUTING_NONE; | |
3479 if (source_frame) { | |
3480 RenderViewImpl* source_view = | |
3481 RenderViewImpl::FromWebView(source_frame->view()); | |
3482 if (source_view) | |
3483 params.source_routing_id = source_view->routing_id(); | |
3484 } | |
3485 | |
3486 Send(new ViewHostMsg_RouteMessageEvent(render_view_->routing_id_, params)); | |
3487 return true; | 3556 return true; |
3488 } | 3557 } |
3489 | 3558 |
3490 blink::WebString RenderFrameImpl::userAgentOverride(blink::WebLocalFrame* frame, | 3559 blink::WebString RenderFrameImpl::userAgentOverride(blink::WebLocalFrame* frame, |
3491 const blink::WebURL& url) { | 3560 const blink::WebURL& url) { |
3492 DCHECK(!frame_ || frame_ == frame); | 3561 DCHECK(!frame_ || frame_ == frame); |
3493 std::string user_agent_override_for_url = | 3562 std::string user_agent_override_for_url = |
3494 GetContentClient()->renderer()->GetUserAgentOverrideForURL(GURL(url)); | 3563 GetContentClient()->renderer()->GetUserAgentOverrideForURL(GURL(url)); |
3495 if (!user_agent_override_for_url.empty()) | 3564 if (!user_agent_override_for_url.empty()) |
3496 return WebString::fromUTF8(user_agent_override_for_url); | 3565 return WebString::fromUTF8(user_agent_override_for_url); |
(...skipping 1044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4541 | 4610 |
4542 #if defined(ENABLE_BROWSER_CDMS) | 4611 #if defined(ENABLE_BROWSER_CDMS) |
4543 RendererCdmManager* RenderFrameImpl::GetCdmManager() { | 4612 RendererCdmManager* RenderFrameImpl::GetCdmManager() { |
4544 if (!cdm_manager_) | 4613 if (!cdm_manager_) |
4545 cdm_manager_ = new RendererCdmManager(this); | 4614 cdm_manager_ = new RendererCdmManager(this); |
4546 return cdm_manager_; | 4615 return cdm_manager_; |
4547 } | 4616 } |
4548 #endif // defined(ENABLE_BROWSER_CDMS) | 4617 #endif // defined(ENABLE_BROWSER_CDMS) |
4549 | 4618 |
4550 } // namespace content | 4619 } // namespace content |
OLD | NEW |