This source file includes following definitions.
- loadImage
- sendPing
- sendViolationReport
- start
- m_identifier
- didReceiveResponse
- didReceiveData
- didFinishLoading
- didFail
- timeout
#include "config.h"
#include "core/loader/PingLoader.h"
#include "FetchInitiatorTypeNames.h"
#include "core/dom/Document.h"
#include "core/fetch/FetchContext.h"
#include "core/frame/LocalFrame.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/FrameLoaderClient.h"
#include "core/loader/UniqueIdentifier.h"
#include "core/page/Page.h"
#include "platform/exported/WrappedResourceRequest.h"
#include "platform/network/FormData.h"
#include "platform/network/ResourceError.h"
#include "platform/network/ResourceRequest.h"
#include "platform/network/ResourceResponse.h"
#include "platform/weborigin/SecurityOrigin.h"
#include "platform/weborigin/SecurityPolicy.h"
#include "public/platform/Platform.h"
#include "public/platform/WebURLLoader.h"
#include "public/platform/WebURLResponse.h"
#include "wtf/OwnPtr.h"
namespace WebCore {
void PingLoader::loadImage(LocalFrame* frame, const KURL& url)
{
if (!frame->document()->securityOrigin()->canDisplay(url)) {
FrameLoader::reportLocalLoadFailed(frame, url.string());
return;
}
ResourceRequest request(url);
request.setTargetType(ResourceRequest::TargetIsPing);
request.setHTTPHeaderField("Cache-Control", "max-age=0");
frame->loader().fetchContext().addAdditionalRequestHeaders(frame->document(), request, FetchSubresource);
FetchInitiatorInfo initiatorInfo;
initiatorInfo.name = FetchInitiatorTypeNames::ping;
PingLoader::start(frame, request, initiatorInfo);
}
void PingLoader::sendPing(LocalFrame* frame, const KURL& pingURL, const KURL& destinationURL)
{
ResourceRequest request(pingURL);
request.setTargetType(ResourceRequest::TargetIsPing);
request.setHTTPMethod("POST");
request.setHTTPContentType("text/ping");
request.setHTTPBody(FormData::create("PING"));
request.setHTTPHeaderField("Cache-Control", "max-age=0");
frame->loader().fetchContext().addAdditionalRequestHeaders(frame->document(), request, FetchSubresource);
RefPtr<SecurityOrigin> pingOrigin = SecurityOrigin::create(pingURL);
if (frame->document()->securityOrigin()->isSameSchemeHostPort(pingOrigin.get()))
request.clearHTTPReferrer();
request.setHTTPHeaderField("Ping-To", AtomicString(destinationURL.string()));
if (!SecurityPolicy::shouldHideReferrer(pingURL, frame->document()->url().string()))
request.setHTTPHeaderField("Ping-From", AtomicString(frame->document()->url().string()));
FetchInitiatorInfo initiatorInfo;
initiatorInfo.name = FetchInitiatorTypeNames::ping;
PingLoader::start(frame, request, initiatorInfo);
}
void PingLoader::sendViolationReport(LocalFrame* frame, const KURL& reportURL, PassRefPtr<FormData> report, ViolationReportType type)
{
ResourceRequest request(reportURL);
request.setTargetType(ResourceRequest::TargetIsSubresource);
request.setHTTPMethod("POST");
request.setHTTPContentType(type == ContentSecurityPolicyViolationReport ? "application/csp-report" : "application/json");
request.setHTTPBody(report);
frame->loader().fetchContext().addAdditionalRequestHeaders(frame->document(), request, FetchSubresource);
FetchInitiatorInfo initiatorInfo;
initiatorInfo.name = FetchInitiatorTypeNames::violationreport;
PingLoader::start(frame, request, initiatorInfo, SecurityOrigin::create(reportURL)->isSameSchemeHostPort(frame->document()->securityOrigin()) ? AllowStoredCredentials : DoNotAllowStoredCredentials);
}
void PingLoader::start(LocalFrame* frame, ResourceRequest& request, const FetchInitiatorInfo& initiatorInfo, StoredCredentials credentialsAllowed)
{
OwnPtr<PingLoader> pingLoader = adoptPtr(new PingLoader(frame, request, initiatorInfo, credentialsAllowed));
PingLoader* ALLOW_UNUSED leakedPingLoader = pingLoader.leakPtr();
}
PingLoader::PingLoader(LocalFrame* frame, ResourceRequest& request, const FetchInitiatorInfo& initiatorInfo, StoredCredentials credentialsAllowed)
: PageLifecycleObserver(frame->page())
, m_timeout(this, &PingLoader::timeout)
, m_url(request.url())
, m_identifier(createUniqueIdentifier())
{
frame->loader().client()->didDispatchPingLoader(request.url());
m_loader = adoptPtr(blink::Platform::current()->createURLLoader());
ASSERT(m_loader);
blink::WrappedResourceRequest wrappedRequest(request);
wrappedRequest.setAllowStoredCredentials(credentialsAllowed == AllowStoredCredentials);
m_loader->loadAsynchronously(wrappedRequest, this);
InspectorInstrumentation::willSendRequest(frame, m_identifier, frame->loader().documentLoader(), request, ResourceResponse(), initiatorInfo);
m_timeout.startOneShot(60000, FROM_HERE);
}
PingLoader::~PingLoader()
{
if (m_loader)
m_loader->cancel();
}
void PingLoader::didReceiveResponse(blink::WebURLLoader*, const blink::WebURLResponse&)
{
if (Page* page = this->page())
InspectorInstrumentation::didFailLoading(page->mainFrame(), m_identifier, ResourceError::cancelledError(m_url));
delete this;
}
void PingLoader::didReceiveData(blink::WebURLLoader*, const char* data, int dataLength, int encodedDataLength)
{
if (Page* page = this->page())
InspectorInstrumentation::didFailLoading(page->mainFrame(), m_identifier, ResourceError::cancelledError(m_url));
delete this;
}
void PingLoader::didFinishLoading(blink::WebURLLoader*, double, int64_t)
{
if (Page* page = this->page())
InspectorInstrumentation::didFailLoading(page->mainFrame(), m_identifier, ResourceError::cancelledError(m_url));
delete this;
}
void PingLoader::didFail(blink::WebURLLoader*, const blink::WebURLError& resourceError)
{
if (Page* page = this->page())
InspectorInstrumentation::didFailLoading(page->mainFrame(), m_identifier, ResourceError(resourceError));
delete this;
}
void PingLoader::timeout(Timer<PingLoader>*)
{
if (Page* page = this->page())
InspectorInstrumentation::didFailLoading(page->mainFrame(), m_identifier, ResourceError::cancelledError(m_url));
delete this;
}
}