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