blob: 6b680ab1152a6ca829008dbb9043f64e9157a38d [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_API_MESSAGING_INCOGNITO_CONNECTABILITY_H_
#define CHROME_BROWSER_EXTENSIONS_API_MESSAGING_INCOGNITO_CONNECTABILITY_H_
#include <set>
#include "chrome/browser/extensions/api/profile_keyed_api_factory.h"
#include "url/gurl.h"
class Profile;
namespace content {
class WebContents;
}
namespace extensions {
class Extension;
// Tracks the web connectability of domains to extensions in incognito mode.
//
// The most important functionality is prompting the user to allow or disallow
// connections from incognito tabs to extensions or apps. Even if an extension
// hasn't been enabled in incognito mode, it's still useful for web sites to be
// able to send messages to them, with user constent. For apps, it's essential
// we have this functionality because there is no way for them to be enabled in
// incognito.
class IncognitoConnectability : public ProfileKeyedAPI {
public:
// While in scope, immediately either accepts or denies the alerts that show
// up, and counts the number of times it was invoked.
class ScopedAlertTracker {
public:
enum Mode {
INTERACTIVE,
ALWAYS_ALLOW,
ALWAYS_DENY,
};
explicit ScopedAlertTracker(Mode mode);
~ScopedAlertTracker();
// Returns the number of times the alert has been shown since
// GetAndResetAlertCount was last called.
int GetAndResetAlertCount();
private:
int last_checked_invocation_count_;
};
// Returns the IncognitoConnectability object for |profile|. |profile| must
// be off-the-record.
static IncognitoConnectability* Get(Profile* profile);
// Returns true if |url| is allowed to connect from this profile, false
// otherwise. If unknown, this call will block and prompt the user.
bool Query(const Extension* extension,
content::WebContents* web_contents,
const GURL& url);
private:
friend class ProfileKeyedAPIFactory<IncognitoConnectability>;
explicit IncognitoConnectability(Profile* profile);
virtual ~IncognitoConnectability();
typedef std::map<std::string, std::set<GURL> > ExtensionToOriginsMap;
// Returns true if the (|extension|, |origin|) pair appears in the map.
bool IsInMap(const Extension* extension,
const GURL& origin,
const ExtensionToOriginsMap& map);
// ProfileKeyedAPI implementation.
static ProfileKeyedAPIFactory<IncognitoConnectability>* GetFactoryInstance();
static const char* service_name() {
return "Messaging.IncognitoConnectability";
}
static const bool kServiceHasOwnInstanceInIncognito = true;
static const bool kServiceIsCreatedWithBrowserContext = false;
// The origins that have been prompted for and either allowed or disallowed.
// These are deliberately stored in-memory so that they're reset when the
// profile is destroyed (i.e. when the last incognito window is closed).
ExtensionToOriginsMap allowed_origins_;
ExtensionToOriginsMap disallowed_origins_;
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_MESSAGING_INCOGNITO_CONNECTABILITY_H_