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

Side by Side Diff: extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc

Issue 729333002: Add PostMessage support for MimeHandlerView (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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 unified diff | Download patch
« no previous file with comments | « extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_con tainer.h" 5 #include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_con tainer.h"
6 6
7 #include "content/public/renderer/render_frame.h" 7 #include "content/public/renderer/render_frame.h"
8 #include "content/public/renderer/render_view.h"
8 #include "extensions/common/extension_messages.h" 9 #include "extensions/common/extension_messages.h"
9 #include "extensions/common/guest_view/guest_view_constants.h" 10 #include "extensions/common/guest_view/guest_view_constants.h"
11 #include "gin/arguments.h"
12 #include "gin/dictionary.h"
13 #include "gin/handle.h"
14 #include "gin/interceptor.h"
15 #include "gin/object_template_builder.h"
16 #include "gin/wrappable.h"
10 #include "third_party/WebKit/public/web/WebDocument.h" 17 #include "third_party/WebKit/public/web/WebDocument.h"
11 #include "third_party/WebKit/public/web/WebLocalFrame.h" 18 #include "third_party/WebKit/public/web/WebLocalFrame.h"
19 #include "third_party/WebKit/public/web/WebView.h"
12 20
13 namespace extensions { 21 namespace extensions {
14 22
23 namespace {
24
25 const char kPostMessageName[] = "postMessage";
26
27 // The gin-backed scriptable object which is exposed by the BrowserPlugin for
28 // MimeHandlerViewContainer. This currently only implements "postMessage".
29 class ScriptableObject : public gin::Wrappable<ScriptableObject>,
30 public gin::NamedPropertyInterceptor {
31 public:
32 static gin::WrapperInfo kWrapperInfo;
33
34 static v8::Handle<v8::Object> Create(
35 v8::Isolate* isolate,
36 base::WeakPtr<MimeHandlerViewContainer> container) {
37 ScriptableObject* scriptable_object =
38 new ScriptableObject(isolate, container);
39 return gin::CreateHandle(isolate, scriptable_object).ToV8()->ToObject();
40 }
41
42 // gin::NamedPropertyInterceptor
43 v8::Local<v8::Value> GetNamedProperty(
44 v8::Isolate* isolate,
45 const std::string& identifier) override {
46 if (identifier == kPostMessageName) {
47 return gin::CreateFunctionTemplate(isolate,
48 base::Bind(&MimeHandlerViewContainer::PostMessage,
49 container_, isolate))->GetFunction();
50 }
51 return v8::Local<v8::Value>();
52 }
53
54 private:
55 ScriptableObject(v8::Isolate* isolate,
56 base::WeakPtr<MimeHandlerViewContainer> container)
57 : gin::NamedPropertyInterceptor(isolate, this),
58 container_(container) {}
59 virtual ~ScriptableObject() {}
60
61 // gin::Wrappable
62 virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
63 v8::Isolate* isolate) override {
64 return gin::Wrappable<ScriptableObject>::GetObjectTemplateBuilder(isolate)
65 .AddNamedPropertyInterceptor();
66 }
67
68 base::WeakPtr<MimeHandlerViewContainer> container_;
69 };
70
71 // static
72 gin::WrapperInfo ScriptableObject::kWrapperInfo = { gin::kEmbedderNativeGin };
73
74 } // namespace
75
15 MimeHandlerViewContainer::MimeHandlerViewContainer( 76 MimeHandlerViewContainer::MimeHandlerViewContainer(
16 content::RenderFrame* render_frame, 77 content::RenderFrame* render_frame,
17 const std::string& mime_type, 78 const std::string& mime_type,
18 const GURL& original_url) 79 const GURL& original_url)
19 : GuestViewContainer(render_frame), 80 : GuestViewContainer(render_frame),
20 mime_type_(mime_type), 81 mime_type_(mime_type),
21 original_url_(original_url) { 82 original_url_(original_url),
83 guest_proxy_routing_id_(-1),
84 weak_factory_(this) {
22 DCHECK(!mime_type_.empty()); 85 DCHECK(!mime_type_.empty());
23 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); 86 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument();
24 } 87 }
25 88
26 MimeHandlerViewContainer::~MimeHandlerViewContainer() { 89 MimeHandlerViewContainer::~MimeHandlerViewContainer() {
27 if (loader_) 90 if (loader_)
28 loader_->cancel(); 91 loader_->cancel();
29 } 92 }
30 93
31 void MimeHandlerViewContainer::DidFinishLoading() {
32 DCHECK(!is_embedded_);
33 CreateMimeHandlerViewGuest();
34 }
35
36 void MimeHandlerViewContainer::DidReceiveData(const char* data,
37 int data_length) {
38 html_string_ += std::string(data, data_length);
39 }
40
41 void MimeHandlerViewContainer::Ready() { 94 void MimeHandlerViewContainer::Ready() {
42 blink::WebFrame* frame = render_frame()->GetWebFrame(); 95 blink::WebFrame* frame = render_frame()->GetWebFrame();
43 blink::WebURLLoaderOptions options; 96 blink::WebURLLoaderOptions options;
44 // The embedded plugin is allowed to be cross-origin. 97 // The embedded plugin is allowed to be cross-origin.
45 options.crossOriginRequestPolicy = 98 options.crossOriginRequestPolicy =
46 blink::WebURLLoaderOptions::CrossOriginRequestPolicyAllow; 99 blink::WebURLLoaderOptions::CrossOriginRequestPolicyAllow;
47 DCHECK(!loader_); 100 DCHECK(!loader_);
48 loader_.reset(frame->createAssociatedURLLoader(options)); 101 loader_.reset(frame->createAssociatedURLLoader(options));
49 102
50 blink::WebURLRequest request(original_url_); 103 blink::WebURLRequest request(original_url_);
51 request.setRequestContext(blink::WebURLRequest::RequestContextObject); 104 request.setRequestContext(blink::WebURLRequest::RequestContextObject);
52 loader_->loadAsynchronously(request, this); 105 loader_->loadAsynchronously(request, this);
53 } 106 }
54 107
108 void MimeHandlerViewContainer::DidFinishLoading() {
109 DCHECK(!is_embedded_);
110 CreateMimeHandlerViewGuest();
111 }
112
113 void MimeHandlerViewContainer::DidReceiveData(const char* data,
114 int data_length) {
115 html_string_ += std::string(data, data_length);
116 }
117
118 v8::Local<v8::Object> MimeHandlerViewContainer::V8ScriptableObject(
119 v8::Isolate* isolate) {
120 if (scriptable_object_.IsEmpty()) {
121 v8::Local<v8::Object> object =
122 ScriptableObject::Create(isolate, weak_factory_.GetWeakPtr());
123 scriptable_object_.reset(object);
124 }
125 return scriptable_object_.NewHandle(isolate);
126 }
127
55 bool MimeHandlerViewContainer::HandlesMessage(const IPC::Message& message) { 128 bool MimeHandlerViewContainer::HandlesMessage(const IPC::Message& message) {
56 return message.type() == ExtensionMsg_CreateMimeHandlerViewGuestACK::ID; 129 return message.type() == ExtensionMsg_CreateMimeHandlerViewGuestACK::ID ||
130 message.type() == ExtensionMsg_GuestAttached::ID;
57 } 131 }
58 132
59 bool MimeHandlerViewContainer::OnMessage(const IPC::Message& message) { 133 bool MimeHandlerViewContainer::OnMessage(const IPC::Message& message) {
60 bool handled = true; 134 bool handled = true;
61 IPC_BEGIN_MESSAGE_MAP(MimeHandlerViewContainer, message) 135 IPC_BEGIN_MESSAGE_MAP(MimeHandlerViewContainer, message)
62 IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK, 136 IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK,
63 OnCreateMimeHandlerViewGuestACK) 137 OnCreateMimeHandlerViewGuestACK)
138 IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached)
64 IPC_MESSAGE_UNHANDLED(handled = false) 139 IPC_MESSAGE_UNHANDLED(handled = false)
65 IPC_END_MESSAGE_MAP() 140 IPC_END_MESSAGE_MAP()
66 return handled; 141 return handled;
67 } 142 }
68 143
69 void MimeHandlerViewContainer::didReceiveData(blink::WebURLLoader* /* unused */, 144 void MimeHandlerViewContainer::didReceiveData(blink::WebURLLoader* /* unused */,
70 const char* data, 145 const char* data,
71 int data_length, 146 int data_length,
72 int /* unused */) { 147 int /* unused */) {
73 html_string_ += std::string(data, data_length); 148 html_string_ += std::string(data, data_length);
74 } 149 }
75 150
76 void MimeHandlerViewContainer::didFinishLoading( 151 void MimeHandlerViewContainer::didFinishLoading(
77 blink::WebURLLoader* /* unused */, 152 blink::WebURLLoader* /* unused */,
78 double /* unused */, 153 double /* unused */,
79 int64_t /* unused */) { 154 int64_t /* unused */) {
80 DCHECK(is_embedded_); 155 DCHECK(is_embedded_);
81 CreateMimeHandlerViewGuest(); 156 CreateMimeHandlerViewGuest();
82 } 157 }
83 158
159 void MimeHandlerViewContainer::PostMessage(v8::Isolate* isolate,
160 v8::Handle<v8::Value> message) {
161 content::RenderView* guest_proxy_render_view =
162 content::RenderView::FromRoutingID(guest_proxy_routing_id_);
163 if (!guest_proxy_render_view)
164 return;
165 blink::WebFrame* guest_proxy_frame =
166 guest_proxy_render_view->GetWebView()->mainFrame();
167 if (!guest_proxy_frame)
168 return;
169
170 v8::Local<v8::Object> guest_proxy_window =
171 guest_proxy_frame->mainWorldScriptContext()->Global();
172 gin::Dictionary window_object(isolate, guest_proxy_window);
173 v8::Handle<v8::Function> post_message;
174 window_object.Get(std::string(kPostMessageName), &post_message);
175 if (post_message.IsEmpty())
Sam McNally 2014/12/19 00:18:19 Checking the return value of Get() should be suffi
176 return;
177
178 v8::Handle<v8::Value> args[] = {
179 message,
180 // Post the message to any domain inside the browser plugin. The embedder
181 // should already know what is embedded.
182 gin::StringToV8(isolate, "*")
183 };
184 post_message.As<v8::Function>()->Call(
185 guest_proxy_window, arraysize(args), args);
186 }
187
84 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( 188 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK(
85 int element_instance_id) { 189 int element_instance_id) {
86 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); 190 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone);
87 DCHECK_EQ(this->element_instance_id(), element_instance_id); 191 DCHECK_EQ(this->element_instance_id(), element_instance_id);
88 render_frame()->AttachGuest(element_instance_id); 192 render_frame()->AttachGuest(element_instance_id);
89 } 193 }
90 194
195 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */,
196 int guest_proxy_routing_id) {
197 // Save the RenderView routing ID of the guest here so it can be used to route
198 // PostMessage calls.
199 guest_proxy_routing_id_ = guest_proxy_routing_id;
200 }
201
91 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() { 202 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() {
92 // The loader has completed loading |html_string_| so we can dispose it. 203 // The loader has completed loading |html_string_| so we can dispose it.
93 loader_.reset(); 204 loader_.reset();
94 205
95 // Parse the stream URL to ensure it's valid. 206 // Parse the stream URL to ensure it's valid.
96 GURL stream_url(html_string_); 207 GURL stream_url(html_string_);
97 208
98 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone); 209 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone);
99 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( 210 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest(
100 routing_id(), stream_url.spec(), original_url_.spec(), mime_type_, 211 routing_id(), stream_url.spec(), original_url_.spec(), mime_type_,
101 element_instance_id())); 212 element_instance_id()));
102 } 213 }
103 214
104 } // namespace extensions 215 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698