Chromium Code Reviews| Index: components/test_runner/mock_web_speech_recognizer.cc |
| diff --git a/components/test_runner/mock_web_speech_recognizer.cc b/components/test_runner/mock_web_speech_recognizer.cc |
| index d186df199cb1fac189b06e80365e4fd1e3137566..7745f13e3faa33588e5a85145c433861d4167b0f 100644 |
| --- a/components/test_runner/mock_web_speech_recognizer.cc |
| +++ b/components/test_runner/mock_web_speech_recognizer.cc |
| @@ -120,18 +120,46 @@ class EndedTask : public MockWebSpeechRecognizer::Task { |
| void run() override { |
| blink::WebSpeechRecognitionHandle handle = recognizer_->Handle(); |
| - recognizer_->Handle().reset(); |
| - recognizer_->Client()->didEnd(handle); |
| + blink::WebSpeechRecognizerClient* client = recognizer_->Client(); |
| + recognizer_->SetClientContext(blink::WebSpeechRecognitionHandle(), nullptr); |
| + client->didEnd(handle); |
| } |
| private: |
| DISALLOW_COPY_AND_ASSIGN(EndedTask); |
| }; |
| +// Task for switching processing to the next (handle, client) pairing. |
| +class SwitchClientHandleTask : public MockWebSpeechRecognizer::Task { |
| + public: |
| + SwitchClientHandleTask( |
| + MockWebSpeechRecognizer* mock, |
| + const blink::WebSpeechRecognitionHandle& handle, |
| + blink::WebSpeechRecognizerClient* client) |
| + : MockWebSpeechRecognizer::Task(mock) |
| + , handle_(handle) |
|
dmazzoni
2016/11/28 16:58:02
nit: in Chromium code the comma goes at the end of
sof
2016/11/28 21:40:04
Fixed, ran git-cl-format (no PRESUBMIT.py in this
|
| + , client_(client) {} |
| + |
| + ~SwitchClientHandleTask() override {} |
| + |
| + bool isNewContextTask() const override { return true; } |
| + |
| + void run() override { |
| + recognizer_->SetClientContext(handle_, client_); |
| + } |
| + |
| + private: |
| + const blink::WebSpeechRecognitionHandle handle_; |
| + blink::WebSpeechRecognizerClient* client_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SwitchClientHandleTask); |
| +}; |
| + |
| } // namespace |
| MockWebSpeechRecognizer::MockWebSpeechRecognizer() |
| - : was_aborted_(false), |
| + : client_(nullptr), |
| + was_aborted_(false), |
| task_queue_running_(false), |
| delegate_(0), |
| weak_factory_(this) {} |
| @@ -140,17 +168,33 @@ MockWebSpeechRecognizer::~MockWebSpeechRecognizer() { |
| ClearTaskQueue(); |
| } |
| +bool MockWebSpeechRecognizer::Task::isNewContextTask() const { |
| + return false; |
| +} |
| + |
| void MockWebSpeechRecognizer::SetDelegate(WebTestDelegate* delegate) { |
| delegate_ = delegate; |
| } |
| +void MockWebSpeechRecognizer::SetClientContext( |
| + const blink::WebSpeechRecognitionHandle& handle, |
| + blink::WebSpeechRecognizerClient* client) { |
| + handle_ = handle; |
|
dmazzoni
2016/11/28 16:58:02
nit: should be 2 spaces indent
sof
2016/11/28 21:40:04
Done.
|
| + client_ = client; |
|
dmazzoni
2016/11/28 16:58:02
Can you DCHECK(client_) or is it okay for it to be
sof
2016/11/28 21:40:04
There's no separate method provided for clearing,
|
| +} |
| + |
| void MockWebSpeechRecognizer::start( |
| const blink::WebSpeechRecognitionHandle& handle, |
| const blink::WebSpeechRecognitionParams& params, |
| blink::WebSpeechRecognizerClient* client) { |
| was_aborted_ = false; |
| - handle_ = handle; |
| - client_ = client; |
| + if (!client_) { |
| + handle_ = handle; |
| + client_ = client; |
| + } else { |
| + task_queue_.push_back( |
| + new SwitchClientHandleTask(this, handle, client)); |
| + } |
| task_queue_.push_back( |
| new ClientCallTask(this, &blink::WebSpeechRecognizerClient::didStart)); |
| @@ -183,8 +227,7 @@ void MockWebSpeechRecognizer::start( |
| void MockWebSpeechRecognizer::stop( |
| const blink::WebSpeechRecognitionHandle& handle, |
| blink::WebSpeechRecognizerClient* client) { |
| - handle_ = handle; |
| - client_ = client; |
| + SetClientContext(handle, client); |
| // FIXME: Implement. |
| NOTREACHED(); |
| @@ -193,11 +236,10 @@ void MockWebSpeechRecognizer::stop( |
| void MockWebSpeechRecognizer::abort( |
| const blink::WebSpeechRecognitionHandle& handle, |
| blink::WebSpeechRecognizerClient* client) { |
| - handle_ = handle; |
| - client_ = client; |
| - |
| - ClearTaskQueue(); |
| was_aborted_ = true; |
| + ClearTaskQueue(); |
| + task_queue_.push_back( |
| + new SwitchClientHandleTask(this, handle, client)); |
| task_queue_.push_back(new EndedTask(this)); |
| StartTaskQueue(); |
| @@ -248,10 +290,14 @@ void MockWebSpeechRecognizer::StartTaskQueue() { |
| void MockWebSpeechRecognizer::ClearTaskQueue() { |
| while (!task_queue_.empty()) { |
| + Task* task = task_queue_.front(); |
| + if (task->isNewContextTask()) |
| + break; |
| delete task_queue_.front(); |
| task_queue_.pop_front(); |
| } |
| - task_queue_running_ = false; |
| + if (task_queue_.empty()) |
| + task_queue_running_ = false; |
| } |
| void MockWebSpeechRecognizer::PostRunTaskFromQueue() { |