Cleanup RuntimeEnabledFeatures includes
[WebKit.git] / Source / WebCore / dom / PseudoElement.cpp
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  * Copyright (C) 2017 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Neither the name of Google Inc. nor the names of its
12  * contributors may be used to endorse or promote products derived from
13  * this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include "config.h"
29 #include "PseudoElement.h"
30
31 #include "CSSAnimationController.h"
32 #include "ContentData.h"
33 #include "DocumentTimeline.h"
34 #include "InspectorInstrumentation.h"
35 #include "RenderElement.h"
36 #include "RenderImage.h"
37 #include "RenderQuote.h"
38 #include "StyleResolver.h"
39 #include <wtf/IsoMallocInlines.h>
40
41 namespace WebCore {
42
43 WTF_MAKE_ISO_ALLOCATED_IMPL(PseudoElement);
44
45 const QualifiedName& pseudoElementTagName()
46 {
47     static NeverDestroyed<QualifiedName> name(nullAtom(), "<pseudo>", nullAtom());
48     return name;
49 }
50
51 String PseudoElement::pseudoElementNameForEvents(PseudoId pseudoId)
52 {
53     static NeverDestroyed<const String> after(MAKE_STATIC_STRING_IMPL("::after"));
54     static NeverDestroyed<const String> before(MAKE_STATIC_STRING_IMPL("::before"));
55     switch (pseudoId) {
56     case PseudoId::After:
57         return after;
58     case PseudoId::Before:
59         return before;
60     default:
61         return emptyString();
62     }
63 }
64
65 PseudoElement::PseudoElement(Element& host, PseudoId pseudoId)
66     : Element(pseudoElementTagName(), host.document(), CreatePseudoElement)
67     , m_hostElement(&host)
68     , m_pseudoId(pseudoId)
69 {
70     ASSERT(pseudoId == PseudoId::Before || pseudoId == PseudoId::After);
71     setHasCustomStyleResolveCallbacks();
72 }
73
74 PseudoElement::~PseudoElement()
75 {
76     ASSERT(!m_hostElement);
77 }
78
79 Ref<PseudoElement> PseudoElement::create(Element& host, PseudoId pseudoId)
80 {
81     auto pseudoElement = adoptRef(*new PseudoElement(host, pseudoId));
82
83     InspectorInstrumentation::pseudoElementCreated(host.document().page(), pseudoElement.get());
84
85     return pseudoElement;
86 }
87
88 void PseudoElement::clearHostElement()
89 {
90     InspectorInstrumentation::pseudoElementDestroyed(document().page(), *this);
91
92     if (auto* timeline = document().existingTimeline())
93         timeline->removeAnimationsForElement(*this);
94     if (auto* frame = document().frame())
95         frame->animation().cancelAnimations(*this);
96
97     m_hostElement = nullptr;
98 }
99
100 bool PseudoElement::rendererIsNeeded(const RenderStyle& style)
101 {
102     return pseudoElementRendererIsNeeded(&style);
103 }
104
105 } // namespace