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 "base/json/json_reader.h"
6#include "base/strings/string_number_conversions.h"
7#include "base/strings/string_split.h"
8#include "base/values.h"
9#include "chrome/test/chromedriver/chrome/mobile_device.h"
10#include "chrome/test/chromedriver/chrome/mobile_device_list.h"
11#include "chrome/test/chromedriver/chrome/status.h"
12
13MobileDevice::MobileDevice() {}
14MobileDevice::~MobileDevice() {}
15
16Status FindMobileDevice(std::string device_name,
17                        scoped_ptr<MobileDevice>* mobile_device) {
18  base::JSONReader json_reader(base::JSON_ALLOW_TRAILING_COMMAS);
19  scoped_ptr<base::Value> devices_value;
20  devices_value.reset(json_reader.ReadToValue(kMobileDevices));
21  if (!devices_value.get())
22    return Status(kUnknownError,
23                  "could not parse mobile device list because " +
24                  json_reader.GetErrorMessage());
25
26  base::ListValue* mobile_devices;
27  if (!devices_value->GetAsList(&mobile_devices))
28    return Status(kUnknownError, "malformed device metrics list");
29
30  for (base::ListValue::iterator it = mobile_devices->begin();
31       it != mobile_devices->end();
32       ++it) {
33    base::ListValue* device = NULL;
34    if (!(*it)->GetAsList(&device)) {
35      return Status(kUnknownError,
36                    "malformed device in list: should be an array");
37    }
38
39    if (device != NULL) {
40      std::string name;
41      if (!device->GetString(0, &name)) {
42        return Status(kUnknownError,
43                      "malformed device name: should be a string");
44      }
45      if (name != device_name)
46        continue;
47
48      scoped_ptr<MobileDevice> tmp_mobile_device(new MobileDevice());
49      std::string device_metrics_string;
50      if (!device->GetString(1, &tmp_mobile_device->user_agent)) {
51        return Status(kUnknownError,
52                      "malformed device user agent: should be a string");
53      }
54      if (!device->GetString(2, &device_metrics_string)) {
55        return Status(kUnknownError,
56                      "malformed device metrics: should be a string");
57      }
58      std::vector<std::string> metrics_vector;
59      base::SplitString(device_metrics_string, 'x', &metrics_vector);
60      if (metrics_vector.size() < 3)
61        return Status(kUnknownError, "malformed device metrics string");
62
63      int width = 0;
64      int height = 0;
65      double device_scale_factor = 0.0;
66      if (!base::StringToInt(metrics_vector[0], &width)) {
67        return Status(kUnknownError,
68                      "malformed device width: should be an integer");
69      }
70      if (!base::StringToInt(metrics_vector[1], &height)) {
71        return Status(kUnknownError,
72                      "malformed device height: should be an integer");
73      }
74      if (!base::StringToDouble(metrics_vector[2], &device_scale_factor)) {
75        return Status(kUnknownError,
76                      "malformed device scale factor: should be a double");
77      }
78      tmp_mobile_device->device_metrics.reset(
79          new DeviceMetrics(width, height, device_scale_factor));
80
81      *mobile_device = tmp_mobile_device.Pass();
82      return Status(kOk);
83    }
84  }
85
86  return Status(kUnknownError, "must be a valid device");
87}
88