Chromium Code Reviews| 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 |