Index: components/html_viewer/html_frame.cc |
diff --git a/components/html_viewer/html_frame.cc b/components/html_viewer/html_frame.cc |
index ceb7a4a91b9449981ac85102b6606929347bc0d1..9291e49f9f2c4f9c51fb3e6d202bc036f2755094 100644 |
--- a/components/html_viewer/html_frame.cc |
+++ b/components/html_viewer/html_frame.cc |
@@ -46,6 +46,7 @@ |
#include "third_party/WebKit/public/web/WebElement.h" |
#include "third_party/WebKit/public/web/WebFrameWidget.h" |
#include "third_party/WebKit/public/web/WebInputEvent.h" |
+#include "third_party/WebKit/public/web/WebKit.h" |
#include "third_party/WebKit/public/web/WebLocalFrame.h" |
#include "third_party/WebKit/public/web/WebNavigationPolicy.h" |
#include "third_party/WebKit/public/web/WebRemoteFrame.h" |
@@ -61,6 +62,8 @@ |
#include "ui/gfx/geometry/size.h" |
#include "url/origin.h" |
+using mandoline::HTMLMessageEvent; |
+using mandoline::HTMLMessageEventPtr; |
using mojo::AxProvider; |
using mojo::Rect; |
using mojo::ServiceProviderPtr; |
@@ -574,6 +577,54 @@ void HTMLFrame::OnFrameClientPropertyChanged(uint32_t frame_id, |
new_value.Pass()); |
} |
+void HTMLFrame::PostMessage(uint32_t source_frame_id, |
+ uint32_t target_frame_id, |
+ HTMLMessageEventPtr serialized_event) { |
+ NOTIMPLEMENTED(); // For message ports. |
+ |
+ HTMLFrame* target = frame_tree_manager_->root_->FindFrame(target_frame_id); |
+ HTMLFrame* source = frame_tree_manager_->root_->FindFrame(source_frame_id); |
+ if (!target || !source) { |
+ DVLOG(1) << "Invalid source or target for PostMessage"; |
+ return; |
+ } |
+ |
+ if (!target->IsLocal()) { |
+ DVLOG(1) << "Target for PostMessage is not lot local"; |
+ return; |
+ } |
+ |
+ blink::WebFrame* target_web_frame = target->web_frame_; |
+ |
+ blink::WebSerializedScriptValue serialized_script_value; |
+ serialized_script_value = blink::WebSerializedScriptValue::fromString( |
+ serialized_event->data.To<blink::WebString>()); |
+ |
+ blink::WebMessagePortChannelArray channels; |
+ |
+ // Create an event with the message. The next-to-last parameter to |
+ // initMessageEvent is the last event ID, which is not used with postMessage. |
+ blink::WebDOMEvent event = |
+ target_web_frame->document().createEvent("MessageEvent"); |
+ blink::WebDOMMessageEvent msg_event = event.to<blink::WebDOMMessageEvent>(); |
+ msg_event.initMessageEvent( |
+ "message", |
+ // |canBubble| and |cancellable| are always false |
+ false, false, serialized_script_value, |
+ serialized_event->source_origin.To<blink::WebString>(), |
+ source->web_frame_, "", channels); |
+ |
+ // We must pass in the target_origin to do the security check on this side, |
+ // since it may have changed since the original postMessage call was made. |
+ blink::WebSecurityOrigin target_origin; |
+ if (!serialized_event->target_origin.is_null()) { |
+ target_origin = blink::WebSecurityOrigin::createFromString( |
+ serialized_event->target_origin.To<blink::WebString>()); |
+ } |
+ target_web_frame->dispatchMessageEventWithOriginCheck(target_origin, |
+ msg_event); |
+} |
+ |
blink::WebStorageNamespace* HTMLFrame::createSessionStorageNamespace() { |
return new WebStorageNamespaceImpl(); |
} |
@@ -830,11 +881,27 @@ void HTMLFrame::UpdateTextInputState(bool show_ime) { |
} |
} |
-void HTMLFrame::postMessageEvent(blink::WebLocalFrame* source_frame, |
- blink::WebRemoteFrame* target_frame, |
+void HTMLFrame::postMessageEvent(blink::WebLocalFrame* source_web_frame, |
+ blink::WebRemoteFrame* target_web_frame, |
blink::WebSecurityOrigin target_origin, |
- blink::WebDOMMessageEvent event) { |
- NOTIMPLEMENTED(); |
+ blink::WebDOMMessageEvent web_event) { |
+ NOTIMPLEMENTED(); // message_ports aren't implemented yet. |
+ |
+ HTMLFrame* source_frame = |
+ frame_tree_manager_->root_->FindFrameWithWebFrame(source_web_frame); |
+ DCHECK(source_frame); |
+ HTMLFrame* target_frame = |
+ frame_tree_manager_->root_->FindFrameWithWebFrame(target_web_frame); |
+ DCHECK(target_frame); |
+ |
+ HTMLMessageEventPtr event(HTMLMessageEvent::New()); |
+ event->data = mojo::Array<uint8_t>::From(web_event.data().toString()); |
+ event->source_origin = mojo::String::From(web_event.origin()); |
+ if (!target_origin.isNull()) |
+ event->target_origin = mojo::String::From(target_origin.toString()); |
+ |
+ GetFrameTreeServer()->PostMessageEventToFrame( |
+ source_frame->id_, target_frame->id_, event.Pass()); |
} |
void HTMLFrame::initializeChildFrame(const blink::WebRect& frame_rect, |