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_NOTIFICATIONS_NOTIFICATIONS_PREFS_CACHE_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_NOTIFICATIONS_NOTIFICATIONS_PREFS_CACHE_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/content_settings.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ListValue;
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Class which caches notification preferences.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construction occurs on the UI thread when the contents
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of the profile preferences are initialized.  Once is_initialized() is set,
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// access can only be done from the IO thread.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NotificationsPrefsCache
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public base::RefCountedThreadSafe<NotificationsPrefsCache> {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationsPrefsCache();
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Once is_initialized() is set, all accesses must happen on the IO thread.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Before that, all accesses need to happen on the UI thread.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_is_initialized(bool val) { is_initialized_ = val; }
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_initialized() { return is_initialized_; }
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Checks to see if a given origin has permission to create desktop
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notifications.  Returns a constant from WebNotificationPresenter
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // class.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int HasPermission(const GURL& origin);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates the cache with a new origin allowed or denied.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CacheAllowedOrigin(const GURL& origin);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CacheDeniedOrigin(const GURL& origin);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the cache to the supplied values.  This clears the current
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // contents of the cache.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetCacheAllowedOrigins(const std::vector<GURL>& allowed);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetCacheDeniedOrigins(const std::vector<GURL>& denied);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetCacheDefaultContentSetting(ContentSetting setting);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void ListValueToGurlVector(const ListValue& origin_list,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    std::vector<GURL>* origin_vector);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Exposed for testing.
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ContentSetting CachedDefaultContentSetting() {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return default_content_setting_;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<NotificationsPrefsCache>;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ~NotificationsPrefsCache();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper functions which read preferences.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsOriginAllowed(const GURL& origin);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsOriginDenied(const GURL& origin);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper that ensures we are running on the expected thread.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckThreadAccess();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Storage of the actual preferences.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::set<GURL> allowed_origins_;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::set<GURL> denied_origins_;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The default setting, used for origins that are neither in
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |allowed_origins_| nor |denied_origins_|.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ContentSetting default_content_setting_;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set to true once the initial cached settings have been completely read.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Once this is done, the class can no longer be accessed on the UI thread.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_initialized_;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(NotificationsPrefsCache);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_NOTIFICATIONS_NOTIFICATIONS_PREFS_CACHE_H_
83