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