summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_unittest.cc2
-rw-r--r--chrome/browser/invalidation/fake_invalidation_service.cc4
-rw-r--r--chrome/browser/invalidation/fake_invalidation_service.h3
-rw-r--r--chrome/browser/invalidation/invalidation_logger.cc81
-rw-r--r--chrome/browser/invalidation/invalidation_logger.h51
-rw-r--r--chrome/browser/invalidation/invalidation_logger_observer.h42
-rw-r--r--chrome/browser/invalidation/invalidation_logger_unittest.cc134
-rw-r--r--chrome/browser/invalidation/invalidation_service.h4
-rw-r--r--chrome/browser/invalidation/invalidation_service_android.cc4
-rw-r--r--chrome/browser/invalidation/invalidation_service_android.h3
-rw-r--r--chrome/browser/invalidation/p2p_invalidation_service.cc4
-rw-r--r--chrome/browser/invalidation/p2p_invalidation_service.h2
-rw-r--r--chrome/browser/invalidation/ticl_invalidation_service.cc14
-rw-r--r--chrome/browser/invalidation/ticl_invalidation_service.h6
-rw-r--r--chrome/browser/resources/about_invalidations.css22
-rw-r--r--chrome/browser/resources/about_invalidations.html24
-rw-r--r--chrome/browser/resources/about_invalidations.js77
-rw-r--r--chrome/browser/ui/webui/invalidations_message_handler.cc81
-rw-r--r--chrome/browser/ui/webui/invalidations_message_handler.h53
-rw-r--r--chrome/browser/ui/webui/invalidations_ui.cc7
-rw-r--r--chrome/browser/ui/webui/invalidations_ui.h1
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_browser_ui.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/chrome_tests_unit.gypi1
-rw-r--r--chrome/test/data/webui/about_invalidations_browsertest.js62
26 files changed, 670 insertions, 17 deletions
diff --git a/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_unittest.cc b/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_unittest.cc
index f868f9c..8efba2e6 100644
--- a/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_unittest.cc
+++ b/chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_unittest.cc
@@ -7,6 +7,7 @@
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_delegate.h"
+#include "chrome/browser/invalidation/invalidation_logger.h"
#include "chrome/browser/invalidation/invalidation_service.h"
#include "google/cacheinvalidation/types.pb.h"
#include "sync/notifier/object_id_invalidation_map.h"
@@ -34,6 +35,7 @@ class MockInvalidationService : public invalidation::InvalidationService {
void(syncer::InvalidationHandler*));
MOCK_CONST_METHOD0(GetInvalidatorState, syncer::InvalidatorState());
MOCK_CONST_METHOD0(GetInvalidatorClientId, std::string());
+ MOCK_METHOD0(GetInvalidationLogger, invalidation::InvalidationLogger*());
private:
DISALLOW_COPY_AND_ASSIGN(MockInvalidationService);
diff --git a/chrome/browser/invalidation/fake_invalidation_service.cc b/chrome/browser/invalidation/fake_invalidation_service.cc
index 96f4b55..edaf561 100644
--- a/chrome/browser/invalidation/fake_invalidation_service.cc
+++ b/chrome/browser/invalidation/fake_invalidation_service.cc
@@ -41,6 +41,10 @@ std::string FakeInvalidationService::GetInvalidatorClientId() const {
return client_id_;
}
+InvalidationLogger* FakeInvalidationService::GetInvalidationLogger() {
+ return NULL;
+}
+
void FakeInvalidationService::SetInvalidatorState(
syncer::InvalidatorState state) {
invalidator_registrar_.UpdateInvalidatorState(state);
diff --git a/chrome/browser/invalidation/fake_invalidation_service.h b/chrome/browser/invalidation/fake_invalidation_service.h
index e176889..7f64225 100644
--- a/chrome/browser/invalidation/fake_invalidation_service.h
+++ b/chrome/browser/invalidation/fake_invalidation_service.h
@@ -19,6 +19,8 @@ class Invalidation;
namespace invalidation {
+class InvalidationLogger;
+
// An InvalidationService that emits invalidations only when
// its EmitInvalidationForTest method is called.
class FakeInvalidationService : public InvalidationService {
@@ -36,6 +38,7 @@ class FakeInvalidationService : public InvalidationService {
virtual syncer::InvalidatorState GetInvalidatorState() const OVERRIDE;
virtual std::string GetInvalidatorClientId() const OVERRIDE;
+ virtual InvalidationLogger* GetInvalidationLogger() OVERRIDE;
void SetInvalidatorState(syncer::InvalidatorState state);
diff --git a/chrome/browser/invalidation/invalidation_logger.cc b/chrome/browser/invalidation/invalidation_logger.cc
new file mode 100644
index 0000000..19bdf9d
--- /dev/null
+++ b/chrome/browser/invalidation/invalidation_logger.cc
@@ -0,0 +1,81 @@
+// Copyright 2014 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.
+
+#include "chrome/browser/invalidation/invalidation_logger.h"
+
+#include "base/memory/scoped_ptr.h"
+#include "base/values.h"
+#include "chrome/browser/invalidation/invalidation_logger_observer.h"
+
+namespace syncer {
+class ObjectIdInvalidationMap;
+}
+
+namespace invalidation {
+class InvalidationLoggerObserver;
+
+InvalidationLogger::InvalidationLogger()
+ : last_invalidator_state_(syncer::TRANSIENT_INVALIDATION_ERROR) {}
+
+InvalidationLogger::~InvalidationLogger() {}
+
+void InvalidationLogger::OnRegistration(const base::DictionaryValue& details) {
+ FOR_EACH_OBSERVER(
+ InvalidationLoggerObserver, observer_list_, OnRegistration(details));
+}
+
+void InvalidationLogger::OnUnregistration(
+ const base::DictionaryValue& details) {
+ FOR_EACH_OBSERVER(
+ InvalidationLoggerObserver, observer_list_, OnUnregistration(details));
+}
+
+void InvalidationLogger::OnStateChange(
+ const syncer::InvalidatorState& newState) {
+ last_invalidator_state_ = newState;
+ EmitState();
+}
+
+void InvalidationLogger::EmitState() {
+ FOR_EACH_OBSERVER(InvalidationLoggerObserver,
+ observer_list_,
+ OnStateChange(last_invalidator_state_));
+}
+
+void InvalidationLogger::OnUpdateIds(const base::DictionaryValue& details) {
+ FOR_EACH_OBSERVER(
+ InvalidationLoggerObserver, observer_list_, OnUpdateIds(details));
+}
+
+void InvalidationLogger::OnDebugMessage(const base::DictionaryValue& details) {
+ FOR_EACH_OBSERVER(
+ InvalidationLoggerObserver, observer_list_, OnDebugMessage(details));
+}
+
+void InvalidationLogger::OnInvalidation(
+ const syncer::ObjectIdInvalidationMap& details) {
+ FOR_EACH_OBSERVER(
+ InvalidationLoggerObserver, observer_list_, OnInvalidation(details));
+}
+
+void InvalidationLogger::EmitContent() {
+ // Here we add content to send to the observers not via real time push
+ // but on explicit request.
+ EmitState();
+}
+
+// Obtain a target object to call whenever we have
+// debug messages to display
+void InvalidationLogger::RegisterForDebug(
+ InvalidationLoggerObserver* debug_observer) {
+ observer_list_.AddObserver(debug_observer);
+}
+
+// Removes the target object to call whenever we have
+// debug messages to display
+void InvalidationLogger::UnregisterForDebug(
+ InvalidationLoggerObserver* debug_observer) {
+ observer_list_.RemoveObserver(debug_observer);
+}
+} // namespace invalidation
diff --git a/chrome/browser/invalidation/invalidation_logger.h b/chrome/browser/invalidation/invalidation_logger.h
new file mode 100644
index 0000000..0d80b9a
--- /dev/null
+++ b/chrome/browser/invalidation/invalidation_logger.h
@@ -0,0 +1,51 @@
+// Copyright 2014 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_INVALIDATION_INVALIDATION_LOGGER_H_
+#define CHROME_BROWSER_INVALIDATION_INVALIDATION_LOGGER_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "base/observer_list.h"
+#include "sync/notifier/invalidator_state.h"
+
+namespace base {
+class DictionaryValue;
+} // namespace base
+
+namespace syncer {
+class ObjectIdInvalidationMap;
+}
+
+namespace invalidation {
+class InvalidationLoggerObserver;
+
+class InvalidationLogger {
+ public:
+ // Pass through to any registered InvalidationLoggerObservers.
+ // We will do local logging here too.
+ void OnRegistration(const base::DictionaryValue& details);
+ void OnUnregistration(const base::DictionaryValue& details);
+ void OnStateChange(const syncer::InvalidatorState& newState);
+ void OnUpdateIds(const base::DictionaryValue& details);
+ void OnDebugMessage(const base::DictionaryValue& details);
+ void OnInvalidation(const syncer::ObjectIdInvalidationMap& details);
+
+ void EmitContent();
+
+ InvalidationLogger();
+ ~InvalidationLogger();
+
+ void RegisterForDebug(InvalidationLoggerObserver* debug_observer);
+ void UnregisterForDebug(InvalidationLoggerObserver* debug_observer);
+
+ private:
+ void EmitState();
+ // The list of every observer currently listening for notifications.
+ ObserverList<InvalidationLoggerObserver> observer_list_;
+ // The last InvalidatorState updated by the InvalidatorService.
+ syncer::InvalidatorState last_invalidator_state_;
+};
+
+} // namespace invalidation
+#endif // CHROME_BROWSER_INVALIDATION_INVALIDATION_LOGGER_H_
diff --git a/chrome/browser/invalidation/invalidation_logger_observer.h b/chrome/browser/invalidation/invalidation_logger_observer.h
new file mode 100644
index 0000000..6bd102e
--- /dev/null
+++ b/chrome/browser/invalidation/invalidation_logger_observer.h
@@ -0,0 +1,42 @@
+// Copyright 2014 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_INVALIDATION_INVALIDATION_LOGGER_OBSERVER_H_
+#define CHROME_BROWSER_INVALIDATION_INVALIDATION_LOGGER_OBSERVER_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "sync/notifier/invalidator_state.h"
+#include "sync/notifier/object_id_invalidation_map.h"
+
+namespace base {
+class DictionaryValue;
+} // namespace base
+
+namespace syncer {
+class ObjectIdInvalidationMap;
+} // namespace syncer
+
+namespace invalidation {
+// This class provides the possibilty to register as an observer for the
+// InvalidationLogger notifications whenever an InvalidatorService changes
+// its internal state.
+// (i.e. A new registration, a new invalidation, a TICL/GCM state change)
+
+class InvalidationLoggerObserver {
+ public:
+ virtual void OnRegistration(const base::DictionaryValue& details) = 0;
+ virtual void OnUnregistration(const base::DictionaryValue& details) = 0;
+ virtual void OnStateChange(const syncer::InvalidatorState& newState) = 0;
+ virtual void OnUpdateIds(const base::DictionaryValue& details) = 0;
+ virtual void OnDebugMessage(const base::DictionaryValue& details) = 0;
+ virtual void OnInvalidation(
+ const syncer::ObjectIdInvalidationMap& details) = 0;
+
+ protected:
+ virtual ~InvalidationLoggerObserver() {}
+};
+
+} // namespace invalidation
+
+#endif // CHROME_BROWSER_INVALIDATION_INVALIDATION_LOGGER_OBSERVER_H_
diff --git a/chrome/browser/invalidation/invalidation_logger_unittest.cc b/chrome/browser/invalidation/invalidation_logger_unittest.cc
new file mode 100644
index 0000000..30a3c4d
--- /dev/null
+++ b/chrome/browser/invalidation/invalidation_logger_unittest.cc
@@ -0,0 +1,134 @@
+// Copyright 2014 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.
+
+#include "chrome/browser/invalidation/invalidation_logger.h"
+#include "chrome/browser/invalidation/invalidation_logger_observer.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace invalidation {
+
+class InvalidationLoggerTest : public testing::Test {
+ public:
+ InvalidationLoggerTest() {}
+};
+
+class InvalidationLoggerObserverTest : public InvalidationLoggerObserver {
+ public:
+ InvalidationLoggerObserverTest() { resetStates(); }
+
+ void resetStates() {
+ registrationReceived = false;
+ unregistrationReceived = false;
+ stateReceived = false;
+ updateIdReceived = false;
+ debugMessageReceived = false;
+ invalidationReceived = false;
+ }
+
+ virtual void OnRegistration(const base::DictionaryValue& details) OVERRIDE {
+ registrationReceived = true;
+ }
+
+ virtual void OnUnregistration(const base::DictionaryValue& details) OVERRIDE {
+ unregistrationReceived = true;
+ }
+
+ virtual void OnStateChange(const syncer::InvalidatorState& newState)
+ OVERRIDE {
+ stateReceived = true;
+ }
+
+ virtual void OnUpdateIds(const base::DictionaryValue& details) OVERRIDE {
+ updateIdReceived = true;
+ }
+
+ virtual void OnDebugMessage(const base::DictionaryValue& details) OVERRIDE {
+ debugMessageReceived = true;
+ }
+
+ virtual void OnInvalidation(
+ const syncer::ObjectIdInvalidationMap& newInvalidations) OVERRIDE {
+ invalidationReceived = true;
+ }
+
+ bool registrationReceived;
+ bool unregistrationReceived;
+ bool stateReceived;
+ bool updateIdReceived;
+ bool debugMessageReceived;
+ bool invalidationReceived;
+};
+
+// Test that the callbacks are actually being called when observers are
+// registered and don't produce any other callback in the meantime.
+TEST_F(InvalidationLoggerTest, TestCallbacks) {
+ InvalidationLogger log;
+ InvalidationLoggerObserverTest observerTest;
+
+ log.RegisterForDebug(&observerTest);
+ log.OnStateChange(syncer::INVALIDATIONS_ENABLED);
+ EXPECT_TRUE(observerTest.stateReceived);
+ EXPECT_FALSE(observerTest.updateIdReceived);
+ EXPECT_FALSE(observerTest.registrationReceived);
+ EXPECT_FALSE(observerTest.invalidationReceived);
+ EXPECT_FALSE(observerTest.unregistrationReceived);
+ EXPECT_FALSE(observerTest.debugMessageReceived);
+
+ observerTest.resetStates();
+
+ log.OnInvalidation(syncer::ObjectIdInvalidationMap());
+ EXPECT_TRUE(observerTest.invalidationReceived);
+ EXPECT_FALSE(observerTest.stateReceived);
+ EXPECT_FALSE(observerTest.updateIdReceived);
+ EXPECT_FALSE(observerTest.registrationReceived);
+ EXPECT_FALSE(observerTest.unregistrationReceived);
+ EXPECT_FALSE(observerTest.debugMessageReceived);
+
+ log.UnregisterForDebug(&observerTest);
+}
+
+// Test that after registering an observer and then unregistering it
+// no callbacks regarding that observer are called.
+// (i.e. the observer is cleanly removed)
+TEST_F(InvalidationLoggerTest, TestReleaseOfObserver) {
+ InvalidationLogger log;
+ InvalidationLoggerObserverTest observerTest;
+
+ log.RegisterForDebug(&observerTest);
+ log.UnregisterForDebug(&observerTest);
+
+ log.OnInvalidation(syncer::ObjectIdInvalidationMap());
+ log.OnStateChange(syncer::INVALIDATIONS_ENABLED);
+ log.OnRegistration(base::DictionaryValue());
+ log.OnUnregistration(base::DictionaryValue());
+ log.OnDebugMessage(base::DictionaryValue());
+ log.OnUpdateIds(base::DictionaryValue());
+ EXPECT_FALSE(observerTest.registrationReceived);
+ EXPECT_FALSE(observerTest.unregistrationReceived);
+ EXPECT_FALSE(observerTest.updateIdReceived);
+ EXPECT_FALSE(observerTest.invalidationReceived);
+ EXPECT_FALSE(observerTest.stateReceived);
+ EXPECT_FALSE(observerTest.debugMessageReceived);
+}
+
+// Test the EmitContet in InvalidationLogger is actually
+// sending (only) state notifications.
+TEST_F(InvalidationLoggerTest, TestEmitContent) {
+ InvalidationLogger log;
+ InvalidationLoggerObserverTest observerTest;
+
+ log.RegisterForDebug(&observerTest);
+ EXPECT_FALSE(observerTest.stateReceived);
+ log.EmitContent();
+
+ EXPECT_TRUE(observerTest.stateReceived);
+ EXPECT_FALSE(observerTest.registrationReceived);
+ EXPECT_FALSE(observerTest.unregistrationReceived);
+ EXPECT_FALSE(observerTest.updateIdReceived);
+ EXPECT_FALSE(observerTest.invalidationReceived);
+ EXPECT_FALSE(observerTest.debugMessageReceived);
+ log.UnregisterForDebug(&observerTest);
+}
+} // namespace invalidation
diff --git a/chrome/browser/invalidation/invalidation_service.h b/chrome/browser/invalidation/invalidation_service.h
index 33b09f3..48b7274 100644
--- a/chrome/browser/invalidation/invalidation_service.h
+++ b/chrome/browser/invalidation/invalidation_service.h
@@ -14,6 +14,7 @@ class InvalidationHandler;
} // namespace syncer
namespace invalidation {
+class InvalidationLogger;
// Interface for classes that handle invalidation registrations and send out
// invalidations to register handlers.
@@ -99,6 +100,9 @@ class InvalidationService : public BrowserContextKeyedService {
// prevent the receipt of notifications of our own changes.
virtual std::string GetInvalidatorClientId() const = 0;
+ // Return the logger used to debug invalidations
+ virtual InvalidationLogger* GetInvalidationLogger() = 0;
+
protected:
virtual ~InvalidationService() { }
};
diff --git a/chrome/browser/invalidation/invalidation_service_android.cc b/chrome/browser/invalidation/invalidation_service_android.cc
index ad30aaa..e37091b 100644
--- a/chrome/browser/invalidation/invalidation_service_android.cc
+++ b/chrome/browser/invalidation/invalidation_service_android.cc
@@ -56,6 +56,10 @@ std::string InvalidationServiceAndroid::GetInvalidatorClientId() const {
return invalidation_controller_->GetInvalidatorClientId();
}
+InvalidationLogger* InvalidationServiceAndroid::GetInvalidationLogger() {
+ return NULL;
+}
+
void InvalidationServiceAndroid::Observe(
int type,
const content::NotificationSource& source,
diff --git a/chrome/browser/invalidation/invalidation_service_android.h b/chrome/browser/invalidation/invalidation_service_android.h
index 36b3315..af77045 100644
--- a/chrome/browser/invalidation/invalidation_service_android.h
+++ b/chrome/browser/invalidation/invalidation_service_android.h
@@ -18,7 +18,7 @@
class Profile;
namespace invalidation {
-
+class InvalidationLogger;
class InvalidationControllerAndroid;
// This InvalidationService is used to deliver invalidations on Android. The
@@ -50,6 +50,7 @@ class InvalidationServiceAndroid
syncer::InvalidationHandler* handler) OVERRIDE;
virtual syncer::InvalidatorState GetInvalidatorState() const OVERRIDE;
virtual std::string GetInvalidatorClientId() const OVERRIDE;
+ virtual InvalidationLogger* GetInvalidationLogger() OVERRIDE;
// content::NotificationObserver implementation.
virtual void Observe(int type,
diff --git a/chrome/browser/invalidation/p2p_invalidation_service.cc b/chrome/browser/invalidation/p2p_invalidation_service.cc
index 1eda06e..e38c3c1 100644
--- a/chrome/browser/invalidation/p2p_invalidation_service.cc
+++ b/chrome/browser/invalidation/p2p_invalidation_service.cc
@@ -70,4 +70,8 @@ std::string P2PInvalidationService::GetInvalidatorClientId() const {
return invalidator_id_;
}
+InvalidationLogger* P2PInvalidationService::GetInvalidationLogger() {
+ return NULL;
+}
+
} // namespace invalidation
diff --git a/chrome/browser/invalidation/p2p_invalidation_service.h b/chrome/browser/invalidation/p2p_invalidation_service.h
index 9e6c023..d4dfdbf 100644
--- a/chrome/browser/invalidation/p2p_invalidation_service.h
+++ b/chrome/browser/invalidation/p2p_invalidation_service.h
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/threading/non_thread_safe.h"
+#include "chrome/browser/invalidation/invalidation_logger.h"
#include "chrome/browser/invalidation/invalidation_service.h"
#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
@@ -41,6 +42,7 @@ class P2PInvalidationService
syncer::InvalidationHandler* handler) OVERRIDE;
virtual syncer::InvalidatorState GetInvalidatorState() const OVERRIDE;
virtual std::string GetInvalidatorClientId() const OVERRIDE;
+ virtual InvalidationLogger* GetInvalidationLogger() OVERRIDE;
void UpdateCredentials(const std::string& username,
const std::string& password);
diff --git a/chrome/browser/invalidation/ticl_invalidation_service.cc b/chrome/browser/invalidation/ticl_invalidation_service.cc
index e76db5b..c30e689 100644
--- a/chrome/browser/invalidation/ticl_invalidation_service.cc
+++ b/chrome/browser/invalidation/ticl_invalidation_service.cc
@@ -8,6 +8,7 @@
#include "base/metrics/histogram.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/invalidation/gcm_network_channel_delegate_impl.h"
+#include "chrome/browser/invalidation/invalidation_logger.h"
#include "chrome/browser/invalidation/invalidation_service_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/about_signin_internals.h"
@@ -18,9 +19,11 @@
#include "content/public/browser/notification_service.h"
#include "google_apis/gaia/gaia_constants.h"
#include "sync/notifier/gcm_network_channel_delegate.h"
+#include "sync/notifier/invalidation_util.h"
#include "sync/notifier/invalidator.h"
#include "sync/notifier/invalidator_state.h"
#include "sync/notifier/non_blocking_invalidator.h"
+#include "sync/notifier/object_id_invalidation_map.h"
static const char* kOAuth2Scopes[] = {
GaiaConstants::kGoogleTalkOAuth2Scope
@@ -65,8 +68,8 @@ TiclInvalidationService::TiclInvalidationService(
signin_manager_(signin),
oauth2_token_service_(oauth2_token_service),
invalidator_registrar_(new syncer::InvalidatorRegistrar()),
- request_access_token_backoff_(&kRequestAccessTokenBackoffPolicy) {
-}
+ request_access_token_backoff_(&kRequestAccessTokenBackoffPolicy),
+ logger_() {}
TiclInvalidationService::~TiclInvalidationService() {
DCHECK(CalledOnValidThread());
@@ -153,6 +156,10 @@ std::string TiclInvalidationService::GetInvalidatorClientId() const {
return invalidator_storage_->GetInvalidatorClientId();
}
+InvalidationLogger* TiclInvalidationService::GetInvalidationLogger() {
+ return &logger_;
+}
+
void TiclInvalidationService::Observe(
int type,
const content::NotificationSource& source,
@@ -266,11 +273,14 @@ void TiclInvalidationService::OnInvalidatorStateChange(
} else {
invalidator_registrar_->UpdateInvalidatorState(state);
}
+ logger_.OnStateChange(state);
}
void TiclInvalidationService::OnIncomingInvalidation(
const syncer::ObjectIdInvalidationMap& invalidation_map) {
invalidator_registrar_->DispatchInvalidationsToHandlers(invalidation_map);
+
+ logger_.OnInvalidation(invalidation_map);
}
void TiclInvalidationService::Shutdown() {
diff --git a/chrome/browser/invalidation/ticl_invalidation_service.h b/chrome/browser/invalidation/ticl_invalidation_service.h
index d5323af..cdbd0a6 100644
--- a/chrome/browser/invalidation/ticl_invalidation_service.h
+++ b/chrome/browser/invalidation/ticl_invalidation_service.h
@@ -8,6 +8,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/threading/non_thread_safe.h"
#include "base/timer/timer.h"
+#include "chrome/browser/invalidation/invalidation_logger.h"
#include "chrome/browser/invalidation/invalidation_service.h"
#include "chrome/browser/invalidation/invalidator_storage.h"
#include "chrome/browser/signin/profile_oauth2_token_service.h"
@@ -56,6 +57,7 @@ class TiclInvalidationService
syncer::InvalidationHandler* handler) OVERRIDE;
virtual syncer::InvalidatorState GetInvalidatorState() const OVERRIDE;
virtual std::string GetInvalidatorClientId() const OVERRIDE;
+ virtual InvalidationLogger* GetInvalidationLogger() OVERRIDE;
// content::NotificationObserver implementation.
virtual void Observe(int type,
@@ -126,6 +128,10 @@ class TiclInvalidationService
base::OneShotTimer<TiclInvalidationService> request_access_token_retry_timer_;
net::BackoffEntry request_access_token_backoff_;
+ // The invalidation logger object we use to record state changes
+ // and invalidations.
+ InvalidationLogger logger_;
+
DISALLOW_COPY_AND_ASSIGN(TiclInvalidationService);
};
diff --git a/chrome/browser/resources/about_invalidations.css b/chrome/browser/resources/about_invalidations.css
index eb3e290..e71c941 100644
--- a/chrome/browser/resources/about_invalidations.css
+++ b/chrome/browser/resources/about_invalidations.css
@@ -3,6 +3,22 @@
* found in the LICENSE file.
*/
-/*
- * TODO(mferreria): Implement this CSS. See http://crbug.com/263863
- */
+body {
+ font-family: Ubuntu, Arial, sans-serif;
+ font-size: 80%;
+}
+
+#invalidations-info p {
+ color: rgb(74, 142, 230);
+ font-size: 100%;
+ font-weight: bold;
+ margin-bottom: 0;
+}
+
+#invalidations-info .section {
+ display: inline-block;
+ margin-left: auto;
+ margin-right: auto;
+ width: 100%;
+}
+
diff --git a/chrome/browser/resources/about_invalidations.html b/chrome/browser/resources/about_invalidations.html
index 7b1b71b..d7dd623 100644
--- a/chrome/browser/resources/about_invalidations.html
+++ b/chrome/browser/resources/about_invalidations.html
@@ -1,17 +1,29 @@
+<!DOCTYPE HTML>
<html>
<head>
+ <meta charset="utf-8">
<title>Invalidations</title>
<script src="chrome://resources/js/cr.js"></script>
<script src="chrome://resources/js/parse_html_subset.js"></script>
<script src="chrome://resources/js/util.js"></script>
<script src="chrome://invalidations/about_invalidations.js"></script>
- <link rel="stylesheet" type="text/css" href="about_invalidations.css">
+ <link rel="stylesheet" href="about_invalidations.css">
</head>
-
<body>
- <h1>Invalidations Debug Information
- <button id='refresh-invalidation-data'>Refresh</button></h1>
+ <h1>Invalidations Debug Information</h1>
+ <div id="invalidations-info">
+ <div id="states" class="section">
+ <label>
+ <p>Invalidation service state:</p><span id="invalidations-state"></span>
+ </label>
+ </div>
+ <div class="section">
+ <label>
+ <p>Invalidations Log:</p>
+ <textarea
+ id="invalidations-log" rows="10" cols="120" readonly></textarea>
+ </label>
+ </div>
+ </div>
</body>
-
-
</html>
diff --git a/chrome/browser/resources/about_invalidations.js b/chrome/browser/resources/about_invalidations.js
index 0a73626..db58dc9 100644
--- a/chrome/browser/resources/about_invalidations.js
+++ b/chrome/browser/resources/about_invalidations.js
@@ -1,8 +1,77 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright (c) 2014 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.
+cr.define('chrome.invalidations', function() {
-// TODO(mferreria): Implement in this JS the ability to get from the C++ Layer
-// the invalidations history and display them as they come.
-// See http://crbug.com/263863
+ function quote(str) {
+ return '\"' + str + '\"';
+ }
+
+ function nowTimeString() {
+ return '[' + new Date().getTime() + '] ';
+ }
+
+ /**
+ * Appends a string to a textarea log.
+ *
+ * @param {string} logMessage The string to be appended.
+ */
+ function appendToLog(logMessage) {
+ var invalidationsLog = $('invalidations-log');
+ invalidationsLog.value += logMessage + '\n';
+ }
+
+ /**
+ * Shows the current state of the InvalidatorService
+ *
+ * @param {string} newState The string to be displayed and logged.
+ */
+ function updateState(newState) {
+ var logMessage = nowTimeString() +
+ 'Invalidations service state changed to ' + quote(newState);
+
+ appendToLog(logMessage);
+ $('invalidations-state').textContent = newState;
+ currentInvalidationState = newState;
+ }
+
+ /**
+ * Adds to the log the latest invalidations received
+ *
+ * @param {Array of Object} allInvalidations The array of ObjectId
+ * that contains the invalidations received by the InvalidatorService
+ */
+ function logInvalidations(allInvalidations) {
+ for (var i = 0; i < allInvalidations.length; i++) {
+ var inv = allInvalidations[i];
+ if (inv.hasOwnProperty('objectId')) {
+ var logMessage = nowTimeString() +
+ 'Received Invalidation with type ' +
+ quote(inv.objectId.name) +
+ ' version ' +
+ quote((inv.isUnknownVersion ? 'Unknown' : inv.version)) +
+ ' with payload ' +
+ quote(inv.payload);
+
+ appendToLog(logMessage);
+ }
+ }
+ }
+
+ /**
+ * Function that notifies the Invalidator Logger that the UI is
+ * ready to receive real-time notifications.
+ */
+ function onLoadWork() {
+ chrome.send('doneLoading');
+ }
+
+ return {
+ updateState: updateState,
+ logInvalidations: logInvalidations,
+ onLoadWork: onLoadWork
+ };
+});
+
+document.addEventListener('DOMContentLoaded', chrome.invalidations.onLoadWork);
diff --git a/chrome/browser/ui/webui/invalidations_message_handler.cc b/chrome/browser/ui/webui/invalidations_message_handler.cc
new file mode 100644
index 0000000..6a55ec5
--- /dev/null
+++ b/chrome/browser/ui/webui/invalidations_message_handler.cc
@@ -0,0 +1,81 @@
+// Copyright 2014 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.
+
+#include "chrome/browser/ui/webui/invalidations_message_handler.h"
+
+#include "base/bind.h"
+#include "chrome/browser/invalidation/invalidation_logger.h"
+#include "chrome/browser/invalidation/invalidation_service.h"
+#include "chrome/browser/invalidation/invalidation_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "content/public/browser/web_ui.h"
+
+namespace invalidation {
+class InvalidationLogger;
+} // namespace invalidation
+
+namespace syncer {
+class ObjectIdInvalidationMap;
+} // namespace syncer
+
+InvalidationsMessageHandler::InvalidationsMessageHandler()
+ : logger_(NULL), isRegistered(false) {}
+
+InvalidationsMessageHandler::~InvalidationsMessageHandler() {
+ if (logger_)
+ logger_->UnregisterForDebug(this);
+}
+
+void InvalidationsMessageHandler::RegisterMessages() {
+ web_ui()->RegisterMessageCallback(
+ "doneLoading",
+ base::Bind(&InvalidationsMessageHandler::UIReady,
+ base::Unretained(this)));
+}
+
+void InvalidationsMessageHandler::UIReady(const base::ListValue* args) {
+ Profile* profile = Profile::FromWebUI(web_ui());
+ if (!isRegistered && profile) {
+ invalidation::InvalidationService* invalidation_service =
+ invalidation::InvalidationServiceFactory::GetForProfile(profile);
+ if (invalidation_service)
+ logger_ = invalidation_service->GetInvalidationLogger();
+ if (logger_) {
+ logger_->RegisterForDebug(this);
+ isRegistered = true;
+ }
+ }
+ UpdateContent(args);
+}
+
+void InvalidationsMessageHandler::UpdateContent(const base::ListValue* args) {
+ if (logger_)
+ logger_->EmitContent();
+}
+
+void InvalidationsMessageHandler::OnUnregistration(
+ const base::DictionaryValue& newRegistrationState) {}
+
+void InvalidationsMessageHandler::OnRegistration(
+ const base::DictionaryValue& newRegistrationState) {}
+
+void InvalidationsMessageHandler::OnStateChange(
+ const syncer::InvalidatorState& newState) {
+ std::string state(syncer::InvalidatorStateToString(newState));
+ web_ui()->CallJavascriptFunction("chrome.invalidations.updateState",
+ base::StringValue(state));
+}
+
+void InvalidationsMessageHandler::OnUpdateIds(
+ const base::DictionaryValue& newIds) {}
+
+void InvalidationsMessageHandler::OnDebugMessage(
+ const base::DictionaryValue& details) {}
+
+void InvalidationsMessageHandler::OnInvalidation(
+ const syncer::ObjectIdInvalidationMap& newInvalidations) {
+ scoped_ptr<base::ListValue> invalidationsList = newInvalidations.ToValue();
+ web_ui()->CallJavascriptFunction("chrome.invalidations.logInvalidations",
+ *invalidationsList);
+}
diff --git a/chrome/browser/ui/webui/invalidations_message_handler.h b/chrome/browser/ui/webui/invalidations_message_handler.h
new file mode 100644
index 0000000..41d6073
--- /dev/null
+++ b/chrome/browser/ui/webui/invalidations_message_handler.h
@@ -0,0 +1,53 @@
+// Copyright 2014 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_UI_WEBUI_INVALIDATIONS_MESSAGE_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_INVALIDATIONS_MESSAGE_HANDLER_H_
+
+#include "base/compiler_specific.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/values.h"
+#include "chrome/browser/invalidation/invalidation_logger_observer.h"
+#include "content/public/browser/web_ui_message_handler.h"
+
+class Profile;
+
+namespace invalidation {
+class InvalidationLogger;
+} // namespace invalidation
+
+// The implementation for the chrome://invalidations page.
+class InvalidationsMessageHandler
+ : public content::WebUIMessageHandler,
+ public invalidation::InvalidationLoggerObserver {
+ public:
+ InvalidationsMessageHandler();
+ virtual ~InvalidationsMessageHandler();
+
+ // Implementation of InvalidationLoggerObserver
+ virtual void OnRegistration(const base::DictionaryValue& details) OVERRIDE;
+ virtual void OnUnregistration(const base::DictionaryValue& details) OVERRIDE;
+ virtual void OnStateChange(const syncer::InvalidatorState& newState) OVERRIDE;
+ virtual void OnUpdateIds(const base::DictionaryValue& details) OVERRIDE;
+ virtual void OnDebugMessage(const base::DictionaryValue& details) OVERRIDE;
+ virtual void OnInvalidation(
+ const syncer::ObjectIdInvalidationMap& newInvalidations) OVERRIDE;
+
+ // Implementation of WebUIMessageHandler
+ virtual void RegisterMessages() OVERRIDE;
+
+ void UpdateContent(const base::ListValue* args);
+ void UIReady(const base::ListValue* args);
+
+ private:
+ // The pointer to the internal InvalidatorService InvalidationLogger.
+ // Used to get the information necessary to display to the JS and to
+ // register ourselves as Observers for any notifications.
+ invalidation::InvalidationLogger* logger_;
+ // Check to see if we are already registered as an observer
+ bool isRegistered;
+ DISALLOW_COPY_AND_ASSIGN(InvalidationsMessageHandler);
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_INVALIDATIONS_MESSAGE_HANDLER_H_
diff --git a/chrome/browser/ui/webui/invalidations_ui.cc b/chrome/browser/ui/webui/invalidations_ui.cc
index b2e8fba..c18e9fb 100644
--- a/chrome/browser/ui/webui/invalidations_ui.cc
+++ b/chrome/browser/ui/webui/invalidations_ui.cc
@@ -5,9 +5,11 @@
#include "chrome/browser/ui/webui/invalidations_ui.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/invalidations_message_handler.h"
#include "chrome/common/url_constants.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
+#include "content/public/browser/web_ui_message_handler.h"
#include "grit/invalidations_resources.h"
content::WebUIDataSource* CreateInvalidationsHTMLSource() {
@@ -25,7 +27,12 @@ InvalidationsUI::InvalidationsUI(content::WebUI* web_ui)
Profile* profile = Profile::FromWebUI(web_ui);
if (profile) {
content::WebUIDataSource::Add(profile, CreateInvalidationsHTMLSource());
+ InvalidationsMessageHandler* message_handler =
+ new InvalidationsMessageHandler();
+ // The MessageHandler of web_ui takes ownership of the object
+ web_ui->AddMessageHandler(message_handler);
}
}
InvalidationsUI::~InvalidationsUI() { }
+
diff --git a/chrome/browser/ui/webui/invalidations_ui.h b/chrome/browser/ui/webui/invalidations_ui.h
index fbbbf60..013d3e3 100644
--- a/chrome/browser/ui/webui/invalidations_ui.h
+++ b/chrome/browser/ui/webui/invalidations_ui.h
@@ -6,7 +6,6 @@
#define CHROME_BROWSER_UI_WEBUI_INVALIDATIONS_UI_H_
#include "base/basictypes.h"
-#include "base/compiler_specific.h"
#include "content/public/browser/web_ui_controller.h"
// The implementation for the chrome://invalidations page.
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 7fd948e..3ab5c03 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -950,6 +950,8 @@
'browser/internal_auth.h',
'browser/intranet_redirect_detector.cc',
'browser/intranet_redirect_detector.h',
+ 'browser/invalidation/invalidation_logger.cc',
+ 'browser/invalidation/invalidation_logger.h',
'browser/invalidation/fake_invalidation_service.cc',
'browser/invalidation/fake_invalidation_service.h',
'browser/invalidation/gcm_network_channel_delegate_impl.cc',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
index 5bc1d3d..17f22fe 100644
--- a/chrome/chrome_browser_ui.gypi
+++ b/chrome/chrome_browser_ui.gypi
@@ -2387,6 +2387,8 @@
'browser/ui/webui/instant_ui.h',
'browser/ui/webui/invalidations_ui.cc',
'browser/ui/webui/invalidations_ui.h',
+ 'browser/ui/webui/invalidations_message_handler.cc',
+ 'browser/ui/webui/invalidations_message_handler.h',
'browser/ui/webui/media/webrtc_logs_ui.cc',
'browser/ui/webui/media/webrtc_logs_ui.h',
'browser/ui/webui/memory_internals/memory_internals_handler.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 6c2dc01..c84766e 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1600,6 +1600,7 @@
'test/base/test_chrome_web_ui_controller_factory.h',
'test/base/test_chrome_web_ui_controller_factory_browsertest.cc',
'test/data/chromeos/oobe_webui_browsertest.js',
+ 'test/data/webui/about_invalidations_browsertest.js',
'test/data/webui/accessibility_audit_browsertest.js',
'test/data/webui/assertions.js',
'test/data/webui/async_gen.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 9c83d3e..104e2e8 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -1015,6 +1015,7 @@
'browser/install_verification/win/module_verification_test.cc',
'browser/install_verification/win/module_verification_test.h',
'browser/invalidation/gcm_network_channel_delegate_impl_unittest.cc',
+ 'browser/invalidation/invalidation_logger_unittest.cc',
'browser/invalidation/invalidation_service_android_unittest.cc',
'browser/invalidation/invalidation_service_test_template.cc',
'browser/invalidation/invalidation_service_test_template.h',
diff --git a/chrome/test/data/webui/about_invalidations_browsertest.js b/chrome/test/data/webui/about_invalidations_browsertest.js
new file mode 100644
index 0000000..694e488
--- /dev/null
+++ b/chrome/test/data/webui/about_invalidations_browsertest.js
@@ -0,0 +1,62 @@
+// Copyright 2014 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.
+
+/**
+ * TestFixture for Invalidations WebUI testing.
+ * @extends {testing.Test}
+ * @constructor
+ **/
+function InvalidationsWebUITest() {}
+
+InvalidationsWebUITest.prototype = {
+ __proto__: testing.Test.prototype,
+
+ /**
+ * Browse to the Invalidations page.
+ **/
+ browsePreload: 'chrome://invalidations',
+ runAccessibilityChecks: false,
+ accessibilityIssuesAreErrors: false,
+};
+
+// Test that registering an invalidations appears properly on the textarea.
+TEST_F('InvalidationsWebUITest', 'testRegisteringNewInvalidation', function() {
+ var invalidationsLog = $('invalidations-log');
+ var invalidation = [{
+ isUnknownVersion: 'true',
+ objectId: {name: 'EXTENSIONS', source: 1004}
+ }];
+ invalidationsLog.value = '';
+ chrome.invalidations.logInvalidations(invalidation);
+ var isContained =
+ invalidationsLog.value.indexOf(
+ 'Received Invalidation with type ' +
+ '"EXTENSIONS" version "Unknown" with payload "undefined"') != -1;
+ expectTrue(isContained, 'Actual log is:' + invalidationsLog.value);
+
+});
+
+// Test that changing the Invalidations Service state appears both in the
+// span and in the textarea.
+TEST_F('InvalidationsWebUITest', 'testChangingInvalidationsState', function() {
+ var invalidationsState = $('invalidations-state');
+ var invalidationsLog = $('invalidations-log');
+ var newState = 'INVALIDATIONS_ENABLED';
+ var newNewState = 'TRANSIENT_INVALIDATION_ERROR';
+
+ chrome.invalidations.updateState(newState);
+ expectEquals(invalidationsState.textContent,
+ 'INVALIDATIONS_ENABLED',
+ 'could not change the invalidations text');
+ invalidationsLog.value = '';
+ chrome.invalidations.updateState(newNewState);
+ expectEquals(invalidationsState.textContent,
+ 'TRANSIENT_INVALIDATION_ERROR');
+ var isContained =
+ invalidationsLog.value.indexOf(
+ 'Invalidations service state changed to '+
+ '"TRANSIENT_INVALIDATION_ERROR"') != -1;
+ expectTrue(isContained, 'Actual log is:' + invalidationsLog.value);
+});
+