| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/plugin/webplugin_proxy.h" | 5 #include "chrome/plugin/webplugin_proxy.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/scoped_handle.h" | 10 #include "base/scoped_handle.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 #include "ui/base/x/x11_util_internal.h" | 38 #include "ui/base/x/x11_util_internal.h" |
| 39 #endif | 39 #endif |
| 40 | 40 |
| 41 using WebKit::WebBindings; | 41 using WebKit::WebBindings; |
| 42 | 42 |
| 43 using webkit::npapi::WebPluginResourceClient; | 43 using webkit::npapi::WebPluginResourceClient; |
| 44 #if defined(OS_MACOSX) | 44 #if defined(OS_MACOSX) |
| 45 using webkit::npapi::WebPluginAcceleratedSurface; | 45 using webkit::npapi::WebPluginAcceleratedSurface; |
| 46 #endif | 46 #endif |
| 47 | 47 |
| 48 typedef std::map<CPBrowsingContext, WebPluginProxy*> ContextMap; | |
| 49 static base::LazyInstance<ContextMap> g_context_map(base::LINKER_INITIALIZED); | |
| 50 | |
| 51 WebPluginProxy::WebPluginProxy( | 48 WebPluginProxy::WebPluginProxy( |
| 52 PluginChannel* channel, | 49 PluginChannel* channel, |
| 53 int route_id, | 50 int route_id, |
| 54 const GURL& page_url, | 51 const GURL& page_url, |
| 55 gfx::NativeViewId containing_window, | 52 gfx::NativeViewId containing_window, |
| 56 int host_render_view_routing_id) | 53 int host_render_view_routing_id) |
| 57 : channel_(channel), | 54 : channel_(channel), |
| 58 route_id_(route_id), | 55 route_id_(route_id), |
| 59 cp_browsing_context_(0), | |
| 60 window_npobject_(NULL), | 56 window_npobject_(NULL), |
| 61 plugin_element_(NULL), | 57 plugin_element_(NULL), |
| 62 delegate_(NULL), | 58 delegate_(NULL), |
| 63 waiting_for_paint_(false), | 59 waiting_for_paint_(false), |
| 64 containing_window_(containing_window), | 60 containing_window_(containing_window), |
| 65 page_url_(page_url), | 61 page_url_(page_url), |
| 66 transparent_(false), | 62 transparent_(false), |
| 67 host_render_view_routing_id_(host_render_view_routing_id), | 63 host_render_view_routing_id_(host_render_view_routing_id), |
| 68 ALLOW_THIS_IN_INITIALIZER_LIST(runnable_method_factory_(this)) { | 64 ALLOW_THIS_IN_INITIALIZER_LIST(runnable_method_factory_(this)) { |
| 69 #if defined(USE_X11) | 65 #if defined(USE_X11) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 81 | 77 |
| 82 if (vis->red_mask == 0xff0000 && | 78 if (vis->red_mask == 0xff0000 && |
| 83 vis->green_mask == 0xff00 && | 79 vis->green_mask == 0xff00 && |
| 84 vis->blue_mask == 0xff) | 80 vis->blue_mask == 0xff) |
| 85 use_shm_pixmap_ = true; | 81 use_shm_pixmap_ = true; |
| 86 } | 82 } |
| 87 #endif | 83 #endif |
| 88 } | 84 } |
| 89 | 85 |
| 90 WebPluginProxy::~WebPluginProxy() { | 86 WebPluginProxy::~WebPluginProxy() { |
| 91 if (cp_browsing_context_) | |
| 92 g_context_map.Get().erase(cp_browsing_context_); | |
| 93 | |
| 94 #if defined(USE_X11) | 87 #if defined(USE_X11) |
| 95 if (windowless_shm_pixmap_ != None) | 88 if (windowless_shm_pixmap_ != None) |
| 96 XFreePixmap(ui::GetXDisplay(), windowless_shm_pixmap_); | 89 XFreePixmap(ui::GetXDisplay(), windowless_shm_pixmap_); |
| 97 #endif | 90 #endif |
| 98 | 91 |
| 99 #if defined(OS_MACOSX) | 92 #if defined(OS_MACOSX) |
| 100 // Destroy the surface early, since it may send messages during cleanup. | 93 // Destroy the surface early, since it may send messages during cleanup. |
| 101 if (accelerated_surface_.get()) | 94 if (accelerated_surface_.get()) |
| 102 accelerated_surface_.reset(); | 95 accelerated_surface_.reset(); |
| 103 #endif | 96 #endif |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 | 232 |
| 240 std::string WebPluginProxy::GetCookies(const GURL& url, | 233 std::string WebPluginProxy::GetCookies(const GURL& url, |
| 241 const GURL& first_party_for_cookies) { | 234 const GURL& first_party_for_cookies) { |
| 242 std::string cookies; | 235 std::string cookies; |
| 243 Send(new PluginHostMsg_GetCookies(route_id_, url, | 236 Send(new PluginHostMsg_GetCookies(route_id_, url, |
| 244 first_party_for_cookies, &cookies)); | 237 first_party_for_cookies, &cookies)); |
| 245 | 238 |
| 246 return cookies; | 239 return cookies; |
| 247 } | 240 } |
| 248 | 241 |
| 249 void WebPluginProxy::ShowModalHTMLDialog(const GURL& url, int width, int height, | |
| 250 const std::string& json_arguments, | |
| 251 std::string* json_retval) { | |
| 252 PluginHostMsg_ShowModalHTMLDialog* msg = | |
| 253 new PluginHostMsg_ShowModalHTMLDialog( | |
| 254 route_id_, url, width, height, json_arguments, json_retval); | |
| 255 | |
| 256 // Pump messages while waiting for a response (which won't come until the | |
| 257 // dialog is closed). This avoids a deadlock. | |
| 258 msg->EnableMessagePumping(); | |
| 259 Send(msg); | |
| 260 } | |
| 261 | |
| 262 void WebPluginProxy::OnMissingPluginStatus(int status) { | 242 void WebPluginProxy::OnMissingPluginStatus(int status) { |
| 263 Send(new PluginHostMsg_MissingPluginStatus(route_id_, status)); | 243 Send(new PluginHostMsg_MissingPluginStatus(route_id_, status)); |
| 264 } | 244 } |
| 265 | 245 |
| 266 CPBrowsingContext WebPluginProxy::GetCPBrowsingContext() { | |
| 267 if (cp_browsing_context_ == 0) { | |
| 268 Send(new PluginHostMsg_GetCPBrowsingContext(route_id_, | |
| 269 &cp_browsing_context_)); | |
| 270 g_context_map.Get()[cp_browsing_context_] = this; | |
| 271 } | |
| 272 return cp_browsing_context_; | |
| 273 } | |
| 274 | |
| 275 WebPluginProxy* WebPluginProxy::FromCPBrowsingContext( | |
| 276 CPBrowsingContext context) { | |
| 277 return g_context_map.Get()[context]; | |
| 278 } | |
| 279 | |
| 280 WebPluginResourceClient* WebPluginProxy::GetResourceClient(int id) { | 246 WebPluginResourceClient* WebPluginProxy::GetResourceClient(int id) { |
| 281 ResourceClientMap::iterator iterator = resource_clients_.find(id); | 247 ResourceClientMap::iterator iterator = resource_clients_.find(id); |
| 282 // The IPC messages which deal with streams are now asynchronous. It is | 248 // The IPC messages which deal with streams are now asynchronous. It is |
| 283 // now possible to receive stream messages from the renderer for streams | 249 // now possible to receive stream messages from the renderer for streams |
| 284 // which may have been cancelled by the plugin. | 250 // which may have been cancelled by the plugin. |
| 285 if (iterator == resource_clients_.end()) { | 251 if (iterator == resource_clients_.end()) { |
| 286 return NULL; | 252 return NULL; |
| 287 } | 253 } |
| 288 | 254 |
| 289 return iterator->second; | 255 return iterator->second; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 memcpy(¶ms.buffer.front(), buf, len); | 309 memcpy(¶ms.buffer.front(), buf, len); |
| 344 } | 310 } |
| 345 | 311 |
| 346 params.notify_id = notify_id; | 312 params.notify_id = notify_id; |
| 347 params.popups_allowed = popups_allowed; | 313 params.popups_allowed = popups_allowed; |
| 348 params.notify_redirects = notify_redirects; | 314 params.notify_redirects = notify_redirects; |
| 349 | 315 |
| 350 Send(new PluginHostMsg_URLRequest(route_id_, params)); | 316 Send(new PluginHostMsg_URLRequest(route_id_, params)); |
| 351 } | 317 } |
| 352 | 318 |
| 353 bool WebPluginProxy::GetDragData(struct NPObject* event, bool add_data, | |
| 354 int32* identity, int32* event_id, | |
| 355 std::string* type, std::string* data) { | |
| 356 DCHECK(event); | |
| 357 NPObjectProxy* proxy = NPObjectProxy::GetProxy(event); | |
| 358 if (!proxy) // NPObject* event should have/be a renderer proxy. | |
| 359 return false; | |
| 360 | |
| 361 NPVariant_Param event_param; | |
| 362 event_param.type = NPVARIANT_PARAM_RECEIVER_OBJECT_ROUTING_ID; | |
| 363 event_param.npobject_routing_id = proxy->route_id(); | |
| 364 | |
| 365 std::vector<NPVariant_Param> values; | |
| 366 bool success = false; | |
| 367 Send(new PluginHostMsg_GetDragData(route_id_, event_param, add_data, | |
| 368 &values, &success)); | |
| 369 if (!success) | |
| 370 return false; | |
| 371 | |
| 372 DCHECK(values.size() == 4); | |
| 373 DCHECK(values[0].type == NPVARIANT_PARAM_INT); | |
| 374 *identity = static_cast<int32>(values[0].int_value); | |
| 375 DCHECK(values[1].type == NPVARIANT_PARAM_INT); | |
| 376 *event_id = static_cast<int32>(values[1].int_value); | |
| 377 DCHECK(values[2].type == NPVARIANT_PARAM_STRING); | |
| 378 type->swap(values[2].string_value); | |
| 379 if (add_data && (values[3].type == NPVARIANT_PARAM_STRING)) | |
| 380 data->swap(values[3].string_value); | |
| 381 | |
| 382 return true; | |
| 383 } | |
| 384 | |
| 385 bool WebPluginProxy::SetDropEffect(struct NPObject* event, int effect) { | |
| 386 DCHECK(event); | |
| 387 NPObjectProxy* proxy = NPObjectProxy::GetProxy(event); | |
| 388 if (!proxy) // NPObject* event should have/be a renderer proxy. | |
| 389 return false; | |
| 390 | |
| 391 NPVariant_Param event_param; | |
| 392 event_param.type = NPVARIANT_PARAM_RECEIVER_OBJECT_ROUTING_ID; | |
| 393 event_param.npobject_routing_id = proxy->route_id(); | |
| 394 | |
| 395 bool success = false; | |
| 396 Send(new PluginHostMsg_SetDropEffect(route_id_, event_param, effect, | |
| 397 &success)); | |
| 398 return success; | |
| 399 } | |
| 400 | |
| 401 void WebPluginProxy::Paint(const gfx::Rect& rect) { | 319 void WebPluginProxy::Paint(const gfx::Rect& rect) { |
| 402 #if defined(OS_MACOSX) | 320 #if defined(OS_MACOSX) |
| 403 if (!windowless_context_.get()) | 321 if (!windowless_context_.get()) |
| 404 return; | 322 return; |
| 405 #else | 323 #else |
| 406 if (!windowless_canvas_.get()) | 324 if (!windowless_canvas_.get()) |
| 407 return; | 325 return; |
| 408 #endif | 326 #endif |
| 409 | 327 |
| 410 // Clear the damaged area so that if the plugin doesn't paint there we won't | 328 // Clear the damaged area so that if the plugin doesn't paint there we won't |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 resource_clients_.erase(index++); | 648 resource_clients_.erase(index++); |
| 731 } else { | 649 } else { |
| 732 index++; | 650 index++; |
| 733 } | 651 } |
| 734 } | 652 } |
| 735 } | 653 } |
| 736 | 654 |
| 737 void WebPluginProxy::URLRedirectResponse(bool allow, int resource_id) { | 655 void WebPluginProxy::URLRedirectResponse(bool allow, int resource_id) { |
| 738 Send(new PluginHostMsg_URLRedirectResponse(route_id_, allow, resource_id)); | 656 Send(new PluginHostMsg_URLRedirectResponse(route_id_, allow, resource_id)); |
| 739 } | 657 } |
| 740 | |
| OLD | NEW |