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

Unified Diff: content/browser/renderer_host/duplicate_resource_handler.cc

Issue 10701151: DuplicateContentResourceHandler to monitor resources and track how many times th… (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Created 8 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/duplicate_resource_handler.cc
===================================================================
--- content/browser/renderer_host/duplicate_resource_handler.cc (revision 0)
+++ content/browser/renderer_host/duplicate_resource_handler.cc (revision 0)
@@ -0,0 +1,78 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "content/browser/renderer_host/duplicate_resource_handler.h"
gavinp 2012/07/11 23:39:46 Move this above #include <string>
frankwang 2012/07/12 01:50:36 Done.
+
+#include "base/logging.h"
+#include "base/metrics/histogram.h"
+#include "content/browser/renderer_host/resource_request_info_impl.h"
+#include "net/base/io_buffer.h"
+#include "third_party/smhasher/src/MurmurHash3.h"
+
+
+namespace content{
+
+namespace{
+
+ std::set<uint32>* GetSetOfHashes(){
gavinp 2012/07/11 23:39:46 Nit: don't indent this.
frankwang 2012/07/12 01:50:36 Done.
+ static std::set<uint32> seen_resources;
+ return &seen_resources;
+ }
+
+} // namespace
+
+DuplicateResourceHandler::DuplicateResourceHandler(
+ scoped_ptr<ResourceHandler> next_handler,
+ net::URLRequest* request)
+ : LayeredResourceHandler(next_handler.Pass()),
+ bytes_hit_(0),
+ bytes_miss_(0),
+ read_buffer_size_(0), // keep track of bytes in read buffer
+ request_(request) {
+}
+
+DuplicateResourceHandler::~DuplicateResourceHandler(){
+}
+
+bool DuplicateResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf,
+ int* buf_size, int min_size){
+ DCHECK_EQ(-1, min_size);
+
+ read_buffer_ = *buf;
+ read_buffer_size_ = *buf_size;
gavinp 2012/07/11 23:39:46 This is wrong. The buffer is provided by your down
frankwang 2012/07/12 01:50:36 Done.
+
+ return true;
+}
+
+bool DuplicateResourceHandler::OnReadCompleted(int request_id, int bytes_read,
+ bool* defer) {
+
gavinp 2012/07/11 23:39:46 if (!next_handler_->OnReadCompleted(...)) return
frankwang 2012/07/12 01:50:36 Done.
+ // find hash of resource
+ uint32 buf_hash;
+ MurmurHash3_x86_32(read_buffer_, bytes_read, 0x0, &buf_hash);
gavinp 2012/07/11 23:39:46 This is conceptually broken. The reads come to you
gavinp 2012/07/11 23:39:46 Also: MurmurHash3_x86_32(read_buffer_->data(), by
frankwang 2012/07/12 01:50:36 Done.
+
+ static base::Histogram* num_hits(NULL);
gavinp 2012/07/11 23:39:46 This isn't a common pattern for creating histogram
frankwang 2012/07/12 01:50:36 I changed it just for one histogram. I am still di
+ if (!num_hits)
+ num_hits = base::BooleanHistogram::FactoryGet(
+ "hash.hit", base::Histogram::kUmaTargetedHistogramFlag);
+
+ // if element is in hash
+ if (GetSetOfHashes()->find(buf_hash) != GetSetOfHashes()->end()){
+ bytes_hit_ += bytes_read;
+ num_hits->AddBoolean(true);
+
+ } else{
+ bytes_miss_ += bytes_read;
+ num_hits->AddBoolean(false);
+ GetSetOfHashes()->insert(buf_hash);
+ }
+
gavinp 2012/07/11 23:41:31 I'm not sure if it's kosher to keep read_buffer_ a
frankwang 2012/07/12 01:50:36 Yes, I called release() on it because it was a sco
+ read_buffer_size_ = 0;
+
+ return true;
+}
+
+} //namespace content

Powered by Google App Engine
This is Rietveld 408576698