Home | History | Annotate | Download | only in streams
      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 
     11 using base::UserDataAdapter;
     12 
     13 namespace {
     14 const char* kStreamContextKeyName = "content_stream_context";
     15 }
     16 
     17 namespace content {
     18 
     19 StreamContext::StreamContext() {}
     20 
     21 StreamContext* 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 
     37 void StreamContext::InitializeOnIOThread() {
     38   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
     39   registry_.reset(new StreamRegistry());
     40 }
     41 
     42 StreamContext::~StreamContext() {}
     43 
     44 void 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