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

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) {
159 if (!guest_loaded_) {
160 linked_ptr<ScopedPersistent<v8::Value>> scoped_persistent(
161 new ScopedPersistent<v8::Value>(isolate, message));
162 pending_messages_.push_back(scoped_persistent);
163 return;
164 }
165
156 content::RenderView* guest_proxy_render_view = 166 content::RenderView* guest_proxy_render_view =
157 content::RenderView::FromRoutingID(guest_proxy_routing_id_); 167 content::RenderView::FromRoutingID(guest_proxy_routing_id_);
158 if (!guest_proxy_render_view) 168 if (!guest_proxy_render_view)
159 return; 169 return;
160 blink::WebFrame* guest_proxy_frame = 170 blink::WebFrame* guest_proxy_frame =
161 guest_proxy_render_view->GetWebView()->mainFrame(); 171 guest_proxy_render_view->GetWebView()->mainFrame();
162 if (!guest_proxy_frame) 172 if (!guest_proxy_frame)
163 return; 173 return;
164 174
165 v8::Local<v8::Object> guest_proxy_window = 175 v8::Local<v8::Object> guest_proxy_window =
(...skipping 13 matching lines...) Expand all
179 guest_proxy_window, arraysize(args), args); 189 guest_proxy_window, arraysize(args), args);
180 } 190 }
181 191
182 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( 192 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK(
183 int element_instance_id) { 193 int element_instance_id) {
184 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); 194 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone);
185 DCHECK_EQ(this->element_instance_id(), element_instance_id); 195 DCHECK_EQ(this->element_instance_id(), element_instance_id);
186 render_frame()->AttachGuest(element_instance_id); 196 render_frame()->AttachGuest(element_instance_id);
187 } 197 }
188 198
199 void MimeHandlerViewContainer::OnMimeHandlerViewGuestOnLoadCompleted(
200 int /* unused */) {
201 guest_loaded_ = true;
202 if (pending_messages_.empty())
203 return;
204
205 // Now that the guest has loaded, flush any unsent messages.
206 blink::WebFrame* frame = render_frame()->GetWebFrame();
207 if (!frame)
208 return;
209
210 v8::Isolate* isolate = v8::Isolate::GetCurrent();
211 v8::HandleScope handle_scope(isolate);
212 v8::Context::Scope context_scope(frame->mainWorldScriptContext());
213 for (const auto& pending_message : pending_messages_)
214 PostMessage(isolate, pending_message->NewHandle(isolate));
215
216 pending_messages_.clear();
217 }
218
189 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */, 219 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */,
190 int guest_proxy_routing_id) { 220 int guest_proxy_routing_id) {
191 // Save the RenderView routing ID of the guest here so it can be used to route 221 // Save the RenderView routing ID of the guest here so it can be used to route
192 // PostMessage calls. 222 // PostMessage calls.
193 guest_proxy_routing_id_ = guest_proxy_routing_id; 223 guest_proxy_routing_id_ = guest_proxy_routing_id;
194 } 224 }
195 225
196 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() { 226 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() {
197 // The loader has completed loading |html_string_| so we can dispose it. 227 // The loader has completed loading |html_string_| so we can dispose it.
198 loader_.reset(); 228 loader_.reset();
199 229
200 // Parse the stream URL to ensure it's valid. 230 // Parse the stream URL to ensure it's valid.
201 GURL stream_url(html_string_); 231 GURL stream_url(html_string_);
202 232
203 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone); 233 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone);
204 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( 234 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest(
205 render_frame()->GetRoutingID(), stream_url.spec(), original_url_.spec(), 235 render_frame()->GetRoutingID(), stream_url.spec(), original_url_.spec(),
206 mime_type_, element_instance_id())); 236 mime_type_, element_instance_id()));
207 } 237 }
208 238
209 } // namespace extensions 239 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698