1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 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.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/debug/leak_annotations.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_display/display_info_provider.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_display/system_display_api.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/system_display.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/display.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/display_observer.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/screen.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/display/screen_ash.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/shell.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace utils = extension_function_test_utils;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing core_api::system_display::Bounds;
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing core_api::system_display::DisplayUnitInfo;
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using gfx::Screen;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS)
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MockScreen : public ash::ScreenAsh {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MockScreen() {
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (int i = 0; i < 4; i++) {
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Rect bounds(0, 0, 1280, 720);
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Rect work_area(0, 0, 960, 720);
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Display display(i, bounds);
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      display.set_work_area(work_area);
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      displays_.push_back(display);
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~MockScreen() {}
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Overridden from gfx::Screen:
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual int GetNumDisplays() const OVERRIDE {
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return displays_.size();
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE {
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return displays_;
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gfx::Display GetPrimaryDisplay() const OVERRIDE {
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return displays_[0];
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<gfx::Display> displays_;
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockScreen);
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MockScreen : public Screen {
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MockScreen() {
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    for (int i = 0; i < 4; i++) {
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Rect bounds(0, 0, 1280, 720);
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Rect work_area(0, 0, 960, 720);
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::Display display(i, bounds);
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      display.set_work_area(work_area);
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      displays_.push_back(display);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~MockScreen() {}
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Overridden from gfx::Screen:
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool IsDIPEnabled() OVERRIDE { return true; }
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gfx::Point GetCursorScreenPoint() OVERRIDE  { return gfx::Point(); }
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gfx::NativeWindow GetWindowUnderCursor() OVERRIDE {
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return gfx::NativeWindow();
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gfx::NativeWindow GetWindowAtScreenPoint(
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const gfx::Point& point) OVERRIDE {
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return gfx::NativeWindow();
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual int GetNumDisplays() const OVERRIDE {
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return displays_.size();
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE {
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return displays_;
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gfx::Display GetDisplayNearestWindow(
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      gfx::NativeView window) const OVERRIDE {
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return gfx::Display(0);
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gfx::Display GetDisplayNearestPoint(
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const gfx::Point& point) const OVERRIDE {
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return gfx::Display(0);
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gfx::Display GetDisplayMatching(
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const gfx::Rect& match_rect) const OVERRIDE {
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return gfx::Display(0);
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual gfx::Display GetPrimaryDisplay() const OVERRIDE {
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return displays_[0];
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AddObserver(gfx::DisplayObserver* observer) OVERRIDE {}
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void RemoveObserver(gfx::DisplayObserver* observer) OVERRIDE {}
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<gfx::Display> displays_;
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockScreen);
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MockDisplayInfoProvider : public DisplayInfoProvider {
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MockDisplayInfoProvider() {}
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~MockDisplayInfoProvider() {}
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool SetInfo(
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const std::string& display_id,
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const core_api::system_display::DisplayProperties& params,
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      std::string* error) OVERRIDE {
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Should get called only once per test case.
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(set_info_value_);
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    set_info_value_ = params.ToValue();
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    set_info_display_id_ = display_id;
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return true;
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual gfx::Screen* GetActiveScreen() OVERRIDE { return NULL; }
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> GetSetInfoValue() {
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return set_info_value_.Pass();
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string GetSetInfoDisplayId() const {
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return set_info_display_id_;
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Update the content of the |unit| obtained for |display| using
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // platform specific method.
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void UpdateDisplayUnitInfoForPlatform(
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const gfx::Display& display,
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extensions::core_api::system_display::DisplayUnitInfo* unit) OVERRIDE {
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int64 id = display.id();
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    unit->name = "DISPLAY NAME FOR " + base::Int64ToString(id);
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (id == 1)
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      unit->mirroring_source_id = "0";
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    unit->is_primary = id == 0 ? true : false;
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    unit->is_internal = id == 0 ? true : false;
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    unit->is_enabled = true;
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    unit->rotation = (90 * id) % 360;
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    unit->dpi_x = 96.0;
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    unit->dpi_y = 96.0;
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (id == 0) {
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      unit->overscan.left = 20;
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      unit->overscan.top = 40;
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      unit->overscan.right = 60;
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      unit->overscan.bottom = 80;
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> set_info_value_;
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string set_info_display_id_;
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockDisplayInfoProvider);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass SystemDisplayApiTest: public ExtensionApiTest {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SystemDisplayApiTest() : provider_(new MockDisplayInfoProvider),
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           screen_(new MockScreen) {}
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual ~SystemDisplayApiTest() {}
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ExtensionApiTest::SetUpOnMainThread();
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ANNOTATE_LEAKING_OBJECT_PTR(
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE));
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_.get());
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DisplayInfoProvider::InitializeForTesting(provider_.get());
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS)
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE,
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   ash::Shell::GetScreen());
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ExtensionApiTest::TearDownOnMainThread();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<MockDisplayInfoProvider> provider_;
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<gfx::Screen> screen_;
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SystemDisplayApiTest);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(SystemDisplayApiTest, GetDisplay) {
205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_TRUE(RunPlatformAppTest("system/display")) << message_;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(OS_CHROMEOS)
209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(SystemDisplayApiTest, SetDisplay) {
210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<SystemDisplaySetDisplayPropertiesFunction>
211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      set_info_function(new SystemDisplaySetDisplayPropertiesFunction());
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  set_info_function->set_has_callback(true);
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("Function available only on ChromeOS.",
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            utils::RunFunctionAndReturnError(set_info_function.get(),
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                             "[\"display_id\", {}]",
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                             browser()));
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> set_info = provider_->GetSetInfoValue();
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(set_info);
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_CHROMEOS)
226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(SystemDisplayApiTest, SetDisplayNotKioskEnabled) {
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> test_extension_value(utils::ParseDictionary(
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "{\n"
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"name\": \"Test\",\n"
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"version\": \"1.0\",\n"
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"app\": {\n"
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    \"background\": {\n"
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "      \"scripts\": [\"background.js\"]\n"
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    }\n"
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  }\n"
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "}"));
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<Extension> test_extension(
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      utils::CreateExtension(test_extension_value.get()));
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<SystemDisplaySetDisplayPropertiesFunction>
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      set_info_function(new SystemDisplaySetDisplayPropertiesFunction());
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  set_info_function->set_extension(test_extension.get());
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  set_info_function->set_has_callback(true);
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("The extension needs to be kiosk enabled to use the function.",
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            utils::RunFunctionAndReturnError(set_info_function.get(),
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                             "[\"display_id\", {}]",
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                             browser()));
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> set_info = provider_->GetSetInfoValue();
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(set_info);
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(SystemDisplayApiTest, SetDisplayKioskEnabled) {
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> test_extension_value(utils::ParseDictionary(
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "{\n"
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"name\": \"Test\",\n"
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"version\": \"1.0\",\n"
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"app\": {\n"
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    \"background\": {\n"
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "      \"scripts\": [\"background.js\"]\n"
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    }\n"
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  },\n"
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"kiosk_enabled\": true\n"
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "}"));
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<Extension> test_extension(
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      utils::CreateExtension(test_extension_value.get()));
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<SystemDisplaySetDisplayPropertiesFunction>
271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      set_info_function(new SystemDisplaySetDisplayPropertiesFunction());
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  set_info_function->set_has_callback(true);
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  set_info_function->set_extension(test_extension.get());
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(utils::RunFunction(
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      set_info_function.get(),
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "[\"display_id\", {\n"
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"isPrimary\": true,\n"
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"mirroringSourceId\": \"mirroringId\",\n"
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"boundsOriginX\": 100,\n"
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"boundsOriginY\": 200,\n"
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"rotation\": 90,\n"
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "  \"overscan\": {\"left\": 1, \"top\": 2, \"right\": 3, \"bottom\": 4}\n"
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "}]",
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      browser(),
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      utils::NONE));
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> set_info = provider_->GetSetInfoValue();
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(set_info);
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(utils::GetBoolean(set_info.get(), "isPrimary"));
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("mirroringId",
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            utils::GetString(set_info.get(), "mirroringSourceId"));
2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(100, utils::GetInteger(set_info.get(), "boundsOriginX"));
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(200, utils::GetInteger(set_info.get(), "boundsOriginY"));
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(90, utils::GetInteger(set_info.get(), "rotation"));
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* overscan;
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(set_info->GetDictionary("overscan", &overscan));
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1, utils::GetInteger(overscan, "left"));
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2, utils::GetInteger(overscan, "top"));
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(3, utils::GetInteger(overscan, "right"));
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(4, utils::GetInteger(overscan, "bottom"));
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("display_id", provider_->GetSetInfoDisplayId());
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace extensions
309