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