b4e9dd9c0fd6d9bd6c93b81caae990bc04216b77
[WebKit-https.git] / Source / WebCore / loader / ContentFilter.h
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 #ifndef ContentFilter_h
27 #define ContentFilter_h
28
29 #if ENABLE(CONTENT_FILTERING)
30
31 #include "CachedRawResourceClient.h"
32 #include "CachedResourceHandle.h"
33 #include <functional>
34 #include <wtf/Vector.h>
35
36 namespace WebCore {
37
38 class CachedRawResource;
39 class ContentFilterUnblockHandler;
40 class PlatformContentFilter;
41 class SharedBuffer;
42
43 class ContentFilter final : private CachedRawResourceClient {
44     WTF_MAKE_FAST_ALLOCATED;
45     WTF_MAKE_NONCOPYABLE(ContentFilter);
46
47 public:
48     template <typename T> static void addType() { types().append(type<T>()); }
49
50     using DecisionFunction = std::function<void()>;
51     static std::unique_ptr<ContentFilter> createIfNeeded(DecisionFunction);
52     ~ContentFilter() override;
53
54     static const char* urlScheme() { return "x-apple-content-filter"; }
55
56     void willSendRequest(ResourceRequest&, const ResourceResponse&);
57     void startFilteringMainResource(CachedRawResource&);
58
59     enum class State {
60         Initialized,
61         Filtering,
62         Allowed,
63         Blocked
64     };
65     State state() const { return m_state; }
66     ContentFilterUnblockHandler unblockHandler() const;
67     Ref<SharedBuffer> replacementData() const;
68     String unblockRequestDeniedScript() const;
69
70 private:
71     struct Type {
72         const std::function<bool()> enabled;
73         const std::function<std::unique_ptr<PlatformContentFilter>()> create;
74     };
75     template <typename T> static Type type();
76     WEBCORE_EXPORT static Vector<Type>& types();
77
78     using Container = Vector<std::unique_ptr<PlatformContentFilter>>;
79     friend std::unique_ptr<ContentFilter> std::make_unique<ContentFilter>(Container&&, DecisionFunction&&);
80     ContentFilter(Container, DecisionFunction);
81
82     // CachedRawResourceClient
83     void responseReceived(CachedResource*, const ResourceResponse&) override;
84     void dataReceived(CachedResource*, const char* data, int length) override;
85     void redirectReceived(CachedResource*, ResourceRequest&, const ResourceResponse&) override;
86
87     // CachedResourceClient
88     void notifyFinished(CachedResource*) override;
89
90     void forEachContentFilterUntilBlocked(std::function<void(PlatformContentFilter&)>);
91     void didDecide(State);
92
93     const Container m_contentFilters;
94     const DecisionFunction m_decisionFunction;
95     CachedResourceHandle<CachedRawResource> m_mainResource;
96     PlatformContentFilter* m_blockingContentFilter { nullptr };
97     State m_state { State::Initialized };
98 };
99
100 template <typename T>
101 ContentFilter::Type ContentFilter::type()
102 {
103     static_assert(std::is_base_of<PlatformContentFilter, T>::value, "Type must be a PlatformContentFilter.");
104     return { T::enabled, T::create };
105 }
106
107 } // namespace WebCore
108
109 #endif // ENABLE(CONTENT_FILTERING)
110
111 #endif // ContentFilter_h