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

Side by Side Diff: webkit/plugins/ppapi/ppapi_plugin_instance.cc

Issue 10081020: PPAPI: Make blocking completion callbacks work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated TestURLLoader to test blocking callbacks. Created 8 years, 8 months 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 | Annotate | Revision Log
OLDNEW
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 "webkit/plugins/ppapi/ppapi_plugin_instance.h" 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/linked_ptr.h" 10 #include "base/memory/linked_ptr.h"
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 #endif 91 #endif
92 92
93 #if defined(OS_WIN) 93 #if defined(OS_WIN)
94 #include "base/metrics/histogram.h" 94 #include "base/metrics/histogram.h"
95 #include "skia/ext/platform_canvas.h" 95 #include "skia/ext/platform_canvas.h"
96 #include "ui/gfx/codec/jpeg_codec.h" 96 #include "ui/gfx/codec/jpeg_codec.h"
97 #include "ui/gfx/gdi_util.h" 97 #include "ui/gfx/gdi_util.h"
98 #endif 98 #endif
99 99
100 using base::StringPrintf; 100 using base::StringPrintf;
101 using ppapi::ApiCallbackType;
101 using ppapi::InputEventData; 102 using ppapi::InputEventData;
102 using ppapi::PPB_InputEvent_Shared; 103 using ppapi::PPB_InputEvent_Shared;
103 using ppapi::PpapiGlobals; 104 using ppapi::PpapiGlobals;
104 using ppapi::PPB_View_Shared; 105 using ppapi::PPB_View_Shared;
105 using ppapi::ScopedPPResource; 106 using ppapi::ScopedPPResource;
106 using ppapi::StringVar; 107 using ppapi::StringVar;
108 using ppapi::TrackedCallback;
107 using ppapi::thunk::EnterResourceNoLock; 109 using ppapi::thunk::EnterResourceNoLock;
108 using ppapi::thunk::PPB_Buffer_API; 110 using ppapi::thunk::PPB_Buffer_API;
109 using ppapi::thunk::PPB_Graphics2D_API; 111 using ppapi::thunk::PPB_Graphics2D_API;
110 using ppapi::thunk::PPB_Graphics3D_API; 112 using ppapi::thunk::PPB_Graphics3D_API;
111 using ppapi::thunk::PPB_ImageData_API; 113 using ppapi::thunk::PPB_ImageData_API;
112 using ppapi::thunk::PPB_Instance_FunctionAPI; 114 using ppapi::thunk::PPB_Instance_FunctionAPI;
113 using ppapi::Var; 115 using ppapi::Var;
114 using ppapi::ViewData; 116 using ppapi::ViewData;
115 using WebKit::WebBindings; 117 using WebKit::WebBindings;
116 using WebKit::WebCanvas; 118 using WebKit::WebCanvas;
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 message_channel_(NULL), 310 message_channel_(NULL),
309 sad_plugin_(NULL), 311 sad_plugin_(NULL),
310 input_event_mask_(0), 312 input_event_mask_(0),
311 filtered_input_event_mask_(0), 313 filtered_input_event_mask_(0),
312 text_input_type_(kPluginDefaultTextInputType), 314 text_input_type_(kPluginDefaultTextInputType),
313 text_input_caret_(0, 0, 0, 0), 315 text_input_caret_(0, 0, 0, 0),
314 text_input_caret_bounds_(0, 0, 0, 0), 316 text_input_caret_bounds_(0, 0, 0, 0),
315 text_input_caret_set_(false), 317 text_input_caret_set_(false),
316 selection_caret_(0), 318 selection_caret_(0),
317 selection_anchor_(0), 319 selection_anchor_(0),
318 lock_mouse_callback_(PP_BlockUntilComplete()),
319 pending_user_gesture_(0.0) { 320 pending_user_gesture_(0.0) {
320 pp_instance_ = HostGlobals::Get()->AddInstance(this); 321 pp_instance_ = HostGlobals::Get()->AddInstance(this);
321 322
322 memset(&current_print_settings_, 0, sizeof(current_print_settings_)); 323 memset(&current_print_settings_, 0, sizeof(current_print_settings_));
323 DCHECK(delegate); 324 DCHECK(delegate);
324 module_->InstanceCreated(this); 325 module_->InstanceCreated(this);
325 delegate_->InstanceCreated(this); 326 delegate_->InstanceCreated(this);
326 message_channel_.reset(new MessageChannel(this)); 327 message_channel_.reset(new MessageChannel(this));
327 328
328 view_data_.is_page_visible = delegate->IsPageVisible(); 329 view_data_.is_page_visible = delegate->IsPageVisible();
329 } 330 }
330 331
331 PluginInstance::~PluginInstance() { 332 PluginInstance::~PluginInstance() {
332 DCHECK(!fullscreen_container_); 333 DCHECK(!fullscreen_container_);
333 334
334 // Free all the plugin objects. This will automatically clear the back- 335 // Free all the plugin objects. This will automatically clear the back-
335 // pointer from the NPObject so WebKit can't call into the plugin any more. 336 // pointer from the NPObject so WebKit can't call into the plugin any more.
336 // 337 //
337 // Swap out the set so we can delete from it (the objects will try to 338 // Swap out the set so we can delete from it (the objects will try to
338 // unregister themselves inside the delete call). 339 // unregister themselves inside the delete call).
339 PluginObjectSet plugin_object_copy; 340 PluginObjectSet plugin_object_copy;
340 live_plugin_objects_.swap(plugin_object_copy); 341 live_plugin_objects_.swap(plugin_object_copy);
341 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); 342 for (PluginObjectSet::iterator i = plugin_object_copy.begin();
342 i != plugin_object_copy.end(); ++i) 343 i != plugin_object_copy.end(); ++i)
343 delete *i; 344 delete *i;
344 345
345 if (lock_mouse_callback_.func) 346 if (lock_mouse_callback_)
346 PP_RunAndClearCompletionCallback(&lock_mouse_callback_, PP_ERROR_ABORTED); 347 TrackedCallback::ClearAndAbort(&lock_mouse_callback_);
347 348
348 delegate_->InstanceDeleted(this); 349 delegate_->InstanceDeleted(this);
349 module_->InstanceDeleted(this); 350 module_->InstanceDeleted(this);
350 351
351 HostGlobals::Get()->InstanceDeleted(pp_instance_); 352 HostGlobals::Get()->InstanceDeleted(pp_instance_);
352 } 353 }
353 354
354 // NOTE: Any of these methods that calls into the plugin needs to take into 355 // NOTE: Any of these methods that calls into the plugin needs to take into
355 // account that the plugin may use Var to remove the <embed> from the DOM, which 356 // account that the plugin may use Var to remove the <embed> from the DOM, which
356 // will make the WebPluginImpl drop its reference, usually the last one. If a 357 // will make the WebPluginImpl drop its reference, usually the last one. If a
(...skipping 1347 matching lines...) Expand 10 before | Expand all | Expand 10 after
1704 bool PluginInstance::IsProcessingUserGesture() { 1705 bool PluginInstance::IsProcessingUserGesture() {
1705 PP_TimeTicks now = 1706 PP_TimeTicks now =
1706 ::ppapi::TimeTicksToPPTimeTicks(base::TimeTicks::Now()); 1707 ::ppapi::TimeTicksToPPTimeTicks(base::TimeTicks::Now());
1707 // Give a lot of slack so tests won't be flaky. Well behaved plugins will 1708 // Give a lot of slack so tests won't be flaky. Well behaved plugins will
1708 // close the user gesture. 1709 // close the user gesture.
1709 const PP_TimeTicks kUserGestureDurationInSeconds = 10.0; 1710 const PP_TimeTicks kUserGestureDurationInSeconds = 10.0;
1710 return (now - pending_user_gesture_ < kUserGestureDurationInSeconds); 1711 return (now - pending_user_gesture_ < kUserGestureDurationInSeconds);
1711 } 1712 }
1712 1713
1713 void PluginInstance::OnLockMouseACK(bool succeeded) { 1714 void PluginInstance::OnLockMouseACK(bool succeeded) {
1714 if (!lock_mouse_callback_.func) { 1715 if (!lock_mouse_callback_) {
1715 NOTREACHED(); 1716 NOTREACHED();
1716 return; 1717 return;
1717 } 1718 }
1718 PP_RunAndClearCompletionCallback(&lock_mouse_callback_, 1719 TrackedCallback::ClearAndRun(&lock_mouse_callback_,
1719 succeeded ? PP_OK : PP_ERROR_FAILED); 1720 succeeded ? PP_OK : PP_ERROR_FAILED);
1720 } 1721 }
1721 1722
1722 void PluginInstance::OnMouseLockLost() { 1723 void PluginInstance::OnMouseLockLost() {
1723 if (LoadMouseLockInterface()) 1724 if (LoadMouseLockInterface())
1724 plugin_mouse_lock_interface_->MouseLockLost(pp_instance()); 1725 plugin_mouse_lock_interface_->MouseLockLost(pp_instance());
1725 } 1726 }
1726 1727
1727 void PluginInstance::HandleMouseLockedInputEvent( 1728 void PluginInstance::HandleMouseLockedInputEvent(
1728 const WebKit::WebMouseEvent& event) { 1729 const WebKit::WebMouseEvent& event) {
1729 // |cursor_info| is ignored since it is hidden when the mouse is locked. 1730 // |cursor_info| is ignored since it is hidden when the mouse is locked.
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
2031 // TODO(yzshen): Implement it. 2032 // TODO(yzshen): Implement it.
2032 NOTIMPLEMENTED(); 2033 NOTIMPLEMENTED();
2033 return false; 2034 return false;
2034 #endif 2035 #endif
2035 2036
2036 DoSetCursor(custom_cursor.release()); 2037 DoSetCursor(custom_cursor.release());
2037 return PP_TRUE; 2038 return PP_TRUE;
2038 } 2039 }
2039 2040
2040 int32_t PluginInstance::LockMouse(PP_Instance instance, 2041 int32_t PluginInstance::LockMouse(PP_Instance instance,
2041 PP_CompletionCallback callback) { 2042 ApiCallbackType callback) {
2042 if (!callback.func) { 2043 if (TrackedCallback::IsPending(lock_mouse_callback_))
2043 // Don't support synchronous call.
2044 return PP_ERROR_BLOCKS_MAIN_THREAD;
2045 }
2046 if (lock_mouse_callback_.func) // A lock is pending.
2047 return PP_ERROR_INPROGRESS; 2044 return PP_ERROR_INPROGRESS;
2048 2045
2049 if (delegate()->IsMouseLocked(this)) 2046 if (delegate()->IsMouseLocked(this))
2050 return PP_OK; 2047 return PP_OK;
2051 2048
2052 if (!CanAccessMainFrame()) 2049 if (!CanAccessMainFrame())
2053 return PP_ERROR_NOACCESS; 2050 return PP_ERROR_NOACCESS;
2054 2051
2055 if (delegate()->LockMouse(this)) { 2052 if (delegate()->LockMouse(this)) {
2056 lock_mouse_callback_ = callback; 2053 lock_mouse_callback_ = callback;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
2185 screen_size_for_fullscreen_ = gfx::Size(); 2182 screen_size_for_fullscreen_ = gfx::Size();
2186 WebElement element = container_->element(); 2183 WebElement element = container_->element();
2187 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 2184 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_);
2188 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 2185 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_);
2189 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 2186 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_);
2190 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 2187 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_);
2191 } 2188 }
2192 2189
2193 } // namespace ppapi 2190 } // namespace ppapi
2194 } // namespace webkit 2191 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698