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(); 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