Diff
Modified: trunk/Source/WebCore/ChangeLog (224521 => 224522)
--- trunk/Source/WebCore/ChangeLog 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/ChangeLog 2017-11-07 00:55:47 UTC (rev 224522)
@@ -1,3 +1,45 @@
+2017-11-06 Alex Christensen <[email protected]>
+
+ Make ResourceLoader::willSendRequestInternal asynchronous
+ https://bugs.webkit.org/show_bug.cgi?id=179251
+
+ Reviewed by Andy Estes.
+
+ ResourceLoader::willSendRequestInternal is used for redirects, which need to be asynchronous, and for the initial request.
+ Making it asynchronous requires making load initialization asynchronous, too.
+
+ No change in behavior. This will allow us to make more things asynchronous.
+
+ * loader/LoaderStrategy.h:
+ * loader/NetscapePlugInStreamLoader.cpp:
+ (WebCore::NetscapePlugInStreamLoader::create):
+ (WebCore::NetscapePlugInStreamLoader::init):
+ (WebCore::NetscapePlugInStreamLoader::willSendRequest):
+ * loader/NetscapePlugInStreamLoader.h:
+ * loader/ResourceLoader.cpp:
+ (WebCore::ResourceLoader::init):
+ (WebCore::ResourceLoader::willSendRequestInternal):
+ (WebCore::ResourceLoader::willSendRequest):
+ (WebCore::ResourceLoader::willSendRequestAsync):
+ * loader/ResourceLoader.h:
+ (WebCore::ResourceLoader::startLoading):
+ * loader/SubresourceLoader.cpp:
+ (WebCore::SubresourceLoader::create):
+ (WebCore::SubresourceLoader::startLoading):
+ (WebCore::SubresourceLoader::init):
+ (WebCore::SubresourceLoader::willSendRequestInternal):
+ * loader/SubresourceLoader.h:
+ * loader/cache/CachedResource.cpp:
+ (WebCore::CachedResource::load):
+ * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
+ (-[WebCoreResourceHandleAsOperationQueueDelegate connection:willSendRequest:redirectResponse:]):
+ (-[WebCoreResourceHandleAsOperationQueueDelegate connection:willCacheResponse:]):
+ Calling autorelease from a non-main thread was causing crashes. This is because we need to set up an autorelease pool on that thread, which we have not done. See:
+ https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-1041876
+ I replaced the calls to RetainPtr::autorelease with RetainPtr::get. This causes us to keep the NSURLRequest and NSURLResponse alive as long as the request is being
+ responded to in WebKitLegacy and in El Capitan. Given the number of ResourceRequest and ResourceResponse copies we store, this shouldn't be a problem memory-wise.
+ This will all go away once NSURLSession is used for loading in WebKitLegacy, and this is a large step towards that.
+
2017-11-06 Wenson Hsieh <[email protected]>
[Attachment Support] Implement delegate hooks for attachment element insertion and removal
Modified: trunk/Source/WebCore/loader/LoaderStrategy.h (224521 => 224522)
--- trunk/Source/WebCore/loader/LoaderStrategy.h 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/loader/LoaderStrategy.h 2017-11-07 00:55:47 UTC (rev 224522)
@@ -54,7 +54,7 @@
class WEBCORE_EXPORT LoaderStrategy {
public:
- virtual RefPtr<SubresourceLoader> loadResource(Frame&, CachedResource&, const ResourceRequest&, const ResourceLoaderOptions&) = 0;
+ virtual void loadResource(Frame&, CachedResource&, ResourceRequest&&, const ResourceLoaderOptions&, CompletionHandler<void(RefPtr<SubresourceLoader>&&)>&&) = 0;
virtual void loadResourceSynchronously(NetworkingContext*, unsigned long identifier, const ResourceRequest&, StoredCredentialsPolicy, ClientCredentialPolicy, ResourceError&, ResourceResponse&, Vector<char>& data) = 0;
virtual void remove(ResourceLoader*) = 0;
Modified: trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp (224521 => 224522)
--- trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp 2017-11-07 00:55:47 UTC (rev 224522)
@@ -54,13 +54,14 @@
NetscapePlugInStreamLoader::~NetscapePlugInStreamLoader() = default;
-RefPtr<NetscapePlugInStreamLoader> NetscapePlugInStreamLoader::create(Frame& frame, NetscapePlugInStreamLoaderClient& client, const ResourceRequest& request)
+void NetscapePlugInStreamLoader::create(Frame& frame, NetscapePlugInStreamLoaderClient& client, ResourceRequest&& request, CompletionHandler<void(RefPtr<NetscapePlugInStreamLoader>&&)>&& completionHandler)
{
- auto loader(adoptRef(new NetscapePlugInStreamLoader(frame, client)));
- if (!loader->init(request))
- return nullptr;
-
- return loader;
+ auto loader(adoptRef(*new NetscapePlugInStreamLoader(frame, client)));
+ loader->init(WTFMove(request), [loader = loader.copyRef(), completionHandler = WTFMove(completionHandler)] (bool initialized) mutable {
+ if (!initialized)
+ return completionHandler(nullptr);
+ completionHandler(WTFMove(loader));
+ });
}
bool NetscapePlugInStreamLoader::isDone() const
@@ -74,26 +75,25 @@
ResourceLoader::releaseResources();
}
-bool NetscapePlugInStreamLoader::init(const ResourceRequest& request)
+void NetscapePlugInStreamLoader::init(ResourceRequest&& request, CompletionHandler<void(bool)>&& completionHandler)
{
- if (!ResourceLoader::init(request))
- return false;
-
- ASSERT(!reachedTerminalState());
-
- m_documentLoader->addPlugInStreamLoader(*this);
- m_isInitialized = true;
-
- return true;
+ ResourceLoader::init(WTFMove(request), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] (bool success) mutable {
+ if (!success)
+ return completionHandler(false);
+ ASSERT(!reachedTerminalState());
+ m_documentLoader->addPlugInStreamLoader(*this);
+ m_isInitialized = true;
+ completionHandler(true);
+ });
}
void NetscapePlugInStreamLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& callback)
{
- m_client->willSendRequest(this, WTFMove(request), redirectResponse, [protectedThis = makeRef(*this), redirectResponse, callback = WTFMove(callback)](ResourceRequest request) mutable {
+ m_client->willSendRequest(this, WTFMove(request), redirectResponse, [protectedThis = makeRef(*this), redirectResponse, callback = WTFMove(callback)] (ResourceRequest&& request) mutable {
if (!request.isNull())
- protectedThis->willSendRequestInternal(request, redirectResponse);
-
- callback(WTFMove(request));
+ protectedThis->willSendRequestInternal(WTFMove(request), redirectResponse, WTFMove(callback));
+ else
+ callback({ });
});
}
Modified: trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h (224521 => 224522)
--- trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.h 2017-11-07 00:55:47 UTC (rev 224522)
@@ -51,13 +51,13 @@
class NetscapePlugInStreamLoader final : public ResourceLoader {
public:
- WEBCORE_EXPORT static RefPtr<NetscapePlugInStreamLoader> create(Frame&, NetscapePlugInStreamLoaderClient&, const ResourceRequest&);
+ WEBCORE_EXPORT static void create(Frame&, NetscapePlugInStreamLoaderClient&, ResourceRequest&&, CompletionHandler<void(RefPtr<NetscapePlugInStreamLoader>&&)>&&);
virtual ~NetscapePlugInStreamLoader();
WEBCORE_EXPORT bool isDone() const;
private:
- bool init(const ResourceRequest&) override;
+ void init(ResourceRequest&&, CompletionHandler<void(bool)>&&) override;
void willSendRequest(ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& callback) override;
void didReceiveResponse(const ResourceResponse&) override;
Modified: trunk/Source/WebCore/loader/ResourceLoader.cpp (224521 => 224522)
--- trunk/Source/WebCore/loader/ResourceLoader.cpp 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/loader/ResourceLoader.cpp 2017-11-07 00:55:47 UTC (rev 224522)
@@ -114,7 +114,7 @@
m_deferredRequest = ResourceRequest();
}
-bool ResourceLoader::init(const ResourceRequest& r)
+void ResourceLoader::init(ResourceRequest&& clientRequest, CompletionHandler<void(bool)>&& completionHandler)
{
ASSERT(!m_handle);
ASSERT(m_request.isNull());
@@ -121,8 +121,6 @@
ASSERT(m_deferredRequest.isNull());
ASSERT(!m_documentLoader->isSubstituteLoadPending(this));
- ResourceRequest clientRequest(r);
-
m_loadTiming.markStartTimeAndFetchStart();
#if PLATFORM(IOS)
@@ -130,17 +128,17 @@
// in ResourceLoadScheduler queue, don't continue.
if (!m_documentLoader->frame()) {
cancel();
- return false;
+ return completionHandler(false);
}
#endif
m_defersLoading = m_options.defersLoadingPolicy == DefersLoadingPolicy::AllowDefersLoading && m_frame->page()->defersLoading();
- m_canAskClientForCredentials = m_options.clientCredentialPolicy == ClientCredentialPolicy::MayAskClientForCredentials && !isMixedContent(r.url());
+ m_canAskClientForCredentials = m_options.clientCredentialPolicy == ClientCredentialPolicy::MayAskClientForCredentials && !isMixedContent(clientRequest.url());
if (m_options.securityCheck == DoSecurityCheck && !m_frame->document()->securityOrigin().canDisplay(clientRequest.url())) {
FrameLoader::reportLocalLoadFailed(m_frame.get(), clientRequest.url().string());
releaseResources();
- return false;
+ return completionHandler(false);
}
// https://bugs.webkit.org/show_bug.cgi?id=26391
@@ -153,21 +151,23 @@
clientRequest.setFirstPartyForCookies(document->firstPartyForCookies());
}
- willSendRequestInternal(clientRequest, ResourceResponse());
+ willSendRequestInternal(WTFMove(clientRequest), ResourceResponse(), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)](ResourceRequest&& request) mutable {
#if PLATFORM(IOS)
- // If this ResourceLoader was stopped as a result of willSendRequest, bail out.
- if (m_reachedTerminalState)
- return false;
+ // If this ResourceLoader was stopped as a result of willSendRequest, bail out.
+ if (m_reachedTerminalState)
+ return completionHandler(false);
#endif
- if (clientRequest.isNull()) {
- cancel();
- return false;
- }
+ if (request.isNull()) {
+ cancel();
+ return completionHandler(false);
+ }
- m_originalRequest = m_request = clientRequest;
- return true;
+ m_request = WTFMove(request);
+ m_originalRequest = m_request;
+ completionHandler(true);
+ });
}
void ResourceLoader::deliverResponseAndData(const ResourceResponse& response, RefPtr<SharedBuffer>&& buffer)
@@ -340,7 +340,7 @@
return false;
}
-void ResourceLoader::willSendRequestInternal(ResourceRequest& request, const ResourceResponse& redirectResponse)
+void ResourceLoader::willSendRequestInternal(ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
@@ -365,8 +365,8 @@
auto blockedStatus = page->userContentProvider().processContentExtensionRulesForLoad(request.url(), m_resourceType, *m_documentLoader);
applyBlockedStatusToRequest(blockedStatus, page, request);
if (blockedStatus.blockedLoad) {
- request = { };
didFail(blockedByContentBlockerError());
+ completionHandler({ });
return;
}
}
@@ -375,6 +375,7 @@
if (request.isNull()) {
didFail(cannotShowURLError());
+ completionHandler({ });
return;
}
@@ -384,8 +385,10 @@
#if PLATFORM(IOS)
// If this ResourceLoader was stopped as a result of assignIdentifierToInitialRequest, bail out
- if (m_reachedTerminalState)
+ if (m_reachedTerminalState) {
+ completionHandler(WTFMove(request));
return;
+ }
#endif
frameLoader()->notifier().willSendRequest(this, request, redirectResponse);
@@ -419,12 +422,12 @@
loadDataURL();
}
}
+ completionHandler(WTFMove(request));
}
-void ResourceLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& callback)
+void ResourceLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
- willSendRequestInternal(request, redirectResponse);
- callback(WTFMove(request));
+ willSendRequestInternal(WTFMove(request), redirectResponse, WTFMove(completionHandler));
}
void ResourceLoader::didSendData(unsigned long long, unsigned long long)
@@ -646,8 +649,7 @@
completionHandler(WTFMove(request));
return;
}
- willSendRequestInternal(request, redirectResponse);
- completionHandler(WTFMove(request));
+ willSendRequestInternal(WTFMove(request), redirectResponse, WTFMove(completionHandler));
}
void ResourceLoader::didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
Modified: trunk/Source/WebCore/loader/ResourceLoader.h (224521 => 224522)
--- trunk/Source/WebCore/loader/ResourceLoader.h 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/loader/ResourceLoader.h 2017-11-07 00:55:47 UTC (rev 224522)
@@ -60,15 +60,14 @@
WEBCORE_EXPORT void cancel();
- virtual bool init(const ResourceRequest&);
+ virtual void init(ResourceRequest&&, CompletionHandler<void(bool)>&&);
void deliverResponseAndData(const ResourceResponse&, RefPtr<SharedBuffer>&&);
#if PLATFORM(IOS)
- virtual bool startLoading()
+ virtual void startLoading()
{
start();
- return true;
}
virtual const ResourceRequest& iOSOriginalRequest() const { return request(); }
@@ -165,7 +164,7 @@
CFCachedURLResponseRef willCacheResponse(ResourceHandle*, CFCachedURLResponseRef) override;
#endif
- virtual void willSendRequestInternal(ResourceRequest&, const ResourceResponse& redirectResponse);
+ virtual void willSendRequestInternal(ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&&);
RefPtr<ResourceHandle> m_handle;
RefPtr<Frame> m_frame;
Modified: trunk/Source/WebCore/loader/SubresourceLoader.cpp (224521 => 224522)
--- trunk/Source/WebCore/loader/SubresourceLoader.cpp 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/loader/SubresourceLoader.cpp 2017-11-07 00:55:47 UTC (rev 224522)
@@ -45,6 +45,7 @@
#include "ResourceLoadObserver.h"
#include "ResourceTiming.h"
#include "RuntimeEnabledFeatures.h"
+#include <wtf/CompletionHandler.h>
#include <wtf/Ref.h>
#include <wtf/RefCountedLeakCounter.h>
#include <wtf/StdLibExtras.h>
@@ -102,9 +103,9 @@
#endif
}
-RefPtr<SubresourceLoader> SubresourceLoader::create(Frame& frame, CachedResource& resource, const ResourceRequest& request, const ResourceLoaderOptions& options)
+void SubresourceLoader::create(Frame& frame, CachedResource& resource, ResourceRequest&& request, const ResourceLoaderOptions& options, CompletionHandler<void(RefPtr<SubresourceLoader>&&)>&& completionHandler)
{
- RefPtr<SubresourceLoader> subloader(adoptRef(new SubresourceLoader(frame, resource, options)));
+ auto subloader(adoptRef(*new SubresourceLoader(frame, resource, options)));
#if PLATFORM(IOS)
if (!IOSApplication::isWebProcess()) {
// On iOS, do not invoke synchronous resource load delegates while resource load scheduling
@@ -111,23 +112,27 @@
// is disabled to avoid re-entering style selection from a different thread (see <rdar://problem/9121719>).
// FIXME: This should be fixed for all ports in <https://bugs.webkit.org/show_bug.cgi?id=56647>.
subloader->m_iOSOriginalRequest = request;
- return subloader;
+ return completionHandler(WTFMove(subloader));
}
#endif
- if (!subloader->init(request))
- return nullptr;
- return subloader;
+ subloader->init(WTFMove(request), [subloader = subloader.copyRef(), completionHandler = WTFMove(completionHandler)] (bool initialized) mutable {
+ if (!initialized)
+ return completionHandler(nullptr);
+ completionHandler(WTFMove(subloader));
+ });
}
#if PLATFORM(IOS)
-bool SubresourceLoader::startLoading()
+void SubresourceLoader::startLoading()
{
+ // FIXME: this should probably be removed.
ASSERT(!IOSApplication::isWebProcess());
- if (!init(m_iOSOriginalRequest))
- return false;
- m_iOSOriginalRequest = ResourceRequest();
- start();
- return true;
+ init(ResourceRequest(m_iOSOriginalRequest), [this, protectedThis = makeRef(*this)] (bool success) {
+ if (!success)
+ return;
+ m_iOSOriginalRequest = ResourceRequest();
+ start();
+ });
}
#endif
@@ -144,18 +149,17 @@
ResourceLoader::cancel();
}
-bool SubresourceLoader::init(const ResourceRequest& request)
+void SubresourceLoader::init(ResourceRequest&& request, CompletionHandler<void(bool)>&& completionHandler)
{
- if (!ResourceLoader::init(request))
- return false;
-
- ASSERT(!reachedTerminalState());
- m_state = Initialized;
- m_documentLoader->addSubresourceLoader(this);
-
- m_origin = m_resource->origin();
-
- return true;
+ ResourceLoader::init(WTFMove(request), [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] (bool initialized) mutable {
+ if (!initialized)
+ return completionHandler(false);
+ ASSERT(!reachedTerminalState());
+ m_state = Initialized;
+ m_documentLoader->addSubresourceLoader(this);
+ m_origin = m_resource->origin();
+ completionHandler(true);
+ });
}
bool SubresourceLoader::isSubresourceLoader()
@@ -163,7 +167,7 @@
return true;
}
-void SubresourceLoader::willSendRequestInternal(ResourceRequest& newRequest, const ResourceResponse& redirectResponse)
+void SubresourceLoader::willSendRequestInternal(ResourceRequest&& newRequest, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
{
// Store the previous URL because the call to ResourceLoader::willSendRequest will modify it.
URL previousURL = request().url();
@@ -171,7 +175,7 @@
if (!newRequest.url().isValid()) {
cancel(cannotShowURLError());
- return;
+ return completionHandler(WTFMove(newRequest));
}
if (newRequest.requester() != ResourceRequestBase::Requester::Main) {
@@ -184,7 +188,7 @@
if (options().redirect != FetchOptions::Redirect::Follow) {
if (options().redirect == FetchOptions::Redirect::Error) {
cancel();
- return;
+ return completionHandler(WTFMove(newRequest));
}
ResourceResponse opaqueRedirectedResponse = redirectResponse;
@@ -194,10 +198,10 @@
NetworkLoadMetrics emptyMetrics;
didFinishLoading(emptyMetrics);
- return;
+ return completionHandler(WTFMove(newRequest));
} else if (m_redirectCount++ >= options().maxRedirectCount) {
cancel(ResourceError(String(), 0, request().url(), ASCIILiteral("Too many redirections"), ResourceError::Type::General));
- return;
+ return completionHandler(WTFMove(newRequest));
}
// CachedResources are keyed off their original request URL.
@@ -213,7 +217,7 @@
if (!m_documentLoader->cachedResourceLoader().updateRequestAfterRedirection(m_resource->type(), newRequest, options())) {
cancel();
- return;
+ return completionHandler(WTFMove(newRequest));
}
String errorDescription;
@@ -222,12 +226,12 @@
if (m_frame && m_frame->document())
m_frame->document()->addConsoleMessage(MessageSource::Security, MessageLevel::Error, errorMessage);
cancel(ResourceError(String(), 0, request().url(), errorMessage, ResourceError::Type::AccessControl));
- return;
+ return completionHandler(WTFMove(newRequest));
}
if (m_resource->isImage() && m_documentLoader->cachedResourceLoader().shouldDeferImageLoad(newRequest.url())) {
cancel();
- return;
+ return completionHandler(WTFMove(newRequest));
}
m_loadTiming.addRedirect(redirectResponse.url(), newRequest.url());
m_resource->redirectReceived(newRequest, redirectResponse);
@@ -234,20 +238,21 @@
}
if (newRequest.isNull() || reachedTerminalState())
- return;
+ return completionHandler(WTFMove(newRequest));
- ResourceLoader::willSendRequestInternal(newRequest, redirectResponse);
-
- if (reachedTerminalState())
- return;
-
- if (newRequest.isNull()) {
- cancel();
- return;
- }
-
- if (m_resource->type() == CachedResource::MainResource && !redirectResponse.isNull())
- m_documentLoader->willContinueMainResourceLoadAfterRedirect(newRequest);
+ ResourceLoader::willSendRequestInternal(WTFMove(newRequest), redirectResponse, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler), redirectResponse] (ResourceRequest&& request) mutable {
+ if (reachedTerminalState())
+ return completionHandler(WTFMove(request));
+
+ if (request.isNull()) {
+ cancel();
+ return completionHandler(WTFMove(request));
+ }
+
+ if (m_resource->type() == CachedResource::MainResource && !redirectResponse.isNull())
+ m_documentLoader->willContinueMainResourceLoadAfterRedirect(request);
+ completionHandler(WTFMove(request));
+ });
}
void SubresourceLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
Modified: trunk/Source/WebCore/loader/SubresourceLoader.h (224521 => 224522)
--- trunk/Source/WebCore/loader/SubresourceLoader.h 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/loader/SubresourceLoader.h 2017-11-07 00:55:47 UTC (rev 224522)
@@ -42,7 +42,7 @@
class SubresourceLoader final : public ResourceLoader {
public:
- WEBCORE_EXPORT static RefPtr<SubresourceLoader> create(Frame&, CachedResource&, const ResourceRequest&, const ResourceLoaderOptions&);
+ WEBCORE_EXPORT static void create(Frame&, CachedResource&, ResourceRequest&&, const ResourceLoaderOptions&, CompletionHandler<void(RefPtr<SubresourceLoader>&&)>&&);
virtual ~SubresourceLoader();
@@ -52,7 +52,7 @@
SecurityOrigin* origin() { return m_origin.get(); }
#if PLATFORM(IOS)
- bool startLoading() override;
+ void startLoading() override;
// FIXME: What is an "iOS" original request? Why is it necessary?
const ResourceRequest& iOSOriginalRequest() const override { return m_iOSOriginalRequest; }
@@ -63,9 +63,9 @@
private:
SubresourceLoader(Frame&, CachedResource&, const ResourceLoaderOptions&);
- bool init(const ResourceRequest&) override;
+ void init(ResourceRequest&&, CompletionHandler<void(bool)>&&) override;
- void willSendRequestInternal(ResourceRequest&, const ResourceResponse& redirectResponse) override;
+ void willSendRequestInternal(ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&&) override;
void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
void didReceiveResponse(const ResourceResponse&) override;
void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType) override;
Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (224521 => 224522)
--- trunk/Source/WebCore/loader/cache/CachedResource.cpp 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp 2017-11-07 00:55:47 UTC (rev 224522)
@@ -48,6 +48,7 @@
#include "SecurityOrigin.h"
#include "SubresourceLoader.h"
#include "URL.h"
+#include <wtf/CompletionHandler.h>
#include <wtf/CurrentTime.h>
#include <wtf/MathExtras.h>
#include <wtf/RefCountedLeakCounter.h>
@@ -293,14 +294,15 @@
}
}
- m_loader = platformStrategies()->loaderStrategy()->loadResource(frame, *this, request, m_options);
- if (!m_loader) {
- RELEASE_LOG_IF_ALLOWED("load: Unable to create SubresourceLoader (frame = %p)", &frame);
- failBeforeStarting();
- return;
- }
-
- m_status = Pending;
+ platformStrategies()->loaderStrategy()->loadResource(frame, *this, WTFMove(request), m_options, [this, protectedThis = CachedResourceHandle<CachedResource>(this), frame = makeRef(frame), loggingAllowed = cachedResourceLoader.isAlwaysOnLoggingAllowed()] (RefPtr<SubresourceLoader>&& loader) {
+ m_loader = WTFMove(loader);
+ if (!m_loader) {
+ RELEASE_LOG_IF(loggingAllowed, Network, "%p - CachedResource::load: Unable to create SubresourceLoader (frame = %p)", this, frame.ptr());
+ failBeforeStarting();
+ return;
+ }
+ m_status = Pending;
+ });
}
void CachedResource::loadFrom(const CachedResource& resource)
Modified: trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm (224521 => 224522)
--- trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebCore/platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm 2017-11-07 00:55:47 UTC (rev 224522)
@@ -128,7 +128,7 @@
callOnMainThread(WTFMove(work));
dispatch_semaphore_wait(m_semaphore, DISPATCH_TIME_FOREVER);
- return m_requestResult.autorelease();
+ return m_requestResult.get();
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
@@ -334,7 +334,7 @@
callOnMainThread(WTFMove(work));
dispatch_semaphore_wait(m_semaphore, DISPATCH_TIME_FOREVER);
- return m_cachedResponseResult.autorelease();
+ return m_cachedResponseResult.get();
}
@end
Modified: trunk/Source/WebKit/ChangeLog (224521 => 224522)
--- trunk/Source/WebKit/ChangeLog 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKit/ChangeLog 2017-11-07 00:55:47 UTC (rev 224522)
@@ -1,3 +1,17 @@
+2017-11-06 Alex Christensen <[email protected]>
+
+ Make ResourceLoader::willSendRequestInternal asynchronous
+ https://bugs.webkit.org/show_bug.cgi?id=179251
+
+ Reviewed by Andy Estes.
+
+ * WebProcess/Network/WebLoaderStrategy.cpp:
+ (WebKit::WebLoaderStrategy::loadResource):
+ (WebKit::WebLoaderStrategy::schedulePluginStreamLoad):
+ * WebProcess/Network/WebLoaderStrategy.h:
+ * WebProcess/Plugins/PluginView.cpp:
+ (WebKit::PluginView::Stream::start):
+
2017-11-06 Wenson Hsieh <[email protected]>
[Attachment Support] Implement delegate hooks for attachment element insertion and removal
Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (224521 => 224522)
--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp 2017-11-07 00:55:47 UTC (rev 224522)
@@ -65,6 +65,7 @@
#include <WebCore/SubresourceLoader.h>
#include <WebCore/UserContentProvider.h>
#include <pal/SessionID.h>
+#include <wtf/CompletionHandler.h>
#include <wtf/text/CString.h>
#if USE(QUICK_LOOK)
@@ -87,22 +88,24 @@
{
}
-RefPtr<SubresourceLoader> WebLoaderStrategy::loadResource(Frame& frame, CachedResource& resource, const ResourceRequest& request, const ResourceLoaderOptions& options)
+void WebLoaderStrategy::loadResource(Frame& frame, CachedResource& resource, ResourceRequest&& request, const ResourceLoaderOptions& options, CompletionHandler<void(RefPtr<SubresourceLoader>&&)>&& completionHandler)
{
- RefPtr<SubresourceLoader> loader = SubresourceLoader::create(frame, resource, request, options);
- if (loader)
- scheduleLoad(*loader, &resource, frame.document()->referrerPolicy() == ReferrerPolicy::NoReferrerWhenDowngrade);
- else
- RELEASE_LOG_IF_ALLOWED(frame, "loadResource: Unable to create SubresourceLoader (frame = %p", &frame);
- return loader;
+ SubresourceLoader::create(frame, resource, WTFMove(request), options, [this, completionHandler = WTFMove(completionHandler), resource = CachedResourceHandle<CachedResource>(&resource), frame = makeRef(frame)] (RefPtr<SubresourceLoader>&& loader) mutable {
+ if (loader)
+ scheduleLoad(*loader, resource.get(), frame->document()->referrerPolicy() == ReferrerPolicy::NoReferrerWhenDowngrade);
+ else
+ RELEASE_LOG_IF_ALLOWED(frame.get(), "loadResource: Unable to create SubresourceLoader (frame = %p", &frame);
+ completionHandler(WTFMove(loader));
+ });
}
-RefPtr<NetscapePlugInStreamLoader> WebLoaderStrategy::schedulePluginStreamLoad(Frame& frame, NetscapePlugInStreamLoaderClient& client, const ResourceRequest& request)
+void WebLoaderStrategy::schedulePluginStreamLoad(Frame& frame, NetscapePlugInStreamLoaderClient& client, ResourceRequest&& request, CompletionHandler<void(RefPtr<NetscapePlugInStreamLoader>&&)>&& completionHandler)
{
- RefPtr<NetscapePlugInStreamLoader> loader = NetscapePlugInStreamLoader::create(frame, client, request);
- if (loader)
- scheduleLoad(*loader, 0, frame.document()->referrerPolicy() == ReferrerPolicy::NoReferrerWhenDowngrade);
- return loader;
+ NetscapePlugInStreamLoader::create(frame, client, WTFMove(request), [this, completionHandler = WTFMove(completionHandler), frame = makeRef(frame)] (RefPtr<NetscapePlugInStreamLoader>&& loader) mutable {
+ if (loader)
+ scheduleLoad(*loader, 0, frame->document()->referrerPolicy() == ReferrerPolicy::NoReferrerWhenDowngrade);
+ completionHandler(WTFMove(loader));
+ });
}
static Seconds maximumBufferingTime(CachedResource* resource)
Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h (224521 => 224522)
--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h 2017-11-07 00:55:47 UTC (rev 224522)
@@ -47,7 +47,7 @@
WebLoaderStrategy();
~WebLoaderStrategy() final;
- RefPtr<WebCore::SubresourceLoader> loadResource(WebCore::Frame&, WebCore::CachedResource&, const WebCore::ResourceRequest&, const WebCore::ResourceLoaderOptions&) final;
+ void loadResource(WebCore::Frame&, WebCore::CachedResource&, WebCore::ResourceRequest&&, const WebCore::ResourceLoaderOptions&, CompletionHandler<void(RefPtr<WebCore::SubresourceLoader>&&)>&&) final;
void loadResourceSynchronously(WebCore::NetworkingContext*, unsigned long resourceLoadIdentifier, const WebCore::ResourceRequest&, WebCore::StoredCredentialsPolicy, WebCore::ClientCredentialPolicy, WebCore::ResourceError&, WebCore::ResourceResponse&, Vector<char>& data) final;
void remove(WebCore::ResourceLoader*) final;
@@ -70,7 +70,7 @@
void setCaptureExtraNetworkLoadMetricsEnabled(bool) final;
WebResourceLoader* webResourceLoaderForIdentifier(ResourceLoadIdentifier identifier) const { return m_webResourceLoaders.get(identifier); }
- RefPtr<WebCore::NetscapePlugInStreamLoader> schedulePluginStreamLoad(WebCore::Frame&, WebCore::NetscapePlugInStreamLoaderClient&, const WebCore::ResourceRequest&);
+ void schedulePluginStreamLoad(WebCore::Frame&, WebCore::NetscapePlugInStreamLoaderClient&, WebCore::ResourceRequest&&, CompletionHandler<void(RefPtr<WebCore::NetscapePlugInStreamLoader>&&)>&&);
void networkProcessCrashed();
Modified: trunk/Source/WebKit/WebProcess/Plugins/PluginView.cpp (224521 => 224522)
--- trunk/Source/WebKit/WebProcess/Plugins/PluginView.cpp 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKit/WebProcess/Plugins/PluginView.cpp 2017-11-07 00:55:47 UTC (rev 224522)
@@ -167,7 +167,9 @@
Frame* frame = m_pluginView->m_pluginElement->document().frame();
ASSERT(frame);
- m_loader = WebProcess::singleton().webLoaderStrategy().schedulePluginStreamLoad(*frame, *this, m_request);
+ WebProcess::singleton().webLoaderStrategy().schedulePluginStreamLoad(*frame, *this, ResourceRequest {m_request}, [this, protectedThis = makeRef(*this)](RefPtr<NetscapePlugInStreamLoader>&& loader) {
+ m_loader = WTFMove(loader);
+ });
}
void PluginView::Stream::cancel()
Modified: trunk/Source/WebKitLegacy/ChangeLog (224521 => 224522)
--- trunk/Source/WebKitLegacy/ChangeLog 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKitLegacy/ChangeLog 2017-11-07 00:55:47 UTC (rev 224522)
@@ -1,3 +1,15 @@
+2017-11-06 Alex Christensen <[email protected]>
+
+ Make ResourceLoader::willSendRequestInternal asynchronous
+ https://bugs.webkit.org/show_bug.cgi?id=179251
+
+ Reviewed by Andy Estes.
+
+ * WebCoreSupport/WebResourceLoadScheduler.cpp:
+ (WebResourceLoadScheduler::loadResource):
+ (WebResourceLoadScheduler::schedulePluginStreamLoad):
+ * WebCoreSupport/WebResourceLoadScheduler.h:
+
2017-11-02 Christopher Reid <[email protected]>
Add a FileSystem namespace to FileSystem.cpp
Modified: trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp (224521 => 224522)
--- trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp 2017-11-07 00:55:47 UTC (rev 224522)
@@ -88,21 +88,22 @@
{
}
-RefPtr<SubresourceLoader> WebResourceLoadScheduler::loadResource(Frame& frame, CachedResource& resource, const ResourceRequest& request, const ResourceLoaderOptions& options)
+void WebResourceLoadScheduler::loadResource(Frame& frame, CachedResource& resource, ResourceRequest&& request, const ResourceLoaderOptions& options, CompletionHandler<void(RefPtr<WebCore::SubresourceLoader>&&)>&& completionHandler)
{
- RefPtr<SubresourceLoader> loader = SubresourceLoader::create(frame, resource, request, options);
- if (loader)
- scheduleLoad(loader.get());
+ SubresourceLoader::create(frame, resource, WTFMove(request), options, [this, completionHandler = WTFMove(completionHandler)] (RefPtr<WebCore::SubresourceLoader>&& loader) mutable {
+ if (loader)
+ scheduleLoad(loader.get());
#if PLATFORM(IOS)
- // Since we defer loader initialization until scheduling on iOS, the frame
- // load delegate that would be called in SubresourceLoader::create() on
- // other ports might be called in scheduleLoad() instead. Our contract to
- // callers of this method is that a null loader is returned if the load was
- // cancelled by a frame load delegate.
- if (!loader || loader->reachedTerminalState())
- return nullptr;
+ // Since we defer loader initialization until scheduling on iOS, the frame
+ // load delegate that would be called in SubresourceLoader::create() on
+ // other ports might be called in scheduleLoad() instead. Our contract to
+ // callers of this method is that a null loader is returned if the load was
+ // cancelled by a frame load delegate.
+ if (!loader || loader->reachedTerminalState())
+ return completionHandler(nullptr);
#endif
- return loader;
+ completionHandler(WTFMove(loader));
+ });
}
void WebResourceLoadScheduler::loadResourceSynchronously(NetworkingContext* context, unsigned long, const ResourceRequest& request, StoredCredentialsPolicy storedCredentialsPolicy, ClientCredentialPolicy, ResourceError& error, ResourceResponse& response, Vector<char>& data)
@@ -110,12 +111,13 @@
ResourceHandle::loadResourceSynchronously(context, request, storedCredentialsPolicy, error, response, data);
}
-RefPtr<NetscapePlugInStreamLoader> WebResourceLoadScheduler::schedulePluginStreamLoad(Frame& frame, NetscapePlugInStreamLoaderClient& client, const ResourceRequest& request)
+void WebResourceLoadScheduler::schedulePluginStreamLoad(Frame& frame, NetscapePlugInStreamLoaderClient& client, ResourceRequest&& request, CompletionHandler<void(RefPtr<WebCore::NetscapePlugInStreamLoader>&&)>&& completionHandler)
{
- RefPtr<NetscapePlugInStreamLoader> loader = NetscapePlugInStreamLoader::create(frame, client, request);
- if (loader)
- scheduleLoad(loader.get());
- return loader;
+ NetscapePlugInStreamLoader::create(frame, client, WTFMove(request), [this, completionHandler = WTFMove(completionHandler)] (RefPtr<WebCore::NetscapePlugInStreamLoader>&& loader) mutable {
+ if (loader)
+ scheduleLoad(loader.get());
+ completionHandler(WTFMove(loader));
+ });
}
void WebResourceLoadScheduler::scheduleLoad(ResourceLoader* resourceLoader)
Modified: trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h (224521 => 224522)
--- trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h 2017-11-07 00:55:47 UTC (rev 224522)
@@ -49,7 +49,7 @@
public:
WebResourceLoadScheduler();
- RefPtr<WebCore::SubresourceLoader> loadResource(WebCore::Frame&, WebCore::CachedResource&, const WebCore::ResourceRequest&, const WebCore::ResourceLoaderOptions&) final;
+ void loadResource(WebCore::Frame&, WebCore::CachedResource&, WebCore::ResourceRequest&&, const WebCore::ResourceLoaderOptions&, CompletionHandler<void(RefPtr<WebCore::SubresourceLoader>&&)>&&) final;
void loadResourceSynchronously(WebCore::NetworkingContext*, unsigned long, const WebCore::ResourceRequest&, WebCore::StoredCredentialsPolicy, WebCore::ClientCredentialPolicy, WebCore::ResourceError&, WebCore::ResourceResponse&, Vector<char>&) final;
void remove(WebCore::ResourceLoader*) final;
void setDefersLoading(WebCore::ResourceLoader*, bool) final;
@@ -70,7 +70,7 @@
bool isSerialLoadingEnabled() const { return m_isSerialLoadingEnabled; }
void setSerialLoadingEnabled(bool b) { m_isSerialLoadingEnabled = b; }
- RefPtr<WebCore::NetscapePlugInStreamLoader> schedulePluginStreamLoad(WebCore::Frame&, WebCore::NetscapePlugInStreamLoaderClient&, const WebCore::ResourceRequest&);
+ void schedulePluginStreamLoad(WebCore::Frame&, WebCore::NetscapePlugInStreamLoaderClient&, WebCore::ResourceRequest&&, CompletionHandler<void(RefPtr<WebCore::NetscapePlugInStreamLoader>&&)>&&);
protected:
virtual ~WebResourceLoadScheduler();
Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (224521 => 224522)
--- trunk/Source/WebKitLegacy/mac/ChangeLog 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog 2017-11-07 00:55:47 UTC (rev 224522)
@@ -1,3 +1,15 @@
+2017-11-06 Alex Christensen <[email protected]>
+
+ Make ResourceLoader::willSendRequestInternal asynchronous
+ https://bugs.webkit.org/show_bug.cgi?id=179251
+
+ Reviewed by Andy Estes.
+
+ * Plugins/Hosted/HostedNetscapePluginStream.mm:
+ (WebKit::HostedNetscapePluginStream::start):
+ * Plugins/WebNetscapePluginStream.mm:
+ (WebNetscapePluginStream::start):
+
2017-11-01 Darin Adler <[email protected]>
Simplify event dispatch code and make it a bit more consistent
Modified: trunk/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.mm (224521 => 224522)
--- trunk/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.mm 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKitLegacy/mac/Plugins/Hosted/HostedNetscapePluginStream.mm 2017-11-07 00:55:47 UTC (rev 224522)
@@ -223,7 +223,9 @@
ASSERT(!m_frameLoader);
ASSERT(!m_loader);
- m_loader = webResourceLoadScheduler().schedulePluginStreamLoad(*core([m_instance->pluginView() webFrame]), *this, m_request.get());
+ webResourceLoadScheduler().schedulePluginStreamLoad(*core([m_instance->pluginView() webFrame]), *this, m_request.get(), [this, protectedThis = makeRef(*this)] (RefPtr<WebCore::NetscapePlugInStreamLoader>&& loader) {
+ m_loader = WTFMove(loader);
+ });
}
void HostedNetscapePluginStream::stop()
Modified: trunk/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.mm (224521 => 224522)
--- trunk/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.mm 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKitLegacy/mac/Plugins/WebNetscapePluginStream.mm 2017-11-07 00:55:47 UTC (rev 224522)
@@ -291,7 +291,9 @@
ASSERT(!m_frameLoader);
ASSERT(!m_loader);
- m_loader = webResourceLoadScheduler().schedulePluginStreamLoad(*core([m_pluginView.get() webFrame]), *this, m_request.get());
+ webResourceLoadScheduler().schedulePluginStreamLoad(*core([m_pluginView.get() webFrame]), *this, m_request.get(), [this, protectedThis = makeRef(*this)] (RefPtr<WebCore::NetscapePlugInStreamLoader>&& loader) {
+ m_loader = WTFMove(loader);
+ });
}
void WebNetscapePluginStream::stop()
Modified: trunk/Source/WebKitLegacy/win/Plugins/PluginStream.cpp (224521 => 224522)
--- trunk/Source/WebKitLegacy/win/Plugins/PluginStream.cpp 2017-11-07 00:55:08 UTC (rev 224521)
+++ trunk/Source/WebKitLegacy/win/Plugins/PluginStream.cpp 2017-11-07 00:55:47 UTC (rev 224522)
@@ -98,7 +98,9 @@
{
ASSERT(!m_loadManually);
ASSERT(m_frame);
- m_loader = webResourceLoadScheduler().schedulePluginStreamLoad(*m_frame, *this, m_resourceRequest);
+ webResourceLoadScheduler().schedulePluginStreamLoad(*m_frame, *this, ResourceRequest(m_resourceRequest), [this, protectedThis = makeRef(*this)] (RefPtr<WebCore::NetscapePlugInStreamLoader>&& loader) {
+ m_loader = WTFMove(loader);
+ });
}
void PluginStream::stop()