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

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: export AssertLockHeld Created 8 years, 6 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
« no previous file with comments | « webkit/plugins/ppapi/ppapi_plugin_instance.h ('k') | webkit/plugins/ppapi/ppb_audio_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 #endif 100 #endif
101 101
102 using base::StringPrintf; 102 using base::StringPrintf;
103 using ppapi::InputEventData; 103 using ppapi::InputEventData;
104 using ppapi::PpapiGlobals; 104 using ppapi::PpapiGlobals;
105 using ppapi::PPB_InputEvent_Shared; 105 using ppapi::PPB_InputEvent_Shared;
106 using ppapi::PPB_View_Shared; 106 using ppapi::PPB_View_Shared;
107 using ppapi::PPP_Instance_Combined; 107 using ppapi::PPP_Instance_Combined;
108 using ppapi::ScopedPPResource; 108 using ppapi::ScopedPPResource;
109 using ppapi::StringVar; 109 using ppapi::StringVar;
110 using ppapi::TrackedCallback;
110 using ppapi::thunk::EnterResourceNoLock; 111 using ppapi::thunk::EnterResourceNoLock;
111 using ppapi::thunk::PPB_Buffer_API; 112 using ppapi::thunk::PPB_Buffer_API;
112 using ppapi::thunk::PPB_Graphics2D_API; 113 using ppapi::thunk::PPB_Graphics2D_API;
113 using ppapi::thunk::PPB_Graphics3D_API; 114 using ppapi::thunk::PPB_Graphics3D_API;
114 using ppapi::thunk::PPB_ImageData_API; 115 using ppapi::thunk::PPB_ImageData_API;
115 using ppapi::Var; 116 using ppapi::Var;
116 using ppapi::ViewData; 117 using ppapi::ViewData;
117 using WebKit::WebBindings; 118 using WebKit::WebBindings;
118 using WebKit::WebCanvas; 119 using WebKit::WebCanvas;
119 using WebKit::WebCursorInfo; 120 using WebKit::WebCursorInfo;
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 message_channel_(NULL), 344 message_channel_(NULL),
344 sad_plugin_(NULL), 345 sad_plugin_(NULL),
345 input_event_mask_(0), 346 input_event_mask_(0),
346 filtered_input_event_mask_(0), 347 filtered_input_event_mask_(0),
347 text_input_type_(kPluginDefaultTextInputType), 348 text_input_type_(kPluginDefaultTextInputType),
348 text_input_caret_(0, 0, 0, 0), 349 text_input_caret_(0, 0, 0, 0),
349 text_input_caret_bounds_(0, 0, 0, 0), 350 text_input_caret_bounds_(0, 0, 0, 0),
350 text_input_caret_set_(false), 351 text_input_caret_set_(false),
351 selection_caret_(0), 352 selection_caret_(0),
352 selection_anchor_(0), 353 selection_anchor_(0),
353 lock_mouse_callback_(PP_BlockUntilComplete()),
354 pending_user_gesture_(0.0), 354 pending_user_gesture_(0.0),
355 flash_impl_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 355 flash_impl_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
356 pp_instance_ = HostGlobals::Get()->AddInstance(this); 356 pp_instance_ = HostGlobals::Get()->AddInstance(this);
357 357
358 memset(&current_print_settings_, 0, sizeof(current_print_settings_)); 358 memset(&current_print_settings_, 0, sizeof(current_print_settings_));
359 DCHECK(delegate); 359 DCHECK(delegate);
360 module_->InstanceCreated(this); 360 module_->InstanceCreated(this);
361 delegate_->InstanceCreated(this); 361 delegate_->InstanceCreated(this);
362 message_channel_.reset(new MessageChannel(this)); 362 message_channel_.reset(new MessageChannel(this));
363 363
364 view_data_.is_page_visible = delegate->IsPageVisible(); 364 view_data_.is_page_visible = delegate->IsPageVisible();
365 } 365 }
366 366
367 PluginInstance::~PluginInstance() { 367 PluginInstance::~PluginInstance() {
368 DCHECK(!fullscreen_container_); 368 DCHECK(!fullscreen_container_);
369 369
370 // Free all the plugin objects. This will automatically clear the back- 370 // Free all the plugin objects. This will automatically clear the back-
371 // pointer from the NPObject so WebKit can't call into the plugin any more. 371 // pointer from the NPObject so WebKit can't call into the plugin any more.
372 // 372 //
373 // Swap out the set so we can delete from it (the objects will try to 373 // Swap out the set so we can delete from it (the objects will try to
374 // unregister themselves inside the delete call). 374 // unregister themselves inside the delete call).
375 PluginObjectSet plugin_object_copy; 375 PluginObjectSet plugin_object_copy;
376 live_plugin_objects_.swap(plugin_object_copy); 376 live_plugin_objects_.swap(plugin_object_copy);
377 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); 377 for (PluginObjectSet::iterator i = plugin_object_copy.begin();
378 i != plugin_object_copy.end(); ++i) 378 i != plugin_object_copy.end(); ++i)
379 delete *i; 379 delete *i;
380 380
381 if (lock_mouse_callback_.func) 381 if (lock_mouse_callback_)
382 PP_RunAndClearCompletionCallback(&lock_mouse_callback_, PP_ERROR_ABORTED); 382 TrackedCallback::ClearAndAbort(&lock_mouse_callback_);
383 383
384 delegate_->InstanceDeleted(this); 384 delegate_->InstanceDeleted(this);
385 module_->InstanceDeleted(this); 385 module_->InstanceDeleted(this);
386 386
387 HostGlobals::Get()->InstanceDeleted(pp_instance_); 387 HostGlobals::Get()->InstanceDeleted(pp_instance_);
388 } 388 }
389 389
390 // NOTE: Any of these methods that calls into the plugin needs to take into 390 // NOTE: Any of these methods that calls into the plugin needs to take into
391 // account that the plugin may use Var to remove the <embed> from the DOM, which 391 // account that the plugin may use Var to remove the <embed> from the DOM, which
392 // will make the WebPluginImpl drop its reference, usually the last one. If a 392 // will make the WebPluginImpl drop its reference, usually the last one. If a
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 bool PluginInstance::IsProcessingUserGesture() { 1588 bool PluginInstance::IsProcessingUserGesture() {
1589 PP_TimeTicks now = 1589 PP_TimeTicks now =
1590 ::ppapi::TimeTicksToPPTimeTicks(base::TimeTicks::Now()); 1590 ::ppapi::TimeTicksToPPTimeTicks(base::TimeTicks::Now());
1591 // Give a lot of slack so tests won't be flaky. Well behaved plugins will 1591 // Give a lot of slack so tests won't be flaky. Well behaved plugins will
1592 // close the user gesture. 1592 // close the user gesture.
1593 const PP_TimeTicks kUserGestureDurationInSeconds = 10.0; 1593 const PP_TimeTicks kUserGestureDurationInSeconds = 10.0;
1594 return (now - pending_user_gesture_ < kUserGestureDurationInSeconds); 1594 return (now - pending_user_gesture_ < kUserGestureDurationInSeconds);
1595 } 1595 }
1596 1596
1597 void PluginInstance::OnLockMouseACK(bool succeeded) { 1597 void PluginInstance::OnLockMouseACK(bool succeeded) {
1598 if (!lock_mouse_callback_.func) { 1598 if (TrackedCallback::IsPending(lock_mouse_callback_)) {
1599 NOTREACHED(); 1599 NOTREACHED();
1600 return; 1600 return;
1601 } 1601 }
1602 PP_RunAndClearCompletionCallback(&lock_mouse_callback_, 1602 TrackedCallback::ClearAndRun(&lock_mouse_callback_,
1603 succeeded ? PP_OK : PP_ERROR_FAILED); 1603 succeeded ? PP_OK : PP_ERROR_FAILED);
1604 } 1604 }
1605 1605
1606 void PluginInstance::OnMouseLockLost() { 1606 void PluginInstance::OnMouseLockLost() {
1607 if (LoadMouseLockInterface()) 1607 if (LoadMouseLockInterface())
1608 plugin_mouse_lock_interface_->MouseLockLost(pp_instance()); 1608 plugin_mouse_lock_interface_->MouseLockLost(pp_instance());
1609 } 1609 }
1610 1610
1611 void PluginInstance::HandleMouseLockedInputEvent( 1611 void PluginInstance::HandleMouseLockedInputEvent(
1612 const WebKit::WebMouseEvent& event) { 1612 const WebKit::WebMouseEvent& event) {
1613 // |cursor_info| is ignored since it is hidden when the mouse is locked. 1613 // |cursor_info| is ignored since it is hidden when the mouse is locked.
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
1947 if (!bitmap->copyTo(&custom_cursor->customImage.getSkBitmap(), 1947 if (!bitmap->copyTo(&custom_cursor->customImage.getSkBitmap(),
1948 bitmap->config())) { 1948 bitmap->config())) {
1949 return PP_FALSE; 1949 return PP_FALSE;
1950 } 1950 }
1951 1951
1952 DoSetCursor(custom_cursor.release()); 1952 DoSetCursor(custom_cursor.release());
1953 return PP_TRUE; 1953 return PP_TRUE;
1954 } 1954 }
1955 1955
1956 int32_t PluginInstance::LockMouse(PP_Instance instance, 1956 int32_t PluginInstance::LockMouse(PP_Instance instance,
1957 PP_CompletionCallback callback) { 1957 scoped_refptr<TrackedCallback> callback) {
1958 if (!callback.func) { 1958 if (TrackedCallback::IsPending(lock_mouse_callback_))
1959 // Don't support synchronous call.
1960 return PP_ERROR_BLOCKS_MAIN_THREAD;
1961 }
1962 if (lock_mouse_callback_.func) // A lock is pending.
1963 return PP_ERROR_INPROGRESS; 1959 return PP_ERROR_INPROGRESS;
1964 1960
1965 if (delegate()->IsMouseLocked(this)) 1961 if (delegate()->IsMouseLocked(this))
1966 return PP_OK; 1962 return PP_OK;
1967 1963
1968 if (!CanAccessMainFrame()) 1964 if (!CanAccessMainFrame())
1969 return PP_ERROR_NOACCESS; 1965 return PP_ERROR_NOACCESS;
1970 1966
1971 if (delegate()->LockMouse(this)) { 1967 if (delegate()->LockMouse(this)) {
1972 lock_mouse_callback_ = callback; 1968 lock_mouse_callback_ = callback;
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
2201 screen_size_for_fullscreen_ = gfx::Size(); 2197 screen_size_for_fullscreen_ = gfx::Size();
2202 WebElement element = container_->element(); 2198 WebElement element = container_->element();
2203 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 2199 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_);
2204 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 2200 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_);
2205 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 2201 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_);
2206 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 2202 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_);
2207 } 2203 }
2208 2204
2209 } // namespace ppapi 2205 } // namespace ppapi
2210 } // namespace webkit 2206 } // namespace webkit
OLDNEW
« no previous file with comments | « webkit/plugins/ppapi/ppapi_plugin_instance.h ('k') | webkit/plugins/ppapi/ppb_audio_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698