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