| Index: chrome/browser/browsing_data/browsing_data_media_license_helper.cc
 | 
| diff --git a/chrome/browser/browsing_data/browsing_data_media_license_helper.cc b/chrome/browser/browsing_data/browsing_data_media_license_helper.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..653af7ffff58d24ca26f99f0c4bd830940007273
 | 
| --- /dev/null
 | 
| +++ b/chrome/browser/browsing_data/browsing_data_media_license_helper.cc
 | 
| @@ -0,0 +1,148 @@
 | 
| +// Copyright 2016 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 "chrome/browser/browsing_data/browsing_data_media_license_helper.h"
 | 
| +
 | 
| +#include <memory>
 | 
| +#include <set>
 | 
| +
 | 
| +#include "base/bind.h"
 | 
| +#include "base/location.h"
 | 
| +#include "base/macros.h"
 | 
| +#include "base/sequenced_task_runner.h"
 | 
| +#include "chrome/browser/browsing_data/browsing_data_helper.h"
 | 
| +#include "content/public/browser/browser_thread.h"
 | 
| +#include "storage/browser/fileapi/file_system_context.h"
 | 
| +#include "storage/browser/fileapi/file_system_quota_util.h"
 | 
| +#include "storage/browser/fileapi/plugin_private_file_system_backend.h"
 | 
| +#include "storage/common/fileapi/file_system_types.h"
 | 
| +
 | 
| +using content::BrowserThread;
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +// An implementation of the BrowsingDataMediaLicenseHelper interface that
 | 
| +// determine data on media licenses in a given |filesystem_context| and
 | 
| +// returns a list of MediaLicenseInfo items to a client.
 | 
| +class BrowsingDataMediaLicenseHelperImpl
 | 
| +    : public BrowsingDataMediaLicenseHelper {
 | 
| + public:
 | 
| +  // BrowsingDataMediaLicenseHelper implementation
 | 
| +  explicit BrowsingDataMediaLicenseHelperImpl(
 | 
| +      storage::FileSystemContext* filesystem_context);
 | 
| +  void StartFetching(const FetchCallback& callback) final;
 | 
| +  void DeleteMediaLicenseOrigin(const GURL& origin) final;
 | 
| +
 | 
| + private:
 | 
| +  ~BrowsingDataMediaLicenseHelperImpl() final;
 | 
| +
 | 
| +  // Enumerates all filesystem files, storing the resulting list into
 | 
| +  // file_system_file_ for later use. This must be called on the file
 | 
| +  // task runner.
 | 
| +  void FetchMediaLicenseInfoOnFileTaskRunner(const FetchCallback& callback);
 | 
| +
 | 
| +  // Deletes all file systems associated with |origin|. This must be called on
 | 
| +  // the file task runner.
 | 
| +  void DeleteMediaLicenseOriginOnFileTaskRunner(const GURL& origin);
 | 
| +
 | 
| +  // Returns the file task runner for the |filesystem_context_|.
 | 
| +  base::SequencedTaskRunner* file_task_runner() {
 | 
| +    return filesystem_context_->default_file_task_runner();
 | 
| +  }
 | 
| +
 | 
| +  // Keep a reference to the FileSystemContext object for the current profile
 | 
| +  // for use on the file task runner.
 | 
| +  scoped_refptr<storage::FileSystemContext> filesystem_context_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(BrowsingDataMediaLicenseHelperImpl);
 | 
| +};
 | 
| +
 | 
| +BrowsingDataMediaLicenseHelperImpl::BrowsingDataMediaLicenseHelperImpl(
 | 
| +    storage::FileSystemContext* filesystem_context)
 | 
| +    : filesystem_context_(filesystem_context) {
 | 
| +  DCHECK(filesystem_context_.get());
 | 
| +}
 | 
| +
 | 
| +BrowsingDataMediaLicenseHelperImpl::~BrowsingDataMediaLicenseHelperImpl() {}
 | 
| +
 | 
| +void BrowsingDataMediaLicenseHelperImpl::StartFetching(
 | 
| +    const FetchCallback& callback) {
 | 
| +  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 | 
| +  DCHECK(!callback.is_null());
 | 
| +  file_task_runner()->PostTask(
 | 
| +      FROM_HERE, base::Bind(&BrowsingDataMediaLicenseHelperImpl::
 | 
| +                                FetchMediaLicenseInfoOnFileTaskRunner,
 | 
| +                            this, callback));
 | 
| +}
 | 
