1/* 2 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include "config.h" 32#include "modules/device_orientation/DeviceSensorEventDispatcher.h" 33 34namespace WebCore { 35 36DeviceSensorEventDispatcher::DeviceSensorEventDispatcher() 37 : m_needsPurge(false) 38 , m_isDispatching(false) 39{ 40} 41 42DeviceSensorEventDispatcher::~DeviceSensorEventDispatcher() 43{ 44} 45 46void DeviceSensorEventDispatcher::addController(DeviceSensorEventController* controller) 47{ 48 bool wasEmpty = m_controllers.isEmpty(); 49 if (!m_controllers.contains(controller)) 50 m_controllers.append(controller); 51 if (wasEmpty) 52 startListening(); 53} 54 55void DeviceSensorEventDispatcher::removeController(DeviceSensorEventController* controller) 56{ 57 // Do not actually remove the controller from the vector, instead zero them out. 58 // The zeros are removed in these two cases: 59 // 1. either immediately if we are not dispatching any events, 60 // 2. or after didChangeDeviceMotion/Orientation has dispatched all events. 61 // This is to correctly handle the re-entrancy case when a controller is destroyed 62 // while in the didChangeDeviceMotion/Orientation method. 63 size_t index = m_controllers.find(controller); 64 if (index == kNotFound) 65 return; 66 67 m_controllers[index] = 0; 68 m_needsPurge = true; 69 70 if (!m_isDispatching) 71 purgeControllers(); 72} 73 74void DeviceSensorEventDispatcher::purgeControllers() 75{ 76 ASSERT(m_needsPurge); 77 78 size_t i = 0; 79 while (i < m_controllers.size()) { 80 if (!m_controllers[i]) { 81 m_controllers[i] = m_controllers.last(); 82 m_controllers.removeLast(); 83 } else { 84 ++i; 85 } 86 } 87 88 m_needsPurge = false; 89 90 if (m_controllers.isEmpty()) 91 stopListening(); 92} 93 94} // namespace WebCore 95