12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/javascript_dialog_manager.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/devtools_client.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)JavaScriptDialogManager::JavaScriptDialogManager(DevToolsClient* client)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : client_(client) {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client_->AddListener(this);
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)JavaScriptDialogManager::~JavaScriptDialogManager() {}
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool JavaScriptDialogManager::IsDialogOpen() {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !unhandled_dialog_queue_.empty();
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status JavaScriptDialogManager::GetDialogMessage(std::string* message) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsDialogOpen())
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Status(kNoAlertOpen);
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *message = unhandled_dialog_queue_.front();
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Status(kOk);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status JavaScriptDialogManager::HandleDialog(bool accept,
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                             const std::string* text) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsDialogOpen())
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Status(kNoAlertOpen);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue params;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.SetBoolean("accept", accept);
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (text)
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    params.SetString("promptText", *text);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Status status = client_->SendCommand("Page.handleJavaScriptDialog", params);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status.IsError())
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return status;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove a dialog from the queue. Need to check the queue is not empty here,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // because it could have been cleared during waiting for the command
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // response.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (unhandled_dialog_queue_.size())
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unhandled_dialog_queue_.pop_front();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Status(kOk);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Status JavaScriptDialogManager::OnConnected(DevToolsClient* client) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unhandled_dialog_queue_.clear();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue params;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return client_->SendCommand("Page.enable", params);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)Status JavaScriptDialogManager::OnEvent(DevToolsClient* client,
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                        const std::string& method,
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                        const base::DictionaryValue& params) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (method == "Page.javascriptDialogOpening") {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string message;
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!params.GetString("message", &message))
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return Status(kUnknownError, "dialog event missing or invalid 'message'");
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unhandled_dialog_queue_.push_back(message);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (method == "Page.javascriptDialogClosing") {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Inspector only sends this event when all dialogs have been closed.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Clear the unhandled queue in case the user closed a dialog manually.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unhandled_dialog_queue_.clear();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return Status(kOk);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
73