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

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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 } // namespace 73 } // namespace
74 74
75 MimeHandlerViewContainer::MimeHandlerViewContainer( 75 MimeHandlerViewContainer::MimeHandlerViewContainer(
76 content::RenderFrame* render_frame, 76 content::RenderFrame* render_frame,
77 const std::string& mime_type, 77 const std::string& mime_type,
78 const GURL& original_url) 78 const GURL& original_url)
79 : GuestViewContainer(render_frame), 79 : GuestViewContainer(render_frame),
80 mime_type_(mime_type), 80 mime_type_(mime_type),
81 original_url_(original_url), 81 original_url_(original_url),
82 guest_proxy_routing_id_(-1), 82 guest_proxy_routing_id_(-1),
83 guest_loaded_(false),
83 weak_factory_(this) { 84 weak_factory_(this) {
84 DCHECK(!mime_type_.empty()); 85 DCHECK(!mime_type_.empty());
85 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument(); 86 is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument();
86 } 87 }
87 88
88 MimeHandlerViewContainer::~MimeHandlerViewContainer() { 89 MimeHandlerViewContainer::~MimeHandlerViewContainer() {
89 if (loader_) 90 if (loader_)
90 loader_->cancel(); 91 loader_->cancel();
91 } 92 }
92 93
(...skipping 26 matching lines...) Expand all
119 if (scriptable_object_.IsEmpty()) { 120 if (scriptable_object_.IsEmpty()) {
120 v8::Local<v8::Object> object = 121 v8::Local<v8::Object> object =
121 ScriptableObject::Create(isolate, weak_factory_.GetWeakPtr()); 122 ScriptableObject::Create(isolate, weak_factory_.GetWeakPtr());
122 scriptable_object_.reset(object); 123 scriptable_object_.reset(object);
123 } 124 }
124 return scriptable_object_.NewHandle(isolate); 125 return scriptable_object_.NewHandle(isolate);
125 } 126 }
126 127
127 bool MimeHandlerViewContainer::HandlesMessage(const IPC::Message& message) { 128 bool MimeHandlerViewContainer::HandlesMessage(const IPC::Message& message) {
128 return message.type() == ExtensionMsg_CreateMimeHandlerViewGuestACK::ID || 129 return message.type() == ExtensionMsg_CreateMimeHandlerViewGuestACK::ID ||
130 message.type() == ExtensionMsg_MimeHandlerViewGuestOnLoadCompleted::ID ||
129 message.type() == ExtensionMsg_GuestAttached::ID; 131 message.type() == ExtensionMsg_GuestAttached::ID;
130 } 132 }
131 133
132 bool MimeHandlerViewContainer::OnMessage(const IPC::Message& message) { 134 bool MimeHandlerViewContainer::OnMessage(const IPC::Message& message) {
133 bool handled = true; 135 bool handled = true;
134 IPC_BEGIN_MESSAGE_MAP(MimeHandlerViewContainer, message) 136 IPC_BEGIN_MESSAGE_MAP(MimeHandlerViewContainer, message)
135 IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK, 137 IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK,
136 OnCreateMimeHandlerViewGuestACK) 138 OnCreateMimeHandlerViewGuestACK)
139 IPC_MESSAGE_HANDLER(ExtensionMsg_MimeHandlerViewGuestOnLoadCompleted,
140 OnMimeHandlerViewGuestOnLoadCompleted)
137 IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached) 141 IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached)
138 IPC_MESSAGE_UNHANDLED(handled = false) 142 IPC_MESSAGE_UNHANDLED(handled = false)
139 IPC_END_MESSAGE_MAP() 143 IPC_END_MESSAGE_MAP()
140 return handled; 144 return handled;
141 } 145 }
142 146
143 void MimeHandlerViewContainer::didReceiveData(blink::WebURLLoader* /* unused */, 147 void MimeHandlerViewContainer::didReceiveData(blink::WebURLLoader* /* unused */,
144 const char* data, 148 const char* data,
145 int data_length, 149 int data_length,
146 int /* unused */) { 150 int /* unused */) {
147 html_string_ += std::string(data, data_length); 151 html_string_ += std::string(data, data_length);
148 } 152 }
149 153
150 void MimeHandlerViewContainer::didFinishLoading( 154 void MimeHandlerViewContainer::didFinishLoading(
151 blink::WebURLLoader* /* unused */, 155 blink::WebURLLoader* /* unused */,
152 double /* unused */, 156 double /* unused */,
153 int64_t /* unused */) { 157 int64_t /* unused */) {
154 DCHECK(is_embedded_); 158 DCHECK(is_embedded_);
155 CreateMimeHandlerViewGuest(); 159 CreateMimeHandlerViewGuest();
156 } 160 }
157 161
158 void MimeHandlerViewContainer::PostMessage(v8::Isolate* isolate, 162 void MimeHandlerViewContainer::PostMessage(v8::Isolate* isolate,
159 v8::Handle<v8::Value> message) { 163 v8::Handle<v8::Value> message) {
164 if (!guest_loaded_) {
165 linked_ptr<ScopedPersistent<v8::Value>> scoped_persistent(
166 new ScopedPersistent<v8::Value>(isolate, message));
167 pending_messages_.push_back(scoped_persistent);
168 return;
169 }
170
160 content::RenderView* guest_proxy_render_view = 171 content::RenderView* guest_proxy_render_view =
161 content::RenderView::FromRoutingID(guest_proxy_routing_id_); 172 content::RenderView::FromRoutingID(guest_proxy_routing_id_);
162 if (!guest_proxy_render_view) 173 if (!guest_proxy_render_view)
163 return; 174 return;
164 blink::WebFrame* guest_proxy_frame = 175 blink::WebFrame* guest_proxy_frame =
165 guest_proxy_render_view->GetWebView()->mainFrame(); 176 guest_proxy_render_view->GetWebView()->mainFrame();
166 if (!guest_proxy_frame) 177 if (!guest_proxy_frame)
167 return; 178 return;
168 179
169 v8::Local<v8::Object> guest_proxy_window = 180 v8::Local<v8::Object> guest_proxy_window =
(...skipping 17 matching lines...) Expand all
187 guest_proxy_window, arraysize(args), args); 198 guest_proxy_window, arraysize(args), args);
188 } 199 }
189 200
190 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK( 201 void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK(
191 int element_instance_id) { 202 int element_instance_id) {
192 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone); 203 DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone);
193 DCHECK_EQ(this->element_instance_id(), element_instance_id); 204 DCHECK_EQ(this->element_instance_id(), element_instance_id);
194 render_frame()->AttachGuest(element_instance_id); 205 render_frame()->AttachGuest(element_instance_id);
195 } 206 }
196 207
208 void MimeHandlerViewContainer::OnMimeHandlerViewGuestOnLoadCompleted(
209 int /* unused */) {
210 guest_loaded_ = true;
211 if (pending_messages_.empty())
212 return;
213
214 // Now that the guest has loaded, flush any unsent messages.
215 content::RenderView* render_view =
216 content::RenderView::FromRoutingID(render_view_routing_id());
217 if (!render_view)
218 return;
219 blink::WebFrame* frame = render_view->GetWebView()->mainFrame();
220 if (!frame)
221 return;
222
223 v8::Isolate* isolate = v8::Isolate::GetCurrent();
224 v8::HandleScope handle_scope(isolate);
225 v8::Context::Scope context_scope(frame->mainWorldScriptContext());
226 for (size_t i = 0; i < pending_messages_.size(); ++i)
Sam McNally 2014/12/19 03:11:46 for (const auto& pending_message : pending_message
raymes 2014/12/19 03:21:07 Done.
227 PostMessage(isolate, pending_messages_[i]->NewHandle(isolate));
228
229 pending_messages_.clear();
230 }
231
197 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */, 232 void MimeHandlerViewContainer::OnGuestAttached(int /* unused */,
198 int guest_proxy_routing_id) { 233 int guest_proxy_routing_id) {
199 guest_proxy_routing_id_ = guest_proxy_routing_id; 234 guest_proxy_routing_id_ = guest_proxy_routing_id;
200 } 235 }
201 236
202 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() { 237 void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() {
203 // The loader has completed loading |html_string_| so we can dispose it. 238 // The loader has completed loading |html_string_| so we can dispose it.
204 loader_.reset(); 239 loader_.reset();
205 240
206 // Parse the stream URL to ensure it's valid. 241 // Parse the stream URL to ensure it's valid.
207 GURL stream_url(html_string_); 242 GURL stream_url(html_string_);
208 243
209 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone); 244 DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone);
210 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( 245 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest(
211 routing_id(), stream_url.spec(), original_url_.spec(), mime_type_, 246 routing_id(), stream_url.spec(), original_url_.spec(), mime_type_,
212 element_instance_id())); 247 element_instance_id()));
213 } 248 }
214 249
215 } // namespace extensions 250 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698