Index: Source/core/frame/SubresourceIntegrityTest.cpp |
diff --git a/Source/core/frame/SubresourceIntegrityTest.cpp b/Source/core/frame/SubresourceIntegrityTest.cpp |
index 560a37f5b76b8031a96c674f59c0863af545b0f0..ecfdeed38952f1c74298e5595e8d0ed55a8a2eec 100644 |
--- a/Source/core/frame/SubresourceIntegrityTest.cpp |
+++ b/Source/core/frame/SubresourceIntegrityTest.cpp |
@@ -7,6 +7,8 @@ |
#include "core/HTMLNames.h" |
#include "core/dom/Document.h" |
+#include "core/fetch/Resource.h" |
+#include "core/fetch/ResourcePtr.h" |
#include "core/html/HTMLScriptElement.h" |
#include "platform/Crypto.h" |
#include "platform/weborigin/KURL.h" |
@@ -136,16 +138,35 @@ protected: |
EXPECT_FALSE(SubresourceIntegrity::parseIntegrityAttribute(integrityAttribute, digest, algorithm, type, *document)); |
} |
- void expectIntegrity(const char* integrity, const char* script, const KURL& url, const String& mimeType = String()) |
+ enum CorsStatus { |
+ WithCors, |
+ NoCors |
+ }; |
+ |
+ void expectIntegrity(const char* integrity, const char* script, const KURL& url, const KURL& requestorUrl, const String& mimeType = String(), CorsStatus corsStatus = WithCors) |
{ |
scriptElement->setAttribute(HTMLNames::integrityAttr, integrity); |
- EXPECT_TRUE(SubresourceIntegrity::CheckSubresourceIntegrity(*scriptElement, script, url, mimeType)); |
+ EXPECT_TRUE(SubresourceIntegrity::CheckSubresourceIntegrity(*scriptElement, script, url, mimeType, *createTestResource(url, requestorUrl, corsStatus).get())); |
} |
- void expectIntegrityFailure(const char* integrity, const char* script, const KURL& url, const String& mimeType = String()) |
+ void expectIntegrityFailure(const char* integrity, const char* script, const KURL& url, const KURL& requestorUrl, const String& mimeType = String(), CorsStatus corsStatus = WithCors) |
{ |
scriptElement->setAttribute(HTMLNames::integrityAttr, integrity); |
- EXPECT_FALSE(SubresourceIntegrity::CheckSubresourceIntegrity(*scriptElement, script, url, mimeType)); |
+ EXPECT_FALSE(SubresourceIntegrity::CheckSubresourceIntegrity(*scriptElement, script, url, mimeType, *createTestResource(url, requestorUrl, corsStatus).get())); |
+ } |
+ |
+ ResourcePtr<Resource> createTestResource(const KURL& url, const KURL& allowOriginUrl, CorsStatus corsStatus) |
+ { |
+ OwnPtr<ResourceResponse> response = adoptPtr(new ResourceResponse); |
+ response->setURL(url); |
+ response->setHTTPStatusCode(200); |
+ if (corsStatus == WithCors) { |
+ response->setHTTPHeaderField("access-control-allow-origin", SecurityOrigin::create(allowOriginUrl)->toAtomicString()); |
+ response->setHTTPHeaderField("access-control-allow-credentials", "true"); |
+ } |
+ ResourcePtr<Resource> resource = new Resource(ResourceRequest(response->url()), Resource::Raw); |
+ resource->setResponse(*response); |
+ return resource; |
} |
KURL secureURL; |
@@ -273,27 +294,37 @@ TEST_F(SubresourceIntegrityTest, CheckSubresourceIntegrityInSecureOrigin) |
document->updateSecurityOrigin(secureOrigin->isolatedCopy()); |
// Verify basic sha256, sha384, and sha512 integrity checks. |
- expectIntegrity(kSha256Integrity, kBasicScript, secureURL); |
- expectIntegrity(kSha384Integrity, kBasicScript, secureURL); |
- expectIntegrity(kSha512Integrity, kBasicScript, secureURL); |
+ expectIntegrity(kSha256Integrity, kBasicScript, secureURL, secureURL); |
+ expectIntegrity(kSha384Integrity, kBasicScript, secureURL, secureURL); |
+ expectIntegrity(kSha512Integrity, kBasicScript, secureURL, secureURL); |
// The hash label must match the hash value. |
- expectIntegrityFailure(kSha384IntegrityLabeledAs256, kBasicScript, secureURL); |
+ expectIntegrityFailure(kSha384IntegrityLabeledAs256, kBasicScript, secureURL, secureURL); |
// Unsupported hash functions should fail. |
- expectIntegrityFailure(kUnsupportedHashFunctionIntegrity, kBasicScript, secureURL); |
+ expectIntegrityFailure(kUnsupportedHashFunctionIntegrity, kBasicScript, secureURL, secureURL); |
+ |
+ // All parameters are fine, and because this is not cross origin, CORS is |
+ // not needed. |
+ expectIntegrity(kSha256Integrity, kBasicScript, secureURL, secureURL, String(), NoCors); |
} |
TEST_F(SubresourceIntegrityTest, CheckSubresourceIntegrityInInsecureOrigin) |
{ |
- // The same checks as CheckSubresourceIntegrityInSecureOrigin should pass here. |
+ // The same checks as CheckSubresourceIntegrityInSecureOrigin should pass |
+ // here, with the expection of the NoCors check at the end. |
document->updateSecurityOrigin(insecureOrigin->isolatedCopy()); |
- expectIntegrity(kSha256Integrity, kBasicScript, secureURL); |
- expectIntegrity(kSha384Integrity, kBasicScript, secureURL); |
- expectIntegrity(kSha512Integrity, kBasicScript, secureURL); |
- expectIntegrityFailure(kSha384IntegrityLabeledAs256, kBasicScript, secureURL); |
- expectIntegrityFailure(kUnsupportedHashFunctionIntegrity, kBasicScript, secureURL); |
+ expectIntegrity(kSha256Integrity, kBasicScript, secureURL, insecureURL); |
+ expectIntegrity(kSha384Integrity, kBasicScript, secureURL, insecureURL); |
+ expectIntegrity(kSha512Integrity, kBasicScript, secureURL, insecureURL); |
+ expectIntegrityFailure(kSha384IntegrityLabeledAs256, kBasicScript, secureURL, insecureURL); |
+ expectIntegrityFailure(kUnsupportedHashFunctionIntegrity, kBasicScript, secureURL, insecureURL); |
+ |
+ // This check should fail because, unlike in the |
+ // CheckSubresourceIntegirtyInSecureOrigin case, this is cross origin |
+ // (secure origin requesting a resource on an insecure origin) |
+ expectIntegrityFailure(kSha256Integrity, kBasicScript, secureURL, insecureURL, String(), NoCors); |
} |
} // namespace blink |