// 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"
#include "content/public/browser/browser_thread.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
