Home | History | Annotate | Download | only in messaging
      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