1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_API_MESSAGING_INCOGNITO_CONNECTABILITY_H_
6#define CHROME_BROWSER_EXTENSIONS_API_MESSAGING_INCOGNITO_CONNECTABILITY_H_
7
8#include <set>
9
10#include "extensions/browser/browser_context_keyed_api_factory.h"
11#include "url/gurl.h"
12
13namespace content {
14class BrowserContext;
15class WebContents;
16}
17
18namespace extensions {
19class Extension;
20
21// Tracks the web connectability of domains to extensions in incognito mode.
22//
23// The most important functionality is prompting the user to allow or disallow
24// connections from incognito tabs to extensions or apps. Even if an extension
25// hasn't been enabled in incognito mode, it's still useful for web sites to be
26// able to send messages to them, with user constent. For apps, it's essential
27// we have this functionality because there is no way for them to be enabled in
28// incognito.
29class IncognitoConnectability : public BrowserContextKeyedAPI {
30 public:
31  // While in scope, immediately either accepts or denies the alerts that show
32  // up, and counts the number of times it was invoked.
33  class ScopedAlertTracker {
34   public:
35    enum Mode {
36      INTERACTIVE,
37      ALWAYS_ALLOW,
38      ALWAYS_DENY,
39    };
40
41    explicit ScopedAlertTracker(Mode mode);
42
43    ~ScopedAlertTracker();
44
45    // Returns the number of times the alert has been shown since
46    // GetAndResetAlertCount was last called.
47    int GetAndResetAlertCount();
48
49   private:
50    int last_checked_invocation_count_;
51  };
52
53  // Returns the IncognitoConnectability object for |context|. |context| must
54  // be off-the-record.
55  static IncognitoConnectability* Get(content::BrowserContext* context);
56
57  // Returns true if |url| is allowed to connect from this profile, false
58  // otherwise. If unknown, this call will block and prompt the user.
59  bool Query(const Extension* extension,
60             content::WebContents* web_contents,
61             const GURL& url);
62
63 private:
64  friend class BrowserContextKeyedAPIFactory<IncognitoConnectability>;
65
66  explicit IncognitoConnectability(content::BrowserContext* context);
67  virtual ~IncognitoConnectability();
68
69  typedef std::map<std::string, std::set<GURL> > ExtensionToOriginsMap;
70
71  // Returns true if the (|extension|, |origin|) pair appears in the map.
72  bool IsInMap(const Extension* extension,
73               const GURL& origin,
74               const ExtensionToOriginsMap& map);
75
76  // BrowserContextKeyedAPI implementation.
77  static BrowserContextKeyedAPIFactory<IncognitoConnectability>*
78      GetFactoryInstance();
79  static const char* service_name() {
80    return "Messaging.IncognitoConnectability";
81  }
82  static const bool kServiceHasOwnInstanceInIncognito = true;
83  static const bool kServiceIsCreatedWithBrowserContext = false;
84
85  // The origins that have been prompted for and either allowed or disallowed.
86  // These are deliberately stored in-memory so that they're reset when the
87  // profile is destroyed (i.e. when the last incognito window is closed).
88  ExtensionToOriginsMap allowed_origins_;
89  ExtensionToOriginsMap disallowed_origins_;
90};
91
92}  // namespace extensions
93
94#endif  // CHROME_BROWSER_EXTENSIONS_API_MESSAGING_INCOGNITO_CONNECTABILITY_H_
95