Title: [194952] trunk/Source/WebCore
Revision
194952
Author
[email protected]
Date
2016-01-12 19:23:12 -0800 (Tue, 12 Jan 2016)

Log Message

[Content Filtering] De-virtualize PlatformContentFilter::{needsMoreData, didBlockData}()
https://bugs.webkit.org/show_bug.cgi?id=153052

Reviewed by Andreas Kling.

No new tests. No change in behavior.

Instead of having virtual functions that each platform content filter implement in terms of their own state,
store the state in the base class so that these functions can be non-virtual. Teach each subclass to update the
base class state appropriately.

* loader/ContentFilter.h:
* platform/PlatformContentFilter.h:
(WebCore::PlatformContentFilter::needsMoreData):
(WebCore::PlatformContentFilter::didBlockData):
* platform/cocoa/NetworkExtensionContentFilter.h:
* platform/cocoa/NetworkExtensionContentFilter.mm:
(WebCore::NetworkExtensionContentFilter::willSendRequest):
(WebCore::NetworkExtensionContentFilter::responseReceived):
(WebCore::NetworkExtensionContentFilter::handleDecision):
(WebCore::NetworkExtensionContentFilter::NetworkExtensionContentFilter): Deleted.
(WebCore::NetworkExtensionContentFilter::needsMoreData): Deleted.
(WebCore::NetworkExtensionContentFilter::didBlockData): Deleted.
* platform/cocoa/ParentalControlsContentFilter.h:
* platform/cocoa/ParentalControlsContentFilter.mm:
(WebCore::ParentalControlsContentFilter::responseReceived):
(WebCore::ParentalControlsContentFilter::updateFilterState):
(WebCore::ParentalControlsContentFilter::ParentalControlsContentFilter): Deleted.
(WebCore::ParentalControlsContentFilter::needsMoreData): Deleted.
(WebCore::ParentalControlsContentFilter::didBlockData): Deleted.
* platform/spi/cocoa/NEFilterSourceSPI.h:
* testing/MockContentFilter.cpp:
(WebCore::MockContentFilter::willSendRequest):
(WebCore::MockContentFilter::maybeDetermineStatus):
(WebCore::MockContentFilter::needsMoreData): Deleted.
(WebCore::MockContentFilter::didBlockData): Deleted.
* testing/MockContentFilter.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (194951 => 194952)


--- trunk/Source/WebCore/ChangeLog	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/ChangeLog	2016-01-13 03:23:12 UTC (rev 194952)
@@ -1,5 +1,45 @@
 2016-01-12  Andy Estes  <[email protected]>
 
+        [Content Filtering] De-virtualize PlatformContentFilter::{needsMoreData, didBlockData}()
+        https://bugs.webkit.org/show_bug.cgi?id=153052
+
+        Reviewed by Andreas Kling.
+
+        No new tests. No change in behavior.
+
+        Instead of having virtual functions that each platform content filter implement in terms of their own state,
+        store the state in the base class so that these functions can be non-virtual. Teach each subclass to update the
+        base class state appropriately.
+
+        * loader/ContentFilter.h:
+        * platform/PlatformContentFilter.h:
+        (WebCore::PlatformContentFilter::needsMoreData):
+        (WebCore::PlatformContentFilter::didBlockData):
+        * platform/cocoa/NetworkExtensionContentFilter.h:
+        * platform/cocoa/NetworkExtensionContentFilter.mm:
+        (WebCore::NetworkExtensionContentFilter::willSendRequest):
+        (WebCore::NetworkExtensionContentFilter::responseReceived):
+        (WebCore::NetworkExtensionContentFilter::handleDecision):
+        (WebCore::NetworkExtensionContentFilter::NetworkExtensionContentFilter): Deleted.
+        (WebCore::NetworkExtensionContentFilter::needsMoreData): Deleted.
+        (WebCore::NetworkExtensionContentFilter::didBlockData): Deleted.
+        * platform/cocoa/ParentalControlsContentFilter.h:
+        * platform/cocoa/ParentalControlsContentFilter.mm:
+        (WebCore::ParentalControlsContentFilter::responseReceived):
+        (WebCore::ParentalControlsContentFilter::updateFilterState):
+        (WebCore::ParentalControlsContentFilter::ParentalControlsContentFilter): Deleted.
+        (WebCore::ParentalControlsContentFilter::needsMoreData): Deleted.
+        (WebCore::ParentalControlsContentFilter::didBlockData): Deleted.
+        * platform/spi/cocoa/NEFilterSourceSPI.h:
+        * testing/MockContentFilter.cpp:
+        (WebCore::MockContentFilter::willSendRequest):
+        (WebCore::MockContentFilter::maybeDetermineStatus):
+        (WebCore::MockContentFilter::needsMoreData): Deleted.
+        (WebCore::MockContentFilter::didBlockData): Deleted.
+        * testing/MockContentFilter.h:
+
+2016-01-12  Andy Estes  <[email protected]>
+
         Address missed review feedback after r194950.
 
         * platform/cocoa/NetworkExtensionContentFilter.mm:

