xref: /aosp_15_r20/external/cronet/components/nacl/renderer/manifest_downloader.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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