#include "chrome/browser/ui/webui/gcm_internals_ui.h"
+#include <vector>
+
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/format_macros.h"
#include "base/memory/weak_ptr.h"
+#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
namespace {
+void SetCheckinInfo(
+ const std::vector<gcm::GCMStatsRecorder::CheckinActivity>& checkins,
+ base::ListValue* checkin_info) {
+ std::vector<gcm::GCMStatsRecorder::CheckinActivity>::const_iterator it =
+ checkins.begin();
+ for (; it < checkins.end(); ++it) {
+ base::ListValue* row = new base::ListValue();
+ checkin_info->Append(row);
+
+ row->AppendDouble(it->time.ToJsTime());
+ row->AppendString(it->event);
+ row->AppendString(it->details);
+ }
+}
+
+void SetConnectionInfo(
+ const std::vector<gcm::GCMStatsRecorder::ConnectionActivity>& connections,
+ base::ListValue* connection_info) {
+ std::vector<gcm::GCMStatsRecorder::ConnectionActivity>::const_iterator it =
+ connections.begin();
+ for (; it < connections.end(); ++it) {
+ base::ListValue* row = new base::ListValue();
+ connection_info->Append(row);
+
+ row->AppendDouble(it->time.ToJsTime());
+ row->AppendString(it->event);
+ row->AppendString(it->details);
+ }
+}
+
+void SetRegistrationInfo(
+ const std::vector<gcm::GCMStatsRecorder::RegistrationActivity>&
+ registrations,
+ base::ListValue* registration_info) {
+ std::vector<gcm::GCMStatsRecorder::RegistrationActivity>::const_iterator it =
+ registrations.begin();
+ for (; it < registrations.end(); ++it) {
+ base::ListValue* row = new base::ListValue();
+ registration_info->Append(row);
+
+ row->AppendDouble(it->time.ToJsTime());
+ row->AppendString(it->app_id);
+ row->AppendString(it->sender_ids);
+ row->AppendString(it->event);
+ row->AppendString(it->details);
+ }
+}
+
+void SetReceivingInfo(
+ const std::vector<gcm::GCMStatsRecorder::ReceivingActivity>& receives,
+ base::ListValue* receive_info) {
+ std::vector<gcm::GCMStatsRecorder::ReceivingActivity>::const_iterator it =
+ receives.begin();
+ for (; it < receives.end(); ++it) {
+ base::ListValue* row = new base::ListValue();
+ receive_info->Append(row);
+
+ row->AppendDouble(it->time.ToJsTime());
+ row->AppendString(it->app_id);
+ row->AppendString(it->from);
+ row->AppendString(base::StringPrintf("%d", it->message_byte_size));
+ row->AppendString(it->event);
+ row->AppendString(it->details);
+ }
+}
+
+void SetSendingInfo(
+ const std::vector<gcm::GCMStatsRecorder::SendingActivity>& sends,
+ base::ListValue* send_info) {
+ std::vector<gcm::GCMStatsRecorder::SendingActivity>::const_iterator it =
+ sends.begin();
+ for (; it < sends.end(); ++it) {
+ base::ListValue* row = new base::ListValue();
+ send_info->Append(row);
+
+ row->AppendDouble(it->time.ToJsTime());
+ row->AppendString(it->app_id);
+ row->AppendString(it->receiver_id);
+ row->AppendString(it->message_id);
+ row->AppendString(it->event);
+ row->AppendString(it->details);
+ }
+}
+
// Class acting as a controller of the chrome://gcm-internals WebUI.
class GcmInternalsUIMessageHandler : public content::WebUIMessageHandler {
public:
// Request all of the GCM related infos through gcm profile service.
void RequestAllInfo(const base::ListValue* args);
+ // Enables/disables GCM activity recording through gcm profile service.
+ void SetRecording(const base::ListValue* args);
+
// Callback function of the request for all gcm related infos.
void RequestGCMStatisticsFinished(
const gcm::GCMClient::GCMStatistics& args) const;
profile_service->IsGCMClientReady());
}
if (stats) {
+ results.SetBoolean("isRecording", stats->is_recording);
device_info->SetBoolean("gcmClientCreated", stats->gcm_client_created);
device_info->SetString("gcmClientState", stats->gcm_client_state);
device_info->SetBoolean("connectionClientCreated",
stats->connection_client_created);
+ device_info->SetString("registeredAppIds",
+ JoinString(stats->registered_app_ids, ","));
if (stats->connection_client_created)
device_info->SetString("connectionState", stats->connection_state);
if (stats->android_id > 0) {
device_info->SetString("androidId",
base::StringPrintf("0x%" PRIx64, stats->android_id));
}
+ device_info->SetInteger("sendQueueSize", stats->send_queue_size);
+ device_info->SetInteger("resendQueueSize", stats->resend_queue_size);
+
+ if (stats->recorded_activities.checkin_activities.size() > 0) {
+ base::ListValue* checkin_info = new base::ListValue();
+ results.Set("checkinInfo", checkin_info);
+ SetCheckinInfo(stats->recorded_activities.checkin_activities,
+ checkin_info);
+ }
+ if (stats->recorded_activities.connection_activities.size() > 0) {
+ base::ListValue* connection_info = new base::ListValue();
+ results.Set("connectionInfo", connection_info);
+ SetConnectionInfo(stats->recorded_activities.connection_activities,
+ connection_info);
+ }
+ if (stats->recorded_activities.registration_activities.size() > 0) {
+ base::ListValue* registration_info = new base::ListValue();
+ results.Set("registrationInfo", registration_info);
+ SetRegistrationInfo(stats->recorded_activities.registration_activities,
+ registration_info);
+ }
+ if (stats->recorded_activities.receiving_activities.size() > 0) {
+ base::ListValue* receive_info = new base::ListValue();
+ results.Set("receiveInfo", receive_info);
+ SetReceivingInfo(stats->recorded_activities.receiving_activities,
+ receive_info);
+ }
+ if (stats->recorded_activities.sending_activities.size() > 0) {
+ base::ListValue* send_info = new base::ListValue();
+ results.Set("sendInfo", send_info);
+ SetSendingInfo(stats->recorded_activities.sending_activities, send_info);
+ }
}
web_ui()->CallJavascriptFunction("gcmInternals.setGcmInternalsInfo",
results);
void GcmInternalsUIMessageHandler::RequestAllInfo(
const base::ListValue* args) {
+ if (args->GetSize() != 1) {
+ NOTREACHED();
+ return;
+ }
+ bool clear_logs = false;
+ if (!args->GetBoolean(0, &clear_logs)) {
+ NOTREACHED();
+ return;
+ }
+
Profile* profile = Profile::FromWebUI(web_ui());
gcm::GCMProfileService* profile_service =
gcm::GCMProfileServiceFactory::GetForProfile(profile);
if (!profile_service) {
ReturnResults(profile, NULL, NULL);
+ } else if (profile_service->SignedInUserName().empty()) {
+ ReturnResults(profile, profile_service, NULL);
} else {
- profile_service->RequestGCMStatistics(base::Bind(
- &GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished,
- weak_ptr_factory_.GetWeakPtr()));
+ profile_service->GetGCMStatistics(
+ base::Bind(&GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished,
+ weak_ptr_factory_.GetWeakPtr()),
+ clear_logs);
+ }
+}
+
+void GcmInternalsUIMessageHandler::SetRecording(const base::ListValue* args) {
+ if (args->GetSize() != 1) {
+ NOTREACHED();
+ return;
}
+ bool recording = false;
+ if (!args->GetBoolean(0, &recording)) {
+ NOTREACHED();
+ return;
+ }
+
+ Profile* profile = Profile::FromWebUI(web_ui());
+ gcm::GCMProfileService* profile_service =
+ gcm::GCMProfileServiceFactory::GetForProfile(profile);
+
+ if (!profile_service) {
+ ReturnResults(profile, NULL, NULL);
+ return;
+ }
+ if (profile_service->SignedInUserName().empty()) {
+ ReturnResults(profile, profile_service, NULL);
+ return;
+ }
+ // Get fresh stats after changing recording setting.
+ profile_service->SetGCMRecording(
+ base::Bind(
+ &GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished,
+ weak_ptr_factory_.GetWeakPtr()),
+ recording);
}
void GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished(
web_ui()->RegisterMessageCallback(
"getGcmInternalsInfo",
base::Bind(&GcmInternalsUIMessageHandler::RequestAllInfo,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
+ web_ui()->RegisterMessageCallback(
+ "setGcmInternalsRecording",
+ base::Bind(&GcmInternalsUIMessageHandler::SetRecording,
+ weak_ptr_factory_.GetWeakPtr()));
}
} // namespace