// Copyright (c) 2013 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/streams/stream_context.h" #include "base/bind.h" #include "content/browser/streams/stream_registry.h" #include "content/public/browser/browser_context.h" using base::UserDataAdapter; namespace { const char* kStreamContextKeyName = "content_stream_context"; } namespace content { StreamContext::StreamContext() {} StreamContext* StreamContext::GetFor(BrowserContext* context) { if (!context->GetUserData(kStreamContextKeyName)) { scoped_refptr<StreamContext> stream = new StreamContext(); context->SetUserData(kStreamContextKeyName, new UserDataAdapter<StreamContext>(stream.get())); // Check first to avoid memory leak in unittests. if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) { BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&StreamContext::InitializeOnIOThread, stream)); } } return UserDataAdapter<StreamContext>::Get(context, kStreamContextKeyName); } void StreamContext::InitializeOnIOThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); registry_.reset(new StreamRegistry()); } StreamContext::~StreamContext() {} void StreamContext::DeleteOnCorrectThread() const { // In many tests, there isn't a valid IO thread. In that case, just delete on // the current thread. // TODO(zork): Remove this custom deleter, and fix the leaks in all the // tests. if (BrowserThread::IsMessageLoopValid(BrowserThread::IO) && !BrowserThread::CurrentlyOn(BrowserThread::IO)) { BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, this); return; } delete this; } } // namespace content