1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/browser/streams/stream_context.h" 6 7#include "base/bind.h" 8#include "content/browser/streams/stream_registry.h" 9#include "content/public/browser/browser_context.h" 10#include "content/public/browser/browser_thread.h" 11 12using base::UserDataAdapter; 13 14namespace { 15const char* kStreamContextKeyName = "content_stream_context"; 16} 17 18namespace content { 19 20StreamContext::StreamContext() {} 21 22StreamContext* StreamContext::GetFor(BrowserContext* context) { 23 if (!context->GetUserData(kStreamContextKeyName)) { 24 scoped_refptr<StreamContext> stream = new StreamContext(); 25 context->SetUserData(kStreamContextKeyName, 26 new UserDataAdapter<StreamContext>(stream.get())); 27 // Check first to avoid memory leak in unittests. 28 if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) { 29 BrowserThread::PostTask( 30 BrowserThread::IO, FROM_HERE, 31 base::Bind(&StreamContext::InitializeOnIOThread, stream)); 32 } 33 } 34 35 return UserDataAdapter<StreamContext>::Get(context, kStreamContextKeyName); 36} 37 38void StreamContext::InitializeOnIOThread() { 39 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 40 registry_.reset(new StreamRegistry()); 41} 42 43StreamContext::~StreamContext() {} 44 45void StreamContext::DeleteOnCorrectThread() const { 46 // In many tests, there isn't a valid IO thread. In that case, just delete on 47 // the current thread. 48 // TODO(zork): Remove this custom deleter, and fix the leaks in all the 49 // tests. 50 if (BrowserThread::IsMessageLoopValid(BrowserThread::IO) && 51 !BrowserThread::CurrentlyOn(BrowserThread::IO)) { 52 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, this); 53 return; 54 } 55 delete this; 56} 57 58} // namespace content 59