Index: chrome/browser/extensions/extension_protocols.cc |
diff --git a/chrome/browser/extensions/extension_protocols.cc b/chrome/browser/extensions/extension_protocols.cc |
index e3e9865cb89f808ed4bd5c33ea136bf0525567ce..7efb81b98d66b76219a939a0e420a0337f83097d 100644 |
--- a/chrome/browser/extensions/extension_protocols.cc |
+++ b/chrome/browser/extensions/extension_protocols.cc |
@@ -14,6 +14,7 @@ |
#include "base/logging.h" |
#include "base/memory/weak_ptr.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/metrics/field_trial.h" |
#include "base/metrics/histogram.h" |
#include "base/path_service.h" |
#include "base/sha1.h" |
@@ -33,6 +34,8 @@ |
#include "chrome/common/url_constants.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/resource_request_info.h" |
+#include "crypto/secure_hash.h" |
+#include "crypto/sha2.h" |
#include "extensions/browser/info_map.h" |
#include "extensions/common/constants.h" |
#include "extensions/common/extension.h" |
@@ -45,6 +48,7 @@ |
#include "extensions/common/manifest_handlers/web_accessible_resources_info.h" |
#include "extensions/common/manifest_handlers/webview_info.h" |
#include "grit/component_extension_resources_map.h" |
+#include "net/base/io_buffer.h" |
#include "net/base/mime_util.h" |
#include "net/base/net_errors.h" |
#include "net/http/http_request_headers.h" |
@@ -285,20 +289,31 @@ class URLRequestExtensionJob : public net::URLRequestFileJob { |
const std::string& content_security_policy, |
bool send_cors_header, |
bool follow_symlinks_anywhere) |
- : net::URLRequestFileJob( |
- request, network_delegate, base::FilePath(), |
- BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( |
- base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)), |
- directory_path_(directory_path), |
- // TODO(tc): Move all of these files into resources.pak so we don't break |
- // when updating on Linux. |
- resource_(extension_id, directory_path, relative_path), |
- content_security_policy_(content_security_policy), |
- send_cors_header_(send_cors_header), |
- weak_factory_(this) { |
+ : net::URLRequestFileJob( |
+ request, |
+ network_delegate, |
+ base::FilePath(), |
+ BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( |
+ base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)), |
+ seek_position_(0), |
+ bytes_read_(0), |
+ directory_path_(directory_path), |
+ // TODO(tc): Move all of these files into resources.pak so we don't |
+ // break when updating on Linux. |
+ resource_(extension_id, directory_path, relative_path), |
+ content_security_policy_(content_security_policy), |
+ send_cors_header_(send_cors_header), |
+ weak_factory_(this) { |
if (follow_symlinks_anywhere) { |
resource_.set_follow_symlinks_anywhere(); |
} |
+ const std::string& group = |
+ base::FieldTrialList::FindFullName("ExtensionContentHashMeasurement"); |
+ if (group == "Yes") { |
+ base::ElapsedTimer timer; |
+ hash_.reset(crypto::SecureHash::Create(crypto::SecureHash::SHA256)); |
+ hashing_time_ += timer.Elapsed(); |
rvargas (doing something else)
2014/04/08 16:53:45
hashing_time_ =
asargent_no_longer_on_chrome
2014/04/09 20:59:59
Done.
|
+ } |
} |
virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE { |
@@ -310,7 +325,8 @@ class URLRequestExtensionJob : public net::URLRequestFileJob { |
base::Time* last_modified_time = new base::Time(); |
bool posted = BrowserThread::PostBlockingPoolTaskAndReply( |
FROM_HERE, |
- base::Bind(&ReadResourceFilePathAndLastModifiedTime, resource_, |
+ base::Bind(&ReadResourceFilePathAndLastModifiedTime, |
+ resource_, |
directory_path_, |
base::Unretained(read_file_path), |
base::Unretained(last_modified_time)), |
@@ -321,8 +337,36 @@ class URLRequestExtensionJob : public net::URLRequestFileJob { |
DCHECK(posted); |
} |
+ virtual void OnSeekComplete(int64 result) OVERRIDE { |
+ DCHECK_EQ(seek_position_, 0); |
+ seek_position_ = result; |
+ } |
+ |
+ virtual void OnReadComplete(net::IOBuffer* buffer, int result) OVERRIDE { |
+ UMA_HISTOGRAM_COUNTS("ExtensionUrlRequest.OnReadCompleteResult", result); |
rvargas (doing something else)
2014/04/08 16:53:45
What do you expect to get out of this histogram?
asargent_no_longer_on_chrome
2014/04/09 20:59:59
I'm interested to see the distribution of common r
|
+ if (result > 0) { |
+ bytes_read_ += result; |
+ if (hash_.get()) { |
+ base::ElapsedTimer timer; |
+ hash_->Update(buffer->data(), result); |
+ hashing_time_ += timer.Elapsed(); |
+ } |
+ } |
+ } |
+ |
private: |
- virtual ~URLRequestExtensionJob() {} |
+ virtual ~URLRequestExtensionJob() { |
+ if (hash_.get()) { |
+ base::ElapsedTimer timer; |
+ std::string hash_bytes(crypto::kSHA256Length, 0); |
+ hash_->Finish(string_as_array(&hash_bytes), hash_bytes.size()); |
+ hashing_time_ += timer.Elapsed(); |
+ UMA_HISTOGRAM_TIMES("ExtensionUrlRequest.HashTimeMs", hashing_time_); |
+ } |
+ UMA_HISTOGRAM_COUNTS("ExtensionUrlRequest.TotalKbRead", |
+ bytes_read_ / 1024); |
+ UMA_HISTOGRAM_COUNTS("ExtensionUrlRequest.SeekPosition", seek_position_); |
+ } |
void OnFilePathAndLastModifiedTimeRead(base::FilePath* read_file_path, |
base::Time* last_modified_time) { |
@@ -334,6 +378,18 @@ class URLRequestExtensionJob : public net::URLRequestFileJob { |
URLRequestFileJob::Start(); |
} |
+ // A hash of the contents we've read from the file. |
+ scoped_ptr<crypto::SecureHash> hash_; |
+ |
+ // The position we seeked to in the file. |
+ int64 seek_position_; |
+ |
+ // The number of bytes of content we read from the file. |
+ int bytes_read_; |
+ |
+ // Used to count the total time it takes to do hashing operations. |
+ base::TimeDelta hashing_time_; |
+ |
net::HttpResponseInfo response_info_; |
base::FilePath directory_path_; |
extensions::ExtensionResource resource_; |