10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/command_line.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/threading/platform_thread.h"
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/device_sensors/data_fetcher_shared_memory.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/device_sensors/device_inertial_sensor_service.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/device_sensors/device_light_hardware_buffer.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/device_sensors/device_motion_hardware_buffer.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/device_sensors/device_orientation_hardware_buffer.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/web_contents.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/common/content_switches.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test.h"
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test_utils.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/test/test_navigation_observer.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/test/test_utils.h"
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/shell/browser/shell.h"
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/shell/browser/shell_javascript_dialog_manager.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace content {
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class FakeDataFetcher : public DataFetcherSharedMemory {
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeDataFetcher()
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : started_orientation_(false, false),
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        stopped_orientation_(false, false),
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        started_motion_(false, false),
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        stopped_motion_(false, false),
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        started_light_(false, false),
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        stopped_light_(false, false),
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sensor_data_available_(true) {}
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~FakeDataFetcher() { }
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool Start(ConsumerType consumer_type, void* buffer) OVERRIDE {
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(buffer);
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (consumer_type) {
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case CONSUMER_TYPE_MOTION:
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        {
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          DeviceMotionHardwareBuffer* motion_buffer =
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              static_cast<DeviceMotionHardwareBuffer*>(buffer);
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          if (sensor_data_available_)
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            UpdateMotion(motion_buffer);
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          SetMotionBufferReady(motion_buffer);
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          started_motion_.Signal();
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        }
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case CONSUMER_TYPE_ORIENTATION:
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        {
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          DeviceOrientationHardwareBuffer* orientation_buffer =
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              static_cast<DeviceOrientationHardwareBuffer*>(buffer);
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          if (sensor_data_available_)
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            UpdateOrientation(orientation_buffer);
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          SetOrientationBufferReady(orientation_buffer);
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          started_orientation_.Signal();
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        }
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case CONSUMER_TYPE_LIGHT:
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          DeviceLightHardwareBuffer* light_buffer =
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              static_cast<DeviceLightHardwareBuffer*>(buffer);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          UpdateLight(light_buffer,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      sensor_data_available_
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          ? 100
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          : std::numeric_limits<double>::infinity());
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          started_light_.Signal();
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      default:
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        return false;
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return true;
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool Stop(ConsumerType consumer_type) OVERRIDE {
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (consumer_type) {
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case CONSUMER_TYPE_MOTION:
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        stopped_motion_.Signal();
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case CONSUMER_TYPE_ORIENTATION:
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        stopped_orientation_.Signal();
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      case CONSUMER_TYPE_LIGHT:
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        stopped_light_.Signal();
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        break;
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      default:
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        return false;
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return true;
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void Fetch(unsigned consumer_bitmask) OVERRIDE {
988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    FAIL() << "fetch should not be called";
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual FetcherType GetType() const OVERRIDE {
1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return FETCHER_TYPE_DEFAULT;
1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void SetSensorDataAvailable(bool available) {
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    sensor_data_available_ = available;
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void SetMotionBufferReady(DeviceMotionHardwareBuffer* buffer) {
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    buffer->seqlock.WriteBegin();
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    buffer->data.allAvailableSensorsAreActive = true;
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    buffer->seqlock.WriteEnd();
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void SetOrientationBufferReady(DeviceOrientationHardwareBuffer* buffer) {
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    buffer->seqlock.WriteBegin();
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    buffer->data.allAvailableSensorsAreActive = true;
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    buffer->seqlock.WriteEnd();
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void UpdateMotion(DeviceMotionHardwareBuffer* buffer) {
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->seqlock.WriteBegin();
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.accelerationX = 1;
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasAccelerationX = true;
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.accelerationY = 2;
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasAccelerationY = true;
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.accelerationZ = 3;
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasAccelerationZ = true;
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.accelerationIncludingGravityX = 4;
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasAccelerationIncludingGravityX = true;
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.accelerationIncludingGravityY = 5;
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasAccelerationIncludingGravityY = true;
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.accelerationIncludingGravityZ = 6;
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasAccelerationIncludingGravityZ = true;
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.rotationRateAlpha = 7;
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasRotationRateAlpha = true;
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.rotationRateBeta = 8;
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasRotationRateBeta = true;
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.rotationRateGamma = 9;
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasRotationRateGamma = true;
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.interval = 100;
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.allAvailableSensorsAreActive = true;
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->seqlock.WriteEnd();
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void UpdateOrientation(DeviceOrientationHardwareBuffer* buffer) {
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->seqlock.WriteBegin();
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.alpha = 1;
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasAlpha = true;
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.beta = 2;
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasBeta = true;
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.gamma = 3;
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.hasGamma = true;
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->data.allAvailableSensorsAreActive = true;
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    buffer->seqlock.WriteEnd();
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void UpdateLight(DeviceLightHardwareBuffer* buffer, double lux) {
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    buffer->seqlock.WriteBegin();
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    buffer->data.value = lux;
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    buffer->seqlock.WriteEnd();
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WaitableEvent started_orientation_;
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WaitableEvent stopped_orientation_;
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WaitableEvent started_motion_;
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WaitableEvent stopped_motion_;
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WaitableEvent started_light_;
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WaitableEvent stopped_light_;
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool sensor_data_available_;
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeDataFetcher);
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DeviceInertialSensorBrowserTest : public ContentBrowserTest  {
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DeviceInertialSensorBrowserTest()
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : fetcher_(NULL),
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        io_loop_finished_event_(false, false) {
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserThread::PostTask(
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        BrowserThread::IO, FROM_HERE,
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        base::Bind(&DeviceInertialSensorBrowserTest::SetUpOnIOThread, this));
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    io_loop_finished_event_.Wait();
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetUpOnIOThread() {
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fetcher_ = new FakeDataFetcher();
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DeviceInertialSensorService::GetInstance()->
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        SetDataFetcherForTesting(fetcher_);
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    io_loop_finished_event_.Signal();
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void DelayAndQuit(base::TimeDelta delay) {
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::PlatformThread::Sleep(delay);
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::MessageLoop::current()->QuitWhenIdle();
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void WaitForAlertDialogAndQuitAfterDelay(base::TimeDelta delay) {
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ShellJavaScriptDialogManager* dialog_manager=
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        static_cast<ShellJavaScriptDialogManager*>(
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            shell()->GetJavaScriptDialogManager());
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner();
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dialog_manager->set_dialog_request_callback(
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::Bind(&DeviceInertialSensorBrowserTest::DelayAndQuit, this,
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            delay));
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    runner->Run();
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeDataFetcher* fetcher_;
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WaitableEvent io_loop_finished_event_;
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DeviceInertialSensorBrowserTest, OrientationTest) {
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The test page will register an event handler for orientation events,
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // expects to get an event with fake values, then removes the event
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // handler and navigates to #pass.
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL test_url = GetTestUrl("device_sensors", "device_orientation_test.html");
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2);
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fetcher_->started_orientation_.Wait();
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fetcher_->stopped_orientation_.Wait();
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(DeviceInertialSensorBrowserTest, LightTest) {
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The test page will register an event handler for light events,
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // expects to get an event with fake values, then removes the event
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // handler and navigates to #pass.
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL test_url = GetTestUrl("device_sensors", "device_light_test.html");
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(riju): remove command line args when the feature goes stable.
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!CommandLine::ForCurrentProcess()->HasSwitch(
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switches::kEnableExperimentalWebPlatformFeatures)) {
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CommandLine::ForCurrentProcess()->AppendSwitch(
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        switches::kEnableExperimentalWebPlatformFeatures);
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2);
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fetcher_->started_light_.Wait();
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fetcher_->stopped_light_.Wait();
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DeviceInertialSensorBrowserTest, MotionTest) {
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The test page will register an event handler for motion events,
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // expects to get an event with fake values, then removes the event
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // handler and navigates to #pass.
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL test_url = GetTestUrl("device_sensors", "device_motion_test.html");
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2);
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fetcher_->started_motion_.Wait();
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fetcher_->stopped_motion_.Wait();
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// crbug/416406. The test is flaky.
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(DeviceInertialSensorBrowserTest,
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       DISABLED_LightOneOffInfintyTest) {
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The test page will register an event handler for light events,
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // expects to get an event with value equal to Infinity. This tests that the
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // one-off infinity event still propagates to window after the alert is
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // dismissed and the callback is invoked which navigates to #pass.
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fetcher_->SetSensorDataAvailable(false);
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(riju): remove command line args when the feature goes stable.
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!CommandLine::ForCurrentProcess()->HasSwitch(
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switches::kEnableExperimentalWebPlatformFeatures)) {
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CommandLine::ForCurrentProcess()->AppendSwitch(
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        switches::kEnableExperimentalWebPlatformFeatures);
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestNavigationObserver same_tab_observer(shell()->web_contents(), 2);
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL test_url =
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetTestUrl("device_sensors", "device_light_infinity_test.html");
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  shell()->LoadURL(test_url);
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WaitForAlertDialogAndQuitAfterDelay(base::TimeDelta::FromMilliseconds(1000));
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fetcher_->started_light_.Wait();
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fetcher_->stopped_light_.Wait();
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  same_tab_observer.Wait();
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Flaking in the android try bot. See http://crbug.com/360578.
299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_ANDROID)
300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define MAYBE_OrientationNullTestWithAlert DISABLED_OrientationNullTestWithAlert
301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define MAYBE_OrientationNullTestWithAlert OrientationNullTestWithAlert
303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(DeviceInertialSensorBrowserTest,
305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    MAYBE_OrientationNullTestWithAlert) {
306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The test page will register an event handler for orientation events,
307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // expects to get an event with null values. The test raises a modal alert
308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // dialog with a delay to test that the one-off null-event still propagates
309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // to window after the alert is dismissed and the callback is invoked which
310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // navigates to #pass.
311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  fetcher_->SetSensorDataAvailable(false);
312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  TestNavigationObserver same_tab_observer(shell()->web_contents(), 2);
313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL test_url = GetTestUrl("device_sensors",
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             "device_orientation_null_test_with_alert.html");
316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  shell()->LoadURL(test_url);
317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // TODO(timvolodine): investigate if it is possible to test this without
319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // delay, crbug.com/360044.
320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WaitForAlertDialogAndQuitAfterDelay(base::TimeDelta::FromMilliseconds(1000));
321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  fetcher_->started_orientation_.Wait();
323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  fetcher_->stopped_orientation_.Wait();
324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  same_tab_observer.Wait();
325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Flaking in the android try bot. See http://crbug.com/360578.
329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_ANDROID)
330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define MAYBE_MotionNullTestWithAlert DISABLED_MotionNullTestWithAlert
331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define MAYBE_MotionNullTestWithAlert MotionNullTestWithAlert
333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(DeviceInertialSensorBrowserTest,
335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    MAYBE_MotionNullTestWithAlert) {
336c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The test page will register an event handler for motion events,
337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // expects to get an event with null values. The test raises a modal alert
338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // dialog with a delay to test that the one-off null-event still propagates
339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // to window after the alert is dismissed and the callback is invoked which
340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // navigates to #pass.
341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  fetcher_->SetSensorDataAvailable(false);
342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  TestNavigationObserver same_tab_observer(shell()->web_contents(), 2);
343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GURL test_url =
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetTestUrl("device_sensors", "device_motion_null_test_with_alert.html");
346c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  shell()->LoadURL(test_url);
347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
348c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // TODO(timvolodine): investigate if it is possible to test this without
349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // delay, crbug.com/360044.
350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WaitForAlertDialogAndQuitAfterDelay(base::TimeDelta::FromMilliseconds(1000));
351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  fetcher_->started_motion_.Wait();
353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  fetcher_->stopped_motion_.Wait();
354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  same_tab_observer.Wait();
355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  //  namespace
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  //  namespace content
361