Index: chrome/browser/ui/webui/sync_internals_message_handler.cc |
diff --git a/chrome/browser/ui/webui/sync_internals_message_handler.cc b/chrome/browser/ui/webui/sync_internals_message_handler.cc |
index 3d4ddefc3add8251704a1a28e1fe7d2521188a1c..c4612b755bc5c4b38ddffba126d8bf4cd4c278b0 100644 |
--- a/chrome/browser/ui/webui/sync_internals_message_handler.cc |
+++ b/chrome/browser/ui/webui/sync_internals_message_handler.cc |
@@ -22,7 +22,8 @@ using syncer::ModelTypeSet; |
using syncer::WeakHandle; |
SyncInternalsMessageHandler::SyncInternalsMessageHandler() |
- : weak_ptr_factory_(this) {} |
+ : is_registered_(false), |
+ weak_ptr_factory_(this) {} |
SyncInternalsMessageHandler::~SyncInternalsMessageHandler() { |
if (js_controller_) |
@@ -63,12 +64,16 @@ void SyncInternalsMessageHandler::HandleRegisterForEvents( |
const base::ListValue* args) { |
DCHECK(args->empty()); |
+ // is_registered_ flag protects us from double-registering. This could |
+ // happen on a page refresh, where the JavaScript gets re-run but the |
+ // message handler remains unchanged. |
ProfileSyncService* service = GetProfileSyncService(); |
- if (service) { |
+ if (service && !is_registered_) { |
service->AddObserver(this); |
service->AddProtocolEventObserver(this); |
js_controller_ = service->GetJsController(); |
js_controller_->AddJsEventHandler(this); |
+ is_registered_ = true; |
} |
} |
@@ -113,12 +118,9 @@ void SyncInternalsMessageHandler::HandleGetAllNodes( |
void SyncInternalsMessageHandler::OnReceivedAllNodes( |
int request_id, |
scoped_ptr<base::ListValue> nodes) { |
- base::ListValue response_args; |
- response_args.Append(new base::FundamentalValue(request_id)); |
- response_args.Append(nodes.release()); |
- |
+ base::FundamentalValue id(request_id); |
web_ui()->CallJavascriptFunction("chrome.sync.getAllNodesCallback", |
- response_args); |
+ id, *nodes); |
} |
void SyncInternalsMessageHandler::OnStateChanged() { |