translate_internals_handler.cc revision 868fa2fe829687343ffae624259930155e16dbd8
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/webui/translate_internals/translate_internals_handler.h" 6 7#include <map> 8#include <vector> 9 10#include "base/bind.h" 11#include "base/bind_helpers.h" 12#include "base/prefs/pref_service.h" 13#include "base/values.h" 14#include "chrome/browser/profiles/profile.h" 15#include "chrome/browser/translate/translate_error_details.h" 16#include "chrome/browser/translate/translate_event_details.h" 17#include "chrome/browser/translate/translate_prefs.h" 18#include "chrome/common/pref_names.h" 19#include "chrome/common/translate/language_detection_details.h" 20#include "content/public/browser/web_contents.h" 21#include "content/public/browser/web_ui.h" 22 23TranslateInternalsHandler::TranslateInternalsHandler() { 24 TranslateManager::GetInstance()->AddObserver(this); 25} 26 27TranslateInternalsHandler::~TranslateInternalsHandler() { 28 TranslateManager::GetInstance()->RemoveObserver(this); 29} 30 31void TranslateInternalsHandler::RegisterMessages() { 32 web_ui()->RegisterMessageCallback("removePrefItem", base::Bind( 33 &TranslateInternalsHandler::OnRemovePrefItem, base::Unretained(this))); 34 web_ui()->RegisterMessageCallback("requestInfo", base::Bind( 35 &TranslateInternalsHandler::OnRequestInfo, base::Unretained(this))); 36} 37 38void TranslateInternalsHandler::OnLanguageDetection( 39 const LanguageDetectionDetails& details) { 40 base::DictionaryValue dict; 41 dict.Set("time", 42 new base::FundamentalValue(details.time.ToJsTime())); 43 dict.Set("url", 44 new base::StringValue(details.url.spec())); 45 dict.Set("content_language", 46 new base::StringValue(details.content_language)); 47 dict.Set("cld_language", 48 new base::StringValue(details.cld_language)); 49 dict.Set("is_cld_reliable", 50 new base::FundamentalValue(details.is_cld_reliable)); 51 dict.Set("html_root_language", 52 new base::StringValue(details.html_root_language)); 53 dict.Set("adopted_language", 54 new base::StringValue(details.adopted_language)); 55 dict.Set("content", new base::StringValue(details.contents)); 56 SendMessageToJs("languageDetectionInfoAdded", dict); 57} 58 59void TranslateInternalsHandler::OnTranslateError( 60 const TranslateErrorDetails& details) { 61 base::DictionaryValue dict; 62 dict.Set("time", 63 new base::FundamentalValue(details.time.ToJsTime())); 64 dict.Set("url", 65 new base::StringValue(details.url.spec())); 66 dict.Set("error", 67 new base::FundamentalValue(details.error)); 68 SendMessageToJs("translateErrorDetailsAdded", dict); 69} 70 71void TranslateInternalsHandler::OnTranslateEvent( 72 const TranslateEventDetails& details) { 73 base::DictionaryValue dict; 74 dict.Set("time", new base::FundamentalValue(details.time.ToJsTime())); 75 dict.Set("filename", new base::StringValue(details.filename)); 76 dict.Set("line", new base::FundamentalValue(details.line)); 77 dict.Set("message", new base::StringValue(details.message)); 78 SendMessageToJs("translateEventDetailsAdded", dict); 79} 80 81void TranslateInternalsHandler::OnRemovePrefItem(const base::ListValue* args) { 82 content::WebContents* web_contents = web_ui()->GetWebContents(); 83 Profile* profile = 84 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 85 PrefService* prefs = profile->GetOriginalProfile()->GetPrefs(); 86 TranslatePrefs translate_prefs(prefs); 87 88 std::string pref_name; 89 if (!args->GetString(0, &pref_name)) 90 return; 91 92 if (pref_name == "language_blacklist") { 93 std::string language; 94 if (!args->GetString(1, &language)) 95 return; 96 translate_prefs.RemoveLanguageFromBlacklist(language); 97 } else if (pref_name == "site_blacklist") { 98 std::string site; 99 if (!args->GetString(1, &site)) 100 return; 101 translate_prefs.RemoveSiteFromBlacklist(site); 102 } else if (pref_name == "whitelists") { 103 std::string from, to; 104 if (!args->GetString(1, &from)) 105 return; 106 if (!args->GetString(2, &to)) 107 return; 108 translate_prefs.RemoveLanguagePairFromWhitelist(from, to); 109 } else { 110 return; 111 } 112 113 base::ListValue unused; 114 SendPrefsToJs(); 115} 116 117void TranslateInternalsHandler::OnRequestInfo(const base::ListValue* /*args*/) { 118 SendPrefsToJs(); 119} 120 121void TranslateInternalsHandler::SendMessageToJs(const std::string& message, 122 const base::Value& value) { 123 const char func[] = "cr.translateInternals.messageHandler"; 124 base::StringValue message_data(message); 125 web_ui()->CallJavascriptFunction(func, message_data, value); 126} 127 128void TranslateInternalsHandler::SendPrefsToJs() { 129 content::WebContents* web_contents = web_ui()->GetWebContents(); 130 Profile* profile = 131 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 132 PrefService* prefs = profile->GetOriginalProfile()->GetPrefs(); 133 134 base::DictionaryValue dict; 135 136 static const char* keys[] = { 137 prefs::kEnableTranslate, 138 TranslatePrefs::kPrefTranslateLanguageBlacklist, 139 TranslatePrefs::kPrefTranslateSiteBlacklist, 140 TranslatePrefs::kPrefTranslateWhitelists, 141 TranslatePrefs::kPrefTranslateDeniedCount, 142 TranslatePrefs::kPrefTranslateAcceptedCount, 143 }; 144 145 for (size_t i = 0; i < arraysize(keys); ++i) { 146 const char* key = keys[i]; 147 const PrefService::Preference* pref = prefs->FindPreference(key); 148 if (pref) 149 dict.Set(key, pref->GetValue()->DeepCopy()); 150 } 151 152 SendMessageToJs("prefsUpdated", dict); 153} 154