Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(393)

Unified Diff: components/html_viewer/html_frame.cc

Issue 1270313006: Connects PostMessage() for OOPIFs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix windows Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/html_viewer/html_frame.h ('k') | components/html_viewer/html_frame_apptest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « components/html_viewer/html_frame.h ('k') | components/html_viewer/html_frame_apptest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698