| Index: components/nacl/renderer/nexe_load_manager.cc
|
| diff --git a/components/nacl/renderer/nexe_load_manager.cc b/components/nacl/renderer/nexe_load_manager.cc
|
| index e01627b2c79c90a11731e7407ba726e9328eff4e..536b622d4b87a132552cfa036ebe372eb50e9b1a 100644
|
| --- a/components/nacl/renderer/nexe_load_manager.cc
|
| +++ b/components/nacl/renderer/nexe_load_manager.cc
|
| @@ -40,6 +40,24 @@
|
|
|
| namespace {
|
|
|
| +void HistogramCustomCounts(const std::string& name,
|
| + int32_t sample,
|
| + int32_t min,
|
| + int32_t max,
|
| + uint32_t bucket_count) {
|
| + base::HistogramBase* counter =
|
| + base::Histogram::FactoryGet(
|
| + name,
|
| + min,
|
| + max,
|
| + bucket_count,
|
| + base::HistogramBase::kUmaTargetedHistogramFlag);
|
| + // The histogram can be NULL if it is constructed with bad arguments. Ignore
|
| + // that data for this API. An error message will be logged.
|
| + if (counter)
|
| + counter->Add(sample);
|
| +}
|
| +
|
| void HistogramEnumerate(const std::string& name,
|
| int32_t sample,
|
| int32_t boundary_value) {
|
| @@ -135,6 +153,27 @@ void HistogramStartupTimeMedium(const std::string& name,
|
| }
|
| }
|
|
|
| +void HistogramSizeKB(const std::string& name, int32_t sample) {
|
| + if (sample < 0) return;
|
| + HistogramCustomCounts(name,
|
| + sample,
|
| + 1,
|
| + 512 * 1024, // A very large .nexe.
|
| + 100);
|
| +}
|
| +
|
| +void HistogramHTTPStatusCode(const std::string& name,
|
| + int32_t status) {
|
| + // Log the status codes in rough buckets - 1XX, 2XX, etc.
|
| + int sample = status / 100;
|
| + // HTTP status codes only go up to 5XX, using "6" to indicate an internal
|
| + // error.
|
| + // Note: installed files may have "0" for a status code.
|
| + if (status < 0 || status >= 600)
|
| + sample = 6;
|
| + HistogramEnumerate(name, sample, 7);
|
| +}
|
| +
|
| blink::WebString EventTypeToString(PP_NaClEventType event_type) {
|
| switch (event_type) {
|
| case PP_NACL_EVENT_LOADSTART:
|
| @@ -191,6 +230,51 @@ NexeLoadManager::~NexeLoadManager() {
|
| }
|
| }
|
|
|
| +void NexeLoadManager::NexeFileDidOpen(int32_t pp_error,
|
| + int32_t fd,
|
| + int32_t http_status,
|
| + int64_t nexe_bytes_read,
|
| + const std::string& url) {
|
| + VLOG(1) << "Plugin::NexeFileDidOpen (pp_error=" << pp_error << ")";
|
| + VLOG(1) << "Plugin::NexeFileDidOpen (file_desc=" << fd << ")";
|
| + HistogramHTTPStatusCode(
|
| + is_installed_ ? "NaCl.HttpStatusCodeClass.Nexe.InstalledApp" :
|
| + "NaCl.HttpStatusCodeClass.Nexe.NotInstalledApp",
|
| + http_status);
|
| + // TODO(dmichael): fd is only used for error reporting here currently, and
|
| + // the trusted Plugin is responsible for using it and closing it.
|
| + // Note -1 is NACL_NO_FILE_DESC from nacl_macros.h.
|
| + if (pp_error != PP_OK || fd == -1) {
|
| + if (pp_error == PP_ERROR_ABORTED) {
|
| + ReportLoadAbort();
|
| + } else if (pp_error == PP_ERROR_NOACCESS) {
|
| + ReportLoadError(PP_NACL_ERROR_NEXE_NOACCESS_URL,
|
| + "access to nexe url was denied.");
|
| + } else {
|
| + ReportLoadError(PP_NACL_ERROR_NEXE_LOAD_URL,
|
| + "could not load nexe url.");
|
| + }
|
| + return;
|
| + } else if (nexe_bytes_read == -1) {
|
| + ReportLoadError(PP_NACL_ERROR_NEXE_STAT, "could not stat nexe file.");
|
| + return;
|
| + }
|
| +
|
| + // TODO(dmichael): Can we avoid stashing away so much state?
|
| + nexe_size_ = nexe_bytes_read;
|
| + HistogramSizeKB("NaCl.Perf.Size.Nexe",
|
| + static_cast<int32_t>(nexe_size_ / 1024));
|
| +
|
| + // Inform JavaScript that we successfully downloaded the nacl module.
|
| + ProgressEvent progress_event(pp_instance_, PP_NACL_EVENT_PROGRESS, url, true,
|
| + nexe_size_, nexe_size_);
|
| + ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&NexeLoadManager::DispatchEvent,
|
| + weak_factory_.GetWeakPtr(),
|
| + progress_event));
|
| +}
|
| +
|
| void NexeLoadManager::ReportLoadSuccess(const std::string& url,
|
| uint64_t loaded_bytes,
|
| uint64_t total_bytes) {
|
|
|