blob: 82e50e15c54807028999e1ae6b7a2eb0523c7451 [file] [log] [blame]
Ben Murdoche69819b2013-07-17 14:56:49 +01001/*
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/CustomElementCallbackInvocation.h"
33
Ben Murdoch7757ec22013-07-23 11:17:36 +010034#include "core/dom/CustomElementCallbackScheduler.h"
35#include "core/dom/Element.h"
Ben Murdoche69819b2013-07-17 14:56:49 +010036
37namespace WebCore {
38
39class CreatedInvocation : public CustomElementCallbackInvocation {
40public:
41 CreatedInvocation(PassRefPtr<CustomElementLifecycleCallbacks> callbacks)
42 : CustomElementCallbackInvocation(callbacks)
43 {
44 }
45
46private:
47 virtual void dispatch(Element*) OVERRIDE;
48};
49
50void CreatedInvocation::dispatch(Element* element)
51{
Ben Murdochfff88842013-07-30 15:20:09 +010052 if (element->inDocument() && element->document()->defaultView())
Ben Murdoch7757ec22013-07-23 11:17:36 +010053 CustomElementCallbackScheduler::scheduleEnteredDocumentCallback(callbacks(), element);
Ben Murdoche69819b2013-07-17 14:56:49 +010054 callbacks()->created(element);
55}
56
57class EnteredLeftDocumentInvocation : public CustomElementCallbackInvocation {
58public:
59 EnteredLeftDocumentInvocation(PassRefPtr<CustomElementLifecycleCallbacks>, CustomElementLifecycleCallbacks::CallbackType which);
60
61private:
62 virtual void dispatch(Element*) OVERRIDE;
63
64 CustomElementLifecycleCallbacks::CallbackType m_which;
65};
66
67EnteredLeftDocumentInvocation::EnteredLeftDocumentInvocation(PassRefPtr<CustomElementLifecycleCallbacks> callbacks, CustomElementLifecycleCallbacks::CallbackType which)
68 : CustomElementCallbackInvocation(callbacks)
69 , m_which(which)
70{
71 ASSERT(m_which == CustomElementLifecycleCallbacks::EnteredDocument || m_which == CustomElementLifecycleCallbacks::LeftDocument);
72}
73
74void EnteredLeftDocumentInvocation::dispatch(Element* element)
75{
76 switch (m_which) {
77 case CustomElementLifecycleCallbacks::EnteredDocument:
78 callbacks()->enteredDocument(element);
79 break;
80 case CustomElementLifecycleCallbacks::LeftDocument:
81 callbacks()->leftDocument(element);
82 break;
83 default:
84 ASSERT_NOT_REACHED();
85 }
86}
87
88class AttributeChangedInvocation : public CustomElementCallbackInvocation {
89public:
90 AttributeChangedInvocation(PassRefPtr<CustomElementLifecycleCallbacks>, const AtomicString& name, const AtomicString& oldValue, const AtomicString& newValue);
91
92private:
93 virtual void dispatch(Element*) OVERRIDE;
94
95 AtomicString m_name;
96 AtomicString m_oldValue;
97 AtomicString m_newValue;
98};
99
100AttributeChangedInvocation::AttributeChangedInvocation(PassRefPtr<CustomElementLifecycleCallbacks> callbacks, const AtomicString& name, const AtomicString& oldValue, const AtomicString& newValue)
101 : CustomElementCallbackInvocation(callbacks)
102 , m_name(name)
103 , m_oldValue(oldValue)
104 , m_newValue(newValue)
105{
106}
107
108void AttributeChangedInvocation::dispatch(Element* element)
109{
110 callbacks()->attributeChanged(element, m_name, m_oldValue, m_newValue);
111}
112
113PassOwnPtr<CustomElementCallbackInvocation> CustomElementCallbackInvocation::createInvocation(PassRefPtr<CustomElementLifecycleCallbacks> callbacks, CustomElementLifecycleCallbacks::CallbackType which)
114{
115 switch (which) {
116 case CustomElementLifecycleCallbacks::Created:
117 return adoptPtr(new CreatedInvocation(callbacks));
118
119 case CustomElementLifecycleCallbacks::EnteredDocument:
120 case CustomElementLifecycleCallbacks::LeftDocument:
121 return adoptPtr(new EnteredLeftDocumentInvocation(callbacks, which));
122
123 default:
124 ASSERT_NOT_REACHED();
125 return PassOwnPtr<CustomElementCallbackInvocation>();
126 }
127}
128
129PassOwnPtr<CustomElementCallbackInvocation> CustomElementCallbackInvocation::createAttributeChangedInvocation(PassRefPtr<CustomElementLifecycleCallbacks> callbacks, const AtomicString& name, const AtomicString& oldValue, const AtomicString& newValue)
130{
131 return adoptPtr(new AttributeChangedInvocation(callbacks, name, oldValue, newValue));
132}
133
134} // namespace WebCore