1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
// 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 "extensions/browser/browser_context_keyed_api_factory.h"
#include "url/gurl.h"
namespace content {
class BrowserContext;
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 BrowserContextKeyedAPI {
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 |context|. |context| must
// be off-the-record.
static IncognitoConnectability* Get(content::BrowserContext* context);
// 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 BrowserContextKeyedAPIFactory<IncognitoConnectability>;
explicit IncognitoConnectability(content::BrowserContext* context);
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);
// BrowserContextKeyedAPI implementation.
static BrowserContextKeyedAPIFactory<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_
|