| +
 | 
| +void BrowsingDataMediaLicenseHelperImpl::DeleteMediaLicenseOrigin(
 | 
| +    const GURL& origin) {
 | 
| +  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 | 
| +  file_task_runner()->PostTask(
 | 
| +      FROM_HERE, base::Bind(&BrowsingDataMediaLicenseHelperImpl::
 | 
| +                                DeleteMediaLicenseOriginOnFileTaskRunner,
 | 
| +                            this, origin));
 | 
| +}
 | 
| +
 | 
| +void BrowsingDataMediaLicenseHelperImpl::FetchMediaLicenseInfoOnFileTaskRunner(
 | 
| +    const FetchCallback& callback) {
 | 
| +  DCHECK(file_task_runner()->RunsTasksOnCurrentThread());
 | 
| +  DCHECK(!callback.is_null());
 | 
| +
 | 
| +  const storage::FileSystemType kType = storage::kFileSystemTypePluginPrivate;
 | 
| +
 | 
| +  storage::PluginPrivateFileSystemBackend* backend =
 | 
| +      static_cast<storage::PluginPrivateFileSystemBackend*>(
 | 
| +          filesystem_context_->GetFileSystemBackend(kType));
 | 
| +
 | 
| +  // Determine the set of origins used.
 | 
| +  std::set<GURL> origins;
 | 
| +  std::list<MediaLicenseInfo> result;
 | 
| +  backend->GetOriginsForTypeOnFileTaskRunner(kType, &origins);
 | 
| +  for (const GURL& origin : origins) {
 | 
| +    if (!BrowsingDataHelper::HasWebScheme(origin))
 | 
| +      continue;  // Non-websafe state is not considered browsing data.
 | 
| +
 | 
| +    int64_t size;
 | 
| +    base::Time last_modified_time;
 | 
| +    backend->GetOriginDetailsOnFileTaskRunner(filesystem_context_.get(), origin,
 | 
| +                                              &size, &last_modified_time);
 | 
| +    result.push_back(MediaLicenseInfo(origin, size, last_modified_time));
 | 
| +  }
 | 
| +
 | 
| +  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
 | 
| +                          base::Bind(callback, result));
 | 
| +}
 | 
| +
 | 
| +void BrowsingDataMediaLicenseHelperImpl::
 | 
| +    DeleteMediaLicenseOriginOnFileTaskRunner(const GURL& origin) {
 | 
| +  DCHECK(file_task_runner()->RunsTasksOnCurrentThread());
 | 
| +
 | 
| +  const storage::FileSystemType kType = storage::kFileSystemTypePluginPrivate;
 | 
| +  storage::FileSystemBackend* backend =
 | 
| +      filesystem_context_->GetFileSystemBackend(kType);
 | 
| +  storage::FileSystemQuotaUtil* quota_util = backend->GetQuotaUtil();
 | 
| +  quota_util->DeleteOriginDataOnFileTaskRunner(
 | 
| +      filesystem_context_.get(), filesystem_context_->quota_manager_proxy(),
 | 
| +      origin, kType);
 | 
| +}
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +BrowsingDataMediaLicenseHelper::MediaLicenseInfo::MediaLicenseInfo(
 | 
| +    const GURL& origin,
 | 
| +    int64_t size,
 | 
| +    base::Time last_modified_time)
 | 
| +    : origin(origin), size(size), last_modified_time(last_modified_time) {}
 | 
| +
 | 
| +BrowsingDataMediaLicenseHelper::MediaLicenseInfo::MediaLicenseInfo(
 | 
| +    const MediaLicenseInfo& other) = default;
 | 
| +
 | 
| +BrowsingDataMediaLicenseHelper::MediaLicenseInfo::~MediaLicenseInfo() {}
 | 
| +
 | 
| +// static
 | 
| +BrowsingDataMediaLicenseHelper* BrowsingDataMediaLicenseHelper::Create(
 | 
| +    storage::FileSystemContext* filesystem_context) {
 | 
| +  return new BrowsingDataMediaLicenseHelperImpl(filesystem_context);
 | 
| +}
 | 
| 
 |