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

Unified Diff: components/test_runner/mock_web_speech_recognizer.cc

Issue 2525933002: Handle overlapping uses of MockWebSpeechRecognizer (Closed)
Patch Set: add test Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698