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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
// Copyright (c) 2012 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_PUSH_MESSAGING_PUSH_MESSAGING_API_H__
#define CHROME_BROWSER_EXTENSIONS_API_PUSH_MESSAGING_PUSH_MESSAGING_API_H__
#include <string>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/extensions/api/profile_keyed_api_factory.h"
#include "chrome/browser/extensions/api/push_messaging/obfuscated_gaia_id_fetcher.h"
#include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_delegate.h"
#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/ui/webui/signin/login_ui_service.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "google_apis/gaia/oauth2_token_service.h"
class Profile;
namespace extensions {
class PushMessagingInvalidationMapper;
class ObfuscatedGaiaIdFetcher;
// Observes a single InvalidationHandler and generates onMessage events.
class PushMessagingEventRouter
: public PushMessagingInvalidationHandlerDelegate {
public:
explicit PushMessagingEventRouter(Profile* profile);
virtual ~PushMessagingEventRouter();
// For testing purposes.
void TriggerMessageForTest(const std::string& extension_id,
int subchannel,
const std::string& payload);
private:
// InvalidationHandlerDelegate implementation.
virtual void OnMessage(const std::string& extension_id,
int subchannel,
const std::string& payload) OVERRIDE;
Profile* const profile_;
DISALLOW_COPY_AND_ASSIGN(PushMessagingEventRouter);
};
class PushMessagingGetChannelIdFunction
: public AsyncExtensionFunction,
public ObfuscatedGaiaIdFetcher::Delegate,
public OAuth2TokenService::Observer,
public OAuth2TokenService::Consumer {
public:
PushMessagingGetChannelIdFunction();
protected:
virtual ~PushMessagingGetChannelIdFunction();
// ExtensionFunction:
virtual bool RunImpl() OVERRIDE;
DECLARE_EXTENSION_FUNCTION("pushMessaging.getChannelId",
PUSHMESSAGING_GETCHANNELID)
private:
void ReportResult(const std::string& gaia_id,
const std::string& error_message);
void BuildAndSendResult(const std::string& gaia_id,
const std::string& error_message);
// Begin the async fetch of the Gaia ID.
void StartGaiaIdFetch(const std::string& access_token);
// Begin the async fetch of the access token for Gaia ID fetcher.
void StartAccessTokenFetch();
// OAuth2TokenService::Observer implementation.
virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE;
// OAuth2TokenService::Consumer implementation.
virtual void OnGetTokenSuccess(
const OAuth2TokenService::Request* request,
const std::string& access_token,
const base::Time& expiration_time) OVERRIDE;
virtual void OnGetTokenFailure(
const OAuth2TokenService::Request* request,
const GoogleServiceAuthError& error) OVERRIDE;
// Check if the user is signed into chrome.
bool IsUserLoggedIn() const;
// ObfuscatedGiaiaIdFetcher::Delegate implementation.
virtual void OnObfuscatedGaiaIdFetchSuccess(const std::string& gaia_id)
OVERRIDE;
virtual void OnObfuscatedGaiaIdFetchFailure(
const GoogleServiceAuthError& error) OVERRIDE;
scoped_ptr<ObfuscatedGaiaIdFetcher> fetcher_;
bool interactive_;
scoped_ptr<OAuth2TokenService::Request> fetcher_access_token_request_;
DISALLOW_COPY_AND_ASSIGN(PushMessagingGetChannelIdFunction);
};
class PushMessagingAPI : public ProfileKeyedAPI,
public content::NotificationObserver {
public:
explicit PushMessagingAPI(Profile* profile);
virtual ~PushMessagingAPI();
// Convenience method to get the PushMessagingAPI for a profile.
static PushMessagingAPI* Get(Profile* profile);
// BrowserContextKeyedService implementation.
virtual void Shutdown() OVERRIDE;
// ProfileKeyedAPI implementation.
static ProfileKeyedAPIFactory<PushMessagingAPI>* GetFactoryInstance();
// For testing purposes.
PushMessagingEventRouter* GetEventRouterForTest() const {
return event_router_.get();
}
PushMessagingInvalidationMapper* GetMapperForTest() const {
return handler_.get();
}
void SetMapperForTest(scoped_ptr<PushMessagingInvalidationMapper> mapper);
private:
friend class ProfileKeyedAPIFactory<PushMessagingAPI>;
// ProfileKeyedAPI implementation.
static const char* service_name() {
return "PushMessagingAPI";
}
static const bool kServiceIsNULLWhileTesting = true;
// content::NotificationDelegate implementation.
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// Created lazily when an app or extension with the push messaging permission
// is loaded.
scoped_ptr<PushMessagingEventRouter> event_router_;
scoped_ptr<PushMessagingInvalidationMapper> handler_;
content::NotificationRegistrar registrar_;
Profile* profile_;
DISALLOW_COPY_AND_ASSIGN(PushMessagingAPI);
};
template <>
void ProfileKeyedAPIFactory<PushMessagingAPI>::DeclareFactoryDependencies();
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_PUSH_MESSAGING_PUSH_MESSAGING_API_H__
|