172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/sync_internals_ui.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string> 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/logging.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/task.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/tracked_objects.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/js_arg_list.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/js_frontend.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/profile_sync_service.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/sync_ui_util.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager.h" 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/sync_internals_html_source.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_messages.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSyncInternalsUI::SyncInternalsUI(TabContents* contents) 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : WebUI(contents) { 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser_sync::JsFrontend* backend = GetJsFrontend(); 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (backend) { 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen backend->AddHandler(this); 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // If this PostTask() call fails, it's most likely because this is 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // being run from a unit test. The created objects will be cleaned 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // up, anyway. 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen contents->profile()->GetChromeURLDataManager()->AddDataSource( 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new SyncInternalsHTMLSource()); 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSyncInternalsUI::~SyncInternalsUI() { 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser_sync::JsFrontend* backend = GetJsFrontend(); 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (backend) { 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen backend->RemoveHandler(this); 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SyncInternalsUI::ProcessWebUIMessage( 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ExtensionHostMsg_DomMessage_Params& params) { 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& name = params.name; 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser_sync::JsArgList args(params.arguments); 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen VLOG(1) << "Received message: " << name << " with args " 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << args.ToString(); 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We handle this case directly because it needs to work even if 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // the sync service doesn't exist. 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (name == "getAboutInfo") { 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue args; 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DictionaryValue* about_info = new DictionaryValue(); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen args.Append(about_info); 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ProfileSyncService* service = GetProfile()->GetProfileSyncService(); 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_ui_util::ConstructAboutInformation(service, about_info); 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HandleJsEvent("onGetAboutInfoFinished", 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser_sync::JsArgList(args)); 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser_sync::JsFrontend* backend = GetJsFrontend(); 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (backend) { 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen backend->ProcessMessage(name, args, this); 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LOG(WARNING) << "No sync service; dropping message " << name 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen << " with args " << args.ToString(); 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SyncInternalsUI::HandleJsEvent(const std::string& name, 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const browser_sync::JsArgList& args) { 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen VLOG(1) << "Handling event: " << name << " with args " << args.ToString(); 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<const Value*> arg_list(args.Get().begin(), args.Get().end()); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CallJavascriptFunction(name, arg_list); 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbrowser_sync::JsFrontend* SyncInternalsUI::GetJsFrontend() { 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // If this returns NULL that means that sync is disabled for 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // whatever reason. 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ProfileSyncService* sync_service = GetProfile()->GetProfileSyncService(); 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return sync_service ? sync_service->GetJsFrontend() : NULL; 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 85