Fix the windows build.
[WebKit-https.git] / Source / WebCore / page / UserContentController.cpp
1  /*
2  * Copyright (C) 2014-2015 Apple 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "UserContentController.h"
28
29 #include "DOMWrapperWorld.h"
30 #include "UserScript.h"
31 #include "UserStyleSheet.h"
32 #include <runtime/JSCellInlines.h>
33 #include <runtime/StructureInlines.h>
34
35 #if ENABLE(USER_MESSAGE_HANDLERS)
36 #include "UserMessageHandlerDescriptor.h"
37 #endif
38
39 #if ENABLE(CONTENT_EXTENSIONS)
40 #include "CompiledContentExtension.h"
41 #endif
42
43 namespace WebCore {
44
45 Ref<UserContentController> UserContentController::create()
46 {
47     return adoptRef(*new UserContentController);
48 }
49
50 UserContentController::UserContentController()
51 {
52 }
53
54 UserContentController::~UserContentController()
55 {
56 }
57
58 void UserContentController::forEachUserScript(const std::function<void(DOMWrapperWorld&, const UserScript&)>& functor) const
59 {
60     for (const auto& worldAndUserScriptVector : m_userScripts) {
61         auto& world = *worldAndUserScriptVector.key.get();
62         for (const auto& userScript : *worldAndUserScriptVector.value)
63             functor(world, *userScript);
64     }
65 }
66
67 void UserContentController::forEachUserStyleSheet(const std::function<void(const UserStyleSheet&)>& functor) const
68 {
69     for (auto& styleSheetVector : m_userStyleSheets.values()) {
70         for (const auto& styleSheet : *styleSheetVector)
71             functor(*styleSheet);
72     }
73 }
74
75 void UserContentController::addUserScript(DOMWrapperWorld& world, std::unique_ptr<UserScript> userScript)
76 {
77     auto& scriptsInWorld = m_userScripts.ensure(&world, [&] { return std::make_unique<UserScriptVector>(); }).iterator->value;
78     scriptsInWorld->append(WTFMove(userScript));
79 }
80
81 void UserContentController::removeUserScript(DOMWrapperWorld& world, const URL& url)
82 {
83     auto it = m_userScripts.find(&world);
84     if (it == m_userScripts.end())
85         return;
86
87     auto scripts = it->value.get();
88     for (int i = scripts->size() - 1; i >= 0; --i) {
89         if (scripts->at(i)->url() == url)
90             scripts->remove(i);
91     }
92
93     if (scripts->isEmpty())
94         m_userScripts.remove(it);
95 }
96
97 void UserContentController::removeUserScripts(DOMWrapperWorld& world)
98 {
99     m_userScripts.remove(&world);
100 }
101
102 void UserContentController::addUserStyleSheet(DOMWrapperWorld& world, std::unique_ptr<UserStyleSheet> userStyleSheet, UserStyleInjectionTime injectionTime)
103 {
104     auto& styleSheetsInWorld = m_userStyleSheets.ensure(&world, [&] { return std::make_unique<UserStyleSheetVector>(); }).iterator->value;
105     styleSheetsInWorld->append(WTFMove(userStyleSheet));
106
107     if (injectionTime == InjectInExistingDocuments)
108         invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
109 }
110
111 void UserContentController::removeUserStyleSheet(DOMWrapperWorld& world, const URL& url)
112 {
113     auto it = m_userStyleSheets.find(&world);
114     if (it == m_userStyleSheets.end())
115         return;
116
117     auto& stylesheets = *it->value;
118
119     bool sheetsChanged = false;
120     for (int i = stylesheets.size() - 1; i >= 0; --i) {
121         if (stylesheets[i]->url() == url) {
122             stylesheets.remove(i);
123             sheetsChanged = true;
124         }
125     }
126
127     if (!sheetsChanged)
128         return;
129
130     if (stylesheets.isEmpty())
131         m_userStyleSheets.remove(it);
132
133     invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
134 }
135
136 void UserContentController::removeUserStyleSheets(DOMWrapperWorld& world)
137 {
138     if (!m_userStyleSheets.remove(&world))
139         return;
140
141     invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
142 }
143
144 #if ENABLE(USER_MESSAGE_HANDLERS)
145 void UserContentController::addUserMessageHandlerDescriptor(UserMessageHandlerDescriptor& descriptor)
146 {
147     m_userMessageHandlerDescriptors.add(std::make_pair(descriptor.name(), &descriptor.world()), &descriptor);
148 }
149
150 void UserContentController::removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor& descriptor)
151 {
152     m_userMessageHandlerDescriptors.remove(std::make_pair(descriptor.name(), &descriptor.world()));
153 }
154 #endif
155
156 #if ENABLE(CONTENT_EXTENSIONS)
157 void UserContentController::addUserContentExtension(const String& name, RefPtr<ContentExtensions::CompiledContentExtension> contentExtension)
158 {
159     m_contentExtensionBackend.addContentExtension(name, contentExtension);
160 }
161
162 void UserContentController::removeUserContentExtension(const String& name)
163 {
164     m_contentExtensionBackend.removeContentExtension(name);
165 }
166
167 void UserContentController::removeAllUserContentExtensions()
168 {
169     m_contentExtensionBackend.removeAllContentExtensions();
170 }
171 #endif
172
173 void UserContentController::removeAllUserContent()
174 {
175     m_userScripts.clear();
176
177     if (!m_userStyleSheets.isEmpty()) {
178         m_userStyleSheets.clear();
179         invalidateInjectedStyleSheetCacheInAllFramesInAllPages();
180     }
181 }
182
183 } // namespace WebCore