OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 29 matching lines...) Expand all Loading... |
40 #include "core/loader/UniqueIdentifier.h" | 40 #include "core/loader/UniqueIdentifier.h" |
41 #include "platform/exported/WrappedResourceRequest.h" | 41 #include "platform/exported/WrappedResourceRequest.h" |
42 #include "platform/network/FormData.h" | 42 #include "platform/network/FormData.h" |
43 #include "platform/network/ResourceRequest.h" | 43 #include "platform/network/ResourceRequest.h" |
44 #include "platform/network/ResourceResponse.h" | 44 #include "platform/network/ResourceResponse.h" |
45 #include "platform/weborigin/SecurityOrigin.h" | 45 #include "platform/weborigin/SecurityOrigin.h" |
46 #include "platform/weborigin/SecurityPolicy.h" | 46 #include "platform/weborigin/SecurityPolicy.h" |
47 #include "public/platform/Platform.h" | 47 #include "public/platform/Platform.h" |
48 #include "public/platform/WebURLLoader.h" | 48 #include "public/platform/WebURLLoader.h" |
49 #include "wtf/OwnPtr.h" | 49 #include "wtf/OwnPtr.h" |
50 #include "wtf/UnusedParam.h" | |
51 | 50 |
52 namespace WebCore { | 51 namespace WebCore { |
53 | 52 |
54 void PingLoader::loadImage(Frame* frame, const KURL& url) | 53 void PingLoader::loadImage(Frame* frame, const KURL& url) |
55 { | 54 { |
56 if (!frame->document()->securityOrigin()->canDisplay(url)) { | 55 if (!frame->document()->securityOrigin()->canDisplay(url)) { |
57 FrameLoader::reportLocalLoadFailed(frame, url.string()); | 56 FrameLoader::reportLocalLoadFailed(frame, url.string()); |
58 return; | 57 return; |
59 } | 58 } |
60 | 59 |
61 ResourceRequest request(url); | 60 ResourceRequest request(url); |
62 request.setTargetType(ResourceRequest::TargetIsPing); | 61 request.setTargetType(ResourceRequest::TargetIsPing); |
63 request.setHTTPHeaderField("Cache-Control", "max-age=0"); | 62 request.setHTTPHeaderField("Cache-Control", "max-age=0"); |
64 String referrer = SecurityPolicy::generateReferrerHeader(frame->document()->
referrerPolicy(), request.url(), frame->loader().outgoingReferrer()); | 63 String referrer = SecurityPolicy::generateReferrerHeader(frame->document()->
referrerPolicy(), request.url(), frame->loader().outgoingReferrer()); |
65 if (!referrer.isEmpty()) | 64 if (!referrer.isEmpty()) |
66 request.setHTTPReferrer(referrer); | 65 request.setHTTPReferrer(referrer); |
67 frame->loader().addExtraFieldsToRequest(request); | 66 frame->loader().addExtraFieldsToRequest(request); |
68 OwnPtr<PingLoader> pingLoader = adoptPtr(new PingLoader(frame, request)); | 67 OwnPtr<PingLoader> pingLoader = adoptPtr(new PingLoader(frame, request)); |
69 | 68 |
70 // Leak the ping loader, since it will kill itself as soon as it receives a
response. | 69 // Leak the ping loader, since it will kill itself as soon as it receives a
response. |
71 PingLoader* leakedPingLoader = pingLoader.leakPtr(); | 70 PingLoader* ALLOW_UNUSED leakedPingLoader = pingLoader.leakPtr(); |
72 UNUSED_PARAM(leakedPingLoader); | |
73 } | 71 } |
74 | 72 |
75 // http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperl
ink-auditing | 73 // http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperl
ink-auditing |
76 void PingLoader::sendPing(Frame* frame, const KURL& pingURL, const KURL& destina
tionURL) | 74 void PingLoader::sendPing(Frame* frame, const KURL& pingURL, const KURL& destina
tionURL) |
77 { | 75 { |
78 ResourceRequest request(pingURL); | 76 ResourceRequest request(pingURL); |
79 request.setTargetType(ResourceRequest::TargetIsPing); | 77 request.setTargetType(ResourceRequest::TargetIsPing); |
80 request.setHTTPMethod("POST"); | 78 request.setHTTPMethod("POST"); |
81 request.setHTTPContentType("text/ping"); | 79 request.setHTTPContentType("text/ping"); |
82 request.setHTTPBody(FormData::create("PING")); | 80 request.setHTTPBody(FormData::create("PING")); |
83 request.setHTTPHeaderField("Cache-Control", "max-age=0"); | 81 request.setHTTPHeaderField("Cache-Control", "max-age=0"); |
84 frame->loader().addExtraFieldsToRequest(request); | 82 frame->loader().addExtraFieldsToRequest(request); |
85 | 83 |
86 SecurityOrigin* sourceOrigin = frame->document()->securityOrigin(); | 84 SecurityOrigin* sourceOrigin = frame->document()->securityOrigin(); |
87 RefPtr<SecurityOrigin> pingOrigin = SecurityOrigin::create(pingURL); | 85 RefPtr<SecurityOrigin> pingOrigin = SecurityOrigin::create(pingURL); |
88 FrameLoader::addHTTPOriginIfNeeded(request, sourceOrigin->toString()); | 86 FrameLoader::addHTTPOriginIfNeeded(request, sourceOrigin->toString()); |
89 request.setHTTPHeaderField("Ping-To", destinationURL.string()); | 87 request.setHTTPHeaderField("Ping-To", destinationURL.string()); |
90 if (!SecurityPolicy::shouldHideReferrer(pingURL, frame->loader().outgoingRef
errer())) { | 88 if (!SecurityPolicy::shouldHideReferrer(pingURL, frame->loader().outgoingRef
errer())) { |
91 request.setHTTPHeaderField("Ping-From", frame->document()->url().string(
)); | 89 request.setHTTPHeaderField("Ping-From", frame->document()->url().string(
)); |
92 if (!sourceOrigin->isSameSchemeHostPort(pingOrigin.get())) { | 90 if (!sourceOrigin->isSameSchemeHostPort(pingOrigin.get())) { |
93 String referrer = SecurityPolicy::generateReferrerHeader(frame->docu
ment()->referrerPolicy(), pingURL, frame->loader().outgoingReferrer()); | 91 String referrer = SecurityPolicy::generateReferrerHeader(frame->docu
ment()->referrerPolicy(), pingURL, frame->loader().outgoingReferrer()); |
94 if (!referrer.isEmpty()) | 92 if (!referrer.isEmpty()) |
95 request.setHTTPReferrer(referrer); | 93 request.setHTTPReferrer(referrer); |
96 } | 94 } |
97 } | 95 } |
98 OwnPtr<PingLoader> pingLoader = adoptPtr(new PingLoader(frame, request)); | 96 OwnPtr<PingLoader> pingLoader = adoptPtr(new PingLoader(frame, request)); |
99 | 97 |
100 // Leak the ping loader, since it will kill itself as soon as it receives a
response. | 98 // Leak the ping loader, since it will kill itself as soon as it receives a
response. |
101 PingLoader* leakedPingLoader = pingLoader.leakPtr(); | 99 PingLoader* ALLOW_UNUSED leakedPingLoader = pingLoader.leakPtr(); |
102 UNUSED_PARAM(leakedPingLoader); | |
103 } | 100 } |
104 | 101 |
105 void PingLoader::sendViolationReport(Frame* frame, const KURL& reportURL, PassRe
fPtr<FormData> report, ViolationReportType type) | 102 void PingLoader::sendViolationReport(Frame* frame, const KURL& reportURL, PassRe
fPtr<FormData> report, ViolationReportType type) |
106 { | 103 { |
107 ResourceRequest request(reportURL); | 104 ResourceRequest request(reportURL); |
108 request.setTargetType(ResourceRequest::TargetIsSubresource); | 105 request.setTargetType(ResourceRequest::TargetIsSubresource); |
109 request.setHTTPMethod("POST"); | 106 request.setHTTPMethod("POST"); |
110 request.setHTTPContentType(type == ContentSecurityPolicyViolationReport ? "a
pplication/csp-report" : "application/json"); | 107 request.setHTTPContentType(type == ContentSecurityPolicyViolationReport ? "a
pplication/csp-report" : "application/json"); |
111 request.setHTTPBody(report); | 108 request.setHTTPBody(report); |
112 frame->loader().addExtraFieldsToRequest(request); | 109 frame->loader().addExtraFieldsToRequest(request); |
113 | 110 |
114 String referrer = SecurityPolicy::generateReferrerHeader(frame->document()->
referrerPolicy(), reportURL, frame->loader().outgoingReferrer()); | 111 String referrer = SecurityPolicy::generateReferrerHeader(frame->document()->
referrerPolicy(), reportURL, frame->loader().outgoingReferrer()); |
115 if (!referrer.isEmpty()) | 112 if (!referrer.isEmpty()) |
116 request.setHTTPReferrer(referrer); | 113 request.setHTTPReferrer(referrer); |
117 OwnPtr<PingLoader> pingLoader = adoptPtr(new PingLoader(frame, request, Secu
rityOrigin::create(reportURL)->isSameSchemeHostPort(frame->document()->securityO
rigin()) ? AllowStoredCredentials : DoNotAllowStoredCredentials)); | 114 OwnPtr<PingLoader> pingLoader = adoptPtr(new PingLoader(frame, request, Secu
rityOrigin::create(reportURL)->isSameSchemeHostPort(frame->document()->securityO
rigin()) ? AllowStoredCredentials : DoNotAllowStoredCredentials)); |
118 | 115 |
119 // Leak the ping loader, since it will kill itself as soon as it receives a
response. | 116 // Leak the ping loader, since it will kill itself as soon as it receives a
response. |
120 PingLoader* leakedPingLoader = pingLoader.leakPtr(); | 117 PingLoader* ALLOW_UNUSED leakedPingLoader = pingLoader.leakPtr(); |
121 UNUSED_PARAM(leakedPingLoader); | |
122 } | 118 } |
123 | 119 |
124 PingLoader::PingLoader(Frame* frame, ResourceRequest& request, StoredCredentials
credentialsAllowed) | 120 PingLoader::PingLoader(Frame* frame, ResourceRequest& request, StoredCredentials
credentialsAllowed) |
125 : m_timeout(this, &PingLoader::timeout) | 121 : m_timeout(this, &PingLoader::timeout) |
126 { | 122 { |
127 frame->loader().client()->didDispatchPingLoader(request.url()); | 123 frame->loader().client()->didDispatchPingLoader(request.url()); |
128 | 124 |
129 unsigned long identifier = createUniqueIdentifier(); | 125 unsigned long identifier = createUniqueIdentifier(); |
130 m_loader = adoptPtr(blink::Platform::current()->createURLLoader()); | 126 m_loader = adoptPtr(blink::Platform::current()->createURLLoader()); |
131 ASSERT(m_loader); | 127 ASSERT(m_loader); |
132 blink::WrappedResourceRequest wrappedRequest(request); | 128 blink::WrappedResourceRequest wrappedRequest(request); |
133 wrappedRequest.setAllowStoredCredentials(credentialsAllowed == AllowStoredCr
edentials); | 129 wrappedRequest.setAllowStoredCredentials(credentialsAllowed == AllowStoredCr
edentials); |
134 m_loader->loadAsynchronously(wrappedRequest, this); | 130 m_loader->loadAsynchronously(wrappedRequest, this); |
135 | 131 |
136 InspectorInstrumentation::continueAfterPingLoader(frame, identifier, frame->
loader().activeDocumentLoader(), request, ResourceResponse()); | 132 InspectorInstrumentation::continueAfterPingLoader(frame, identifier, frame->
loader().activeDocumentLoader(), request, ResourceResponse()); |
137 | 133 |
138 // If the server never responds, FrameLoader won't be able to cancel this lo
ad and | 134 // If the server never responds, FrameLoader won't be able to cancel this lo
ad and |
139 // we'll sit here waiting forever. Set a very generous timeout, just in case
. | 135 // we'll sit here waiting forever. Set a very generous timeout, just in case
. |
140 m_timeout.startOneShot(60000); | 136 m_timeout.startOneShot(60000); |
141 } | 137 } |
142 | 138 |
143 PingLoader::~PingLoader() | 139 PingLoader::~PingLoader() |
144 { | 140 { |
145 if (m_loader) | 141 if (m_loader) |
146 m_loader->cancel(); | 142 m_loader->cancel(); |
147 } | 143 } |
148 | 144 |
149 } | 145 } |
OLD | NEW |