Modified: trunk/Source/WebCore/loader/ContentFilter.h (194951 => 194952)


--- trunk/Source/WebCore/loader/ContentFilter.h	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/loader/ContentFilter.h	2016-01-13 03:23:12 UTC (rev 194952)
@@ -29,6 +29,7 @@
 #if ENABLE(CONTENT_FILTERING)
 
 #include "CachedResourceHandle.h"
+#include "PlatformContentFilter.h"
 #include <functional>
 #include <wtf/Vector.h>
 
@@ -37,7 +38,6 @@
 class CachedRawResource;
 class ContentFilterUnblockHandler;
 class DocumentLoader;
-class PlatformContentFilter;
 class ResourceRequest;
 class ResourceResponse;
 class SharedBuffer;
@@ -67,12 +67,7 @@
     String unblockRequestDeniedScript() const;
 
 private:
-    enum class State {
-        Stopped,
-        Filtering,
-        Allowed,
-        Blocked,
-    };
+    using State = PlatformContentFilter::State;
 
     struct Type {
         const std::function<std::unique_ptr<PlatformContentFilter>()> create;

Modified: trunk/Source/WebCore/platform/PlatformContentFilter.h (194951 => 194952)


--- trunk/Source/WebCore/platform/PlatformContentFilter.h	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/platform/PlatformContentFilter.h	2016-01-13 03:23:12 UTC (rev 194952)
@@ -40,20 +40,29 @@
     WTF_MAKE_FAST_ALLOCATED;
     WTF_MAKE_NONCOPYABLE(PlatformContentFilter);
 
-protected:
-    PlatformContentFilter() = default;
+public:
+    enum class State {
+        Stopped,
+        Filtering,
+        Allowed,
+        Blocked,
+    };
 
-public:
+    bool needsMoreData() const { return m_state == State::Filtering; }
+    bool didBlockData() const { return m_state == State::Blocked; }
+
     virtual ~PlatformContentFilter() { }
     virtual void willSendRequest(ResourceRequest&, const ResourceResponse&) = 0;
     virtual void responseReceived(const ResourceResponse&) = 0;
     virtual void addData(const char* data, int length) = 0;
     virtual void finishedAddingData() = 0;
-    virtual bool needsMoreData() const = 0;
-    virtual bool didBlockData() const = 0;
     virtual Ref<SharedBuffer> replacementData() const = 0;
     virtual ContentFilterUnblockHandler unblockHandler() const = 0;
     virtual String unblockRequestDeniedScript() const { return emptyString(); }
+
+protected:
+    PlatformContentFilter() = default;
+    State m_state { State::Filtering };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.h (194951 => 194952)


--- trunk/Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.h	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.h	2016-01-13 03:23:12 UTC (rev 194952)
@@ -51,19 +51,16 @@
     void responseReceived(const ResourceResponse&) override;
     void addData(const char* data, int length) override;
     void finishedAddingData() override;
-    bool needsMoreData() const override;
-    bool didBlockData() const override;
     Ref<SharedBuffer> replacementData() const override;
     ContentFilterUnblockHandler unblockHandler() const override;
 
 private:
     static bool enabled();
 
-    NetworkExtensionContentFilter();
+    NetworkExtensionContentFilter() = default;
     void initialize(const URL* = nullptr);
     void handleDecision(NEFilterSourceStatus, NSData *replacementData);
 
-    NEFilterSourceStatus m_status;
     OSObjectPtr<dispatch_queue_t> m_queue;
     OSObjectPtr<dispatch_semaphore_t> m_semaphore;
     RetainPtr<NSData> m_replacementData;

Modified: trunk/Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.mm (194951 => 194952)


--- trunk/Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.mm	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.mm	2016-01-13 03:23:12 UTC (rev 194952)
@@ -63,11 +63,6 @@
     return std::make_unique<NetworkExtensionContentFilter>();
 }
 
