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
11using base::UserDataAdapter;
12
13namespace {
14const char* kStreamContextKeyName = "content_stream_context";
15}
16
17namespace content {
18
19StreamContext::StreamContext() {}
20
21StreamContext* StreamContext::GetFor(BrowserContext* context) {
22  if (!context->GetUserData(kStreamContextKeyName)) {
23    scoped_refptr<StreamContext> stream = new StreamContext();
24    context->SetUserData(kStreamContextKeyName,
25                         new UserDataAdapter<StreamContext>(stream.get()));
26    // Check first to avoid memory leak in unittests.
27    if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) {
28      BrowserThread::PostTask(
29          BrowserThread::IO, FROM_HERE,
30          base::Bind(&StreamContext::InitializeOnIOThread, stream));
31    }
32  }
33
34  return UserDataAdapter<StreamContext>::Get(context, kStreamContextKeyName);
35}
36
37void StreamContext::InitializeOnIOThread() {
38  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
39  registry_.reset(new StreamRegistry());
40}
41
42StreamContext::~StreamContext() {}
43
44void StreamContext::DeleteOnCorrectThread() const {
45  // In many tests, there isn't a valid IO thread.  In that case, just delete on
46  // the current thread.
47  // TODO(zork): Remove this custom deleter, and fix the leaks in all the
48  // tests.
49  if (BrowserThread::IsMessageLoopValid(BrowserThread::IO) &&
50      !BrowserThread::CurrentlyOn(BrowserThread::IO)) {
51    BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, this);
52    return;
53  }
54  delete this;
55}
56
57}  // namespace content
58