1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "components/nacl/renderer/manifest_downloader.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <utility>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
10*6777b538SAndroid Build Coastguard Worker #include "components/nacl/renderer/histogram.h"
11*6777b538SAndroid Build Coastguard Worker #include "components/nacl/renderer/nexe_load_manager.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
13*6777b538SAndroid Build Coastguard Worker #include "third_party/blink/public/platform/web_url_error.h"
14*6777b538SAndroid Build Coastguard Worker #include "third_party/blink/public/platform/web_url_response.h"
15*6777b538SAndroid Build Coastguard Worker #include "third_party/blink/public/web/web_associated_url_loader.h"
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker namespace nacl {
18*6777b538SAndroid Build Coastguard Worker
ManifestDownloader(std::unique_ptr<blink::WebAssociatedURLLoader> url_loader,bool is_installed,Callback cb)19*6777b538SAndroid Build Coastguard Worker ManifestDownloader::ManifestDownloader(
20*6777b538SAndroid Build Coastguard Worker std::unique_ptr<blink::WebAssociatedURLLoader> url_loader,
21*6777b538SAndroid Build Coastguard Worker bool is_installed,
22*6777b538SAndroid Build Coastguard Worker Callback cb)
23*6777b538SAndroid Build Coastguard Worker : url_loader_(std::move(url_loader)),
24*6777b538SAndroid Build Coastguard Worker is_installed_(is_installed),
25*6777b538SAndroid Build Coastguard Worker cb_(std::move(cb)),
26*6777b538SAndroid Build Coastguard Worker status_code_(-1),
27*6777b538SAndroid Build Coastguard Worker pp_nacl_error_(PP_NACL_ERROR_LOAD_SUCCESS) {
28*6777b538SAndroid Build Coastguard Worker CHECK(!cb_.is_null());
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker
~ManifestDownloader()31*6777b538SAndroid Build Coastguard Worker ManifestDownloader::~ManifestDownloader() { }
32*6777b538SAndroid Build Coastguard Worker
Load(const blink::WebURLRequest & request)33*6777b538SAndroid Build Coastguard Worker void ManifestDownloader::Load(const blink::WebURLRequest& request) {
34*6777b538SAndroid Build Coastguard Worker url_loader_->LoadAsynchronously(request, this);
35*6777b538SAndroid Build Coastguard Worker }
36*6777b538SAndroid Build Coastguard Worker
DidReceiveResponse(const blink::WebURLResponse & response)37*6777b538SAndroid Build Coastguard Worker void ManifestDownloader::DidReceiveResponse(
38*6777b538SAndroid Build Coastguard Worker const blink::WebURLResponse& response) {
39*6777b538SAndroid Build Coastguard Worker if (response.HttpStatusCode() != 200)
40*6777b538SAndroid Build Coastguard Worker pp_nacl_error_ = PP_NACL_ERROR_MANIFEST_LOAD_URL;
41*6777b538SAndroid Build Coastguard Worker status_code_ = response.HttpStatusCode();
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker
DidReceiveData(const char * data,int data_length)44*6777b538SAndroid Build Coastguard Worker void ManifestDownloader::DidReceiveData(const char* data, int data_length) {
45*6777b538SAndroid Build Coastguard Worker if (buffer_.size() + data_length > kNaClManifestMaxFileBytes) {
46*6777b538SAndroid Build Coastguard Worker pp_nacl_error_ = PP_NACL_ERROR_MANIFEST_TOO_LARGE;
47*6777b538SAndroid Build Coastguard Worker buffer_.clear();
48*6777b538SAndroid Build Coastguard Worker }
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker if (pp_nacl_error_ == PP_NACL_ERROR_LOAD_SUCCESS)
51*6777b538SAndroid Build Coastguard Worker buffer_.append(data, data_length);
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker
Close()54*6777b538SAndroid Build Coastguard Worker void ManifestDownloader::Close() {
55*6777b538SAndroid Build Coastguard Worker // We log the status code here instead of in didReceiveResponse so that we
56*6777b538SAndroid Build Coastguard Worker // always log a histogram value, even when we never receive a status code.
57*6777b538SAndroid Build Coastguard Worker HistogramHTTPStatusCode(
58*6777b538SAndroid Build Coastguard Worker is_installed_ ? "NaCl.HttpStatusCodeClass.Manifest.InstalledApp" :
59*6777b538SAndroid Build Coastguard Worker "NaCl.HttpStatusCodeClass.Manifest.NotInstalledApp",
60*6777b538SAndroid Build Coastguard Worker status_code_);
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker std::move(cb_).Run(pp_nacl_error_, buffer_);
63*6777b538SAndroid Build Coastguard Worker delete this;
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker
DidFinishLoading()66*6777b538SAndroid Build Coastguard Worker void ManifestDownloader::DidFinishLoading() {
67*6777b538SAndroid Build Coastguard Worker Close();
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker
DidFail(const blink::WebURLError & error)70*6777b538SAndroid Build Coastguard Worker void ManifestDownloader::DidFail(const blink::WebURLError& error) {
71*6777b538SAndroid Build Coastguard Worker // TODO(teravest): Find a place to share this code with PepperURLLoaderHost.
72*6777b538SAndroid Build Coastguard Worker pp_nacl_error_ = PP_NACL_ERROR_MANIFEST_LOAD_URL;
73*6777b538SAndroid Build Coastguard Worker switch (error.reason()) {
74*6777b538SAndroid Build Coastguard Worker case net::ERR_ACCESS_DENIED:
75*6777b538SAndroid Build Coastguard Worker case net::ERR_NETWORK_ACCESS_DENIED:
76*6777b538SAndroid Build Coastguard Worker pp_nacl_error_ = PP_NACL_ERROR_MANIFEST_NOACCESS_URL;
77*6777b538SAndroid Build Coastguard Worker break;
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker if (error.is_web_security_violation())
81*6777b538SAndroid Build Coastguard Worker pp_nacl_error_ = PP_NACL_ERROR_MANIFEST_NOACCESS_URL;
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker Close();
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker } // namespace nacl
87