15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_channel_id_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/ssl/channel_id_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using content::BrowserThread;
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class BrowsingDataChannelIDHelperImpl
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : public BrowsingDataChannelIDHelper {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit BrowsingDataChannelIDHelperImpl(
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::URLRequestContextGetter* request_context);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // BrowsingDataChannelIDHelper methods.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartFetching(const FetchResultCallback& callback) OVERRIDE;
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void DeleteChannelID(const std::string& server_id) OVERRIDE;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~BrowsingDataChannelIDHelperImpl();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetch the certs. This must be called in the IO thread.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FetchOnIOThread();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFetchComplete(
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const net::ChannelIDStore::ChannelIDList& channel_id_list);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the completion callback. This must be called in the UI thread.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void NotifyInUIThread(
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const net::ChannelIDStore::ChannelIDList& channel_id_list);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete a single cert. This must be called in IO thread.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteOnIOThread(const std::string& server_id);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when deletion is done.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DeleteCallback();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates whether or not we're currently fetching information:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it's true when StartFetching() is called in the UI thread, and it's reset
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after we notify the callback in the UI thread.
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // This member is only mutated on the UI thread.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_fetching_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // This member is only mutated on the UI thread.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FetchResultCallback completion_callback_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowsingDataChannelIDHelperImpl);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBrowsingDataChannelIDHelperImpl::BrowsingDataChannelIDHelperImpl(
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    net::URLRequestContextGetter* request_context)
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : is_fetching_(false), request_context_getter_(request_context) {
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)BrowsingDataChannelIDHelperImpl::
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)~BrowsingDataChannelIDHelperImpl() {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowsingDataChannelIDHelperImpl::StartFetching(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FetchResultCallback& callback) {
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!is_fetching_);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!callback.is_null());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(completion_callback_.is_null());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fetching_ = true;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_ = callback;
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  BrowserThread::PostTask(
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BrowserThread::IO,
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FROM_HERE,
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(&BrowsingDataChannelIDHelperImpl::FetchOnIOThread, this));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowsingDataChannelIDHelperImpl::DeleteChannelID(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& server_id) {
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  BrowserThread::PostTask(
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BrowserThread::IO,
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FROM_HERE,
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::Bind(
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          &BrowsingDataChannelIDHelperImpl::DeleteOnIOThread, this, server_id));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowsingDataChannelIDHelperImpl::FetchOnIOThread() {
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  net::ChannelIDStore* cert_store =
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_context_getter_->GetURLRequestContext()->
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      channel_id_service()->GetChannelIDStore();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cert_store) {
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cert_store->GetAllChannelIDs(base::Bind(
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        &BrowsingDataChannelIDHelperImpl::OnFetchComplete, this));
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    OnFetchComplete(net::ChannelIDStore::ChannelIDList());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowsingDataChannelIDHelperImpl::OnFetchComplete(
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const net::ChannelIDStore::ChannelIDList& channel_id_list) {
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  BrowserThread::PostTask(
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BrowserThread::UI,
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      FROM_HERE,
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&BrowsingDataChannelIDHelperImpl::NotifyInUIThread,
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 this,
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                 channel_id_list));
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowsingDataChannelIDHelperImpl::NotifyInUIThread(
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const net::ChannelIDStore::ChannelIDList& channel_id_list) {
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(is_fetching_);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_fetching_ = false;
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  completion_callback_.Run(channel_id_list);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_.Reset();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowsingDataChannelIDHelperImpl::DeleteOnIOThread(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& server_id) {
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  net::ChannelIDStore* cert_store =
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_context_getter_->GetURLRequestContext()->
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      channel_id_service()->GetChannelIDStore();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (cert_store) {
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cert_store->DeleteChannelID(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        server_id,
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::Bind(&BrowsingDataChannelIDHelperImpl::DeleteCallback,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   this));
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowsingDataChannelIDHelperImpl::DeleteCallback() {
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Need to close open SSL connections which may be using the channel ids we
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are deleting.
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mattm): http://crbug.com/166069 Make the server bound cert
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // service/store have observers that can notify relevant things directly.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  request_context_getter_->GetURLRequestContext()->ssl_config_service()->
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NotifySSLConfigChange();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBrowsingDataChannelIDHelper* BrowsingDataChannelIDHelper::Create(
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    net::URLRequestContextGetter* request_context) {
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return new BrowsingDataChannelIDHelperImpl(request_context);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)CannedBrowsingDataChannelIDHelper::
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)CannedBrowsingDataChannelIDHelper() {}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)CannedBrowsingDataChannelIDHelper::
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)~CannedBrowsingDataChannelIDHelper() {}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CannedBrowsingDataChannelIDHelper::AddChannelID(
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const net::ChannelIDStore::ChannelID& channel_id) {
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  channel_id_map_[channel_id.server_identifier()] =
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      channel_id;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CannedBrowsingDataChannelIDHelper::Reset() {
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  channel_id_map_.clear();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool CannedBrowsingDataChannelIDHelper::empty() const {
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return channel_id_map_.empty();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)size_t CannedBrowsingDataChannelIDHelper::GetChannelIDCount() const {
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return channel_id_map_.size();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CannedBrowsingDataChannelIDHelper::StartFetching(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FetchResultCallback& callback) {
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (callback.is_null())
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We post a task to emulate async fetching behavior.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  completion_callback_ = callback;
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&CannedBrowsingDataChannelIDHelper::FinishFetching,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 this));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CannedBrowsingDataChannelIDHelper::FinishFetching() {
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  net::ChannelIDStore::ChannelIDList channel_id_list;
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (ChannelIDMap::iterator i = channel_id_map_.begin();
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       i != channel_id_map_.end(); ++i)
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    channel_id_list.push_back(i->second);
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  completion_callback_.Run(channel_id_list);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CannedBrowsingDataChannelIDHelper::DeleteChannelID(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& server_id) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
214