From 3b568bf423d41df1f886fb8ae0bf64a8a9e9bd66 Mon Sep 17 00:00:00 2001 From: "willchan@chromium.org" Date: Mon, 6 Jul 2009 16:31:43 +0000 Subject: Add checks to track down crashes in URLRequestChromeJob. BUG=http://crbug.com/13924 TEST=none Review URL: http://codereview.chromium.org/155011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19950 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/dom_ui/chrome_url_data_manager.cc | 13 +++++++++++++ chrome/browser/dom_ui/chrome_url_data_manager.h | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/chrome/browser/dom_ui/chrome_url_data_manager.cc b/chrome/browser/dom_ui/chrome_url_data_manager.cc index ff4fa9f..2537a12 100644 --- a/chrome/browser/dom_ui/chrome_url_data_manager.cc +++ b/chrome/browser/dom_ui/chrome_url_data_manager.cc @@ -199,6 +199,16 @@ void ChromeURLDataManager::RemoveFileSource(const std::string& source_name) { file_sources_.erase(source_name); } +bool ChromeURLDataManager::HasPendingJob(URLRequestChromeJob* job) const { + for (PendingRequestMap::const_iterator i = pending_requests_.begin(); + i != pending_requests_.end(); ++i) { + if (i->second == job) + return true; + } + + return false; +} + bool ChromeURLDataManager::StartRequest(const GURL& url, URLRequestChromeJob* job) { // Parse the URL into a request for a source and path. @@ -293,6 +303,7 @@ URLRequestChromeJob::URLRequestChromeJob(URLRequest* request) : URLRequestJob(request), data_offset_(0) {} URLRequestChromeJob::~URLRequestChromeJob() { + CHECK(!chrome_url_data_manager.HasPendingJob(this)); } void URLRequestChromeJob::Start() { @@ -320,6 +331,7 @@ void URLRequestChromeJob::DataAvailable(RefCountedBytes* bytes) { data_ = bytes; int bytes_read; if (pending_buf_.get()) { + CHECK(pending_buf_->data()); CompleteRead(pending_buf_, pending_buf_size_, &bytes_read); pending_buf_ = NULL; NotifyReadComplete(bytes_read); @@ -335,6 +347,7 @@ bool URLRequestChromeJob::ReadRawData(net::IOBuffer* buf, int buf_size, if (!data_.get()) { SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); DCHECK(!pending_buf_.get()); + CHECK(buf->data()); pending_buf_ = buf; pending_buf_size_ = buf_size; return false; // Tell the caller we're still waiting for data. diff --git a/chrome/browser/dom_ui/chrome_url_data_manager.h b/chrome/browser/dom_ui/chrome_url_data_manager.h index f11045c..49e8fd1 100644 --- a/chrome/browser/dom_ui/chrome_url_data_manager.h +++ b/chrome/browser/dom_ui/chrome_url_data_manager.h @@ -112,6 +112,11 @@ private: // Remove a request from the list of pending requests. void RemoveRequest(URLRequestChromeJob* job); + // Returns true if the job exists in |pending_requests_|. False otherwise. + // Called by ~URLRequestChromeJob to verify that |pending_requests_| is kept + // up to date. + bool HasPendingJob(URLRequestChromeJob* job) const; + // Sent by Request::SendResponse. void DataAvailable(RequestID request_id, scoped_refptr bytes); -- cgit v1.1