Changeset 254983 in webkit
- Timestamp:
- Jan 23, 2020, 10:50:55 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 1 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r254977 r254983 1 2020-01-23 Alex Christensen <achristensen@webkit.org> 2 3 ContentFilter should access DocumentLoader through an interface 4 https://bugs.webkit.org/show_bug.cgi?id=206564 5 6 Reviewed by Andy Estes. 7 8 This will make it easier to move, like to the NetworkProcess where there are no DocumentLoaders. 9 Also use WTF::Function instead of std::function and UniqueRef instead of std::unique_ptr. 10 No change in behavior. 11 12 * WebCore.xcodeproj/project.pbxproj: 13 * loader/ContentFilter.cpp: 14 (WebCore::ContentFilter::types): 15 (WebCore::ContentFilter::create): 16 (WebCore::ContentFilter::ContentFilter): 17 (WebCore::ContentFilter::continueAfterWillSendRequest): 18 (WebCore::ContentFilter::continueAfterResponseReceived): 19 (WebCore::ContentFilter::continueAfterDataReceived): 20 (WebCore::ContentFilter::continueAfterNotifyFinished): 21 (WebCore::ContentFilter::forEachContentFilterUntilBlocked): 22 (WebCore::ContentFilter::didDecide): 23 (WebCore::ContentFilter::deliverResourceData): 24 (WebCore::ContentFilter::handleProvisionalLoadFailure): 25 (): Deleted. 26 * loader/ContentFilter.h: 27 * loader/ContentFilterClient.h: Added. 28 (WebCore::ContentFilterClient::~ContentFilterClient): 29 * loader/DocumentLoader.cpp: 30 (WebCore::DocumentLoader::handleProvisionalLoadFailure): 31 (WebCore::DocumentLoader::didBlock): 32 * loader/DocumentLoader.h: 33 * platform/cocoa/NetworkExtensionContentFilter.h: 34 * platform/cocoa/NetworkExtensionContentFilter.mm: 35 (WebCore::NetworkExtensionContentFilter::create): 36 * platform/cocoa/ParentalControlsContentFilter.h: 37 * platform/cocoa/ParentalControlsContentFilter.mm: 38 (WebCore::ParentalControlsContentFilter::create): 39 1 40 2020-01-23 Zalan Bujtas <zalan@apple.com> 2 41 -
trunk/Source/WebCore/Headers.cmake
r254931 r254983 690 690 loader/AdClickAttribution.h 691 691 loader/CanvasActivityRecord.h 692 loader/ContentFilterClient.h 692 693 loader/CookieJar.h 693 694 loader/CrossOriginAccessControl.h -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r254931 r254983 1916 1916 5CD9F5671AA0F74200DA45FF /* DFABytecodeCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305F1AA0F6A90029C816 /* DFABytecodeCompiler.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1917 1917 5CD9F5681AA0F74600DA45FF /* DFABytecodeInterpreter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C3930611AA0F6A90029C816 /* DFABytecodeInterpreter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1918 5CDCDDC623D80A1C00BA34A1 /* ContentFilterClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CDCDDBF23D7B7BE00BA34A1 /* ContentFilterClient.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1918 1919 5CDD83641E4325A000621E92 /* LibWebRTCDataChannelHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CDD833F1E43253D00621E92 /* LibWebRTCDataChannelHandler.cpp */; }; 1919 1920 5CDFA6C81AA4F2DA00EA8746 /* ContentExtensionActions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CDFA6C71AA4F2DA00EA8746 /* ContentExtensionActions.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 9069 9070 5CCC270622D53B6800964FA0 /* AutofillElements.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutofillElements.h; sourceTree = "<group>"; }; 9070 9071 5CCC270722D53B6900964FA0 /* AutofillElements.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AutofillElements.cpp; sourceTree = "<group>"; }; 9072 5CDCDDBF23D7B7BE00BA34A1 /* ContentFilterClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentFilterClient.h; sourceTree = "<group>"; }; 9071 9073 5CDD83391E4324BB00621E83 /* RealtimeIncomingVideoSourceCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RealtimeIncomingVideoSourceCocoa.mm; sourceTree = "<group>"; }; 9072 9074 5CDD83391E4324BB00621E92 /* RealtimeIncomingVideoSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeIncomingVideoSource.cpp; sourceTree = "<group>"; }; … … 25752 25754 A149786C1ABAF33800CEF7E4 /* ContentFilter.cpp */, 25753 25755 A149786D1ABAF33800CEF7E4 /* ContentFilter.h */, 25756 5CDCDDBF23D7B7BE00BA34A1 /* ContentFilterClient.h */, 25754 25757 E1424C91164B52C800F32D40 /* CookieJar.cpp */, 25755 25758 E1424C92164B52C800F32D40 /* CookieJar.h */, … … 29433 29436 51FB67DC1AE6B82F00D06C5A /* ContentExtensionStyleSheet.h in Headers */, 29434 29437 A149786F1ABAF33800CEF7E4 /* ContentFilter.h in Headers */, 29438 5CDCDDC623D80A1C00BA34A1 /* ContentFilterClient.h in Headers */, 29435 29439 A14090FD1AA51E480091191A /* ContentFilterUnblockHandler.h in Headers */, 29436 29440 5C9C2DB52241A67B00996B0B /* ContentRuleListResults.h in Headers */, -
trunk/Source/WebCore/loader/ContentFilter.cpp
r253519 r254983 30 30 31 31 #include "CachedRawResource.h" 32 #include "ContentFilterClient.h" 32 33 #include "ContentFilterUnblockHandler.h" 33 34 #include "DocumentLoader.h" … … 55 56 { 56 57 static NeverDestroyed<Vector<ContentFilter::Type>> types { 57 Vector<ContentFilter::Type> {58 Vector<ContentFilter::Type>::from( 58 59 #if HAVE(PARENTAL_CONTROLS) 59 60 type<ParentalControlsContentFilter>(), … … 62 63 type<NetworkExtensionContentFilter>() 63 64 #endif 64 }65 ) 65 66 }; 66 67 return types; 67 68 } 68 69 69 std::unique_ptr<ContentFilter> ContentFilter::create( DocumentLoader& documentLoader)70 std::unique_ptr<ContentFilter> ContentFilter::create(ContentFilterClient& client) 70 71 { 71 72 Container filters; 72 73 for (auto& type : types()) { 73 74 auto filter = type.create(); 74 ASSERT(filter);75 75 filters.append(WTFMove(filter)); 76 76 } … … 79 79 return nullptr; 80 80 81 return makeUnique<ContentFilter>(WTFMove(filters), documentLoader);82 } 83 84 ContentFilter::ContentFilter(Container&& contentFilters, DocumentLoader& documentLoader)85 : m_contentFilters { WTFMove(contentFilters) }86 , m_ documentLoader { documentLoader }81 return makeUnique<ContentFilter>(WTFMove(filters), client); 82 } 83 84 ContentFilter::ContentFilter(Container&& contentFilters, ContentFilterClient& client) 85 : m_contentFilters(WTFMove(contentFilters)) 86 , m_client(client) 87 87 { 88 88 LOG(ContentFiltering, "Creating ContentFilter with %zu platform content filter(s).\n", m_contentFilters.size()); … … 97 97 bool ContentFilter::continueAfterWillSendRequest(ResourceRequest& request, const ResourceResponse& redirectResponse) 98 98 { 99 Ref< DocumentLoader> protectedDocumentLoader { m_documentLoader};99 Ref<ContentFilterClient> protectedClient { m_client }; 100 100 101 101 LOG(ContentFiltering, "ContentFilter received request for <%s> with redirect response from <%s>.\n", request.url().string().ascii().data(), redirectResponse.url().string().ascii().data()); … … 136 136 bool ContentFilter::continueAfterResponseReceived(const ResourceResponse& response) 137 137 { 138 Ref< DocumentLoader> protectedDocumentLoader { m_documentLoader};138 Ref<ContentFilterClient> protectedClient { m_client }; 139 139 140 140 if (m_state == State::Filtering) { … … 150 150 bool ContentFilter::continueAfterDataReceived(const char* data, int length) 151 151 { 152 Ref< DocumentLoader> protectedDocumentLoader { m_documentLoader};152 Ref<ContentFilterClient> protectedClient { m_client }; 153 153 154 154 if (m_state == State::Filtering) { … … 169 169 { 170 170 ASSERT_UNUSED(resource, &resource == m_mainResource); 171 Ref< DocumentLoader> protectedDocumentLoader { m_documentLoader};171 Ref<ContentFilterClient> protectedClient { m_client }; 172 172 173 173 if (m_mainResource->errorOccurred()) … … 202 202 } 203 203 204 function( *contentFilter);204 function(contentFilter.get()); 205 205 206 206 if (contentFilter->didBlockData()) { 207 207 ASSERT(!m_blockingContentFilter); 208 m_blockingContentFilter = contentFilter.get();208 m_blockingContentFilter = &contentFilter; 209 209 didDecide(State::Blocked); 210 210 return; … … 227 227 return; 228 228 229 ContentFilterUnblockHandler unblockHandler { m_blockingContentFilter->unblockHandler() }; 230 unblockHandler.setUnreachableURL(m_documentLoader.documentURL()); 231 auto frame { m_documentLoader.frame() }; 232 String unblockRequestDeniedScript { m_blockingContentFilter->unblockRequestDeniedScript() }; 233 if (!unblockRequestDeniedScript.isEmpty() && frame) { 234 unblockHandler.wrapWithDecisionHandler([scriptController = makeWeakPtr(frame->script()), script = unblockRequestDeniedScript.isolatedCopy()](bool unblocked) { 235 if (!unblocked && scriptController) 236 scriptController->executeScriptIgnoringException(script); 237 }); 238 } 239 m_documentLoader.frameLoader()->client().contentFilterDidBlockLoad(WTFMove(unblockHandler)); 240 241 m_blockedError = m_documentLoader.frameLoader()->blockedByContentFilterError(m_documentLoader.request()); 242 m_documentLoader.cancelMainResourceLoad(m_blockedError); 229 m_blockedError = m_client.contentFilterDidBlock(m_blockingContentFilter->unblockHandler(), m_blockingContentFilter->unblockRequestDeniedScript()); 230 m_client.cancelMainResourceLoadForContentFilter(m_blockedError); 243 231 } 244 232 … … 248 236 ASSERT(resource.dataBufferingPolicy() == DataBufferingPolicy::BufferData); 249 237 if (auto* resourceBuffer = resource.resourceBuffer()) 250 m_ documentLoader.dataReceived(resource,resourceBuffer->data(), resourceBuffer->size());238 m_client.dataReceivedThroughContentFilter(resourceBuffer->data(), resourceBuffer->size()); 251 239 } 252 240 … … 295 283 SubstituteData substituteData { WTFMove(replacementData), error.failingURL(), response, SubstituteData::SessionHistoryVisibility::Hidden }; 296 284 SetForScope<bool> loadingBlockedPage { m_isLoadingBlockedPage, true }; 297 m_ documentLoader.frameLoader()->load(FrameLoadRequest(*m_documentLoader.frame(), blockedPageURL(), ShouldOpenExternalURLsPolicy::ShouldNotAllow, substituteData));285 m_client.handleProvisionalLoadFailureFromContentFilter(blockedPageURL(), substituteData); 298 286 } 299 287 -
trunk/Source/WebCore/loader/ContentFilter.h
r246190 r254983 33 33 #include <functional> 34 34 #include <wtf/Forward.h> 35 #include <wtf/UniqueRef.h> 35 36 36 37 namespace WebCore { 37 38 38 39 class CachedRawResource; 40 class ContentFilterClient; 39 41 class DocumentLoader; 40 42 class ResourceRequest; … … 49 51 template <typename T> static void addType() { types().append(type<T>()); } 50 52 51 static std::unique_ptr<ContentFilter> create( DocumentLoader&);53 static std::unique_ptr<ContentFilter> create(ContentFilterClient&); 52 54 ~ContentFilter(); 53 55 … … 70 72 71 73 struct Type { 72 const std::function<std::unique_ptr<PlatformContentFilter>()> create;74 Function<UniqueRef<PlatformContentFilter>()> create; 73 75 }; 74 76 template <typename T> static Type type(); 75 77 WEBCORE_EXPORT static Vector<Type>& types(); 76 78 77 using Container = Vector< std::unique_ptr<PlatformContentFilter>>;78 friend std::unique_ptr<ContentFilter> std::make_unique<ContentFilter>(Container&&, DocumentLoader&);79 ContentFilter(Container&&, DocumentLoader&);79 using Container = Vector<UniqueRef<PlatformContentFilter>>; 80 friend std::unique_ptr<ContentFilter> std::make_unique<ContentFilter>(Container&&, ContentFilterClient&); 81 ContentFilter(Container&&, ContentFilterClient&); 80 82 81 83 template <typename Function> void forEachContentFilterUntilBlocked(Function&&); … … 83 85 void deliverResourceData(CachedResource&); 84 86 85 constContainer m_contentFilters;86 DocumentLoader& m_documentLoader;87 Container m_contentFilters; 88 ContentFilterClient& m_client; 87 89 CachedResourceHandle<CachedRawResource> m_mainResource; 88 PlatformContentFilter* m_blockingContentFilter { nullptr };90 const PlatformContentFilter* m_blockingContentFilter { nullptr }; 89 91 State m_state { State::Stopped }; 90 92 ResourceError m_blockedError; -
trunk/Source/WebCore/loader/DocumentLoader.cpp
r254857 r254983 103 103 #if ENABLE(CONTENT_FILTERING) 104 104 #include "ContentFilter.h" 105 #include "FrameLoadRequest.h" 106 #include "ScriptController.h" 105 107 #endif 106 108 … … 2187 2189 } 2188 2190 2191 #if ENABLE(CONTENT_FILTERING) 2192 void DocumentLoader::dataReceivedThroughContentFilter(const char* data, int size) 2193 { 2194 dataReceived(data, size); 2195 } 2196 2197 void DocumentLoader::cancelMainResourceLoadForContentFilter(const ResourceError& error) 2198 { 2199 cancelMainResourceLoad(error); 2200 } 2201 2202 void DocumentLoader::handleProvisionalLoadFailureFromContentFilter(const URL& blockedPageURL, SubstituteData& substituteData) 2203 { 2204 frameLoader()->load(FrameLoadRequest(*frame(), blockedPageURL, ShouldOpenExternalURLsPolicy::ShouldNotAllow, substituteData)); 2205 } 2206 2207 ResourceError DocumentLoader::contentFilterDidBlock(ContentFilterUnblockHandler unblockHandler, WTF::String&& unblockRequestDeniedScript) 2208 { 2209 unblockHandler.setUnreachableURL(documentURL()); 2210 if (!unblockRequestDeniedScript.isEmpty() && frame()) { 2211 unblockHandler.wrapWithDecisionHandler([scriptController = makeWeakPtr(frame()->script()), script = unblockRequestDeniedScript.isolatedCopy()](bool unblocked) { 2212 if (!unblocked && scriptController) 2213 scriptController->executeScriptIgnoringException(script); 2214 }); 2215 } 2216 frameLoader()->client().contentFilterDidBlockLoad(WTFMove(unblockHandler)); 2217 return frameLoader()->blockedByContentFilterError(request()); 2218 } 2219 #endif // ENABLE(CONTENT_FILTERING) 2220 2189 2221 } // namespace WebCore -
trunk/Source/WebCore/loader/DocumentLoader.h
r254087 r254983 32 32 #include "CachedRawResourceClient.h" 33 33 #include "CachedResourceHandle.h" 34 #include "ContentFilterClient.h" 34 35 #include "ContentSecurityPolicyClient.h" 35 36 #include "DeviceOrientationOrMotionPermissionState.h" … … 143 144 , public FrameDestructionObserver 144 145 , public ContentSecurityPolicyClient 146 #if ENABLE(CONTENT_FILTERING) 147 , public ContentFilterClient 148 #endif 145 149 , private CachedRawResourceClient { 146 150 WTF_MAKE_FAST_ALLOCATED_WITH_HEAP_IDENTIFIER(DocumentLoader); … … 367 371 368 372 #if ENABLE(CONTENT_FILTERING) 369 ContentFilter* contentFilter() const; 373 ContentFilter* contentFilter() const { return m_contentFilter.get(); } 374 void ref() const final { RefCounted<DocumentLoader>::ref(); } 375 void deref() const final { RefCounted<DocumentLoader>::deref(); } 370 376 #endif 371 377 … … 445 451 446 452 void responseReceived(const ResourceResponse&, CompletionHandler<void()>&&); 453 454 #if ENABLE(CONTENT_FILTERING) 455 // ContentFilterClient 456 WEBCORE_EXPORT void dataReceivedThroughContentFilter(const char*, int) final; 457 WEBCORE_EXPORT ResourceError contentFilterDidBlock(ContentFilterUnblockHandler, String&& unblockRequestDeniedScript) final; 458 WEBCORE_EXPORT void cancelMainResourceLoadForContentFilter(const ResourceError&) final; 459 WEBCORE_EXPORT void handleProvisionalLoadFailureFromContentFilter(const URL& blockedPageURL, SubstituteData&) final; 460 #endif 461 447 462 void dataReceived(const char* data, int length); 448 463 … … 703 718 } 704 719 705 #if ENABLE(CONTENT_FILTERING)706 707 inline ContentFilter* DocumentLoader::contentFilter() const708 {709 return m_contentFilter.get();710 }711 712 #endif713 714 720 inline void DocumentLoader::didTellClientAboutLoad(const String& url) 715 721 { -
trunk/Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.h
r253351 r254983 31 31 #include <wtf/OSObjectPtr.h> 32 32 #include <wtf/RetainPtr.h> 33 #include <wtf/UniqueRef.h> 33 34 34 35 enum NEFilterSourceStatus : NSInteger; … … 40 41 41 42 class NetworkExtensionContentFilter final : public PlatformContentFilter { 42 friend std::unique_ptr<NetworkExtensionContentFilter> std::make_unique<NetworkExtensionContentFilter>();43 friend UniqueRef<NetworkExtensionContentFilter> WTF::makeUniqueRefWithoutFastMallocCheck<NetworkExtensionContentFilter>(); 43 44 44 45 public: 45 static std::unique_ptr<NetworkExtensionContentFilter> create();46 static UniqueRef<NetworkExtensionContentFilter> create(); 46 47 47 48 void willSendRequest(ResourceRequest&, const ResourceResponse&) override; -
trunk/Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.mm
r253351 r254983 72 72 } 73 73 74 std::unique_ptr<NetworkExtensionContentFilter> NetworkExtensionContentFilter::create()75 { 76 return makeUnique <NetworkExtensionContentFilter>();74 UniqueRef<NetworkExtensionContentFilter> NetworkExtensionContentFilter::create() 75 { 76 return makeUniqueRef<NetworkExtensionContentFilter>(); 77 77 } 78 78 -
trunk/Source/WebCore/platform/cocoa/ParentalControlsContentFilter.h
r253440 r254983 29 29 #include <wtf/Compiler.h> 30 30 #include <wtf/RetainPtr.h> 31 #include <wtf/UniqueRef.h> 31 32 32 33 OBJC_CLASS NSData; … … 36 37 37 38 class ParentalControlsContentFilter final : public PlatformContentFilter { 38 friend std::unique_ptr<ParentalControlsContentFilter> std::make_unique<ParentalControlsContentFilter>();39 friend UniqueRef<ParentalControlsContentFilter> WTF::makeUniqueRefWithoutFastMallocCheck<ParentalControlsContentFilter>(); 39 40 40 41 public: 41 static std::unique_ptr<ParentalControlsContentFilter> create();42 static UniqueRef<ParentalControlsContentFilter> create(); 42 43 43 44 void willSendRequest(ResourceRequest&, const ResourceResponse&) override { } -
trunk/Source/WebCore/platform/cocoa/ParentalControlsContentFilter.mm
r253440 r254983 68 68 } 69 69 70 std::unique_ptr<ParentalControlsContentFilter> ParentalControlsContentFilter::create()70 UniqueRef<ParentalControlsContentFilter> ParentalControlsContentFilter::create() 71 71 { 72 return makeUnique <ParentalControlsContentFilter>();72 return makeUniqueRef<ParentalControlsContentFilter>(); 73 73 } 74 74 -
trunk/Source/WebCore/testing/MockContentFilter.cpp
r248846 r254983 63 63 } 64 64 65 std::unique_ptr<MockContentFilter> MockContentFilter::create()65 UniqueRef<MockContentFilter> MockContentFilter::create() 66 66 { 67 return makeUnique <MockContentFilter>();67 return makeUniqueRef<MockContentFilter>(); 68 68 } 69 69 -
trunk/Source/WebCore/testing/MockContentFilter.h
r208668 r254983 28 28 #include "MockContentFilterSettings.h" 29 29 #include "PlatformContentFilter.h" 30 #include <wtf/UniqueRef.h> 30 31 31 32 namespace WebCore { 32 33 33 34 class MockContentFilter final : public PlatformContentFilter { 34 friend std::unique_ptr<MockContentFilter> std::make_unique<MockContentFilter>();35 friend UniqueRef<MockContentFilter> WTF::makeUniqueRefWithoutFastMallocCheck<MockContentFilter>(); 35 36 36 37 public: 37 38 static void ensureInstalled(); 38 static std::unique_ptr<MockContentFilter> create();39 static UniqueRef<MockContentFilter> create(); 39 40 40 41 void willSendRequest(ResourceRequest&, const ResourceResponse&) override;
Note:
See TracChangeset
for help on using the changeset viewer.