• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
13 namespace content {
14 class BrowserContext;
15 class WebContents;
16 }
17 
18 namespace extensions {
19 class 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.
29 class 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();
service_name()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