summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
Diffstat (limited to 'media')
-rw-r--r--media/blink/buffered_data_source.cc7
-rw-r--r--media/blink/buffered_data_source_unittest.cc33
2 files changed, 30 insertions, 10 deletions
diff --git a/media/blink/buffered_data_source.cc b/media/blink/buffered_data_source.cc
index eb4c984..0fc1617 100644
--- a/media/blink/buffered_data_source.cc
+++ b/media/blink/buffered_data_source.cc
@@ -431,9 +431,10 @@ bool BufferedDataSource::CheckPartialResponseURL(
// generated bytes and the target response. See http://crbug.com/489060#c32
// for details.
// If the origin of the new response is different from the first response we
- // deny the redirected response.
- return response_original_url_.GetOrigin() ==
- partial_response_original_url.GetOrigin();
+ // deny the redirected response unless the crossorigin attribute has been set.
+ return (response_original_url_.GetOrigin() ==
+ partial_response_original_url.GetOrigin()) ||
+ DidPassCORSAccessCheck();
}
void BufferedDataSource::ReadCallback(
diff --git a/media/blink/buffered_data_source_unittest.cc b/media/blink/buffered_data_source_unittest.cc
index 878d5f7..aed8453 100644
--- a/media/blink/buffered_data_source_unittest.cc
+++ b/media/blink/buffered_data_source_unittest.cc
@@ -51,11 +51,12 @@ class MockBufferedDataSource : public BufferedDataSource {
public:
MockBufferedDataSource(
const GURL& url,
+ BufferedResourceLoader::CORSMode cors_mode,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
WebLocalFrame* frame,
BufferedDataSourceHost* host)
: BufferedDataSource(url,
- BufferedResourceLoader::kUnspecified,
+ cors_mode,
task_runner,
frame,
new media::MediaLog(),
@@ -128,13 +129,13 @@ class BufferedDataSourceTest : public testing::Test {
MOCK_METHOD1(OnInitialize, void(bool));
- void Initialize(const char* url, bool expected) {
+ void InitializeWithCORS(const char* url,
+ bool expected,
+ BufferedResourceLoader::CORSMode cors_mode) {
GURL gurl(url);
- data_source_.reset(
- new MockBufferedDataSource(gurl,
- message_loop_.task_runner(),
- view_->mainFrame()->toWebLocalFrame(),
- &host_));
+ data_source_.reset(new MockBufferedDataSource(
+ gurl, cors_mode, message_loop_.task_runner(),
+ view_->mainFrame()->toWebLocalFrame(), &host_));
data_source_->SetPreload(preload_);
response_generator_.reset(new TestResponseGenerator(gurl, kFileSize));
@@ -148,6 +149,10 @@ class BufferedDataSourceTest : public testing::Test {
EXPECT_EQ(data_source_->downloading(), is_http);
}
+ void Initialize(const char* url, bool expected) {
+ InitializeWithCORS(url, expected, BufferedResourceLoader::kUnspecified);
+ }
+
// Helper to initialize tests with a valid 200 response.
void InitializeWith200Response() {
Initialize(kHttpUrl, true);
@@ -577,6 +582,20 @@ TEST_F(BufferedDataSourceTest,
ExecuteMixedResponseFailureTest(response1, response2);
}
+TEST_F(BufferedDataSourceTest,
+ Http_MixedResponse_ServiceWorkerProxiedAndDifferentOriginResponseCORS) {
+ InitializeWithCORS(kHttpUrl, true, BufferedResourceLoader::kAnonymous);
+ WebURLResponse response1 =
+ response_generator_->GeneratePartial206(0, kDataSize - 1);
+ response1.setWasFetchedViaServiceWorker(true);
+ response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentOriginUrl));
+ WebURLResponse response2 =
+ response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
+ // The origin URL of response1 and response2 are different, but a CORS check
+ // has been passed for each request, so expect success.
+ ExecuteMixedResponseSuccessTest(response1, response2);
+}
+
TEST_F(BufferedDataSourceTest, File_Retry) {
InitializeWithFileResponse();