blob: 1d4a9b0f4ebcd35ad4b5be03744f8562d60e706c [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_LANGUAGE_LIST_H_
#define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_LANGUAGE_LIST_H_
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/callback_list.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/time/time.h"
class GURL;
namespace translate {
struct TranslateEventDetails;
class TranslateURLFetcher;
// The TranslateLanguageList class is responsible for maintaining the latest
// supporting language list.
class TranslateLanguageList {
public:
static const int kFetcherId = 1;
TranslateLanguageList();
virtual ~TranslateLanguageList();
// Returns the last-updated time when the language list is fetched from the
// Translate server. Returns null time if the list is yet to be fetched.
base::Time last_updated() { return last_updated_; }
// Fills |languages| with the list of languages that the translate server can
// translate to and from. May attempt a language list request unless
// |translate_allowed| is false.
void GetSupportedLanguages(bool translate_allowed,
std::vector<std::string>* languages);
// Returns the language code that can be used with the Translate method for a
// specified |language|. (ex. GetLanguageCode("en-US") will return "en", and
// GetLanguageCode("zh-CN") returns "zh-CN")
std::string GetLanguageCode(const std::string& language);
// Returns true if |language| is supported by the translation server.
bool IsSupportedLanguage(const std::string& language);
// Fetches the language list from the translate server if resource requests
// are allowed, and otherwise keeps the request as pending until allowed.
void RequestLanguageList();
// Sets whether requests are allowed. If |allowed| is true, this resumes any
// pending request.
void SetResourceRequestsAllowed(bool allowed);
typedef base::Callback<void(const TranslateEventDetails&)> EventCallback;
typedef base::CallbackList<void(const TranslateEventDetails&)>
EventCallbackList;
// Registers a callback for translate events related to the language list,
// such as updates and download errors.
std::unique_ptr<EventCallbackList::Subscription> RegisterEventCallback(
const EventCallback& callback);
// Helper methods used by specific unit tests.
GURL LanguageFetchURLForTesting();
bool HasOngoingLanguageListLoadingForTesting();
// Disables the language list updater. This is used only for testing now.
static void DisableUpdate();
// static const values shared with our browser tests.
static const char kTargetLanguagesKey[];
private:
FRIEND_TEST_ALL_PREFIXES(TranslateLanguageListTest, IsSupportedLanguage);
FRIEND_TEST_ALL_PREFIXES(TranslateLanguageListTest, SetSupportedLanguages);
FRIEND_TEST_ALL_PREFIXES(TranslateLanguageListTest, TranslateLanguageUrl);
FRIEND_TEST_ALL_PREFIXES(TranslateLanguageListTest,
GetSupportedLanguagesFetch);
// Callback function called when TranslateURLFetcher::Request() is finished.
void OnLanguageListFetchComplete(int id,
bool success,
const std::string& data);
// Notifies the callback list of a translate event.
void NotifyEvent(int line, const std::string& message);
// Parses |language_list| containing the list of languages that the translate
// server can translate to and from. Returns true iff the list is parsed
// without syntax errors.
bool SetSupportedLanguages(const std::string& language_list);
// Returns the url from which to load the list of languages.
GURL TranslateLanguageUrl();
// Callbacks called on translate events.
EventCallbackList callback_list_;
// Whether the language list can be requested.
bool resource_requests_allowed_;
// True if the list has to be fetched when resource requests are allowed.
bool request_pending_;
// The languages supported by the translation server.
std::set<std::string> supported_languages_;
// A LanguageListFetcher instance to fetch a server providing supported
// language list.
std::unique_ptr<TranslateURLFetcher> language_list_fetcher_;
// The last-updated time when the language list is sent.
base::Time last_updated_;
DISALLOW_COPY_AND_ASSIGN(TranslateLanguageList);
};
} // namespace translate
#endif // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_LANGUAGE_LIST_H_