| 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..f2527c1e8d44a82ff69a7235fb53d65c40c28473 100644
|
| --- a/components/test_runner/mock_web_speech_recognizer.cc
|
| +++ b/components/test_runner/mock_web_speech_recognizer.cc
|
| @@ -120,18 +120,41 @@ 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), 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 +163,32 @@ 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;
|
| + client_ = client;
|
| +}
|
| +
|
| 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 +221,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 +230,9 @@ 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 +283,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() {
|
|
|