[Content Filtering] Move ContentFilter to from platform/ to loader/
[WebKit-https.git] / Source / WebCore / loader / ContentFilter.cpp
1 /*
2  * Copyright (C) 2013 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 "ContentFilter.h"
28
29 #if ENABLE(CONTENT_FILTERING)
30
31 #include "NetworkExtensionContentFilter.h"
32 #include "ParentalControlsContentFilter.h"
33 #include <wtf/NeverDestroyed.h>
34
35 namespace WebCore {
36
37 Vector<ContentFilter::Type>& ContentFilter::types()
38 {
39     static NeverDestroyed<Vector<ContentFilter::Type>> types {
40         Vector<ContentFilter::Type> {
41             type<ParentalControlsContentFilter>(),
42 #if HAVE(NETWORK_EXTENSION)
43             type<NetworkExtensionContentFilter>()
44 #endif
45         }
46     };
47     return types;
48 }
49
50 std::unique_ptr<ContentFilter> ContentFilter::createIfNeeded(const ResourceResponse& response)
51 {
52     Container filters;
53     for (auto& type : types()) {
54         if (type.canHandleResponse(response))
55             filters.append(type.create(response));
56     }
57
58     if (filters.isEmpty())
59         return nullptr;
60
61     return std::make_unique<ContentFilter>(WTF::move(filters));
62 }
63
64 ContentFilter::ContentFilter(Container contentFilters)
65     : m_contentFilters { WTF::move(contentFilters) }
66 {
67     ASSERT(!m_contentFilters.isEmpty());
68 }
69
70 void ContentFilter::addData(const char* data, int length)
71 {
72     ASSERT(needsMoreData());
73
74     for (auto& contentFilter : m_contentFilters)
75         contentFilter->addData(data, length);
76 }
77     
78 void ContentFilter::finishedAddingData()
79 {
80     ASSERT(needsMoreData());
81
82     for (auto& contentFilter : m_contentFilters)
83         contentFilter->finishedAddingData();
84
85     ASSERT(!needsMoreData());
86 }
87
88 bool ContentFilter::needsMoreData() const
89 {
90     for (auto& contentFilter : m_contentFilters) {
91         if (contentFilter->needsMoreData())
92             return true;
93     }
94
95     return false;
96 }
97
98 bool ContentFilter::didBlockData() const
99 {
100     for (auto& contentFilter : m_contentFilters) {
101         if (contentFilter->didBlockData())
102             return true;
103     }
104
105     return false;
106 }
107
108 const char* ContentFilter::getReplacementData(int& length) const
109 {
110     ASSERT(!needsMoreData());
111
112     for (auto& contentFilter : m_contentFilters) {
113         if (contentFilter->didBlockData())
114             return contentFilter->getReplacementData(length);
115     }
116
117     return m_contentFilters[0]->getReplacementData(length);
118 }
119
120 ContentFilterUnblockHandler ContentFilter::unblockHandler() const
121 {
122     ASSERT(didBlockData());
123
124     for (auto& contentFilter : m_contentFilters) {
125         if (contentFilter->didBlockData())
126             return contentFilter->unblockHandler();
127     }
128
129     ASSERT_NOT_REACHED();
130     return { };
131 }
132
133 } // namespace WebCore
134
135 #endif // ENABLE(CONTENT_FILTERING)