• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 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 "chrome/test/chromedriver/chrome/javascript_dialog_manager.h"
6 
7 #include "base/values.h"
8 #include "chrome/test/chromedriver/chrome/devtools_client.h"
9 #include "chrome/test/chromedriver/chrome/status.h"
10 
JavaScriptDialogManager(DevToolsClient * client)11 JavaScriptDialogManager::JavaScriptDialogManager(DevToolsClient* client)
12     : client_(client) {
13   client_->AddListener(this);
14 }
15 
~JavaScriptDialogManager()16 JavaScriptDialogManager::~JavaScriptDialogManager() {}
17 
IsDialogOpen()18 bool JavaScriptDialogManager::IsDialogOpen() {
19   return !unhandled_dialog_queue_.empty();
20 }
21 
GetDialogMessage(std::string * message)22 Status JavaScriptDialogManager::GetDialogMessage(std::string* message) {
23   if (!IsDialogOpen())
24     return Status(kNoAlertOpen);
25 
26   *message = unhandled_dialog_queue_.front();
27   return Status(kOk);
28 }
29 
HandleDialog(bool accept,const std::string * text)30 Status JavaScriptDialogManager::HandleDialog(bool accept,
31                                              const std::string* text) {
32   if (!IsDialogOpen())
33     return Status(kNoAlertOpen);
34 
35   base::DictionaryValue params;
36   params.SetBoolean("accept", accept);
37   if (text)
38     params.SetString("promptText", *text);
39   Status status = client_->SendCommand("Page.handleJavaScriptDialog", params);
40   if (status.IsError())
41     return status;
42 
43   // Remove a dialog from the queue. Need to check the queue is not empty here,
44   // because it could have been cleared during waiting for the command
45   // response.
46   if (unhandled_dialog_queue_.size())
47     unhandled_dialog_queue_.pop_front();
48   return Status(kOk);
49 }
50 
OnConnected(DevToolsClient * client)51 Status JavaScriptDialogManager::OnConnected(DevToolsClient* client) {
52   unhandled_dialog_queue_.clear();
53   base::DictionaryValue params;
54   return client_->SendCommand("Page.enable", params);
55 }
56 
OnEvent(DevToolsClient * client,const std::string & method,const base::DictionaryValue & params)57 Status JavaScriptDialogManager::OnEvent(DevToolsClient* client,
58                                         const std::string& method,
59                                         const base::DictionaryValue& params) {
60   if (method == "Page.javascriptDialogOpening") {
61     std::string message;
62     if (!params.GetString("message", &message))
63       return Status(kUnknownError, "dialog event missing or invalid 'message'");
64 
65     unhandled_dialog_queue_.push_back(message);
66   } else if (method == "Page.javascriptDialogClosing") {
67     // Inspector only sends this event when all dialogs have been closed.
68     // Clear the unhandled queue in case the user closed a dialog manually.
69     unhandled_dialog_queue_.clear();
70   }
71   return Status(kOk);
72 }
73