Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WebCore / dom / AuthorStyleSheets.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6  * Copyright (C) 2004-2010, 2012-2013, 2015 Apple Inc. All rights reserved.
7  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
8  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
9  * Copyright (C) 2011 Google Inc. All rights reserved.
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Library General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Library General Public License for more details.
20  *
21  * You should have received a copy of the GNU Library General Public License
22  * along with this library; see the file COPYING.LIB.  If not, write to
23  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24  * Boston, MA 02110-1301, USA.
25  *
26  */
27
28 #ifndef AuthorStyleSheets_h
29 #define AuthorStyleSheets_h
30
31 #include "Timer.h"
32 #include <memory>
33 #include <wtf/FastMalloc.h>
34 #include <wtf/HashMap.h>
35 #include <wtf/ListHashSet.h>
36 #include <wtf/RefPtr.h>
37 #include <wtf/Vector.h>
38 #include <wtf/text/WTFString.h>
39
40 namespace WebCore {
41
42 class CSSStyleSheet;
43 class Document;
44 class Node;
45 class StyleSheet;
46 class StyleSheetContents;
47 class StyleSheetList;
48 class ShadowRoot;
49 class TreeScope;
50
51 class AuthorStyleSheets {
52     WTF_MAKE_FAST_ALLOCATED;
53 public:
54     explicit AuthorStyleSheets(Document&);
55     explicit AuthorStyleSheets(ShadowRoot&);
56
57     const Vector<RefPtr<CSSStyleSheet>>& activeStyleSheets() const { return m_activeStyleSheets; }
58
59     const Vector<RefPtr<StyleSheet>>& styleSheetsForStyleSheetList() const { return m_styleSheetsForStyleSheetList; }
60     const Vector<RefPtr<CSSStyleSheet>> activeStyleSheetsForInspector() const;
61
62     void addStyleSheetCandidateNode(Node&, bool createdByParser);
63     void removeStyleSheetCandidateNode(Node&);
64
65     enum UpdateFlag { NoUpdate = 0, OptimizedUpdate, FullUpdate };
66
67     UpdateFlag pendingUpdateType() const { return m_pendingUpdateType; }
68     void setPendingUpdateType(UpdateFlag updateType)
69     {
70         if (updateType > m_pendingUpdateType)
71             m_pendingUpdateType = updateType;
72     }
73
74     void flushPendingUpdates()
75     {
76         if (m_pendingUpdateType != NoUpdate)
77             updateActiveStyleSheets(m_pendingUpdateType);
78     }
79
80     bool updateActiveStyleSheets(UpdateFlag);
81
82     String preferredStylesheetSetName() const { return m_preferredStylesheetSetName; }
83     String selectedStylesheetSetName() const { return m_selectedStylesheetSetName; }
84     void setPreferredStylesheetSetName(const String& name) { m_preferredStylesheetSetName = name; }
85     void setSelectedStylesheetSetName(const String& name) { m_selectedStylesheetSetName = name; }
86
87     void addPendingSheet() { m_pendingStyleSheetCount++; }
88     enum RemovePendingSheetNotificationType {
89         RemovePendingSheetNotifyImmediately,
90         RemovePendingSheetNotifyLater
91     };
92     void removePendingSheet(RemovePendingSheetNotificationType = RemovePendingSheetNotifyImmediately);
93
94     bool hasPendingSheets() const { return m_pendingStyleSheetCount > 0; }
95
96     bool usesRemUnits() const { return m_usesRemUnits; }
97     void setUsesRemUnit(bool b) { m_usesRemUnits = b; }
98     bool usesStyleBasedEditability() { return m_usesStyleBasedEditability; }
99
100     bool activeStyleSheetsContains(const CSSStyleSheet*) const;
101
102 private:
103     void collectActiveStyleSheets(Vector<RefPtr<StyleSheet>>&);
104     enum StyleResolverUpdateType {
105         Reconstruct,
106         Reset,
107         Additive
108     };
109     StyleResolverUpdateType analyzeStyleSheetChange(UpdateFlag, const Vector<RefPtr<CSSStyleSheet>>& newStylesheets, bool& requiresFullStyleRecalc);
110     void updateStyleResolver(Vector<RefPtr<CSSStyleSheet>>&, StyleResolverUpdateType);
111
112     Document& m_document;
113     ShadowRoot* m_shadowRoot { nullptr };
114
115     Vector<RefPtr<StyleSheet>> m_styleSheetsForStyleSheetList;
116     Vector<RefPtr<CSSStyleSheet>> m_activeStyleSheets;
117
118     // This is a mirror of m_activeAuthorStyleSheets that gets populated on demand for activeStyleSheetsContains().
119     mutable std::unique_ptr<HashSet<const CSSStyleSheet*>> m_weakCopyOfActiveStyleSheetListForFastLookup;
120
121     // Track the number of currently loading top-level stylesheets needed for rendering.
122     // Sheets loaded using the @import directive are not included in this count.
123     // We use this count of pending sheets to detect when we can begin attaching
124     // elements and when it is safe to execute scripts.
125     int m_pendingStyleSheetCount { 0 };
126
127     bool m_hadActiveLoadingStylesheet { false };
128     UpdateFlag m_pendingUpdateType { NoUpdate };
129
130     ListHashSet<Node*> m_styleSheetCandidateNodes;
131
132     String m_preferredStylesheetSetName;
133     String m_selectedStylesheetSetName;
134
135     bool m_usesRemUnits { false };
136     bool m_usesStyleBasedEditability { false };
137 };
138
139 }
140
141 #endif
142