109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// found in the LICENSE file.
409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#ifndef CustomElementMicrotaskDispatcher_h
609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#define CustomElementMicrotaskDispatcher_h
709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "platform/heap/Handle.h"
909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/Noncopyable.h"
1009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/PassOwnPtr.h"
1109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/Vector.h"
1209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
13c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
1409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class CustomElementCallbackQueue;
1609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class CustomElementMicrotaskImportStep;
1709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class CustomElementMicrotaskStep;
18197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass Document;
1910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochclass HTMLImportLoader;
2009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
21d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)class CustomElementMicrotaskDispatcher FINAL : public NoBaseWillBeGarbageCollected<CustomElementMicrotaskDispatcher> {
2209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(CustomElementMicrotaskDispatcher);
23d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(CustomElementMicrotaskDispatcher);
2409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)public:
2509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static CustomElementMicrotaskDispatcher& instance();
2609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void enqueue(CustomElementCallbackQueue*);
2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool elementQueueIsEmpty() { return m_elements.isEmpty(); }
3009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
31d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void trace(Visitor*);
32d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)private:
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    CustomElementMicrotaskDispatcher();
3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
36f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void ensureMicrotaskScheduledForElementQueue();
3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void ensureMicrotaskScheduled();
3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static void dispatch();
4009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void doDispatch();
4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool m_hasScheduledMicrotask;
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum {
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        Quiescent,
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        Resolving,
4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        DispatchingCallbacks
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } m_phase;
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
49d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WillBeHeapVector<RawPtrWillBeMember<CustomElementCallbackQueue> > m_elements;
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif // CustomElementMicrotaskDispatcher_h
55