WebURLSchemeTaskProxy.cpp [plain text]
#include "config.h"
#include "WebURLSchemeTaskProxy.h"
#include "WebCoreArgumentCoders.h"
#include "WebPage.h"
#include "WebPageProxyMessages.h"
#include "WebURLSchemeHandlerProxy.h"
#include <WebCore/NetworkLoadMetrics.h>
#include <WebCore/ResourceError.h>
#include <WebCore/ResourceLoader.h>
#include <wtf/CurrentTime.h>
using namespace WebCore;
namespace WebKit {
WebURLSchemeTaskProxy::WebURLSchemeTaskProxy(WebURLSchemeHandlerProxy& handler, ResourceLoader& loader)
: m_urlSchemeHandler(handler)
, m_coreLoader(&loader)
, m_request(loader.request())
, m_identifier(loader.identifier())
{
}
void WebURLSchemeTaskProxy::startLoading()
{
ASSERT(m_coreLoader);
m_urlSchemeHandler.page().send(Messages::WebPageProxy::StartURLSchemeTask(m_urlSchemeHandler.identifier(), m_coreLoader->identifier(), m_request));
}
void WebURLSchemeTaskProxy::stopLoading()
{
ASSERT(m_coreLoader);
m_urlSchemeHandler.page().send(Messages::WebPageProxy::StopURLSchemeTask(m_urlSchemeHandler.identifier(), m_coreLoader->identifier()));
m_coreLoader = nullptr;
m_urlSchemeHandler.taskDidStopLoading(*this);
}
void WebURLSchemeTaskProxy::didPerformRedirection(WebCore::ResourceResponse&& redirectResponse, WebCore::ResourceRequest&& request)
{
if (!hasLoader())
return;
auto completionHandler = [this, protectedThis = makeRef(*this), originalRequest = request] (ResourceRequest&& request) {
m_waitingForRedirectCompletionHandler = false;
if (request.url() != originalRequest.url())
WTFLogAlways("Redirected scheme task would have been sent to a different URL.");
};
if (m_waitingForRedirectCompletionHandler)
WTFLogAlways("Received redirect during previous redirect processing.");
m_waitingForRedirectCompletionHandler = true;
m_coreLoader->willSendRequest(WTFMove(request), redirectResponse, WTFMove(completionHandler));
}
void WebURLSchemeTaskProxy::didReceiveResponse(const ResourceResponse& response)
{
if (m_waitingForRedirectCompletionHandler)
WTFLogAlways("Received response during redirect processing.");
if (!hasLoader())
return;
m_coreLoader->didReceiveResponse(response);
}
void WebURLSchemeTaskProxy::didReceiveData(size_t size, const uint8_t* data)
{
if (!hasLoader())
return;
m_coreLoader->didReceiveData(reinterpret_cast<const char*>(data), size, 0, DataPayloadType::DataPayloadBytes);
}
void WebURLSchemeTaskProxy::didComplete(const ResourceError& error)
{
if (!hasLoader())
return;
if (error.isNull())
m_coreLoader->didFinishLoading(NetworkLoadMetrics());
else
m_coreLoader->didFail(error);
m_coreLoader = nullptr;
}
bool WebURLSchemeTaskProxy::hasLoader()
{
if (m_coreLoader && m_coreLoader->reachedTerminalState())
m_coreLoader = nullptr;
return m_coreLoader;
}
}