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