Index: chrome/service/cloud_print/cloud_print_proxy_backend.cc |
diff --git a/chrome/service/cloud_print/cloud_print_proxy_backend.cc b/chrome/service/cloud_print/cloud_print_proxy_backend.cc |
index bc09b0701997065a6183570a9dfccf8c45ecbc1a..98ca6706a8f983fc8a8fcf5d72d9865ead516d5b 100644 |
--- a/chrome/service/cloud_print/cloud_print_proxy_backend.cc |
+++ b/chrome/service/cloud_print/cloud_print_proxy_backend.cc |
@@ -63,8 +63,7 @@ class CloudPrintProxyBackend::Core |
void DoInitializeWithRobotAuthCode(const std::string& robot_oauth_auth_code, |
const std::string& robot_email); |
- // Called on the CloudPrintProxyBackend core_thread_ to perform |
- // shutdown. |
+ // Called on the CloudPrintProxyBackend |core_thread_| to perform shutdown. |
void DoShutdown(); |
void DoRegisterSelectedPrinters( |
const printing::PrinterList& printer_list); |
@@ -94,6 +93,14 @@ class CloudPrintProxyBackend::Core |
~Core() override {} |
+ CloudPrintProxyFrontend* frontend() { return backend_->frontend_; } |
+ |
+ bool PostFrontendTask(const tracked_objects::Location& from_here, |
+ const base::Closure& task); |
+ |
+ bool CurrentlyOnFrontendThread() const; |
+ bool CurrentlyOnCoreThread() const; |
+ |
void CreateAuthAndConnector(); |
void DestroyAuthAndConnector(); |
@@ -127,7 +134,7 @@ class CloudPrintProxyBackend::Core |
CloudPrintTokenStore* GetTokenStore(); |
// Our parent CloudPrintProxyBackend |
- CloudPrintProxyBackend* backend_; |
+ CloudPrintProxyBackend* const backend_; |
// Cloud Print authenticator. |
scoped_refptr<CloudPrintAuth> auth_; |
@@ -178,10 +185,9 @@ bool CloudPrintProxyBackend::InitializeWithToken( |
const std::string& cloud_print_token) { |
if (!core_thread_.Start()) |
return false; |
- core_thread_.task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithToken, |
- core_.get(), cloud_print_token)); |
+ PostCoreTask(FROM_HERE, |
+ base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithToken, |
+ core_.get(), cloud_print_token)); |
return true; |
} |
@@ -190,7 +196,7 @@ bool CloudPrintProxyBackend::InitializeWithRobotToken( |
const std::string& robot_email) { |
if (!core_thread_.Start()) |
return false; |
- core_thread_.task_runner()->PostTask( |
+ PostCoreTask( |
FROM_HERE, |
base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithRobotToken, |
core_.get(), robot_oauth_refresh_token, robot_email)); |
@@ -202,7 +208,7 @@ bool CloudPrintProxyBackend::InitializeWithRobotAuthCode( |
const std::string& robot_email) { |
if (!core_thread_.Start()) |
return false; |
- core_thread_.task_runner()->PostTask( |
+ PostCoreTask( |
FROM_HERE, |
base::Bind(&CloudPrintProxyBackend::Core::DoInitializeWithRobotAuthCode, |
core_.get(), robot_oauth_auth_code, robot_email)); |
@@ -210,17 +216,22 @@ bool CloudPrintProxyBackend::InitializeWithRobotAuthCode( |
} |
void CloudPrintProxyBackend::Shutdown() { |
- core_thread_.task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&CloudPrintProxyBackend::Core::DoShutdown, core_.get())); |
+ PostCoreTask(FROM_HERE, base::Bind(&CloudPrintProxyBackend::Core::DoShutdown, |
+ core_.get())); |
core_thread_.Stop(); |
- core_ = NULL; // Releases reference to core_. |
+ core_ = nullptr; // Releases reference to |core_|. |
} |
void CloudPrintProxyBackend::UnregisterPrinters() { |
- core_thread_.task_runner()->PostTask( |
- FROM_HERE, base::Bind(&CloudPrintProxyBackend::Core::DoUnregisterPrinters, |
- core_.get())); |
+ PostCoreTask(FROM_HERE, |
+ base::Bind(&CloudPrintProxyBackend::Core::DoUnregisterPrinters, |
+ core_.get())); |
+} |
+ |
+bool CloudPrintProxyBackend::PostCoreTask( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& task) { |
+ return core_thread_.task_runner()->PostTask(from_here, task); |
} |
CloudPrintProxyBackend::Core::Core( |
@@ -238,6 +249,20 @@ CloudPrintProxyBackend::Core::Core( |
settings_.CopyFrom(settings); |
} |
+bool CloudPrintProxyBackend::Core::PostFrontendTask( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& task) { |
+ return backend_->frontend_loop_->task_runner()->PostTask(from_here, task); |
+} |
+ |
+bool CloudPrintProxyBackend::Core::CurrentlyOnFrontendThread() const { |
+ return base::MessageLoop::current() == backend_->frontend_loop_; |
+} |
+ |
+bool CloudPrintProxyBackend::Core::CurrentlyOnCoreThread() const { |
+ return base::MessageLoop::current() == backend_->core_thread_.message_loop(); |
+} |
+ |
void CloudPrintProxyBackend::Core::CreateAuthAndConnector() { |
if (!auth_.get()) { |
auth_ = new CloudPrintAuth(this, settings_.server_url(), oauth_client_info_, |
@@ -256,7 +281,7 @@ void CloudPrintProxyBackend::Core::DestroyAuthAndConnector() { |
void CloudPrintProxyBackend::Core::DoInitializeWithToken( |
const std::string& cloud_print_token) { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
CreateAuthAndConnector(); |
auth_->AuthenticateWithToken(cloud_print_token); |
} |
@@ -264,7 +289,7 @@ void CloudPrintProxyBackend::Core::DoInitializeWithToken( |
void CloudPrintProxyBackend::Core::DoInitializeWithRobotToken( |
const std::string& robot_oauth_refresh_token, |
const std::string& robot_email) { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
CreateAuthAndConnector(); |
auth_->AuthenticateWithRobotToken(robot_oauth_refresh_token, robot_email); |
} |
@@ -272,7 +297,7 @@ void CloudPrintProxyBackend::Core::DoInitializeWithRobotToken( |
void CloudPrintProxyBackend::Core::DoInitializeWithRobotAuthCode( |
const std::string& robot_oauth_auth_code, |
const std::string& robot_email) { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
CreateAuthAndConnector(); |
auth_->AuthenticateWithRobotAuthCode(robot_oauth_auth_code, robot_email); |
} |
@@ -287,10 +312,9 @@ void CloudPrintProxyBackend::Core::OnAuthenticationComplete( |
token_store->SetToken(access_token); |
robot_email_ = robot_email; |
// Let the frontend know that we have authenticated. |
- backend_->frontend_loop_->task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&Core::NotifyAuthenticated, this, robot_oauth_refresh_token, |
- robot_email, user_email)); |
+ PostFrontendTask(FROM_HERE, base::Bind(&Core::NotifyAuthenticated, this, |
+ robot_oauth_refresh_token, robot_email, |
+ user_email)); |
if (first_time) { |
InitNotifications(robot_email, access_token); |
} else { |
@@ -302,17 +326,17 @@ void CloudPrintProxyBackend::Core::OnAuthenticationComplete( |
if (!connector_->IsRunning()) { |
if (!connector_->Start()) { |
// Let the frontend know that we do not have a print system. |
- backend_->frontend_loop_->task_runner()->PostTask( |
- FROM_HERE, base::Bind(&Core::NotifyPrintSystemUnavailable, this)); |
+ PostFrontendTask(FROM_HERE, |
+ base::Bind(&Core::NotifyPrintSystemUnavailable, this)); |
} |
} |
} |
void CloudPrintProxyBackend::Core::OnInvalidCredentials() { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
VLOG(1) << "CP_CONNECTOR: Auth Error"; |
- backend_->frontend_loop_->task_runner()->PostTask( |
- FROM_HERE, base::Bind(&Core::NotifyAuthenticationFailed, this)); |
+ PostFrontendTask(FROM_HERE, |
+ base::Bind(&Core::NotifyAuthenticationFailed, this)); |
} |
void CloudPrintProxyBackend::Core::OnAuthFailed() { |
@@ -328,14 +352,14 @@ void CloudPrintProxyBackend::Core::OnAuthFailed() { |
void CloudPrintProxyBackend::Core::OnXmppPingUpdated(int ping_timeout) { |
settings_.SetXmppPingTimeoutSec(ping_timeout); |
- backend_->frontend_loop_->task_runner()->PostTask( |
+ PostFrontendTask( |
FROM_HERE, base::Bind(&Core::NotifyXmppPingUpdated, this, ping_timeout)); |
} |
void CloudPrintProxyBackend::Core::InitNotifications( |
const std::string& robot_email, |
const std::string& access_token) { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
pending_xmpp_pings_ = 0; |
notifier::NotifierOptions notifier_options; |
@@ -357,7 +381,7 @@ void CloudPrintProxyBackend::Core::InitNotifications( |
} |
void CloudPrintProxyBackend::Core::DoShutdown() { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
VLOG(1) << "CP_CONNECTOR: Shutdown connector, id: " << settings_.proxy_id(); |
if (connector_->IsRunning()) |
@@ -376,21 +400,20 @@ void CloudPrintProxyBackend::Core::DoShutdown() { |
} |
void CloudPrintProxyBackend::Core::DoUnregisterPrinters() { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
std::string access_token = GetTokenStore()->token(); |
std::list<std::string> printer_ids; |
connector_->GetPrinterIds(&printer_ids); |
- backend_->frontend_loop_->task_runner()->PostTask( |
- FROM_HERE, base::Bind(&Core::NotifyUnregisterPrinters, this, access_token, |
- printer_ids)); |
+ PostFrontendTask(FROM_HERE, base::Bind(&Core::NotifyUnregisterPrinters, this, |
+ access_token, printer_ids)); |
} |
void CloudPrintProxyBackend::Core::HandlePrinterNotification( |
const std::string& notification) { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
size_t pos = notification.rfind(kNotificationUpdateSettings); |
if (pos == std::string::npos) { |
@@ -407,7 +430,7 @@ void CloudPrintProxyBackend::Core::HandlePrinterNotification( |
void CloudPrintProxyBackend::Core::PollForJobs() { |
VLOG(1) << "CP_CONNECTOR: Polling for jobs."; |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
// Check all printers for jobs. |
connector_->CheckForJobs(kJobFetchReasonPoll, std::string()); |
@@ -477,7 +500,7 @@ void CloudPrintProxyBackend::Core::CheckXmppPingStatus() { |
} |
CloudPrintTokenStore* CloudPrintProxyBackend::Core::GetTokenStore() { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
if (!token_store_.get()) |
token_store_.reset(new CloudPrintTokenStore); |
return token_store_.get(); |
@@ -487,35 +510,35 @@ void CloudPrintProxyBackend::Core::NotifyAuthenticated( |
const std::string& robot_oauth_refresh_token, |
const std::string& robot_email, |
const std::string& user_email) { |
- DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); |
- backend_->frontend_ |
- ->OnAuthenticated(robot_oauth_refresh_token, robot_email, user_email); |
+ DCHECK(CurrentlyOnFrontendThread()); |
+ frontend()->OnAuthenticated(robot_oauth_refresh_token, robot_email, |
+ user_email); |
} |
void CloudPrintProxyBackend::Core::NotifyAuthenticationFailed() { |
- DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); |
- backend_->frontend_->OnAuthenticationFailed(); |
+ DCHECK(CurrentlyOnFrontendThread()); |
+ frontend()->OnAuthenticationFailed(); |
} |
void CloudPrintProxyBackend::Core::NotifyPrintSystemUnavailable() { |
- DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); |
- backend_->frontend_->OnPrintSystemUnavailable(); |
+ DCHECK(CurrentlyOnFrontendThread()); |
+ frontend()->OnPrintSystemUnavailable(); |
} |
void CloudPrintProxyBackend::Core::NotifyUnregisterPrinters( |
const std::string& auth_token, |
const std::list<std::string>& printer_ids) { |
- DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); |
- backend_->frontend_->OnUnregisterPrinters(auth_token, printer_ids); |
+ DCHECK(CurrentlyOnFrontendThread()); |
+ frontend()->OnUnregisterPrinters(auth_token, printer_ids); |
} |
void CloudPrintProxyBackend::Core::NotifyXmppPingUpdated(int ping_timeout) { |
- DCHECK(base::MessageLoop::current() == backend_->frontend_loop_); |
- backend_->frontend_->OnXmppPingUpdated(ping_timeout); |
+ DCHECK(CurrentlyOnFrontendThread()); |
+ frontend()->OnXmppPingUpdated(ping_timeout); |
} |
void CloudPrintProxyBackend::Core::OnNotificationsEnabled() { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
notifications_enabled_ = true; |
notifications_enabled_since_ = base::TimeTicks::Now(); |
VLOG(1) << "Notifications for connector " << settings_.proxy_id() |
@@ -533,7 +556,7 @@ void CloudPrintProxyBackend::Core::OnNotificationsEnabled() { |
void CloudPrintProxyBackend::Core::OnNotificationsDisabled( |
notifier::NotificationsDisabledReason reason) { |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
+ DCHECK(CurrentlyOnCoreThread()); |
notifications_enabled_ = false; |
LOG(ERROR) << "Notifications for connector " << settings_.proxy_id() |
<< " disabled."; |
@@ -547,11 +570,12 @@ void CloudPrintProxyBackend::Core::OnNotificationsDisabled( |
void CloudPrintProxyBackend::Core::OnIncomingNotification( |
const notifier::Notification& notification) { |
+ DCHECK(CurrentlyOnCoreThread()); |
+ |
// Since we got some notification from the server, |
// reset pending ping counter to 0. |
pending_xmpp_pings_ = 0; |
- DCHECK(base::MessageLoop::current() == backend_->core_thread_.message_loop()); |
VLOG(1) << "CP_CONNECTOR: Incoming notification."; |
if (base::EqualsCaseInsensitiveASCII(kCloudPrintPushNotificationsSource, |
notification.channel)) |