Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(625)

Unified Diff: webkit/renderer/media/media_info_loader.cc

Issue 16327002: android: Implement single origin and CORS check for video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address nits. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/renderer/media/media_info_loader.h ('k') | webkit/renderer/media/media_info_loader_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/renderer/media/media_info_loader.cc
diff --git a/webkit/renderer/media/media_info_loader.cc b/webkit/renderer/media/media_info_loader.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9f55ceaafe747505dfa4e70434a8a4b0e671065f
--- /dev/null
+++ b/webkit/renderer/media/media_info_loader.cc
@@ -0,0 +1,185 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/renderer/media/media_info_loader.h"
+
+#include "base/bits.h"
+#include "base/callback_helpers.h"
+#include "base/metrics/histogram.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
+#include "third_party/WebKit/public/platform/WebURLError.h"
+#include "third_party/WebKit/public/platform/WebURLLoader.h"
+#include "third_party/WebKit/public/platform/WebURLResponse.h"
+
+using WebKit::WebFrame;
+using WebKit::WebURLError;
+using WebKit::WebURLLoader;
+using WebKit::WebURLLoaderOptions;
+using WebKit::WebURLRequest;
+using WebKit::WebURLResponse;
+
+namespace webkit_media {
+
+static const int kHttpOK = 200;
+
+MediaInfoLoader::MediaInfoLoader(
+ const GURL& url,
+ WebKit::WebMediaPlayer::CORSMode cors_mode,
+ const ReadyCB& ready_cb)
+ : loader_failed_(false),
+ url_(url),
+ cors_mode_(cors_mode),
+ single_origin_(true),
+ ready_cb_(ready_cb) {}
+
+MediaInfoLoader::~MediaInfoLoader() {}
+
+void MediaInfoLoader::Start(WebKit::WebFrame* frame) {
+ // Make sure we have not started.
+ DCHECK(!ready_cb_.is_null());
+ CHECK(frame);
+
+ start_time_ = base::TimeTicks::Now();
+
+ // Prepare the request.
+ WebURLRequest request(url_);
+ request.setTargetType(WebURLRequest::TargetIsMedia);
+ frame->setReferrerForRequest(request, WebKit::WebURL());
+
+ scoped_ptr<WebURLLoader> loader;
+ if (test_loader_) {
+ loader = test_loader_.Pass();
+ } else {
+ WebURLLoaderOptions options;
+ if (cors_mode_ == WebKit::WebMediaPlayer::CORSModeUnspecified) {
+ options.allowCredentials = true;
+ options.crossOriginRequestPolicy =
+ WebURLLoaderOptions::CrossOriginRequestPolicyAllow;
+ } else {
+ options.exposeAllResponseHeaders = true;
+ options.crossOriginRequestPolicy =
+ WebURLLoaderOptions::CrossOriginRequestPolicyUseAccessControl;
+ if (cors_mode_ == WebKit::WebMediaPlayer::CORSModeUseCredentials)
+ options.allowCredentials = true;
+ }
+ loader.reset(frame->createAssociatedURLLoader(options));
+ }
+
+ // Start the resource loading.
+ loader->loadAsynchronously(request, this);
+ active_loader_.reset(new ActiveLoader(loader.Pass()));
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// WebKit::WebURLLoaderClient implementation.
+void MediaInfoLoader::willSendRequest(
+ WebURLLoader* loader,
+ WebURLRequest& newRequest,
+ const WebURLResponse& redirectResponse) {
+ // The load may have been stopped and |ready_cb| is destroyed.
+ // In this case we shouldn't do anything.
+ if (ready_cb_.is_null()) {
+ // Set the url in the request to an invalid value (empty url).
+ newRequest.setURL(WebKit::WebURL());
+ return;
+ }
+
+ // Only allow |single_origin_| if we haven't seen a different origin yet.
+ if (single_origin_)
+ single_origin_ = url_.GetOrigin() == GURL(newRequest.url()).GetOrigin();
+
+ url_ = newRequest.url();
+}
+
+void MediaInfoLoader::didSendData(
+ WebURLLoader* loader,
+ unsigned long long bytes_sent,
+ unsigned long long total_bytes_to_be_sent) {
+ NOTIMPLEMENTED();
+}
+
+void MediaInfoLoader::didReceiveResponse(
+ WebURLLoader* loader,
+ const WebURLResponse& response) {
+ DVLOG(1) << "didReceiveResponse: HTTP/"
+ << (response.httpVersion() == WebURLResponse::HTTP_0_9 ? "0.9" :
+ response.httpVersion() == WebURLResponse::HTTP_1_0 ? "1.0" :
+ response.httpVersion() == WebURLResponse::HTTP_1_1 ? "1.1" :
+ "Unknown")
+ << " " << response.httpStatusCode();
+ DCHECK(active_loader_.get());
+ if (response.httpStatusCode() == kHttpOK) {
+ DidBecomeReady(kOk);
+ return;
+ }
+ loader_failed_ = true;
+ DidBecomeReady(kFailed);
+}
+
+void MediaInfoLoader::didReceiveData(
+ WebURLLoader* loader,
+ const char* data,
+ int data_length,
+ int encoded_data_length) {
+ // Ignored.
+}
+
+void MediaInfoLoader::didDownloadData(
+ WebKit::WebURLLoader* loader,
+ int dataLength) {
+ NOTIMPLEMENTED();
+}
+
+void MediaInfoLoader::didReceiveCachedMetadata(
+ WebURLLoader* loader,
+ const char* data,
+ int data_length) {
+ NOTIMPLEMENTED();
+}
+
+void MediaInfoLoader::didFinishLoading(
+ WebURLLoader* loader,
+ double finishTime) {
+ DCHECK(active_loader_.get());
+ DidBecomeReady(kOk);
+}
+
+void MediaInfoLoader::didFail(
+ WebURLLoader* loader,
+ const WebURLError& error) {
+ DVLOG(1) << "didFail: reason=" << error.reason
+ << ", isCancellation=" << error.isCancellation
+ << ", domain=" << error.domain.utf8().data()
+ << ", localizedDescription="
+ << error.localizedDescription.utf8().data();
+ DCHECK(active_loader_.get());
+ loader_failed_ = true;
+ DidBecomeReady(kFailed);
+}
+
+bool MediaInfoLoader::HasSingleOrigin() const {
+ DCHECK(ready_cb_.is_null())
+ << "Must become ready before calling HasSingleOrigin()";
+ return single_origin_;
+}
+
+bool MediaInfoLoader::DidPassCORSAccessCheck() const {
+ DCHECK(ready_cb_.is_null())
+ << "Must become ready before calling DidPassCORSAccessCheck()";
+ return !loader_failed_ &&
+ cors_mode_ != WebKit::WebMediaPlayer::CORSModeUnspecified;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Helper methods.
+
+void MediaInfoLoader::DidBecomeReady(Status status) {
+ UMA_HISTOGRAM_TIMES("Media.InfoLoadDelay",
+ base::TimeTicks::Now() - start_time_);
+ active_loader_.reset();
+ if (!ready_cb_.is_null())
+ base::ResetAndReturn(&ready_cb_).Run(status);
+}
+
+} // namespace webkit_media
« no previous file with comments | « webkit/renderer/media/media_info_loader.h ('k') | webkit/renderer/media/media_info_loader_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698