| Index: chrome/browser/user_style_sheet_watcher.cc
|
| diff --git a/chrome/browser/user_style_sheet_watcher.cc b/chrome/browser/user_style_sheet_watcher.cc
|
| deleted file mode 100644
|
| index 075741253f3bec767c986f0d24fca23cad6f314a..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/user_style_sheet_watcher.cc
|
| +++ /dev/null
|
| @@ -1,215 +0,0 @@
|
| -// Copyright (c) 2012 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/user_style_sheet_watcher.h"
|
| -
|
| -#include "base/base64.h"
|
| -#include "base/bind.h"
|
| -#include "base/file_util.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/notification_types.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -
|
| -using ::base::FilePathWatcher;
|
| -using content::BrowserThread;
|
| -using content::WebContents;
|
| -
|
| -namespace {
|
| -
|
| -// The subdirectory of the profile that contains the style sheet.
|
| -const char kStyleSheetDir[] = "User StyleSheets";
|
| -// The filename of the stylesheet.
|
| -const char kUserStyleSheetFile[] = "Custom.css";
|
| -
|
| -} // namespace
|
| -
|
| -// UserStyleSheetLoader is responsible for loading the user style sheet on the
|
| -// file thread and sends a notification when the style sheet is loaded. It is
|
| -// a helper to UserStyleSheetWatcher. The reference graph is as follows:
|
| -//
|
| -// .-----------------------. owns .-----------------.
|
| -// | UserStyleSheetWatcher |----------->| FilePathWatcher |
|
| -// '-----------------------' '-----------------'
|
| -// | |
|
| -// V |
|
| -// .----------------------. |
|
| -// | UserStyleSheetLoader |<--------------------'
|
| -// '----------------------'
|
| -//
|
| -// FilePathWatcher's reference to UserStyleSheetLoader is used for delivering
|
| -// the change notifications. Since they happen asynchronously,
|
| -// UserStyleSheetWatcher and its FilePathWatcher may be destroyed while a
|
| -// callback to UserStyleSheetLoader is in progress, in which case the
|
| -// UserStyleSheetLoader object outlives the watchers.
|
| -class UserStyleSheetLoader
|
| - : public base::RefCountedThreadSafe<UserStyleSheetLoader> {
|
| - public:
|
| - UserStyleSheetLoader();
|
| -
|
| - GURL user_style_sheet() const {
|
| - return user_style_sheet_;
|
| - }
|
| -
|
| - // Load the user style sheet on the file thread and convert it to a
|
| - // base64 URL. Posts the base64 URL back to the UI thread.
|
| - void LoadStyleSheet(const base::FilePath& style_sheet_file);
|
| -
|
| - // Register a callback to be called whenever the stylesheet gets updated.
|
| - scoped_ptr<base::CallbackList<void(void)>::Subscription>
|
| - RegisterOnStyleSheetUpdatedCallback(const base::Closure& callback);
|
| -
|
| - // Send out a notification if the stylesheet has already been loaded.
|
| - void NotifyLoaded();
|
| -
|
| - // FilePathWatcher::Callback method:
|
| - void NotifyPathChanged(const base::FilePath& path, bool error);
|
| -
|
| - private:
|
| - friend class base::RefCountedThreadSafe<UserStyleSheetLoader>;
|
| - ~UserStyleSheetLoader();
|
| -
|
| - // Called on the UI thread after the stylesheet has loaded.
|
| - void SetStyleSheet(const GURL& url);
|
| -
|
| - // The user style sheet as a base64 data:// URL.
|
| - GURL user_style_sheet_;
|
| -
|
| - // Whether the stylesheet has been loaded.
|
| - bool has_loaded_;
|
| -
|
| - base::CallbackList<void(void)> style_sheet_updated_callbacks_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(UserStyleSheetLoader);
|
| -};
|
| -
|
| -UserStyleSheetLoader::UserStyleSheetLoader()
|
| - : has_loaded_(false) {
|
| -}
|
| -
|
| -UserStyleSheetLoader::~UserStyleSheetLoader() {
|
| -}
|
| -
|
| -scoped_ptr<base::CallbackList<void(void)>::Subscription>
|
| -UserStyleSheetLoader::RegisterOnStyleSheetUpdatedCallback(
|
| - const base::Closure& callback) {
|
| - return style_sheet_updated_callbacks_.Add(callback);
|
| -}
|
| -
|
| -void UserStyleSheetLoader::NotifyLoaded() {
|
| - if (has_loaded_) {
|
| - style_sheet_updated_callbacks_.Notify();
|
| - }
|
| -}
|
| -
|
| -void UserStyleSheetLoader::NotifyPathChanged(const base::FilePath& path,
|
| - bool error) {
|
| - if (!error)
|
| - LoadStyleSheet(path);
|
| -}
|
| -
|
| -void UserStyleSheetLoader::LoadStyleSheet(
|
| - const base::FilePath& style_sheet_file) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| - // We keep the user style sheet in a subdir so we can watch for changes
|
| - // to the file.
|
| - base::FilePath style_sheet_dir = style_sheet_file.DirName();
|
| - if (!base::DirectoryExists(style_sheet_dir)) {
|
| - if (!file_util::CreateDirectory(style_sheet_dir))
|
| - return;
|
| - }
|
| - // Create the file if it doesn't exist.
|
| - if (!base::PathExists(style_sheet_file))
|
| - file_util::WriteFile(style_sheet_file, "", 0);
|
| -
|
| - std::string css;
|
| - bool rv = base::ReadFileToString(style_sheet_file, &css);
|
| - GURL style_sheet_url;
|
| - if (rv && !css.empty()) {
|
| - std::string css_base64;
|
| - rv = base::Base64Encode(css, &css_base64);
|
| - if (rv) {
|
| - // WebKit knows about data urls, so convert the file to a data url.
|
| - const char kDataUrlPrefix[] = "data:text/css;charset=utf-8;base64,";
|
| - style_sheet_url = GURL(kDataUrlPrefix + css_base64);
|
| - }
|
| - }
|
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&UserStyleSheetLoader::SetStyleSheet, this,
|
| - style_sheet_url));
|
| -}
|
| -
|
| -void UserStyleSheetLoader::SetStyleSheet(const GURL& url) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - has_loaded_ = true;
|
| - user_style_sheet_ = url;
|
| - NotifyLoaded();
|
| -}
|
| -
|
| -UserStyleSheetWatcher::UserStyleSheetWatcher(Profile* profile,
|
| - const base::FilePath& profile_path)
|
| - : RefcountedBrowserContextKeyedService(content::BrowserThread::UI),
|
| - profile_(profile),
|
| - profile_path_(profile_path),
|
| - loader_(new UserStyleSheetLoader) {
|
| - // Listen for when the first render view host is created. If we load
|
| - // too fast, the first tab won't hear the notification and won't get
|
| - // the user style sheet.
|
| - registrar_.Add(this,
|
| - content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
|
| - content::NotificationService::AllBrowserContextsAndSources());
|
| -}
|
| -
|
| -UserStyleSheetWatcher::~UserStyleSheetWatcher() {
|
| -}
|
| -
|
| -void UserStyleSheetWatcher::Init() {
|
| - // Make sure we run on the file thread.
|
| - if (!BrowserThread::CurrentlyOn(BrowserThread::FILE)) {
|
| - BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&UserStyleSheetWatcher::Init, this));
|
| - return;
|
| - }
|
| -
|
| - if (!file_watcher_.get()) {
|
| - file_watcher_.reset(new FilePathWatcher);
|
| - base::FilePath style_sheet_file = profile_path_.AppendASCII(kStyleSheetDir)
|
| - .AppendASCII(kUserStyleSheetFile);
|
| - if (!file_watcher_->Watch(
|
| - style_sheet_file,
|
| - false,
|
| - base::Bind(&UserStyleSheetLoader::NotifyPathChanged,
|
| - loader_.get()))) {
|
| - LOG(ERROR) << "Failed to setup watch for " << style_sheet_file.value();
|
| - }
|
| - loader_->LoadStyleSheet(style_sheet_file);
|
| - }
|
| -}
|
| -
|
| -GURL UserStyleSheetWatcher::user_style_sheet() const {
|
| - return loader_->user_style_sheet();
|
| -}
|
| -
|
| -scoped_ptr<base::CallbackList<void(void)>::Subscription>
|
| -UserStyleSheetWatcher::RegisterOnStyleSheetUpdatedCallback(
|
| - const base::Closure& callback) {
|
| - return loader_->RegisterOnStyleSheetUpdatedCallback(callback);
|
| -}
|
| -
|
| -void UserStyleSheetWatcher::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(type == content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED);
|
| - if (profile_->IsSameProfile(Profile::FromBrowserContext(
|
| - content::Source<WebContents>(source)->GetBrowserContext()))) {
|
| - loader_->NotifyLoaded();
|
| - registrar_.RemoveAll();
|
| - }
|
| -}
|
| -
|
| -void UserStyleSheetWatcher::ShutdownOnUIThread() {
|
| - registrar_.RemoveAll();
|
| -}
|
|
|