Index: content/browser/webui/url_data_source_impl.cc |
=================================================================== |
--- content/browser/webui/url_data_source_impl.cc (revision 0) |
+++ content/browser/webui/url_data_source_impl.cc (revision 0) |
@@ -0,0 +1,59 @@ |
+// 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 "content/browser/webui/url_data_source_impl.h" |
+ |
+#include "base/bind.h" |
+#include "base/memory/ref_counted_memory.h" |
+#include "base/string_util.h" |
+#include "content/browser/webui/url_data_manager_backend.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/url_data_source.h" |
+ |
+namespace content { |
+ |
+URLDataSourceImpl::URLDataSourceImpl(const std::string& source_name, |
+ URLDataSource* source) |
+ : source_name_(source_name), |
+ backend_(NULL), |
+ source_(source) { |
+} |
+ |
+URLDataSourceImpl::~URLDataSourceImpl() { |
+} |
+ |
+void URLDataSourceImpl::SendResponse( |
+ int request_id, |
+ base::RefCountedMemory* bytes) { |
+ // Take a ref-pointer on entry so byte->Release() will always get called. |
+ scoped_refptr<base::RefCountedMemory> bytes_ptr(bytes); |
+ if (URLDataManager::IsScheduledForDeletion(this)) { |
+ // We're scheduled for deletion. Servicing the request would result in |
+ // this->AddRef being invoked, even though the ref count is 0 and 'this' is |
+ // about to be deleted. If the AddRef were allowed through, when 'this' is |
+ // released it would be deleted again. |
+ // |
+ // This scenario occurs with DataSources that make history requests. Such |
+ // DataSources do a history query in |StartDataRequest| and the request is |
+ // live until the object is deleted (history requests don't up the ref |
+ // count). This means it's entirely possible for the DataSource to invoke |
+ // |SendResponse| between the time when there are no more refs and the time |
+ // when the object is deleted. |
+ return; |
+ } |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&URLDataSourceImpl::SendResponseOnIOThread, this, request_id, |
+ bytes_ptr)); |
+} |
+ |
+void URLDataSourceImpl::SendResponseOnIOThread( |
+ int request_id, |
+ scoped_refptr<base::RefCountedMemory> bytes) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ if (backend_) |
+ backend_->DataAvailable(request_id, bytes); |
+} |
+ |
+} // namespace content |
Property changes on: content\browser\webui\url_data_source_impl.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |