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