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/automation_extension.h" 6 7#include "base/time/time.h" 8#include "base/values.h" 9#include "chrome/test/chromedriver/chrome/status.h" 10#include "chrome/test/chromedriver/chrome/web_view.h" 11 12AutomationExtension::AutomationExtension(scoped_ptr<WebView> web_view) 13 : web_view_(web_view.Pass()) {} 14 15AutomationExtension::~AutomationExtension() {} 16 17Status AutomationExtension::CaptureScreenshot(std::string* screenshot) { 18 base::ListValue args; 19 scoped_ptr<base::Value> result; 20 Status status = web_view_->CallAsyncFunction( 21 std::string(), 22 "captureScreenshot", 23 args, 24 base::TimeDelta::FromSeconds(10), 25 &result); 26 if (status.IsError()) 27 return Status(status.code(), "cannot take screenshot", status); 28 if (!result->GetAsString(screenshot)) 29 return Status(kUnknownError, "screenshot is not a string"); 30 return Status(kOk); 31} 32 33Status AutomationExtension::GetWindowPosition(int* x, int* y) { 34 int temp_width, temp_height; 35 return GetWindowInfo(x, y, &temp_width, &temp_height); 36} 37 38Status AutomationExtension::SetWindowPosition(int x, int y) { 39 base::DictionaryValue update_info; 40 update_info.SetInteger("left", x); 41 update_info.SetInteger("top", y); 42 update_info.SetString("state", "normal"); 43 return UpdateWindow(update_info); 44} 45 46Status AutomationExtension::GetWindowSize(int* width, int* height) { 47 int temp_x, temp_y; 48 return GetWindowInfo(&temp_x, &temp_y, width, height); 49} 50 51Status AutomationExtension::SetWindowSize(int width, int height) { 52 base::DictionaryValue update_info; 53 update_info.SetInteger("width", width); 54 update_info.SetInteger("height", height); 55 update_info.SetString("state", "normal"); 56 return UpdateWindow(update_info); 57} 58 59Status AutomationExtension::MaximizeWindow() { 60 base::DictionaryValue update_info; 61 update_info.SetString("state", "maximized"); 62 return UpdateWindow(update_info); 63} 64 65Status AutomationExtension::GetWindowInfo(int* x, 66 int* y, 67 int* width, 68 int* height) { 69 base::ListValue args; 70 scoped_ptr<base::Value> result; 71 Status status = web_view_->CallAsyncFunction(std::string(), 72 "getWindowInfo", 73 args, 74 base::TimeDelta::FromSeconds(10), 75 &result); 76 if (status.IsError()) 77 return status; 78 79 base::DictionaryValue* dict; 80 int temp_x = 0; 81 int temp_y = 0; 82 int temp_width = 0; 83 int temp_height = 0; 84 if (!result->GetAsDictionary(&dict) || 85 !dict->GetInteger("left", &temp_x) || 86 !dict->GetInteger("top", &temp_y) || 87 !dict->GetInteger("width", &temp_width) || 88 !dict->GetInteger("height", &temp_height)) { 89 return Status(kUnknownError, "received invalid window info"); 90 } 91 *x = temp_x; 92 *y = temp_y; 93 *width = temp_width; 94 *height = temp_height; 95 return Status(kOk); 96} 97 98Status AutomationExtension::UpdateWindow( 99 const base::DictionaryValue& update_info) { 100 base::ListValue args; 101 args.Append(update_info.DeepCopy()); 102 scoped_ptr<base::Value> result; 103 return web_view_->CallAsyncFunction(std::string(), 104 "updateWindow", 105 args, 106 base::TimeDelta::FromSeconds(10), 107 &result); 108} 109 110Status AutomationExtension::LaunchApp(std::string id) { 111 base::ListValue args; 112 args.AppendString(id); 113 scoped_ptr<base::Value> result; 114 return web_view_->CallAsyncFunction(std::string(), 115 "launchApp", 116 args, 117 base::TimeDelta::FromSeconds(10), 118 &result); 119} 120