1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/webui/translate_internals/translate_internals_handler.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind_helpers.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/translate/chrome_translate_client.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/translate/translate_service.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/pref_names.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_download_manager.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_error_details.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_event_details.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_prefs.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/common/language_detection_details.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/common/translate_pref_names.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/notification_details.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/notification_service.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/notification_source.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/notification_types.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_ui.h" 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TranslateInternalsHandler::TranslateInternalsHandler() { 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) notification_registrar_.Add(this, 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NotificationService::AllSources()); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) error_subscription_ = 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateManager::RegisterTranslateErrorCallback( 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&TranslateInternalsHandler::OnTranslateError, 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this))); 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateLanguageList* language_list = 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateDownloadManager::GetInstance()->language_list(); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!language_list) { 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event_subscription_ = language_list->RegisterEventCallback(base::Bind( 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &TranslateInternalsHandler::OnTranslateEvent, base::Unretained(this))); 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TranslateInternalsHandler::~TranslateInternalsHandler() { 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |event_subscription_| and |error_subscription_| are deleted automatically 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // and un-register the callbacks automatically. 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateInternalsHandler::RegisterMessages() { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_ui()->RegisterMessageCallback("removePrefItem", base::Bind( 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &TranslateInternalsHandler::OnRemovePrefItem, base::Unretained(this))); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_ui()->RegisterMessageCallback("requestInfo", base::Bind( 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &TranslateInternalsHandler::OnRequestInfo, base::Unretained(this))); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslateInternalsHandler::Observe( 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int type, 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::NotificationSource& source, 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::NotificationDetails& details) { 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, type); 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const translate::LanguageDetectionDetails* language_detection_details = 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::Details<const translate::LanguageDetectionDetails>(details) 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) .ptr(); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* web_contents = 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<content::WebContents>(source).ptr(); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (web_contents->GetBrowserContext()->IsOffTheRecord() || 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !TranslateService::IsTranslatableURL(language_detection_details->url)) { 78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 80bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::DictionaryValue dict; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dict.Set( 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "time", 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::FundamentalValue(language_detection_details->time.ToJsTime())); 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dict.Set("url", 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::StringValue(language_detection_details->url.spec())); 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dict.Set("content_language", 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::StringValue(language_detection_details->content_language)); 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dict.Set("cld_language", 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::StringValue(language_detection_details->cld_language)); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dict.Set( 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "is_cld_reliable", 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::FundamentalValue(language_detection_details->is_cld_reliable)); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dict.Set( 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "html_root_language", 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::StringValue(language_detection_details->html_root_language)); 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict.Set("adopted_language", 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::StringValue(language_detection_details->adopted_language)); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dict.Set("content", 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::StringValue(language_detection_details->contents)); 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendMessageToJs("languageDetectionInfoAdded", dict); 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TranslateInternalsHandler::OnTranslateError( 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const translate::TranslateErrorDetails& details) { 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::DictionaryValue dict; 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dict.Set("time", 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new base::FundamentalValue(details.time.ToJsTime())); 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dict.Set("url", 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new base::StringValue(details.url.spec())); 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dict.Set("error", 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new base::FundamentalValue(details.error)); 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendMessageToJs("translateErrorDetailsAdded", dict); 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TranslateInternalsHandler::OnTranslateEvent( 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const translate::TranslateEventDetails& details) { 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::DictionaryValue dict; 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict.Set("time", new base::FundamentalValue(details.time.ToJsTime())); 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict.Set("filename", new base::StringValue(details.filename)); 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict.Set("line", new base::FundamentalValue(details.line)); 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict.Set("message", new base::StringValue(details.message)); 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SendMessageToJs("translateEventDetailsAdded", dict); 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateInternalsHandler::OnRemovePrefItem(const base::ListValue* args) { 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* web_contents = web_ui()->GetWebContents(); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile = 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrefService* prefs = profile->GetOriginalProfile()->GetPrefs(); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<translate::TranslatePrefs> translate_prefs( 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ChromeTranslateClient::CreateTranslatePrefs(prefs)); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string pref_name; 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!args->GetString(0, &pref_name)) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (pref_name == "blocked_languages") { 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string language; 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!args->GetString(1, &language)) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) translate_prefs->UnblockLanguage(language); 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (pref_name == "language_blacklist") { 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string language; 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!args->GetString(1, &language)) 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) translate_prefs->RemoveLanguageFromLegacyBlacklist(language); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (pref_name == "site_blacklist") { 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string site; 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!args->GetString(1, &site)) 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) translate_prefs->RemoveSiteFromBlacklist(site); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (pref_name == "whitelists") { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string from, to; 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!args->GetString(1, &from)) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!args->GetString(2, &to)) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) translate_prefs->RemoveLanguagePairFromWhitelist(from, to); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else if (pref_name == "too_often_denied") { 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch translate_prefs->ResetDenialState(); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendPrefsToJs(); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateInternalsHandler::OnRequestInfo(const base::ListValue* /*args*/) { 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendPrefsToJs(); 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SendSupportedLanguagesToJs(); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateInternalsHandler::SendMessageToJs(const std::string& message, 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Value& value) { 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char func[] = "cr.translateInternals.messageHandler"; 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::StringValue message_data(message); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_ui()->CallJavascriptFunction(func, message_data, value); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TranslateInternalsHandler::SendPrefsToJs() { 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* web_contents = web_ui()->GetWebContents(); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile = 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrefService* prefs = profile->GetOriginalProfile()->GetPrefs(); 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::DictionaryValue dict; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> keys; 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch keys.push_back(prefs::kEnableTranslate); 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keys.push_back(translate::TranslatePrefs::kPrefTranslateBlockedLanguages); 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keys.push_back(translate::TranslatePrefs::kPrefTranslateLanguageBlacklist); 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keys.push_back(translate::TranslatePrefs::kPrefTranslateSiteBlacklist); 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keys.push_back(translate::TranslatePrefs::kPrefTranslateWhitelists); 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keys.push_back(translate::TranslatePrefs::kPrefTranslateDeniedCount); 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keys.push_back(translate::TranslatePrefs::kPrefTranslateAcceptedCount); 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keys.push_back(translate::TranslatePrefs::kPrefTranslateLastDeniedTime); 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keys.push_back(translate::TranslatePrefs::kPrefTranslateTooOftenDenied); 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<std::string>::const_iterator it = keys.begin(); 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it != keys.end(); ++it) { 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& key = *it; 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const PrefService::Preference* pref = prefs->FindPreference(key.c_str()); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (pref) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict.Set(key, pref->GetValue()->DeepCopy()); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendMessageToJs("prefsUpdated", dict); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void TranslateInternalsHandler::SendSupportedLanguagesToJs() { 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue dict; 2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<std::string> languages; 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateDownloadManager::GetSupportedLanguages(&languages); 2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time last_updated = 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) translate::TranslateDownloadManager::GetSupportedLanguagesLastUpdated(); 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* languages_list = new base::ListValue(); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* alpha_languages_list = new base::ListValue(); 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (std::vector<std::string>::iterator it = languages.begin(); 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != languages.end(); ++it) { 2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& lang = *it; 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) languages_list->Append(new base::StringValue(lang)); 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (translate::TranslateDownloadManager::IsAlphaLanguage(lang)) 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) alpha_languages_list->Append(new base::StringValue(lang)); 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dict.Set("languages", languages_list); 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dict.Set("alpha_languages", alpha_languages_list); 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dict.Set("last_updated", 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) new base::FundamentalValue(last_updated.ToJsTime())); 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SendMessageToJs("supportedLanguagesUpdated", dict); 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 236