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