javascript_dialog_manager.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/devtools_client.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)JavaScriptDialogManager::JavaScriptDialogManager(DevToolsClient* client) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : client_(client) { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->AddListener(this); 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)JavaScriptDialogManager::~JavaScriptDialogManager() {} 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool JavaScriptDialogManager::IsDialogOpen() { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !unhandled_dialog_queue_.empty(); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status JavaScriptDialogManager::GetDialogMessage(std::string* message) { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsDialogOpen()) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Status(kNoAlertOpen); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *message = unhandled_dialog_queue_.front(); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Status(kOk); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status JavaScriptDialogManager::HandleDialog(bool accept, 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string* text) { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsDialogOpen()) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Status(kNoAlertOpen); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue params; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.SetBoolean("accept", accept); 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (text) 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.SetString("promptText", *text); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Status status = client_->SendCommand("Page.handleJavaScriptDialog", params); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status.IsError()) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return status; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove a dialog from the queue. Need to check the queue is not empty here, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // because it could have been cleared during waiting for the command 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // response. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (unhandled_dialog_queue_.size()) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unhandled_dialog_queue_.pop_front(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Status(kOk); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)Status JavaScriptDialogManager::OnConnected(DevToolsClient* client) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unhandled_dialog_queue_.clear(); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue params; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return client_->SendCommand("Page.enable", params); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void JavaScriptDialogManager::OnEvent(DevToolsClient* client, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& method, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue& params) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (method == "Page.javascriptDialogOpening") { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string message; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params.GetString("message", &message)) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "dialog event missing or invalid 'message'"; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unhandled_dialog_queue_.push_back(message); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (method == "Page.javascriptDialogClosing") { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Inspector only sends this event when all dialogs have been closed. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear the unhandled queue in case the user closed a dialog manually. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unhandled_dialog_queue_.clear(); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 73