71eed0cf7681ad8229a3b4ed8f7d5516ab0b5cf1
[WebKit-https.git] / Source / WebCore / testing / MockContentFilter.cpp
1 /*
2  * Copyright (C) 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 "MockContentFilter.h"
28
29 #if ENABLE(CONTENT_FILTERING)
30
31 #include <mutex>
32 #include <wtf/text/CString.h>
33
34 namespace WebCore {
35
36 void MockContentFilter::ensureInstalled()
37 {
38     static std::once_flag onceFlag;
39     std::call_once(onceFlag, []{
40         ContentFilter::addType<MockContentFilter>();
41     });
42 }
43
44 bool MockContentFilter::canHandleResponse(const ResourceResponse&)
45 {
46     return MockContentFilterSettings::singleton().enabled();
47 }
48
49 std::unique_ptr<MockContentFilter> MockContentFilter::create(const ResourceResponse& response)
50 {
51     return std::make_unique<MockContentFilter>(response);
52 }
53
54 MockContentFilter::MockContentFilter(const ResourceResponse&)
55 {
56     maybeDetermineStatus(MockContentFilterSettings::DecisionPoint::AfterResponse);
57 }
58
59 void MockContentFilter::addData(const char* data, int length)
60 {
61     m_replacementData.append(data, length);
62     maybeDetermineStatus(MockContentFilterSettings::DecisionPoint::AfterAddData);
63 }
64
65 void MockContentFilter::finishedAddingData()
66 {
67     maybeDetermineStatus(MockContentFilterSettings::DecisionPoint::AfterFinishedAddingData);
68 }
69
70 bool MockContentFilter::needsMoreData() const
71 {
72     return m_status == Status::NeedsMoreData;
73 }
74
75 bool MockContentFilter::didBlockData() const
76 {
77     return m_status == Status::Blocked;
78 }
79
80 const char* MockContentFilter::getReplacementData(int& length) const
81 {
82     length = m_replacementData.size();
83     return m_replacementData.data();
84 }
85
86 ContentFilterUnblockHandler MockContentFilter::unblockHandler() const
87 {
88     return { };
89 }
90
91 void MockContentFilter::maybeDetermineStatus(MockContentFilterSettings::DecisionPoint decisionPoint)
92 {
93     if (m_status != Status::NeedsMoreData || decisionPoint != MockContentFilterSettings::singleton().decisionPoint())
94         return;
95
96     m_status = MockContentFilterSettings::singleton().decision() == MockContentFilterSettings::Decision::Allow ? Status::Allowed : Status::Blocked;
97     if (m_status != Status::Blocked)
98         return;
99
100     m_replacementData.clear();
101     const CString utf8BlockedString = MockContentFilterSettings::singleton().blockedString().utf8();
102     m_replacementData.append(utf8BlockedString.data(), utf8BlockedString.length());
103 }
104
105 } // namespace WebCore
106
107 #endif // ENABLE(CONTENT_FILTERING)