1// Copyright 2014 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 <string> 6#include <vector> 7 8#include "base/compiler_specific.h" 9#include "base/values.h" 10#include "chrome/test/chromedriver/chrome/browser_info.h" 11#include "chrome/test/chromedriver/chrome/device_metrics.h" 12#include "chrome/test/chromedriver/chrome/mobile_emulation_override_manager.h" 13#include "chrome/test/chromedriver/chrome/status.h" 14#include "chrome/test/chromedriver/chrome/stub_devtools_client.h" 15#include "testing/gtest/include/gtest/gtest.h" 16 17namespace { 18 19struct Command { 20 Command() {} 21 Command(const std::string& method, const base::DictionaryValue& params) 22 : method(method) { 23 this->params.MergeDictionary(¶ms); 24 } 25 Command(const Command& command) { 26 *this = command; 27 } 28 Command& operator=(const Command& command) { 29 method = command.method; 30 params.Clear(); 31 params.MergeDictionary(&command.params); 32 return *this; 33 } 34 ~Command() {} 35 36 std::string method; 37 base::DictionaryValue params; 38}; 39 40class RecorderDevToolsClient : public StubDevToolsClient { 41 public: 42 RecorderDevToolsClient() {} 43 virtual ~RecorderDevToolsClient() {} 44 45 // Overridden from StubDevToolsClient: 46 virtual Status SendCommandAndGetResult( 47 const std::string& method, 48 const base::DictionaryValue& params, 49 scoped_ptr<base::DictionaryValue>* result) OVERRIDE { 50 commands_.push_back(Command(method, params)); 51 return Status(kOk); 52 } 53 54 std::vector<Command> commands_; 55}; 56 57void AssertDeviceMetricsCommand(const Command& command, 58 const DeviceMetrics& device_metrics) { 59 ASSERT_EQ("Page.setDeviceMetricsOverride", command.method); 60 int width, height; 61 double device_scale_factor, font_scale_factor; 62 bool mobile, fit_window, text_autosizing; 63 ASSERT_TRUE(command.params.GetInteger("width", &width)); 64 ASSERT_TRUE(command.params.GetInteger("height", &height)); 65 ASSERT_TRUE(command.params.GetDouble("deviceScaleFactor", 66 &device_scale_factor)); 67 ASSERT_TRUE(command.params.GetBoolean("mobile", &mobile)); 68 ASSERT_TRUE(command.params.GetBoolean("fitWindow", &fit_window)); 69 ASSERT_TRUE(command.params.GetBoolean("textAutosizing", &text_autosizing)); 70 ASSERT_TRUE(command.params.GetDouble("fontScaleFactor", &font_scale_factor)); 71 ASSERT_EQ(device_metrics.width, width); 72 ASSERT_EQ(device_metrics.height, height); 73 ASSERT_EQ(device_metrics.device_scale_factor, device_scale_factor); 74 ASSERT_EQ(device_metrics.mobile, mobile); 75 ASSERT_EQ(device_metrics.fit_window, fit_window); 76 ASSERT_EQ(device_metrics.text_autosizing, text_autosizing); 77 ASSERT_EQ(device_metrics.font_scale_factor, font_scale_factor); 78} 79 80} // namespace 81 82TEST(MobileEmulationOverrideManager, SendsCommandOnConnect) { 83 RecorderDevToolsClient client; 84 DeviceMetrics device_metrics(1, 2, 3.0); 85 BrowserInfo browser_info; 86 MobileEmulationOverrideManager manager(&client, 87 &device_metrics, 88 &browser_info); 89 ASSERT_EQ(0u, client.commands_.size()); 90 ASSERT_EQ(kOk, manager.OnConnected(&client).code()); 91 92 ASSERT_EQ(1u, client.commands_.size()); 93 ASSERT_EQ(kOk, manager.OnConnected(&client).code()); 94 ASSERT_EQ(2u, client.commands_.size()); 95 ASSERT_NO_FATAL_FAILURE( 96 AssertDeviceMetricsCommand(client.commands_[1], device_metrics)); 97} 98 99TEST(MobileEmulationOverrideManager, SendsCommandOnNavigation) { 100 RecorderDevToolsClient client; 101 DeviceMetrics device_metrics(1, 2, 3.0); 102 BrowserInfo browser_info; 103 MobileEmulationOverrideManager manager(&client, 104 &device_metrics, 105 &browser_info); 106 base::DictionaryValue main_frame_params; 107 ASSERT_EQ(kOk, 108 manager.OnEvent(&client, "Page.frameNavigated", main_frame_params) 109 .code()); 110 ASSERT_EQ(1u, client.commands_.size()); 111 ASSERT_EQ(kOk, 112 manager.OnEvent(&client, "Page.frameNavigated", main_frame_params) 113 .code()); 114 ASSERT_EQ(2u, client.commands_.size()); 115 ASSERT_NO_FATAL_FAILURE( 116 AssertDeviceMetricsCommand(client.commands_[1], device_metrics)); 117 118 base::DictionaryValue sub_frame_params; 119 sub_frame_params.SetString("frame.parentId", "id"); 120 ASSERT_EQ( 121 kOk, 122 manager.OnEvent(&client, "Page.frameNavigated", sub_frame_params).code()); 123 ASSERT_EQ(2u, client.commands_.size()); 124} 125