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

Side by Side Diff: chrome/browser/extensions/extension_protocols.cc

Issue 227943003: Add experiment to measure time to hash extension content as we read it (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | net/net.gyp » ('j') | net/url_request/url_request_file_job.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/extension_protocols.h" 5 #include "chrome/browser/extensions/extension_protocols.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/files/file_path.h" 12 #include "base/files/file_path.h"
13 #include "base/format_macros.h" 13 #include "base/format_macros.h"
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "base/memory/weak_ptr.h" 15 #include "base/memory/weak_ptr.h"
16 #include "base/message_loop/message_loop.h" 16 #include "base/message_loop/message_loop.h"
17 #include "base/metrics/field_trial.h"
17 #include "base/metrics/histogram.h" 18 #include "base/metrics/histogram.h"
18 #include "base/path_service.h" 19 #include "base/path_service.h"
19 #include "base/sha1.h" 20 #include "base/sha1.h"
20 #include "base/strings/string_number_conversions.h" 21 #include "base/strings/string_number_conversions.h"
21 #include "base/strings/string_util.h" 22 #include "base/strings/string_util.h"
22 #include "base/strings/stringprintf.h" 23 #include "base/strings/stringprintf.h"
23 #include "base/strings/utf_string_conversions.h" 24 #include "base/strings/utf_string_conversions.h"
24 #include "base/threading/sequenced_worker_pool.h" 25 #include "base/threading/sequenced_worker_pool.h"
25 #include "base/threading/thread_restrictions.h" 26 #include "base/threading/thread_restrictions.h"
26 #include "base/timer/elapsed_timer.h" 27 #include "base/timer/elapsed_timer.h"
27 #include "build/build_config.h" 28 #include "build/build_config.h"
28 #include "chrome/browser/extensions/extension_renderer_state.h" 29 #include "chrome/browser/extensions/extension_renderer_state.h"
29 #include "chrome/browser/extensions/image_loader.h" 30 #include "chrome/browser/extensions/image_loader.h"
30 #include "chrome/common/chrome_paths.h" 31 #include "chrome/common/chrome_paths.h"
31 #include "chrome/common/extensions/manifest_handlers/icons_handler.h" 32 #include "chrome/common/extensions/manifest_handlers/icons_handler.h"
32 #include "chrome/common/extensions/manifest_url_handler.h" 33 #include "chrome/common/extensions/manifest_url_handler.h"
33 #include "chrome/common/url_constants.h" 34 #include "chrome/common/url_constants.h"
34 #include "content/public/browser/browser_thread.h" 35 #include "content/public/browser/browser_thread.h"
35 #include "content/public/browser/resource_request_info.h" 36 #include "content/public/browser/resource_request_info.h"
37 #include "crypto/secure_hash.h"
38 #include "crypto/sha2.h"
36 #include "extensions/browser/info_map.h" 39 #include "extensions/browser/info_map.h"
37 #include "extensions/common/constants.h" 40 #include "extensions/common/constants.h"
38 #include "extensions/common/extension.h" 41 #include "extensions/common/extension.h"
39 #include "extensions/common/extension_resource.h" 42 #include "extensions/common/extension_resource.h"
40 #include "extensions/common/file_util.h" 43 #include "extensions/common/file_util.h"
41 #include "extensions/common/manifest_handlers/background_info.h" 44 #include "extensions/common/manifest_handlers/background_info.h"
42 #include "extensions/common/manifest_handlers/csp_info.h" 45 #include "extensions/common/manifest_handlers/csp_info.h"
43 #include "extensions/common/manifest_handlers/incognito_info.h" 46 #include "extensions/common/manifest_handlers/incognito_info.h"
44 #include "extensions/common/manifest_handlers/shared_module_info.h" 47 #include "extensions/common/manifest_handlers/shared_module_info.h"
45 #include "extensions/common/manifest_handlers/web_accessible_resources_info.h" 48 #include "extensions/common/manifest_handlers/web_accessible_resources_info.h"
46 #include "extensions/common/manifest_handlers/webview_info.h" 49 #include "extensions/common/manifest_handlers/webview_info.h"
47 #include "grit/component_extension_resources_map.h" 50 #include "grit/component_extension_resources_map.h"
51 #include "net/base/io_buffer.h"
48 #include "net/base/mime_util.h" 52 #include "net/base/mime_util.h"
49 #include "net/base/net_errors.h" 53 #include "net/base/net_errors.h"
50 #include "net/http/http_request_headers.h" 54 #include "net/http/http_request_headers.h"
51 #include "net/http/http_response_headers.h" 55 #include "net/http/http_response_headers.h"
52 #include "net/http/http_response_info.h" 56 #include "net/http/http_response_info.h"
53 #include "net/url_request/url_request_error_job.h" 57 #include "net/url_request/url_request_error_job.h"
54 #include "net/url_request/url_request_file_job.h" 58 #include "net/url_request/url_request_file_job.h"
55 #include "net/url_request/url_request_simple_job.h" 59 #include "net/url_request/url_request_simple_job.h"
56 #include "ui/base/resource/resource_bundle.h" 60 #include "ui/base/resource/resource_bundle.h"
57 #include "url/url_util.h" 61 #include "url/url_util.h"
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 class URLRequestExtensionJob : public net::URLRequestFileJob { 282 class URLRequestExtensionJob : public net::URLRequestFileJob {
279 public: 283 public:
280 URLRequestExtensionJob(net::URLRequest* request, 284 URLRequestExtensionJob(net::URLRequest* request,
281 net::NetworkDelegate* network_delegate, 285 net::NetworkDelegate* network_delegate,
282 const std::string& extension_id, 286 const std::string& extension_id,
283 const base::FilePath& directory_path, 287 const base::FilePath& directory_path,
284 const base::FilePath& relative_path, 288 const base::FilePath& relative_path,
285 const std::string& content_security_policy, 289 const std::string& content_security_policy,
286 bool send_cors_header, 290 bool send_cors_header,
287 bool follow_symlinks_anywhere) 291 bool follow_symlinks_anywhere)
288 : net::URLRequestFileJob( 292 : net::URLRequestFileJob(
289 request, network_delegate, base::FilePath(), 293 request,
290 BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( 294 network_delegate,
291 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)), 295 base::FilePath(),
292 directory_path_(directory_path), 296 BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
293 // TODO(tc): Move all of these files into resources.pak so we don't break 297 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)),
294 // when updating on Linux. 298 seek_position_(0),
295 resource_(extension_id, directory_path, relative_path), 299 bytes_read_(0),
296 content_security_policy_(content_security_policy), 300 directory_path_(directory_path),
297 send_cors_header_(send_cors_header), 301 // TODO(tc): Move all of these files into resources.pak so we don't
298 weak_factory_(this) { 302 // break when updating on Linux.
303 resource_(extension_id, directory_path, relative_path),
304 content_security_policy_(content_security_policy),
305 send_cors_header_(send_cors_header),
306 weak_factory_(this) {
299 if (follow_symlinks_anywhere) { 307 if (follow_symlinks_anywhere) {
300 resource_.set_follow_symlinks_anywhere(); 308 resource_.set_follow_symlinks_anywhere();
301 } 309 }
310 const std::string& group =
311 base::FieldTrialList::FindFullName("ExtensionContentHashMeasurement");
312 if (group == "Yes") {
313 base::ElapsedTimer timer;
314 hash_.reset(crypto::SecureHash::Create(crypto::SecureHash::SHA256));
315 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.
316 }
302 } 317 }
303 318
304 virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE { 319 virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE {
305 *info = response_info_; 320 *info = response_info_;
306 } 321 }
307 322
308 virtual void Start() OVERRIDE { 323 virtual void Start() OVERRIDE {
309 base::FilePath* read_file_path = new base::FilePath; 324 base::FilePath* read_file_path = new base::FilePath;
310 base::Time* last_modified_time = new base::Time(); 325 base::Time* last_modified_time = new base::Time();
311 bool posted = BrowserThread::PostBlockingPoolTaskAndReply( 326 bool posted = BrowserThread::PostBlockingPoolTaskAndReply(
312 FROM_HERE, 327 FROM_HERE,
313 base::Bind(&ReadResourceFilePathAndLastModifiedTime, resource_, 328 base::Bind(&ReadResourceFilePathAndLastModifiedTime,
329 resource_,
314 directory_path_, 330 directory_path_,
315 base::Unretained(read_file_path), 331 base::Unretained(read_file_path),
316 base::Unretained(last_modified_time)), 332 base::Unretained(last_modified_time)),
317 base::Bind(&URLRequestExtensionJob::OnFilePathAndLastModifiedTimeRead, 333 base::Bind(&URLRequestExtensionJob::OnFilePathAndLastModifiedTimeRead,
318 weak_factory_.GetWeakPtr(), 334 weak_factory_.GetWeakPtr(),
319 base::Owned(read_file_path), 335 base::Owned(read_file_path),
320 base::Owned(last_modified_time))); 336 base::Owned(last_modified_time)));
321 DCHECK(posted); 337 DCHECK(posted);
322 } 338 }
323 339
340 virtual void OnSeekComplete(int64 result) OVERRIDE {
341 DCHECK_EQ(seek_position_, 0);
342 seek_position_ = result;
343 }
344
345 virtual void OnReadComplete(net::IOBuffer* buffer, int result) OVERRIDE {
346 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
347 if (result > 0) {
348 bytes_read_ += result;
349 if (hash_.get()) {
350 base::ElapsedTimer timer;
351 hash_->Update(buffer->data(), result);
352 hashing_time_ += timer.Elapsed();
353 }
354 }
355 }
356
324 private: 357 private:
325 virtual ~URLRequestExtensionJob() {} 358 virtual ~URLRequestExtensionJob() {
359 if (hash_.get()) {
360 base::ElapsedTimer timer;
361 std::string hash_bytes(crypto::kSHA256Length, 0);
362 hash_->Finish(string_as_array(&hash_bytes), hash_bytes.size());
363 hashing_time_ += timer.Elapsed();
364 UMA_HISTOGRAM_TIMES("ExtensionUrlRequest.HashTimeMs", hashing_time_);
365 }
366 UMA_HISTOGRAM_COUNTS("ExtensionUrlRequest.TotalKbRead",
367 bytes_read_ / 1024);
368 UMA_HISTOGRAM_COUNTS("ExtensionUrlRequest.SeekPosition", seek_position_);
369 }
326 370
327 void OnFilePathAndLastModifiedTimeRead(base::FilePath* read_file_path, 371 void OnFilePathAndLastModifiedTimeRead(base::FilePath* read_file_path,
328 base::Time* last_modified_time) { 372 base::Time* last_modified_time) {
329 file_path_ = *read_file_path; 373 file_path_ = *read_file_path;
330 response_info_.headers = BuildHttpHeaders( 374 response_info_.headers = BuildHttpHeaders(
331 content_security_policy_, 375 content_security_policy_,
332 send_cors_header_, 376 send_cors_header_,
333 *last_modified_time); 377 *last_modified_time);
334 URLRequestFileJob::Start(); 378 URLRequestFileJob::Start();
335 } 379 }
336 380
381 // A hash of the contents we've read from the file.
382 scoped_ptr<crypto::SecureHash> hash_;
383
384 // The position we seeked to in the file.
385 int64 seek_position_;
386
387 // The number of bytes of content we read from the file.
388 int bytes_read_;
389
390 // Used to count the total time it takes to do hashing operations.
391 base::TimeDelta hashing_time_;
392
337 net::HttpResponseInfo response_info_; 393 net::HttpResponseInfo response_info_;
338 base::FilePath directory_path_; 394 base::FilePath directory_path_;
339 extensions::ExtensionResource resource_; 395 extensions::ExtensionResource resource_;
340 std::string content_security_policy_; 396 std::string content_security_policy_;
341 bool send_cors_header_; 397 bool send_cors_header_;
342 base::WeakPtrFactory<URLRequestExtensionJob> weak_factory_; 398 base::WeakPtrFactory<URLRequestExtensionJob> weak_factory_;
343 }; 399 };
344 400
345 bool ExtensionCanLoadInIncognito(const ResourceRequestInfo* info, 401 bool ExtensionCanLoadInIncognito(const ResourceRequestInfo* info,
346 const std::string& extension_id, 402 const std::string& extension_id,
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 follow_symlinks_anywhere); 692 follow_symlinks_anywhere);
637 } 693 }
638 694
639 } // namespace 695 } // namespace
640 696
641 net::URLRequestJobFactory::ProtocolHandler* CreateExtensionProtocolHandler( 697 net::URLRequestJobFactory::ProtocolHandler* CreateExtensionProtocolHandler(
642 Profile::ProfileType profile_type, 698 Profile::ProfileType profile_type,
643 extensions::InfoMap* extension_info_map) { 699 extensions::InfoMap* extension_info_map) {
644 return new ExtensionProtocolHandler(profile_type, extension_info_map); 700 return new ExtensionProtocolHandler(profile_type, extension_info_map);
645 } 701 }
OLDNEW
« no previous file with comments | « no previous file | net/net.gyp » ('j') | net/url_request/url_request_file_job.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698