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

Side by Side Diff: extensions/renderer/guest_view/extensions_guest_view_container.cc

Issue 702433002: Refactor GuestViewContainer to split out WebView related logic and MimeHandlerView related logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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/guest_view_container.h" 5 #include "extensions/renderer/guest_view/extensions_guest_view_container.h"
6 6
7 #include "content/public/renderer/browser_plugin_delegate.h"
8 #include "content/public/renderer/render_frame.h" 7 #include "content/public/renderer/render_frame.h"
9 #include "content/public/renderer/render_view.h" 8 #include "content/public/renderer/render_view.h"
10 #include "extensions/common/extension_messages.h" 9 #include "extensions/common/extension_messages.h"
11 #include "extensions/common/guest_view/guest_view_constants.h" 10 #include "extensions/common/guest_view/guest_view_constants.h"
12 #include "third_party/WebKit/public/web/WebLocalFrame.h" 11 #include "third_party/WebKit/public/web/WebLocalFrame.h"
13 #include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h" 12 #include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
14 #include "third_party/WebKit/public/web/WebView.h" 13 #include "third_party/WebKit/public/web/WebView.h"
15 14
16 namespace { 15 namespace {
17 typedef std::pair<int, int> GuestViewID; 16 typedef std::pair<int, int> GuestViewID;
18 typedef std::map<GuestViewID, extensions::GuestViewContainer*> 17 typedef std::map<GuestViewID, extensions::ExtensionsGuestViewContainer*>
19 GuestViewContainerMap; 18 ExtensionsGuestViewContainerMap;
20 static base::LazyInstance<GuestViewContainerMap> g_guest_view_container_map = 19 static base::LazyInstance<ExtensionsGuestViewContainerMap>
21 LAZY_INSTANCE_INITIALIZER; 20 g_guest_view_container_map = LAZY_INSTANCE_INITIALIZER;
22 } // namespace 21 } // namespace
23 22
24 namespace extensions { 23 namespace extensions {
25 24
26 GuestViewContainer::AttachRequest::AttachRequest( 25 ExtensionsGuestViewContainer::AttachRequest::AttachRequest(
27 int element_instance_id, 26 int element_instance_id,
28 int guest_instance_id, 27 int guest_instance_id,
29 scoped_ptr<base::DictionaryValue> params, 28 scoped_ptr<base::DictionaryValue> params,
30 v8::Handle<v8::Function> callback, 29 v8::Handle<v8::Function> callback,
31 v8::Isolate* isolate) 30 v8::Isolate* isolate)
32 : element_instance_id_(element_instance_id), 31 : element_instance_id_(element_instance_id),
33 guest_instance_id_(guest_instance_id), 32 guest_instance_id_(guest_instance_id),
34 params_(params.Pass()), 33 params_(params.Pass()),
35 callback_(callback), 34 callback_(callback),
36 isolate_(isolate) { 35 isolate_(isolate) {
37 } 36 }
38 37
39 GuestViewContainer::AttachRequest::~AttachRequest() { 38 ExtensionsGuestViewContainer::AttachRequest::~AttachRequest() {
40 } 39 }
41 40
42 bool GuestViewContainer::AttachRequest::HasCallback() const { 41 bool ExtensionsGuestViewContainer::AttachRequest::HasCallback() const {
43 return !callback_.IsEmpty(); 42 return !callback_.IsEmpty();
44 } 43 }
45 44
46 v8::Handle<v8::Function> 45 v8::Handle<v8::Function>
47 GuestViewContainer::AttachRequest::GetCallback() const { 46 ExtensionsGuestViewContainer::AttachRequest::GetCallback() const {
48 return callback_.NewHandle(isolate_); 47 return callback_.NewHandle(isolate_);
49 } 48 }
50 49
51 GuestViewContainer::GuestViewContainer( 50 ExtensionsGuestViewContainer::ExtensionsGuestViewContainer(
52 content::RenderFrame* render_frame, 51 content::RenderFrame* render_frame)
53 const std::string& mime_type) 52 : GuestViewContainer(render_frame),
54 : content::BrowserPluginDelegate(render_frame, mime_type),
55 content::RenderFrameObserver(render_frame),
56 mime_type_(mime_type),
57 element_instance_id_(guestview::kInstanceIDNone),
58 render_view_routing_id_(render_frame->GetRenderView()->GetRoutingID()),
59 attached_(false),
60 ready_(false) { 53 ready_(false) {
61 } 54 }
62 55
63 GuestViewContainer::~GuestViewContainer() { 56 ExtensionsGuestViewContainer::~ExtensionsGuestViewContainer() {
64 if (element_instance_id_ != guestview::kInstanceIDNone) { 57 if (element_instance_id_ != guestview::kInstanceIDNone) {
65 g_guest_view_container_map.Get().erase( 58 g_guest_view_container_map.Get().erase(
66 GuestViewID(render_view_routing_id_, element_instance_id_)); 59 GuestViewID(render_view_routing_id_, element_instance_id_));
67 } 60 }
68 } 61 }
69 62
70 GuestViewContainer* GuestViewContainer::FromID(int render_view_routing_id, 63 ExtensionsGuestViewContainer* ExtensionsGuestViewContainer::FromID(
71 int element_instance_id) { 64 int render_view_routing_id,
72 GuestViewContainerMap* guest_view_containers = 65 int element_instance_id) {
66 ExtensionsGuestViewContainerMap* guest_view_containers =
73 g_guest_view_container_map.Pointer(); 67 g_guest_view_container_map.Pointer();
74 GuestViewContainerMap::iterator it = guest_view_containers->find( 68 ExtensionsGuestViewContainerMap::iterator it = guest_view_containers->find(
75 GuestViewID(render_view_routing_id, element_instance_id)); 69 GuestViewID(render_view_routing_id, element_instance_id));
76 return it == guest_view_containers->end() ? NULL : it->second; 70 return it == guest_view_containers->end() ? NULL : it->second;
77 } 71 }
78 72
79 void GuestViewContainer::AttachGuest(linked_ptr<AttachRequest> request) { 73 void ExtensionsGuestViewContainer::AttachGuest(
74 linked_ptr<AttachRequest> request) {
80 EnqueueAttachRequest(request); 75 EnqueueAttachRequest(request);
81 PerformPendingAttachRequest(); 76 PerformPendingAttachRequest();
82 } 77 }
83 78
84 void GuestViewContainer::SetElementInstanceID(int element_instance_id) { 79 void ExtensionsGuestViewContainer::SetElementInstanceID(
80 int element_instance_id) {
81 GuestViewContainer::SetElementInstanceID(element_instance_id);
82
85 GuestViewID guest_view_id(render_view_routing_id_, element_instance_id); 83 GuestViewID guest_view_id(render_view_routing_id_, element_instance_id);
86 DCHECK_EQ(element_instance_id_, guestview::kInstanceIDNone);
87 DCHECK(g_guest_view_container_map.Get().find(guest_view_id) == 84 DCHECK(g_guest_view_container_map.Get().find(guest_view_id) ==
88 g_guest_view_container_map.Get().end()); 85 g_guest_view_container_map.Get().end());
89 element_instance_id_ = element_instance_id;
90 g_guest_view_container_map.Get().insert(std::make_pair(guest_view_id, this)); 86 g_guest_view_container_map.Get().insert(std::make_pair(guest_view_id, this));
91 } 87 }
92 88
93 void GuestViewContainer::DidFinishLoading() { 89 void ExtensionsGuestViewContainer::Ready() {
94 if (mime_type_.empty())
95 return;
96
97 DCHECK_NE(element_instance_id_, guestview::kInstanceIDNone);
98 render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest(
99 routing_id(), html_string_, mime_type_, element_instance_id_));
100 }
101
102 void GuestViewContainer::DidReceiveData(const char* data, int data_length) {
103 std::string value(data, data_length);
104 html_string_ += value;
105 }
106
107 void GuestViewContainer::Ready() {
108 ready_ = true; 90 ready_ = true;
109 CHECK(!pending_response_.get()); 91 CHECK(!pending_response_.get());
110 PerformPendingAttachRequest(); 92 PerformPendingAttachRequest();
111 } 93 }
112 94
113 void GuestViewContainer::OnDestruct() { 95 bool ExtensionsGuestViewContainer::HandlesMessage(const IPC::Message& message) {
114 // GuestViewContainer's lifetime is managed by BrowserPlugin so don't let 96 return message.type() == ExtensionMsg_GuestAttached::ID;
115 // RenderFrameObserver self-destruct here.
116 } 97 }
117 98
118 bool GuestViewContainer::OnMessageReceived(const IPC::Message& message) { 99 bool ExtensionsGuestViewContainer::OnMessage(const IPC::Message& message) {
119 if (!ShouldHandleMessage(message)) 100 bool handled = false;
120 return false; 101 IPC_BEGIN_MESSAGE_MAP(ExtensionsGuestViewContainer, message)
121
122 DCHECK_NE(element_instance_id_, guestview::kInstanceIDNone);
123 int element_instance_id = guestview::kInstanceIDNone;
124 PickleIterator iter(message);
125 bool success = iter.ReadInt(&element_instance_id);
126 DCHECK(success);
127 if (element_instance_id != element_instance_id_)
128 return false;
129
130 bool handled = true;
131 IPC_BEGIN_MESSAGE_MAP(GuestViewContainer, message)
132 IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK,
133 OnCreateMimeHandlerViewGuestACK)
134 IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached) 102 IPC_MESSAGE_HANDLER(ExtensionMsg_GuestAttached, OnGuestAttached)
135 IPC_MESSAGE_UNHANDLED(handled = false) 103 IPC_MESSAGE_UNHANDLED(handled = false)
136 IPC_END_MESSAGE_MAP() 104 IPC_END_MESSAGE_MAP()
137 return handled; 105 return handled;
138 } 106 }
139 107
140 void GuestViewContainer::OnCreateMimeHandlerViewGuestACK( 108 void ExtensionsGuestViewContainer::OnGuestAttached(int guest_proxy_routing_id) {
141 int element_instance_id) {
142 DCHECK_NE(element_instance_id_, guestview::kInstanceIDNone);
143 DCHECK_EQ(element_instance_id_, element_instance_id);
144 DCHECK(!mime_type_.empty());
145 render_frame()->AttachGuest(element_instance_id);
146 }
147
148 void GuestViewContainer::OnGuestAttached(int element_instance_id,
149 int guest_proxy_routing_id) {
150 attached_ = true;
151
152 if (!mime_type_.empty()) {
153 // MimeHandlerView's creation and attachment is not done via JS API.
154 return;
155 }
156
157 // Handle the callback for the current request with a pending response. 109 // Handle the callback for the current request with a pending response.
158 HandlePendingResponseCallback(guest_proxy_routing_id); 110 HandlePendingResponseCallback(guest_proxy_routing_id);
159 // Perform the subsequent attach request if one exists. 111 // Perform the subsequent attach request if one exists.
160 PerformPendingAttachRequest(); 112 PerformPendingAttachRequest();
161 } 113 }
162 114
163 void GuestViewContainer::AttachGuestInternal( 115 void ExtensionsGuestViewContainer::AttachGuestInternal(
164 linked_ptr<AttachRequest> request) { 116 linked_ptr<AttachRequest> request) {
165 CHECK(!pending_response_.get()); 117 CHECK(!pending_response_.get());
166 // Step 1, send the attach params to chrome/. 118 // Step 1, send the attach params to chrome/.
167 render_frame()->Send( 119 render_frame()->Send(
168 new ExtensionHostMsg_AttachGuest(render_view_routing_id_, 120 new ExtensionHostMsg_AttachGuest(render_view_routing_id_,
169 request->element_instance_id(), 121 request->element_instance_id(),
170 request->guest_instance_id(), 122 request->guest_instance_id(),
171 *request->attach_params())); 123 *request->attach_params()));
172 124
173 // Step 2, attach plugin through content/. 125 // Step 2, attach plugin through content/.
174 render_frame()->AttachGuest(request->element_instance_id()); 126 render_frame()->AttachGuest(request->element_instance_id());
175 127
176 pending_response_ = request; 128 pending_response_ = request;
177 } 129 }
178 130
179 void GuestViewContainer::EnqueueAttachRequest( 131 void ExtensionsGuestViewContainer::EnqueueAttachRequest(
180 linked_ptr<AttachRequest> request) { 132 linked_ptr<AttachRequest> request) {
181 pending_requests_.push_back(request); 133 pending_requests_.push_back(request);
182 } 134 }
183 135
184 void GuestViewContainer::PerformPendingAttachRequest() { 136 void ExtensionsGuestViewContainer::PerformPendingAttachRequest() {
185 if (!ready_ || pending_requests_.empty() || pending_response_.get()) 137 if (!ready_ || pending_requests_.empty() || pending_response_.get())
186 return; 138 return;
187 139
188 linked_ptr<AttachRequest> pending_request = pending_requests_.front(); 140 linked_ptr<AttachRequest> pending_request = pending_requests_.front();
189 pending_requests_.pop_front(); 141 pending_requests_.pop_front();
190 AttachGuestInternal(pending_request); 142 AttachGuestInternal(pending_request);
191 } 143 }
192 144
193 void GuestViewContainer::HandlePendingResponseCallback( 145 void ExtensionsGuestViewContainer::HandlePendingResponseCallback(
194 int guest_proxy_routing_id) { 146 int guest_proxy_routing_id) {
195 CHECK(pending_response_.get()); 147 CHECK(pending_response_.get());
196 linked_ptr<AttachRequest> pending_response(pending_response_.release()); 148 linked_ptr<AttachRequest> pending_response(pending_response_.release());
197 149
198 // If we don't have a callback then there's nothing more to do. 150 // If we don't have a callback then there's nothing more to do.
199 if (!pending_response->HasCallback()) 151 if (!pending_response->HasCallback())
200 return; 152 return;
201 153
202 content::RenderView* guest_proxy_render_view = 154 content::RenderView* guest_proxy_render_view =
203 content::RenderView::FromRoutingID(guest_proxy_routing_id); 155 content::RenderView::FromRoutingID(guest_proxy_routing_id);
(...skipping 14 matching lines...) Expand all
218 v8::Handle<v8::Value> argv[argc] = { window }; 170 v8::Handle<v8::Value> argv[argc] = { window };
219 171
220 v8::Context::Scope context_scope(context); 172 v8::Context::Scope context_scope(context);
221 blink::WebScopedMicrotaskSuppression suppression; 173 blink::WebScopedMicrotaskSuppression suppression;
222 174
223 // Call the AttachGuest API's callback with the guest proxy as the first 175 // Call the AttachGuest API's callback with the guest proxy as the first
224 // parameter. 176 // parameter.
225 callback->Call(context->Global(), argc, argv); 177 callback->Call(context->Global(), argc, argv);
226 } 178 }
227 179
228 // static
229 bool GuestViewContainer::ShouldHandleMessage(const IPC::Message& message) {
230 switch (message.type()) {
231 case ExtensionMsg_CreateMimeHandlerViewGuestACK::ID:
232 case ExtensionMsg_GuestAttached::ID:
233 return true;
234 default:
235 break;
236 }
237 return false;
238 }
239
240 } // namespace extensions 180 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698