| OLD | NEW | 
|---|
|  | (Empty) | 
| 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 |  | 
| 6  * are met: |  | 
| 7  * |  | 
| 8  * 1. Redistributions of source code must retain the above copyright |  | 
| 9  *    notice, this list of conditions and the following disclaimer. |  | 
| 10  * 2. Redistributions in binary form must reproduce the above copyright |  | 
| 11  *    notice, this list of conditions and the following disclaimer |  | 
| 12  *    in the documentation and/or other materials provided with the |  | 
| 13  *    distribution. |  | 
| 14  * 3. Neither the name of Google Inc. nor the names of its contributors |  | 
| 15  *    may be used to endorse or promote products derived from this |  | 
| 16  *    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 "core/dom/CustomElementCallbackDispatcher.h" |  | 
| 33 |  | 
| 34 #include "core/dom/CustomElementCallbackQueue.h" |  | 
| 35 #include "core/dom/CustomElementCallbackScheduler.h" |  | 
| 36 #include "wtf/MainThread.h" |  | 
| 37 |  | 
| 38 namespace WebCore { |  | 
| 39 |  | 
| 40 size_t CustomElementCallbackDispatcher::s_elementQueueStart = 0; |  | 
| 41 |  | 
| 42 // The base of the stack has a null sentinel value. |  | 
| 43 size_t CustomElementCallbackDispatcher::s_elementQueueEnd = kNumSentinels; |  | 
| 44 |  | 
| 45 CustomElementCallbackDispatcher& CustomElementCallbackDispatcher::instance() |  | 
| 46 { |  | 
| 47     DEFINE_STATIC_LOCAL(CustomElementCallbackDispatcher, instance, ()); |  | 
| 48     return instance; |  | 
| 49 } |  | 
| 50 |  | 
| 51 // Dispatches callbacks at microtask checkpoint. |  | 
| 52 bool CustomElementCallbackDispatcher::dispatch() |  | 
| 53 { |  | 
| 54     ASSERT(isMainThread()); |  | 
| 55     if (inCallbackDeliveryScope()) |  | 
| 56         return false; |  | 
| 57 |  | 
| 58     size_t start = kNumSentinels; // skip null sentinel |  | 
| 59     size_t end = s_elementQueueEnd; |  | 
| 60     ElementQueue thisQueue = currentElementQueue(); |  | 
| 61 |  | 
| 62     for (size_t i = start; i < end; i++) { |  | 
| 63         { |  | 
| 64             // The created callback may schedule entered document |  | 
| 65             // callbacks. |  | 
| 66             CallbackDeliveryScope deliveryScope; |  | 
| 67             m_flattenedProcessingStack[i]->processInElementQueue(thisQueue); |  | 
| 68         } |  | 
| 69 |  | 
| 70         ASSERT(!s_elementQueueStart); |  | 
| 71         ASSERT(s_elementQueueEnd == end); |  | 
| 72     } |  | 
| 73 |  | 
| 74     s_elementQueueEnd = kNumSentinels; |  | 
| 75     m_flattenedProcessingStack.resize(s_elementQueueEnd); |  | 
| 76 |  | 
| 77     CustomElementCallbackScheduler::clearElementCallbackQueueMap(); |  | 
| 78 |  | 
| 79     bool didWork = start < end; |  | 
| 80     return didWork; |  | 
| 81 } |  | 
| 82 |  | 
| 83 // Dispatches callbacks when popping the processing stack. |  | 
| 84 void CustomElementCallbackDispatcher::processElementQueueAndPop() |  | 
| 85 { |  | 
| 86     instance().processElementQueueAndPop(s_elementQueueStart, s_elementQueueEnd)
     ; |  | 
| 87 } |  | 
| 88 |  | 
| 89 void CustomElementCallbackDispatcher::processElementQueueAndPop(size_t start, si
     ze_t end) |  | 
| 90 { |  | 
| 91     ASSERT(isMainThread()); |  | 
| 92     ElementQueue thisQueue = currentElementQueue(); |  | 
| 93 |  | 
| 94     for (size_t i = start; i < end; i++) { |  | 
| 95         { |  | 
| 96             // The created callback may schedule entered document |  | 
| 97             // callbacks. |  | 
| 98             CallbackDeliveryScope deliveryScope; |  | 
| 99             m_flattenedProcessingStack[i]->processInElementQueue(thisQueue); |  | 
| 100         } |  | 
| 101 |  | 
| 102         ASSERT(start == s_elementQueueStart); |  | 
| 103         ASSERT(end == s_elementQueueEnd); |  | 
| 104     } |  | 
| 105 |  | 
| 106     // Pop the element queue from the processing stack |  | 
| 107     m_flattenedProcessingStack.resize(start); |  | 
| 108     s_elementQueueEnd = start; |  | 
| 109 |  | 
| 110     if (start == kNumSentinels) |  | 
| 111         CustomElementCallbackScheduler::clearElementCallbackQueueMap(); |  | 
| 112 } |  | 
| 113 |  | 
| 114 void CustomElementCallbackDispatcher::enqueue(CustomElementCallbackQueue* callba
     ckQueue) |  | 
| 115 { |  | 
| 116     if (callbackQueue->owner() == currentElementQueue()) |  | 
| 117         return; |  | 
| 118 |  | 
| 119     callbackQueue->setOwner(currentElementQueue()); |  | 
| 120     m_flattenedProcessingStack.append(callbackQueue); |  | 
| 121     ++s_elementQueueEnd; |  | 
| 122 } |  | 
| 123 |  | 
| 124 } // namespace WebCore |  | 
| OLD | NEW | 
|---|