OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "webkit/plugins/ppapi/ppb_flash_message_loop_impl.h" | |
6 | |
7 #include "base/message_loop.h" | |
8 #include "ppapi/c/pp_errors.h" | |
9 | |
10 using ppapi::thunk::PPB_Flash_MessageLoop_API; | |
11 | |
12 namespace webkit { | |
13 namespace ppapi { | |
14 | |
15 class PPB_Flash_MessageLoop_Impl::State | |
16 : public RefCounted<PPB_Flash_MessageLoop_Impl::State> { | |
17 public: | |
18 State() : result_(PP_ERROR_ABORTED), | |
19 run_called_(false), | |
20 quit_called_(false), | |
21 run_callback_(PP_BlockUntilComplete()) { | |
22 } | |
23 | |
24 int32_t result() const { return result_; } | |
25 void set_result(int32_t result) { result_ = result; } | |
26 | |
27 bool run_called() const { return run_called_; } | |
28 void set_run_called() { run_called_ = true; } | |
29 | |
30 bool quit_called() const { return quit_called_; } | |
31 void set_quit_called() { quit_called_ = true; } | |
32 | |
33 const PP_CompletionCallback& run_callback() const { return run_callback_; } | |
34 void set_run_callback(const PP_CompletionCallback& run_callback) { | |
35 run_callback_ = run_callback; | |
36 } | |
37 | |
38 private: | |
39 int32_t result_; | |
40 bool run_called_; | |
41 bool quit_called_; | |
42 PP_CompletionCallback run_callback_; | |
43 }; | |
44 | |
45 PPB_Flash_MessageLoop_Impl::PPB_Flash_MessageLoop_Impl(PP_Instance instance) | |
46 : Resource(instance), | |
47 state_(new State()) { | |
48 } | |
49 | |
50 PPB_Flash_MessageLoop_Impl::~PPB_Flash_MessageLoop_Impl() { | |
51 // It is a no-op if either Run() hasn't been called or Quit() has been called | |
52 // to balance the call to Run(). | |
53 InternalQuit(PP_ERROR_ABORTED); | |
54 } | |
55 | |
56 // static | |
57 PP_Resource PPB_Flash_MessageLoop_Impl::Create(PP_Instance instance) { | |
58 return (new PPB_Flash_MessageLoop_Impl(instance))->GetReference(); | |
59 } | |
60 | |
61 PPB_Flash_MessageLoop_API* | |
62 PPB_Flash_MessageLoop_Impl::AsPPB_Flash_MessageLoop_API() { | |
63 return this; | |
64 } | |
65 | |
66 int32_t PPB_Flash_MessageLoop_Impl::Run() { | |
67 return InternalRun(PP_BlockUntilComplete()); | |
viettrungluu
2012/01/17 21:26:06
Using PP_BlockUntilComplete seems kind of hacky (a
yzshen1
2012/01/18 07:43:35
Thanks. I changed to PP_MakeCompletionCallback. An
| |
68 } | |
69 | |
70 void PPB_Flash_MessageLoop_Impl::RunFromHostProxy( | |
71 PP_CompletionCallback callback) { | |
72 if (!callback.func) | |
viettrungluu
2012/01/17 21:26:06
Should this even happen?
yzshen1
2012/01/18 07:43:35
Removed. It shouldn't happen. And it is the caller
| |
73 return; | |
74 InternalRun(callback); | |
75 } | |
76 | |
77 void PPB_Flash_MessageLoop_Impl::Quit() { | |
78 InternalQuit(PP_OK); | |
79 } | |
80 | |
81 int32_t PPB_Flash_MessageLoop_Impl::InternalRun( | |
82 PP_CompletionCallback callback) { | |
83 if (state_->run_called()) { | |
84 if (callback.func) | |
85 PP_RunCompletionCallback(&callback, PP_ERROR_FAILED); | |
86 return PP_ERROR_FAILED; | |
87 } | |
88 state_->set_run_called(); | |
89 state_->set_run_callback(callback); | |
90 | |
91 // It is possible that the PPB_Flash_MessageLoop_Impl object has been | |
92 // destroyed when the nested message loop exits. | |
93 scoped_refptr<State> state_protector(state_); | |
94 | |
95 bool old_value = MessageLoop::current()->NestableTasksAllowed(); | |
96 MessageLoop::current()->SetNestableTasksAllowed(true); | |
97 MessageLoop::current()->Run(); | |
98 | |
99 // Don't access data members of the class below. | |
100 | |
101 MessageLoop::current()->SetNestableTasksAllowed(old_value); | |
102 return state_protector->result(); | |
103 } | |
104 | |
105 void PPB_Flash_MessageLoop_Impl::InternalQuit(int32_t result) { | |
106 if (!state_->run_called() || state_->quit_called()) | |
107 return; | |
108 state_->set_quit_called(); | |
109 state_->set_result(result); | |
110 | |
111 MessageLoop::current()->QuitNow(); | |
112 | |
113 PP_CompletionCallback callback = state_->run_callback(); | |
114 if (callback.func) | |
115 PP_RunCompletionCallback(&callback, result); | |
116 } | |
117 | |
118 } // namespace ppapi | |
119 } // namespace webkit | |
OLD | NEW |