Chromium Code Reviews| 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. |
|
Fady Samuel
2015/08/11 19:39:07
I'm confused... What does that mean?
|
| + |
| + 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, |