-NetworkExtensionContentFilter::NetworkExtensionContentFilter()
-    : m_status { NEFilterSourceStatusNeedsMoreData }
-{
-}
-
 void NetworkExtensionContentFilter::initialize(const URL* url)
 {
     ASSERT(!m_queue);
@@ -89,7 +84,7 @@
 #if HAVE(MODERN_NE_FILTER_SOURCE)
     ASSERT(!request.isNull());
     if (!request.url().protocolIsInHTTPFamily() || !enabled()) {
-        m_status = NEFilterSourceStatusPass;
+        m_state = State::Allowed;
         return;
     }
 
@@ -132,13 +127,13 @@
 void NetworkExtensionContentFilter::responseReceived(const ResourceResponse& response)
 {
     if (!response.url().protocolIsInHTTPFamily()) {
-        m_status = NEFilterSourceStatusPass;
+        m_state = State::Allowed;
         return;
     }
 
 #if !HAVE(MODERN_NE_FILTER_SOURCE)
     if (!enabled()) {
-        m_status = NEFilterSourceStatusPass;
+        m_state = State::Allowed;
         return;
     }
 
@@ -195,16 +190,6 @@
     dispatch_semaphore_wait(m_semaphore.get(), DISPATCH_TIME_FOREVER);
 }
 
-bool NetworkExtensionContentFilter::needsMoreData() const
-{
-    return m_status == NEFilterSourceStatusNeedsMoreData;
-}
-
-bool NetworkExtensionContentFilter::didBlockData() const
-{
-    return m_status == NEFilterSourceStatusBlock;
-}
-
 Ref<SharedBuffer> NetworkExtensionContentFilter::replacementData() const
 {
     ASSERT(didBlockData());
@@ -233,8 +218,23 @@
 void NetworkExtensionContentFilter::handleDecision(NEFilterSourceStatus status, NSData *replacementData)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!replacementData || [replacementData isKindOfClass:[NSData class]]);
-    m_status = status;
-    if (status == NEFilterSourceStatusBlock)
+
+    switch (status) {
+    case NEFilterSourceStatusPass:
+    case NEFilterSourceStatusError:
+    case NEFilterSourceStatusWhitelisted:
+    case NEFilterSourceStatusBlacklisted:
+        m_state = State::Allowed;
+        break;
+    case NEFilterSourceStatusBlock:
+        m_state = State::Blocked;
+        break;
+    case NEFilterSourceStatusNeedsMoreData:
+        m_state = State::Filtering;
+        break;
+    }
+
+    if (didBlockData())
         m_replacementData = replacementData;
 #if !LOG_DISABLED
     if (!needsMoreData())

Modified: trunk/Source/WebCore/platform/cocoa/ParentalControlsContentFilter.h (194951 => 194952)


--- trunk/Source/WebCore/platform/cocoa/ParentalControlsContentFilter.h	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/platform/cocoa/ParentalControlsContentFilter.h	2016-01-13 03:23:12 UTC (rev 194952)
@@ -45,18 +45,15 @@
     void responseReceived(const ResourceResponse&) override;
     void addData(const char* data, int length) override;
     void finishedAddingData() override;
-    bool needsMoreData() const override;
-    bool didBlockData() const override;
     Ref<SharedBuffer> replacementData() const override;
     ContentFilterUnblockHandler unblockHandler() const override;
 
 private:
     static bool enabled();
 
-    ParentalControlsContentFilter();
+    ParentalControlsContentFilter() = default;
     void updateFilterState();
 
-    OSStatus m_filterState;
     RetainPtr<WebFilterEvaluator> m_webFilterEvaluator;
     RetainPtr<NSData> m_replacementData;
 };

Modified: trunk/Source/WebCore/platform/cocoa/ParentalControlsContentFilter.mm (194951 => 194952)


--- trunk/Source/WebCore/platform/cocoa/ParentalControlsContentFilter.mm	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/platform/cocoa/ParentalControlsContentFilter.mm	2016-01-13 03:23:12 UTC (rev 194952)
@@ -53,11 +53,6 @@
     return std::make_unique<ParentalControlsContentFilter>();
 }
 
-ParentalControlsContentFilter::ParentalControlsContentFilter()
-    : m_filterState { kWFEStateBuffering }
-{
-}
-
 static inline bool canHandleResponse(const ResourceResponse& response)
 {
 #if PLATFORM(MAC)
@@ -72,7 +67,7 @@
     ASSERT(!m_webFilterEvaluator);
 
     if (!canHandleResponse(response) || !enabled()) {
-        m_filterState = kWFEStateAllowed;
+        m_state = State::Allowed;
         return;
     }
 
@@ -95,16 +90,6 @@
     updateFilterState();
 }
 
