1e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch/* 2e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2013 Google Inc. All rights reserved. 3e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 4e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Redistribution and use in source and binary forms, with or without 5e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * modification, are permitted provided that the following conditions 6e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * are met: 7e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 8e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 1. Redistributions of source code must retain the above copyright 9e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * notice, this list of conditions and the following disclaimer. 10e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 11e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * notice, this list of conditions and the following disclaimer 12e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * in the documentation and/or other materials provided with the 13e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * distribution. 14e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 3. Neither the name of Google Inc. nor the names of its contributors 15e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * may be used to endorse or promote products derived from this 16e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * software without specific prior written permission. 17e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 18e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */ 30e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "config.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/custom/CustomElementCallbackQueue.h" 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 36d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassOwnPtrWillBeRawPtr<CustomElementCallbackQueue> CustomElementCallbackQueue::create(PassRefPtrWillBeRawPtr<Element> element) 37e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 38d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return adoptPtrWillBeNoop(new CustomElementCallbackQueue(element)); 39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 41d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CustomElementCallbackQueue::CustomElementCallbackQueue(PassRefPtrWillBeRawPtr<Element> element) 42e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch : m_element(element) 43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch , m_owner(-1) 44e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch , m_index(0) 45e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) , m_inCreatedCallback(false) 46e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 47e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool CustomElementCallbackQueue::processInElementQueue(ElementQueueId caller) 50e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 51e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) ASSERT(!m_inCreatedCallback); 5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool didWork = false; 53e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 54e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch while (m_index < m_queue.size() && owner() == caller) { 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_inCreatedCallback = m_queue[m_index]->isCreatedCallback(); 56e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 57e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // dispatch() may cause recursion which steals this callback 58e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // queue and reenters processInQueue. owner() == caller 59e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // detects this recursion and cedes processing. 60e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_queue[m_index++]->dispatch(m_element.get()); 61e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_inCreatedCallback = false; 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) didWork = true; 63e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 64e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 65e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (owner() == caller && m_index == m_queue.size()) { 66e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // This processInQueue exhausted the queue; shrink it. 67e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_index = 0; 68e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_queue.resize(0); 69e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_owner = -1; 70e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return didWork; 73e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 74e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 75d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void CustomElementCallbackQueue::trace(Visitor* visitor) 76d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 77d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) visitor->trace(m_element); 78d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 80c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 81