1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_USER_STYLE_SHEET_WATCHER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_USER_STYLE_SHEET_WATCHER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/files/file_path_watcher.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass UserStyleSheetLoader;
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Watches the user style sheet file and triggers reloads on the file thread
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// whenever the file changes.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UserStyleSheetWatcher
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public base::RefCountedThreadSafe<UserStyleSheetWatcher,
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                        BrowserThread::DeleteOnUIThread>,
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      public NotificationObserver {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit UserStyleSheetWatcher(const FilePath& profile_path);
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Init();
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL user_style_sheet() const;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver interface
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend class DeleteTask<UserStyleSheetWatcher>;
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~UserStyleSheetWatcher();
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The directory containing User StyleSheets/Custom.css.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath profile_path_;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The loader object.
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<UserStyleSheetLoader> loader_;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Watches for changes to the css file so we can reload the style sheet.
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<base::files::FilePathWatcher> file_watcher_;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(UserStyleSheetWatcher);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_USER_STYLE_SHEET_WATCHER_H_
59