ppb_flash_message_loop_impl.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson// Use of this source code is governed by a BSD-style license that can be 3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson// found in the LICENSE file. 4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson#include "webkit/plugins/ppapi/ppb_flash_message_loop_impl.h" 6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson#include "base/callback.h" 8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson#include "base/message_loop.h" 9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson#include "ppapi/c/pp_errors.h" 10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonusing ppapi::thunk::PPB_Flash_MessageLoop_API; 12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonnamespace webkit { 14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonnamespace ppapi { 15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonclass PPB_Flash_MessageLoop_Impl::State 17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson : public base::RefCounted<PPB_Flash_MessageLoop_Impl::State> { 18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public: 19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson State() : result_(PP_OK), run_called_(false), quit_called_(false) { 20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson int32_t result() const { return result_; } 23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson void set_result(int32_t result) { result_ = result; } 24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson bool run_called() const { return run_called_; } 26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson void set_run_called() { run_called_ = true; } 27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson bool quit_called() const { return quit_called_; } 29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson void set_quit_called() { quit_called_ = true; } 30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson const RunFromHostProxyCallback& run_callback() const { return run_callback_; } 32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson void set_run_callback(const RunFromHostProxyCallback& run_callback) { 33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson run_callback_ = run_callback; 34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private: 37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson int32_t result_; 38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson bool run_called_; 39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson bool quit_called_; 40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson RunFromHostProxyCallback run_callback_; 41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}; 42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian ParkinsonPPB_Flash_MessageLoop_Impl::PPB_Flash_MessageLoop_Impl(PP_Instance instance) 44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson : Resource(::ppapi::OBJECT_IS_IMPL, instance), 45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson state_(new State()) { 46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian ParkinsonPPB_Flash_MessageLoop_Impl::~PPB_Flash_MessageLoop_Impl() { 49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson // It is a no-op if either Run() hasn't been called or Quit() has been called 50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson // to balance the call to Run(). 51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson InternalQuit(PP_ERROR_ABORTED); 52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson// static 55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian ParkinsonPP_Resource PPB_Flash_MessageLoop_Impl::Create(PP_Instance instance) { 56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return (new PPB_Flash_MessageLoop_Impl(instance))->GetReference(); 57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian ParkinsonPPB_Flash_MessageLoop_API* 60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson PPB_Flash_MessageLoop_Impl::AsPPB_Flash_MessageLoop_API() { 61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return this; 62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonint32_t PPB_Flash_MessageLoop_Impl::Run() { 65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return InternalRun(RunFromHostProxyCallback()); 66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonvoid PPB_Flash_MessageLoop_Impl::RunFromHostProxy( 69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson const RunFromHostProxyCallback& callback) { 70e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson InternalRun(callback); 71e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 72e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 73e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonvoid PPB_Flash_MessageLoop_Impl::Quit() { 74e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson InternalQuit(PP_OK); 75e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 76e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 77e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonint32_t PPB_Flash_MessageLoop_Impl::InternalRun( 78e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson const RunFromHostProxyCallback& callback) { 79e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (state_->run_called()) { 80e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (!callback.is_null()) 81e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson callback.Run(PP_ERROR_FAILED); 82e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return PP_ERROR_FAILED; 83e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 84e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson state_->set_run_called(); 85e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson state_->set_run_callback(callback); 86e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 87e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson // It is possible that the PPB_Flash_MessageLoop_Impl object has been 88e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson // destroyed when the nested message loop exits. 89e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson scoped_refptr<State> state_protector(state_); 90e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson { 91e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); 92e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson MessageLoop::current()->Run(); 93e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 94e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson // Don't access data members of the class below. 95e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 96e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return state_protector->result(); 97e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 98e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 99e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonvoid PPB_Flash_MessageLoop_Impl::InternalQuit(int32_t result) { 100e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (!state_->run_called() || state_->quit_called()) 101e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return; 102e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson state_->set_quit_called(); 103e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson state_->set_result(result); 104e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 105e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson MessageLoop::current()->QuitNow(); 106e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 107e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (!state_->run_callback().is_null()) 108e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson state_->run_callback().Run(result); 109e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 110e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 111e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} // namespace ppapi 112e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} // namespace webkit 113e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson