OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |