1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/test/javascript_test_observer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/dom_operation_notification_details.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/web_contents.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content {
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestMessageHandler::TestMessageHandler() : ok_(true) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestMessageHandler::~TestMessageHandler() {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestMessageHandler::SetError(const std::string& message) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ok_ = false;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_message_ = message;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestMessageHandler::Reset() {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ok_ = true;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_message_.clear();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)JavascriptTestObserver::JavascriptTestObserver(
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WebContents* web_contents, TestMessageHandler* handler)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : handler_(handler),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      running_(false),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      finished_(false) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  registrar_.Add(this,
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 NOTIFICATION_DOM_OPERATION_RESPONSE,
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 Source<WebContents>(web_contents));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)JavascriptTestObserver::~JavascriptTestObserver() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool JavascriptTestObserver::Run() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Messages may have arrived before Run was called.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!finished_) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(!running_);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    running_ = true;
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RunMessageLoop();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    running_ = false;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handler_->ok();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JavascriptTestObserver::Reset() {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!running_);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  running_ = false;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_ = false;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_->Reset();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JavascriptTestObserver::Observe(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const NotificationSource& source,
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const NotificationDetails& details) {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK(type == NOTIFICATION_DOM_OPERATION_RESPONSE);
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Details<DomOperationNotificationDetails> dom_op_details(details);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We might receive responses for other script execution, but we only
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // care about the test finished message.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMessageHandler::MessageResponse response =
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handler_->HandleMessage(dom_op_details->json);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (response == TestMessageHandler::DONE) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EndTest();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Continue();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JavascriptTestObserver::Continue() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JavascriptTestObserver::EndTest() {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finished_ = true;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (running_) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    running_ = false;
88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    base::MessageLoopForUI::current()->Quit();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace content
93