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

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

Issue 811263002: Queue postMessage messages destined for a MimeHandlerView guest (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@postMessage1
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
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 "content/public/renderer/render_view.h"
9 #include "extensions/common/extension_messages.h" 9 #include "extensions/common/extension_messages.h"
10 #include "extensions/common/guest_view/guest_view_constants.h" 10 #include "extensions/common/guest_view/guest_view_constants.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 } // namespace 74 } // namespace
75 75
76 MimeHandlerViewContainer::MimeHandlerViewContainer( 76 MimeHandlerViewContainer::MimeHandlerViewContainer(
77 content::RenderFrame* render_frame, 77 content::RenderFrame* render_frame,
78 const std::string& mime_type, 78 const std::string& mime_type,
79 const GURL& original_url) 79 const GURL& original_url)
80 : GuestViewContainer(render_frame), 80 : GuestViewContainer(render_frame),
81 mime_type_(mime_type), 81 mime_type_(mime_type),
82 original_url_(original_url), 82 original_url_(original_url),
83 guest_proxy_routing_id_(-1), 83 guest_proxy_routing_id_(-1),
84 guest_loaded_(false),
84 weak_factory_(this) { 85 weak_factory_(this) {
85 DCHECK(!mime_type_.empty()); 86 DCHECK(!mime_type_.empty());
86 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); 87 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument();
87 } 88 }
88 89
89 MimeHandlerViewContainer::~MimeHandlerViewContainer() { 90 MimeHandlerViewContainer::~MimeHandlerViewContainer() {
90 if (loader_) 91 if (loader_)
91 loader_->cancel(); 92 loader_->cancel();
92 } 93 }
93 94
(...skipping 19 matching lines...) Expand all
113 void MimeHandlerViewContainer::DidReceiveData(const char* data, 114 void MimeHandlerViewContainer::DidReceiveData(const char* data,
114 int data_length) { 115 int data_length) {
115 html_string_ += std::string(data, data_length); 116 html_string_ += std::string(data, data_length);
116 } 117 }
117 118
118 bool MimeHandlerViewContainer::OnMessageReceived(const IPC::Message& message) { 119 bool MimeHandlerViewContainer::OnMessageReceived(const IPC::Message& message) {
119 bool handled = true; 120 bool handled = true;
120 IPC_BEGIN_MESSAGE_MAP(MimeHandlerViewContainer, message) 121 IPC_BEGIN_MESSAGE_MAP(MimeHandlerViewContainer, message)
121 IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK, 122 IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK,
122 OnCreateMimeHandlerViewGuestACK) 123 OnCreateMimeHandlerViewGuestACK)
124 IPC_MESSAGE_HANDLER(ExtensionMsg_MimeHandlerViewGuestOnLoadCompleted,
125 OnMimeHandlerViewGuestOnLoadCompleted)
123 IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached) 126 IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached)
124 IPC_MESSAGE_UNHANDLED(handled = false) 127 IPC_MESSAGE_UNHANDLED(handled = false)
125 IPC_END_MESSAGE_MAP() 128 IPC_END_MESSAGE_MAP()
126 return handled; 129 return handled;
127 } 130 }
128 131
129 v8::Local<v8::Object> MimeHandlerViewContainer::V8ScriptableObject( 132 v8::Local<v8::Object> MimeHandlerViewContainer::V8ScriptableObject(
130 v8::Isolate* isolate) { 133 v8::Isolate* isolate) {
131 if (scriptable_object_.IsEmpty()) { 134 if (scriptable_object_.IsEmpty()) {
132 v8::Local<v8::Object> object = 135 v8::Local<v8::Object> object =
(...skipping 13 matching lines...) Expand all
146 void MimeHandlerViewContainer::didFinishLoading( 149 void MimeHandlerViewContainer::didFinishLoading(
147 blink::WebURLLoader* /* unused */, 150 blink::WebURLLoader* /* unused */,
148 double /* unused */, 151 double /* unused */,
149 int64_t /* unused */) { 152 int64_t /* unused */) {
150 DCHECK(is_embedded_); 153 DCHECK(is_embedded_);
151 CreateMimeHandlerViewGuest(); 154 CreateMimeHandlerViewGuest();
152 } 155 }
153 156
154 void MimeHandlerViewContainer::PostMessage(v8::Isolate* isolate, 157 void MimeHandlerViewContainer::PostMessage(v8::Isolate* isolate,
155 v8::Handle<v8::Value> message) { 158 v8::Handle<v8::Value> message) {
156 content::RenderView* guest_proxy_render_view = 159 if (!guest_loaded_) {
157 content::RenderView::FromRoutingID(guest_proxy_routing_id_); 160 linked_ptr<ScopedPersistent<v8::Value>> scoped_persistent(
158 if (!guest_proxy_render_view) 161 new ScopedPersistent<v8::Value>(isolate, message));
162 pending_messages_.push_back(scoped_persistent);
159 return; 163 return;
160 blink::WebFrame* guest_proxy_frame = 164 }
161 guest_proxy_render_view->GetWebView()->mainFrame(); 165
166 blink::WebFrame* guest_proxy_frame = render_frame()->GetWebFrame();
Sam McNally 2014/12/19 03:54:03 Change the other one, not this one.
162 if (!guest_proxy_frame) 167 if (!guest_proxy_frame)
163 return; 168 return;
164 169
165 v8::Local<v8::Object> guest_proxy_window = 170 v8::Local<v8::Object> guest_proxy_window =
166 guest_proxy_frame->mainWorldScriptContext()->Global(); 171 guest_proxy_frame->mainWorldScriptContext()->Global();
167 gin::Dictionary window_object(isolate, guest_proxy_window); 172 gin::Dictionary window_object(isolate, guest_proxy_window);
168 v8::Handle<v8::Function> post_message; 173 v8::Handle<v8::Function> post_message;
169 if (!window_object.Get(std::string(kPostMessageName), &post_message)) 174 if (!window_object.Get(std::string(kPostMessageName), &post_message))
170 return; 175 return;
171 176
172 v8::Handle<v8::Value> args[] = { 177 v8::Handle<v8::Value> args[] = {
173 message, 178 message,
174 // Post the message to any domain inside the browser plugin. The embedder 179 // Post the message to any domain inside the browser plugin. The embedder
175 // should already know what is embedded. 180 // should already know what is embedded.
176 gin::StringToV8(isolate, "*") 181 gin::StringToV8(isolate, "*")
177 }; 182 };
178 post_message.As<v8::Function>()->Call( 183 post_message.As<v8::Function>()->Call(
179 guest_proxy_window, arraysize(args), args); 184 guest_proxy_window, arraysize(args), args);
180 } 185 }
181 186
182 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( 187 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK(
183 int element_instance_id) { 188 int element_instance_id) {
184 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); 189 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone);
185 DCHECK_EQ(this->element_instance_id(), element_instance_id); 190 DCHECK_EQ(this->element_instance_id(), element_instance_id);
186 render_frame()->AttachGuest(element_instance_id); 191 render_frame()->AttachGuest(element_instance_id);
187 } 192 }
188 193
194 void MimeHandlerViewContainer::OnMimeHandlerViewGuestOnLoadCompleted(
195 int /* unused */) {
196 guest_loaded_ = true;
197 if (pending_messages_.empty())
198 return;
199
200 // Now that the guest has loaded, flush any unsent messages.
201 content::RenderView* render_view =
202 content::RenderView::FromRoutingID(render_view_routing_id());
203 if (!render_view)
204 return;
205 blink::WebFrame* frame = render_view->GetWebView()->mainFrame();
206 if (!frame)
207 return;
208
209 v8::Isolate* isolate = v8::Isolate::GetCurrent();
210 v8::HandleScope handle_scope(isolate);
211 v8::Context::Scope context_scope(frame->mainWorldScriptContext());
212 for (const auto& pending_message : pending_messages_)
213 PostMessage(isolate, pending_message->NewHandle(isolate));
214
215 pending_messages_.clear();
216 }
217
189 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */, 218 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */,
190 int guest_proxy_routing_id) { 219 int guest_proxy_routing_id) {
191 // Save the RenderView routing ID of the guest here so it can be used to route 220 // Save the RenderView routing ID of the guest here so it can be used to route
192 // PostMessage calls. 221 // PostMessage calls.
193 guest_proxy_routing_id_ = guest_proxy_routing_id; 222 guest_proxy_routing_id_ = guest_proxy_routing_id;
194 } 223 }
195 224
196 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() { 225 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() {
197 // The loader has completed loading |html_string_| so we can dispose it. 226 // The loader has completed loading |html_string_| so we can dispose it.
198 loader_.reset(); 227 loader_.reset();
199 228
200 // Parse the stream URL to ensure it's valid. 229 // Parse the stream URL to ensure it's valid.
201 GURL stream_url(html_string_); 230 GURL stream_url(html_string_);
202 231
203 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone); 232 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone);
204 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( 233 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest(
205 render_frame()->GetRoutingID(), stream_url.spec(), original_url_.spec(), 234 render_frame()->GetRoutingID(), stream_url.spec(), original_url_.spec(),
206 mime_type_, element_instance_id())); 235 mime_type_, element_instance_id()));
207 } 236 }
208 237
209 } // namespace extensions 238 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698