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

Side by Side Diff: ppapi/proxy/ppb_instance_proxy.cc

Issue 10081020: PPAPI: Make blocking completion callbacks work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: try again Created 8 years, 7 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 "ppapi/proxy/ppb_instance_proxy.h" 5 #include "ppapi/proxy/ppb_instance_proxy.h"
6 6
7 #include "ppapi/c/pp_errors.h" 7 #include "ppapi/c/pp_errors.h"
8 #include "ppapi/c/pp_time.h" 8 #include "ppapi/c/pp_time.h"
9 #include "ppapi/c/pp_var.h" 9 #include "ppapi/c/pp_var.h"
10 #include "ppapi/c/ppb_audio_config.h" 10 #include "ppapi/c/ppb_audio_config.h"
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 dispatcher()->Send(new PpapiHostMsg_PPBInstance_SetCursor( 428 dispatcher()->Send(new PpapiHostMsg_PPBInstance_SetCursor(
429 API_ID_PPB_INSTANCE, instance, static_cast<int32_t>(type), 429 API_ID_PPB_INSTANCE, instance, static_cast<int32_t>(type),
430 image_host_resource, hot_spot ? *hot_spot : PP_MakePoint(0, 0))); 430 image_host_resource, hot_spot ? *hot_spot : PP_MakePoint(0, 0)));
431 return PP_TRUE; 431 return PP_TRUE;
432 #else // defined(OS_NACL) 432 #else // defined(OS_NACL)
433 return PP_FALSE; 433 return PP_FALSE;
434 #endif 434 #endif
435 } 435 }
436 436
437 int32_t PPB_Instance_Proxy::LockMouse(PP_Instance instance, 437 int32_t PPB_Instance_Proxy::LockMouse(PP_Instance instance,
438 PP_CompletionCallback callback) { 438 scoped_refptr<TrackedCallback> callback) {
439 if (!callback.func)
440 return PP_ERROR_BADARGUMENT;
441
442 // Save the mouse callback on the instance data. 439 // Save the mouse callback on the instance data.
443 InstanceData* data = static_cast<PluginDispatcher*>(dispatcher())-> 440 InstanceData* data = static_cast<PluginDispatcher*>(dispatcher())->
444 GetInstanceData(instance); 441 GetInstanceData(instance);
445 if (!data) 442 if (!data)
446 return PP_ERROR_BADARGUMENT; 443 return PP_ERROR_BADARGUMENT;
447 if (data->mouse_lock_callback.func) 444 if (TrackedCallback::IsPending(data->mouse_lock_callback))
448 return PP_ERROR_INPROGRESS; // Already have a pending callback. 445 return PP_ERROR_INPROGRESS; // Already have a pending callback.
449 data->mouse_lock_callback = callback; 446 data->mouse_lock_callback = callback;
450 447
451 dispatcher()->Send(new PpapiHostMsg_PPBInstance_LockMouse( 448 dispatcher()->Send(new PpapiHostMsg_PPBInstance_LockMouse(
452 API_ID_PPB_INSTANCE, instance)); 449 API_ID_PPB_INSTANCE, instance));
453 return PP_OK_COMPLETIONPENDING; 450 return PP_OK_COMPLETIONPENDING;
454 } 451 }
455 452
456 void PPB_Instance_Proxy::UnlockMouse(PP_Instance instance) { 453 void PPB_Instance_Proxy::UnlockMouse(PP_Instance instance) {
457 dispatcher()->Send(new PpapiHostMsg_PPBInstance_UnlockMouse( 454 dispatcher()->Send(new PpapiHostMsg_PPBInstance_UnlockMouse(
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 // Need to be careful to always issue the callback. 629 // Need to be careful to always issue the callback.
633 pp::CompletionCallback cb = callback_factory_.NewCallback( 630 pp::CompletionCallback cb = callback_factory_.NewCallback(
634 &PPB_Instance_Proxy::MouseLockCompleteInHost, instance); 631 &PPB_Instance_Proxy::MouseLockCompleteInHost, instance);
635 632
636 EnterInstanceNoLock enter(instance); 633 EnterInstanceNoLock enter(instance);
637 if (enter.failed()) { 634 if (enter.failed()) {
638 cb.Run(PP_ERROR_BADARGUMENT); 635 cb.Run(PP_ERROR_BADARGUMENT);
639 return; 636 return;
640 } 637 }
641 int32_t result = enter.functions()->LockMouse(instance, 638 int32_t result = enter.functions()->LockMouse(instance,
642 cb.pp_completion_callback()); 639 enter.callback());
643 if (result != PP_OK_COMPLETIONPENDING) 640 if (result != PP_OK_COMPLETIONPENDING)
644 cb.Run(result); 641 cb.Run(result);
645 } 642 }
646 643
647 void PPB_Instance_Proxy::OnHostMsgUnlockMouse(PP_Instance instance) { 644 void PPB_Instance_Proxy::OnHostMsgUnlockMouse(PP_Instance instance) {
648 EnterInstanceNoLock enter(instance); 645 EnterInstanceNoLock enter(instance);
649 if (enter.succeeded()) 646 if (enter.succeeded())
650 enter.functions()->UnlockMouse(instance); 647 enter.functions()->UnlockMouse(instance);
651 } 648 }
652 649
(...skipping 22 matching lines...) Expand all
675 } 672 }
676 673
677 void PPB_Instance_Proxy::OnHostMsgDocumentCanAccessDocument(PP_Instance active, 674 void PPB_Instance_Proxy::OnHostMsgDocumentCanAccessDocument(PP_Instance active,
678 PP_Instance target, 675 PP_Instance target,
679 PP_Bool* result) { 676 PP_Bool* result) {
680 EnterInstanceNoLock enter(active); 677 EnterInstanceNoLock enter(active);
681 if (enter.succeeded()) 678 if (enter.succeeded())
682 *result = enter.functions()->DocumentCanAccessDocument(active, target); 679 *result = enter.functions()->DocumentCanAccessDocument(active, target);
683 } 680 }
684 681
685 void PPB_Instance_Proxy::OnHostMsgGetDocumentURL(PP_Instance instance, 682 void PPB_Instance_Proxy::OnHostMsgGetDocumentURL(
686 SerializedVarReturnValue result ) { 683 PP_Instance instance,
684 SerializedVarReturnValue result) {
687 EnterInstanceNoLock enter(instance); 685 EnterInstanceNoLock enter(instance);
688 if (enter.succeeded()) { 686 if (enter.succeeded()) {
689 result.Return(dispatcher(), 687 result.Return(dispatcher(),
690 enter.functions()->GetDocumentURL(instance, NULL)); 688 enter.functions()->GetDocumentURL(instance, NULL));
691 } 689 }
692 } 690 }
693 691
694 void PPB_Instance_Proxy::OnHostMsgGetPluginInstanceURL( 692 void PPB_Instance_Proxy::OnHostMsgGetPluginInstanceURL(
695 PP_Instance instance, 693 PP_Instance instance,
696 SerializedVarReturnValue result) { 694 SerializedVarReturnValue result) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 } 747 }
750 } 748 }
751 749
752 void PPB_Instance_Proxy::OnPluginMsgMouseLockComplete(PP_Instance instance, 750 void PPB_Instance_Proxy::OnPluginMsgMouseLockComplete(PP_Instance instance,
753 int32_t result) { 751 int32_t result) {
754 // Save the mouse callback on the instance data. 752 // Save the mouse callback on the instance data.
755 InstanceData* data = static_cast<PluginDispatcher*>(dispatcher())-> 753 InstanceData* data = static_cast<PluginDispatcher*>(dispatcher())->
756 GetInstanceData(instance); 754 GetInstanceData(instance);
757 if (!data) 755 if (!data)
758 return; // Instance was probably deleted. 756 return; // Instance was probably deleted.
759 if (!data->mouse_lock_callback.func) { 757 if (TrackedCallback::IsPending(data->mouse_lock_callback)) {
760 NOTREACHED(); 758 NOTREACHED();
761 return; 759 return;
762 } 760 }
763 PP_RunAndClearCompletionCallback(&data->mouse_lock_callback, result); 761 TrackedCallback::ClearAndRun(&(data->mouse_lock_callback), result);
764 } 762 }
765 763
766 void PPB_Instance_Proxy::MouseLockCompleteInHost(int32_t result, 764 void PPB_Instance_Proxy::MouseLockCompleteInHost(int32_t result,
767 PP_Instance instance) { 765 PP_Instance instance) {
768 dispatcher()->Send(new PpapiMsg_PPBInstance_MouseLockComplete( 766 dispatcher()->Send(new PpapiMsg_PPBInstance_MouseLockComplete(
769 API_ID_PPB_INSTANCE, instance, result)); 767 API_ID_PPB_INSTANCE, instance, result));
770 } 768 }
771 769
772 } // namespace proxy 770 } // namespace proxy
773 } // namespace ppapi 771 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698