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