translate_service.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/translate/translate_service.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/logging.h"
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/prefs/pref_service.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/string_split.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/browser_process.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/pref_names.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_download_manager.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/translate/core/browser/translate_manager.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/common/url_constants.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "url/gurl.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS)
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/chromeos/file_manager/app_id.h"
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/constants.h"
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The singleton instance of TranslateService.
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TranslateService* g_translate_service = NULL;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TranslateService::TranslateService() {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  resource_request_allowed_notifier_.Init(this);
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TranslateService::~TranslateService() {}
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslateService::Initialize() {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (g_translate_service)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_translate_service = new TranslateService;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Initialize the allowed state for resource requests.
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_translate_service->OnResourceRequestsAllowed();
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  translate::TranslateDownloadManager* download_manager =
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      translate::TranslateDownloadManager::GetInstance();
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  download_manager->set_request_context(
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->system_request_context());
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  download_manager->set_application_locale(
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->GetApplicationLocale());
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslateService::Shutdown(bool cleanup_pending_fetcher) {
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  translate::TranslateDownloadManager* download_manager =
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      translate::TranslateDownloadManager::GetInstance();
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (cleanup_pending_fetcher) {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    download_manager->Shutdown();
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // This path is only used by browser tests.
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    download_manager->set_request_context(NULL);
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TranslateService::InitializeForTesting() {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!g_translate_service) {
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    TranslateService::Initialize();
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    translate::TranslateDownloadManager::GetInstance()->ResetForTesting();
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    g_translate_service->OnResourceRequestsAllowed();
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TranslateService::ShutdownForTesting() {
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  translate::TranslateDownloadManager::GetInstance()->Shutdown();
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TranslateService::OnResourceRequestsAllowed() {
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  translate::TranslateLanguageList* language_list =
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      translate::TranslateDownloadManager::GetInstance()->language_list();
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!language_list) {
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED();
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  language_list->SetResourceRequestsAllowed(
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      resource_request_allowed_notifier_.ResourceRequestsAllowed());
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TranslateService::IsTranslateBubbleEnabled() {
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_AURA)
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return true;
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#elif defined(OS_MACOSX)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The bubble UX is experimental on Mac OS X.
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return CommandLine::ForCurrentProcess()->HasSwitch(
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      switches::kEnableTranslateNewUX);
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The bubble UX is not implemented on other platforms.
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)std::string TranslateService::GetTargetLanguage(PrefService* prefs) {
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::vector<std::string> accept_languages_list;
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::SplitString(prefs->GetString(prefs::kAcceptLanguages), ',',
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                    &accept_languages_list);
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return translate::TranslateManager::GetTargetLanguage(accept_languages_list);
11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// static
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool TranslateService::IsTranslatableURL(const GURL& url) {
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // A URLs is translatable unless it is one of the following:
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // - empty (can happen for popups created with window.open(""))
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // - an internal URL (chrome:// and others)
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // - the devtools (which is considered UI)
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // - Chrome OS file manager extension
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // - an FTP page (as FTP pages tend to have long lists of filenames that may
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  //   confuse the CLD)
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return !url.is_empty() && !url.SchemeIs(content::kChromeUIScheme) &&
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         !url.SchemeIs(content::kChromeDevToolsScheme) &&
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS)
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         !(url.SchemeIs(extensions::kExtensionScheme) &&
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch           url.DomainIs(file_manager::kFileManagerAppId)) &&
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         !url.SchemeIs(url::kFtpScheme);
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
129