OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/webplugin_delegate_proxy.h" | 5 #include "content/renderer/webplugin_delegate_proxy.h" |
6 | 6 |
7 #if defined(TOOLKIT_GTK) | 7 #if defined(TOOLKIT_GTK) |
8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
9 #elif defined(USE_X11) | 9 #elif defined(USE_X11) |
10 #include <cairo/cairo.h> | 10 #include <cairo/cairo.h> |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 void InitializeForSeekableStream(unsigned long resource_id, | 118 void InitializeForSeekableStream(unsigned long resource_id, |
119 int range_request_id) { | 119 int range_request_id) { |
120 resource_id_ = resource_id; | 120 resource_id_ = resource_id; |
121 multibyte_response_expected_ = true; | 121 multibyte_response_expected_ = true; |
122 channel_->Send(new PluginMsg_HTTPRangeRequestReply( | 122 channel_->Send(new PluginMsg_HTTPRangeRequestReply( |
123 instance_id_, resource_id, range_request_id)); | 123 instance_id_, resource_id, range_request_id)); |
124 } | 124 } |
125 | 125 |
126 // PluginResourceClient implementation: | 126 // PluginResourceClient implementation: |
127 virtual void WillSendRequest(const GURL& url, int http_status_code) OVERRIDE { | 127 virtual void WillSendRequest(const GURL& url, int http_status_code) OVERRIDE { |
128 DCHECK(channel_ != NULL); | 128 DCHECK(channel_.get() != NULL); |
129 channel_->Send(new PluginMsg_WillSendRequest(instance_id_, resource_id_, | 129 channel_->Send(new PluginMsg_WillSendRequest( |
130 url, http_status_code)); | 130 instance_id_, resource_id_, url, http_status_code)); |
131 } | 131 } |
132 | 132 |
133 virtual void DidReceiveResponse(const std::string& mime_type, | 133 virtual void DidReceiveResponse(const std::string& mime_type, |
134 const std::string& headers, | 134 const std::string& headers, |
135 uint32 expected_length, | 135 uint32 expected_length, |
136 uint32 last_modified, | 136 uint32 last_modified, |
137 bool request_is_seekable) OVERRIDE { | 137 bool request_is_seekable) OVERRIDE { |
138 DCHECK(channel_ != NULL); | 138 DCHECK(channel_.get() != NULL); |
139 PluginMsg_DidReceiveResponseParams params; | 139 PluginMsg_DidReceiveResponseParams params; |
140 params.id = resource_id_; | 140 params.id = resource_id_; |
141 params.mime_type = mime_type; | 141 params.mime_type = mime_type; |
142 params.headers = headers; | 142 params.headers = headers; |
143 params.expected_length = expected_length; | 143 params.expected_length = expected_length; |
144 params.last_modified = last_modified; | 144 params.last_modified = last_modified; |
145 params.request_is_seekable = request_is_seekable; | 145 params.request_is_seekable = request_is_seekable; |
146 // Grab a reference on the underlying channel so it does not get | 146 // Grab a reference on the underlying channel so it does not get |
147 // deleted from under us. | 147 // deleted from under us. |
148 scoped_refptr<PluginChannelHost> channel_ref(channel_); | 148 scoped_refptr<PluginChannelHost> channel_ref(channel_); |
149 channel_->Send(new PluginMsg_DidReceiveResponse(instance_id_, params)); | 149 channel_->Send(new PluginMsg_DidReceiveResponse(instance_id_, params)); |
150 } | 150 } |
151 | 151 |
152 virtual void DidReceiveData(const char* buffer, | 152 virtual void DidReceiveData(const char* buffer, |
153 int length, | 153 int length, |
154 int data_offset) OVERRIDE { | 154 int data_offset) OVERRIDE { |
155 DCHECK(channel_ != NULL); | 155 DCHECK(channel_.get() != NULL); |
156 DCHECK_GT(length, 0); | 156 DCHECK_GT(length, 0); |
157 std::vector<char> data; | 157 std::vector<char> data; |
158 data.resize(static_cast<size_t>(length)); | 158 data.resize(static_cast<size_t>(length)); |
159 memcpy(&data.front(), buffer, length); | 159 memcpy(&data.front(), buffer, length); |
160 // Grab a reference on the underlying channel so it does not get | 160 // Grab a reference on the underlying channel so it does not get |
161 // deleted from under us. | 161 // deleted from under us. |
162 scoped_refptr<PluginChannelHost> channel_ref(channel_); | 162 scoped_refptr<PluginChannelHost> channel_ref(channel_); |
163 channel_->Send(new PluginMsg_DidReceiveData(instance_id_, resource_id_, | 163 channel_->Send(new PluginMsg_DidReceiveData(instance_id_, resource_id_, |
164 data, data_offset)); | 164 data, data_offset)); |
165 } | 165 } |
166 | 166 |
167 virtual void DidFinishLoading() OVERRIDE { | 167 virtual void DidFinishLoading() OVERRIDE { |
168 DCHECK(channel_ != NULL); | 168 DCHECK(channel_.get() != NULL); |
169 channel_->Send(new PluginMsg_DidFinishLoading(instance_id_, resource_id_)); | 169 channel_->Send(new PluginMsg_DidFinishLoading(instance_id_, resource_id_)); |
170 channel_ = NULL; | 170 channel_ = NULL; |
171 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 171 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
172 } | 172 } |
173 | 173 |
174 virtual void DidFail() OVERRIDE { | 174 virtual void DidFail() OVERRIDE { |
175 DCHECK(channel_ != NULL); | 175 DCHECK(channel_.get() != NULL); |
176 channel_->Send(new PluginMsg_DidFail(instance_id_, resource_id_)); | 176 channel_->Send(new PluginMsg_DidFail(instance_id_, resource_id_)); |
177 channel_ = NULL; | 177 channel_ = NULL; |
178 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 178 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
179 } | 179 } |
180 | 180 |
181 virtual bool IsMultiByteResponseExpected() OVERRIDE { | 181 virtual bool IsMultiByteResponseExpected() OVERRIDE { |
182 return multibyte_response_expected_; | 182 return multibyte_response_expected_; |
183 } | 183 } |
184 | 184 |
185 virtual int ResourceId() OVERRIDE { | 185 virtual int ResourceId() OVERRIDE { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 } | 243 } |
244 dummy_activation_window_ = NULL; | 244 dummy_activation_window_ = NULL; |
245 #endif | 245 #endif |
246 | 246 |
247 if (window_) | 247 if (window_) |
248 WillDestroyWindow(); | 248 WillDestroyWindow(); |
249 | 249 |
250 if (render_view_) | 250 if (render_view_) |
251 render_view_->UnregisterPluginDelegate(this); | 251 render_view_->UnregisterPluginDelegate(this); |
252 | 252 |
253 if (channel_host_) { | 253 if (channel_host_.get()) { |
254 Send(new PluginMsg_DestroyInstance(instance_id_)); | 254 Send(new PluginMsg_DestroyInstance(instance_id_)); |
255 | 255 |
256 // Must remove the route after sending the destroy message, since | 256 // Must remove the route after sending the destroy message, since |
257 // RemoveRoute can lead to all the outstanding NPObjects being told the | 257 // RemoveRoute can lead to all the outstanding NPObjects being told the |
258 // channel went away if this was the last instance. | 258 // channel went away if this was the last instance. |
259 channel_host_->RemoveRoute(instance_id_); | 259 channel_host_->RemoveRoute(instance_id_); |
260 | 260 |
261 // Release the channel host now. If we are is the last reference to the | 261 // Release the channel host now. If we are is the last reference to the |
262 // channel, this avoids a race where this renderer asks a new connection to | 262 // channel, this avoids a race where this renderer asks a new connection to |
263 // the same plugin between now and the time 'this' is actually deleted. | 263 // the same plugin between now and the time 'this' is actually deleted. |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 // crashed plugin there. | 327 // crashed plugin there. |
328 return true; | 328 return true; |
329 } | 329 } |
330 LOG(ERROR) << "Plug-in couldn't be found"; | 330 LOG(ERROR) << "Plug-in couldn't be found"; |
331 return false; | 331 return false; |
332 } | 332 } |
333 | 333 |
334 channel_host = | 334 channel_host = |
335 PluginChannelHost::GetPluginChannelHost( | 335 PluginChannelHost::GetPluginChannelHost( |
336 channel_handle, ChildProcess::current()->io_message_loop_proxy()); | 336 channel_handle, ChildProcess::current()->io_message_loop_proxy()); |
337 if (!channel_host) { | 337 if (!channel_host.get()) { |
338 LOG(ERROR) << "Couldn't get PluginChannelHost"; | 338 LOG(ERROR) << "Couldn't get PluginChannelHost"; |
339 continue; | 339 continue; |
340 } | 340 } |
341 #if defined(OS_MACOSX) | 341 #if defined(OS_MACOSX) |
342 track_nested_removes.reset(); | 342 track_nested_removes.reset(); |
343 #endif | 343 #endif |
344 | 344 |
345 { | 345 { |
346 // TODO(bauerb): Debugging for http://crbug.com/141055. | 346 // TODO(bauerb): Debugging for http://crbug.com/141055. |
347 ScopedLogLevel log_level(-2); // Equivalent to --v=2 | 347 ScopedLogLevel log_level(-2); // Equivalent to --v=2 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 | 379 |
380 if (!result) | 380 if (!result) |
381 LOG(ERROR) << "PluginMsg_Init returned false"; | 381 LOG(ERROR) << "PluginMsg_Init returned false"; |
382 | 382 |
383 render_view_->RegisterPluginDelegate(this); | 383 render_view_->RegisterPluginDelegate(this); |
384 | 384 |
385 return result; | 385 return result; |
386 } | 386 } |
387 | 387 |
388 bool WebPluginDelegateProxy::Send(IPC::Message* msg) { | 388 bool WebPluginDelegateProxy::Send(IPC::Message* msg) { |
389 if (!channel_host_) { | 389 if (!channel_host_.get()) { |
390 DLOG(WARNING) << "dropping message because channel host is null"; | 390 DLOG(WARNING) << "dropping message because channel host is null"; |
391 delete msg; | 391 delete msg; |
392 return false; | 392 return false; |
393 } | 393 } |
394 | 394 |
395 return channel_host_->Send(msg); | 395 return channel_host_->Send(msg); |
396 } | 396 } |
397 | 397 |
398 void WebPluginDelegateProxy::SendJavaScriptStream(const GURL& url, | 398 void WebPluginDelegateProxy::SendJavaScriptStream(const GURL& url, |
399 const std::string& result, | 399 const std::string& result, |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 #endif | 673 #endif |
674 | 674 |
675 void WebPluginDelegateProxy::Paint(WebKit::WebCanvas* canvas, | 675 void WebPluginDelegateProxy::Paint(WebKit::WebCanvas* canvas, |
676 const gfx::Rect& damaged_rect) { | 676 const gfx::Rect& damaged_rect) { |
677 // Limit the damaged rectangle to whatever is contained inside the plugin | 677 // Limit the damaged rectangle to whatever is contained inside the plugin |
678 // rectangle, as that's the rectangle that we'll actually draw. | 678 // rectangle, as that's the rectangle that we'll actually draw. |
679 gfx::Rect rect = gfx::IntersectRects(damaged_rect, plugin_rect_); | 679 gfx::Rect rect = gfx::IntersectRects(damaged_rect, plugin_rect_); |
680 | 680 |
681 // If the plugin is no longer connected (channel crashed) draw a crashed | 681 // If the plugin is no longer connected (channel crashed) draw a crashed |
682 // plugin bitmap | 682 // plugin bitmap |
683 if (!channel_host_ || !channel_host_->channel_valid()) { | 683 if (!channel_host_.get() || !channel_host_->channel_valid()) { |
684 PaintSadPlugin(canvas, rect); | 684 PaintSadPlugin(canvas, rect); |
685 return; | 685 return; |
686 } | 686 } |
687 | 687 |
688 if (!uses_shared_bitmaps_) | 688 if (!uses_shared_bitmaps_) |
689 return; | 689 return; |
690 | 690 |
691 // We got a paint before the plugin's coordinates, so there's no buffer to | 691 // We got a paint before the plugin's coordinates, so there's no buffer to |
692 // copy from. | 692 // copy from. |
693 if (!front_buffer_canvas()) | 693 if (!front_buffer_canvas()) |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1099 | 1099 |
1100 plugin_->HandleURLRequest( | 1100 plugin_->HandleURLRequest( |
1101 params.url.c_str(), params.method.c_str(), target, data, | 1101 params.url.c_str(), params.method.c_str(), target, data, |
1102 static_cast<unsigned int>(params.buffer.size()), params.notify_id, | 1102 static_cast<unsigned int>(params.buffer.size()), params.notify_id, |
1103 params.popups_allowed, params.notify_redirects); | 1103 params.popups_allowed, params.notify_redirects); |
1104 } | 1104 } |
1105 | 1105 |
1106 webkit::npapi::WebPluginResourceClient* | 1106 webkit::npapi::WebPluginResourceClient* |
1107 WebPluginDelegateProxy::CreateResourceClient( | 1107 WebPluginDelegateProxy::CreateResourceClient( |
1108 unsigned long resource_id, const GURL& url, int notify_id) { | 1108 unsigned long resource_id, const GURL& url, int notify_id) { |
1109 if (!channel_host_) | 1109 if (!channel_host_.get()) |
1110 return NULL; | 1110 return NULL; |
1111 | 1111 |
1112 ResourceClientProxy* proxy = new ResourceClientProxy(channel_host_, | 1112 ResourceClientProxy* proxy = |
1113 instance_id_); | 1113 new ResourceClientProxy(channel_host_.get(), instance_id_); |
1114 proxy->Initialize(resource_id, url, notify_id); | 1114 proxy->Initialize(resource_id, url, notify_id); |
1115 return proxy; | 1115 return proxy; |
1116 } | 1116 } |
1117 | 1117 |
1118 webkit::npapi::WebPluginResourceClient* | 1118 webkit::npapi::WebPluginResourceClient* |
1119 WebPluginDelegateProxy::CreateSeekableResourceClient( | 1119 WebPluginDelegateProxy::CreateSeekableResourceClient( |
1120 unsigned long resource_id, int range_request_id) { | 1120 unsigned long resource_id, int range_request_id) { |
1121 if (!channel_host_) | 1121 if (!channel_host_.get()) |
1122 return NULL; | 1122 return NULL; |
1123 | 1123 |
1124 ResourceClientProxy* proxy = new ResourceClientProxy(channel_host_, | 1124 ResourceClientProxy* proxy = |
1125 instance_id_); | 1125 new ResourceClientProxy(channel_host_.get(), instance_id_); |
1126 proxy->InitializeForSeekableStream(resource_id, range_request_id); | 1126 proxy->InitializeForSeekableStream(resource_id, range_request_id); |
1127 return proxy; | 1127 return proxy; |
1128 } | 1128 } |
1129 | 1129 |
1130 #if defined(OS_MACOSX) | 1130 #if defined(OS_MACOSX) |
1131 void WebPluginDelegateProxy::OnFocusChanged(bool focused) { | 1131 void WebPluginDelegateProxy::OnFocusChanged(bool focused) { |
1132 if (render_view_) | 1132 if (render_view_) |
1133 render_view_->PluginFocusChanged(focused, instance_id_); | 1133 render_view_->PluginFocusChanged(focused, instance_id_); |
1134 } | 1134 } |
1135 | 1135 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 | 1206 |
1207 void WebPluginDelegateProxy::OnURLRedirectResponse(bool allow, | 1207 void WebPluginDelegateProxy::OnURLRedirectResponse(bool allow, |
1208 int resource_id) { | 1208 int resource_id) { |
1209 if (!plugin_) | 1209 if (!plugin_) |
1210 return; | 1210 return; |
1211 | 1211 |
1212 plugin_->URLRedirectResponse(allow, resource_id); | 1212 plugin_->URLRedirectResponse(allow, resource_id); |
1213 } | 1213 } |
1214 | 1214 |
1215 } // namespace content | 1215 } // namespace content |
OLD | NEW |