• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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 "content/public/test/javascript_test_observer.h"
6 
7 #include "content/public/browser/dom_operation_notification_details.h"
8 #include "content/public/browser/notification_types.h"
9 #include "content/public/browser/render_view_host.h"
10 #include "content/public/browser/web_contents.h"
11 #include "content/public/test/test_utils.h"
12 
13 namespace content {
14 
TestMessageHandler()15 TestMessageHandler::TestMessageHandler() : ok_(true) {
16 }
17 
~TestMessageHandler()18 TestMessageHandler::~TestMessageHandler() {
19 }
20 
SetError(const std::string & message)21 void TestMessageHandler::SetError(const std::string& message) {
22   ok_ = false;
23   error_message_ = message;
24 }
25 
Reset()26 void TestMessageHandler::Reset() {
27   ok_ = true;
28   error_message_.clear();
29 }
30 
JavascriptTestObserver(WebContents * web_contents,TestMessageHandler * handler)31 JavascriptTestObserver::JavascriptTestObserver(
32     WebContents* web_contents, TestMessageHandler* handler)
33     : handler_(handler),
34       running_(false),
35       finished_(false) {
36   Reset();
37   registrar_.Add(this,
38                  NOTIFICATION_DOM_OPERATION_RESPONSE,
39                  Source<WebContents>(web_contents));
40 }
41 
~JavascriptTestObserver()42 JavascriptTestObserver::~JavascriptTestObserver() {
43 }
44 
Run()45 bool JavascriptTestObserver::Run() {
46   // Messages may have arrived before Run was called.
47   if (!finished_) {
48     CHECK(!running_);
49     running_ = true;
50     RunMessageLoop();
51     running_ = false;
52   }
53   return handler_->ok();
54 }
55 
Reset()56 void JavascriptTestObserver::Reset() {
57   CHECK(!running_);
58   running_ = false;
59   finished_ = false;
60   handler_->Reset();
61 }
62 
Observe(int type,const NotificationSource & source,const NotificationDetails & details)63 void JavascriptTestObserver::Observe(
64     int type,
65     const NotificationSource& source,
66     const NotificationDetails& details) {
67   CHECK(type == NOTIFICATION_DOM_OPERATION_RESPONSE);
68   Details<DomOperationNotificationDetails> dom_op_details(details);
69   // We might receive responses for other script execution, but we only
70   // care about the test finished message.
71   TestMessageHandler::MessageResponse response =
72       handler_->HandleMessage(dom_op_details->json);
73 
74   if (response == TestMessageHandler::DONE) {
75     EndTest();
76   } else {
77     Continue();
78   }
79 }
80 
Continue()81 void JavascriptTestObserver::Continue() {
82 }
83 
EndTest()84 void JavascriptTestObserver::EndTest() {
85   finished_ = true;
86   if (running_) {
87     running_ = false;
88     base::MessageLoopForUI::current()->Quit();
89   }
90 }
91 
92 }  // namespace content
93