-bool ParentalControlsContentFilter::needsMoreData() const
-{
-    return m_filterState == kWFEStateBuffering;
-}
-
-bool ParentalControlsContentFilter::didBlockData() const
-{
-    return m_filterState == kWFEStateBlocked;
-}
-
 Ref<SharedBuffer> ParentalControlsContentFilter::replacementData() const
 {
     ASSERT(didBlockData());
@@ -122,10 +107,22 @@
 
 void ParentalControlsContentFilter::updateFilterState()
 {
-    m_filterState = [m_webFilterEvaluator filterState];
+    switch ([m_webFilterEvaluator filterState]) {
+    case kWFEStateAllowed:
+    case kWFEStateEvaluating:
+        m_state = State::Allowed;
+        break;
+    case kWFEStateBlocked:
+        m_state = State::Blocked;
+        break;
+    case kWFEStateBuffering:
+        m_state = State::Filtering;
+        break;
+    }
+
 #if !LOG_DISABLED
     if (!needsMoreData())
-        LOG(ContentFiltering, "ParentalControlsContentFilter stopped buffering with state %d and replacement data length %zu.\n", m_filterState, [m_replacementData length]);
+        LOG(ContentFiltering, "ParentalControlsContentFilter stopped buffering with state %d and replacement data length %zu.\n", m_state, [m_replacementData length]);
 #endif
 }
 

Modified: trunk/Source/WebCore/platform/spi/cocoa/NEFilterSourceSPI.h (194951 => 194952)


--- trunk/Source/WebCore/platform/spi/cocoa/NEFilterSourceSPI.h	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/platform/spi/cocoa/NEFilterSourceSPI.h	2016-01-13 03:23:12 UTC (rev 194952)
@@ -36,6 +36,8 @@
     NEFilterSourceStatusBlock = 2,
     NEFilterSourceStatusNeedsMoreData = 3,
     NEFilterSourceStatusError = 4,
+    NEFilterSourceStatusWhitelisted = 5,
+    NEFilterSourceStatusBlacklisted = 6,
 };
 
 typedef NS_ENUM(NSInteger, NEFilterSourceDirection) {

Modified: trunk/Source/WebCore/testing/MockContentFilter.cpp (194951 => 194952)


--- trunk/Source/WebCore/testing/MockContentFilter.cpp	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/testing/MockContentFilter.cpp	2016-01-13 03:23:12 UTC (rev 194952)
@@ -71,7 +71,7 @@
 void MockContentFilter::willSendRequest(ResourceRequest& request, const ResourceResponse& redirectResponse)
 {
     if (!enabled()) {
-        m_status = Status::Allowed;
+        m_state = State::Allowed;
         return;
     }
 
@@ -80,7 +80,7 @@
     else
         maybeDetermineStatus(DecisionPoint::AfterRedirect);
 
-    if (m_status == Status::NeedsMoreData)
+    if (m_state == State::Filtering)
         return;
 
     String modifiedRequestURLString { settings().modifiedRequestURL() };
@@ -111,16 +111,6 @@
     maybeDetermineStatus(DecisionPoint::AfterFinishedAddingData);
 }
 
-bool MockContentFilter::needsMoreData() const
-{
-    return m_status == Status::NeedsMoreData;
-}
-
-bool MockContentFilter::didBlockData() const
-{
-    return m_status == Status::Blocked;
-}
-
 Ref<SharedBuffer> MockContentFilter::replacementData() const
 {
     ASSERT(didBlockData());
@@ -150,13 +140,13 @@
 
 void MockContentFilter::maybeDetermineStatus(DecisionPoint decisionPoint)
 {
-    if (m_status != Status::NeedsMoreData || decisionPoint != settings().decisionPoint())
+    if (m_state != State::Filtering || decisionPoint != settings().decisionPoint())
         return;
 
-    LOG(ContentFiltering, "MockContentFilter stopped buffering with status %u at decision point %u.\n", m_status, decisionPoint);
+    LOG(ContentFiltering, "MockContentFilter stopped buffering with state %u at decision point %u.\n", m_state, decisionPoint);
 
-    m_status = settings().decision() == Decision::Allow ? Status::Allowed : Status::Blocked;
-    if (m_status != Status::Blocked)
+    m_state = settings().decision() == Decision::Allow ? State::Allowed : State::Blocked;
+    if (m_state != State::Blocked)
         return;
 
     m_replacementData.clear();

Modified: trunk/Source/WebCore/testing/MockContentFilter.h (194951 => 194952)


--- trunk/Source/WebCore/testing/MockContentFilter.h	2016-01-13 02:09:37 UTC (rev 194951)
+++ trunk/Source/WebCore/testing/MockContentFilter.h	2016-01-13 03:23:12 UTC (rev 194952)
@@ -42,26 +42,17 @@
     void responseReceived(const ResourceResponse&) override;
     void addData(const char* data, int length) override;
     void finishedAddingData() override;
-    bool needsMoreData() const override;
-    bool didBlockData() const override;
     Ref<SharedBuffer> replacementData() const override;
     ContentFilterUnblockHandler unblockHandler() const override;
     String unblockRequestDeniedScript() const override;
 
 private:
-    enum class Status {
-        NeedsMoreData,
-        Allowed,
-        Blocked
-    };
-
     static bool enabled();
 
     MockContentFilter() = default;
     void maybeDetermineStatus(MockContentFilterSettings::DecisionPoint);
 
     Vector<char> m_replacementData;
-    Status m_status { Status::NeedsMoreData };
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to