summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host/translation_service.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/renderer_host/translation_service.h')
-rw-r--r--chrome/browser/renderer_host/translation_service.h140
1 files changed, 132 insertions, 8 deletions
diff --git a/chrome/browser/renderer_host/translation_service.h b/chrome/browser/renderer_host/translation_service.h
index a8e8429..bcf6322 100644
--- a/chrome/browser/renderer_host/translation_service.h
+++ b/chrome/browser/renderer_host/translation_service.h
@@ -5,30 +5,154 @@
#ifndef CHROME_BROWSER_RENDERER_HOST_TRANSLATION_SERVICE_H_
#define CHROME_BROWSER_RENDERER_HOST_TRANSLATION_SERVICE_H_
+#include <map>
#include <string>
#include <vector>
+#include "base/scoped_ptr.h"
#include "base/string16.h"
+#include "chrome/browser/net/url_fetcher.h"
+#include "ipc/ipc_message.h"
+#include "testing/gtest/include/gtest/gtest_prod.h"
-class ResourceMessageFilter;
+class DictionaryValue;
+class TranslationServiceTest;
+class TranslateURLFetcherDelegate;
+class URLFetcher;
// The TranslationService class is used to translate text.
-// This temporary implementation only upcases the text sent to it.
-class TranslationService {
+// There is one TranslationService is per renderer process.
+// It receives requests to translate text from the different render views of the
+// render process, provided in lists (text chunks), where the words should be
+// translated without changing the chunks order.
+// It groups multiple such requests and sends them for translation to the Google
+// translation server. When it receives the response, it dispatches it to the
+// appropriate render view.
+
+class TranslationService : public URLFetcher::Delegate {
public:
- explicit TranslationService(ResourceMessageFilter* resource_msg_filter);
+ explicit TranslationService(IPC::Message::Sender* message_sender);
+ virtual ~TranslationService();
- // Translates the passed text chunks and sends a
+ // Sends the specified text for translation, from |source_language| to
+ // |target_language|. If |secure| is true, a secure connection is used when
+ // sending the text to the external translation server.
+ // When the translation results have been received, it sends a
// ViewMsg_TranslateTextReponse message on the renderer at |routing_id|.
void Translate(int routing_id,
+ int page_id,
int work_id,
const std::vector<string16>& text_chunks,
- std::string from_language,
- std::string to_language,
+ const std::string& source_language,
+ const std::string& target_language,
bool secure);
+ // Sends the pending translation request for the specified renderer to the
+ // translation server.
+ void SendTranslationRequestForRenderer(int renderer_id, bool secure);
+
+ // URLFetcher::Delegate implementation.
+ virtual void OnURLFetchComplete(const URLFetcher* source,
+ const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+
+ // Returns true if a page in the language |page_language| (as reported by the
+ // CLD) should be translated when Chrome is using |chrome_language|. Note that
+ // this returns false for similar languages, for example it returns false when
+ // given the values 'en' and 'en-US'.
+ static bool ShouldTranslatePage(const std::string& page_language,
+ const std::string& chrome_language);
+
+ // Returns true if the TranslationService is enabled.
+ static bool IsTranslationEnabled();
+
+ protected:
+ // The amount of time in ms after which a pending request is sent if no other
+ // translation request has been received.
+ // Overriden in tests.
+ virtual int GetSendRequestDelay() const;
+
private:
- ResourceMessageFilter* resource_message_filter_;
+ friend class TranslationServiceTest;
+ friend class TranslateURLFetcherDelegate;
+ FRIEND_TEST(TranslationServiceTest, MergeTestChunks);
+ FRIEND_TEST(TranslationServiceTest, SplitTestChunks);
+ FRIEND_TEST(TranslationServiceTest, RemoveTag);
+
+ struct TranslationRequest;
+
+ // The information necessary to return the translated text to the renderer.
+ struct RendererRequestInfo {
+ RendererRequestInfo() : routing_id(0), work_id(0) {}
+ RendererRequestInfo(int routing_id, int work_id)
+ : routing_id(routing_id),
+ work_id(work_id) {
+ }
+ int routing_id;
+ int work_id;
+ };
+
+ typedef std::vector<RendererRequestInfo> RendererRequestInfoList;
+
+ typedef std::vector<string16> TextChunks;
+ typedef std::vector<TextChunks> TextChunksList;
+ // Maps from a RenderView routing id to the pending request for the
+ // translation server.
+ typedef std::map<int, TranslationRequest*> TranslationRequestMap;
+
+ typedef std::map<const URLFetcher*, RendererRequestInfoList*>
+ RendererRequestInfoMap;
+
+ // Sends the passed request to the translations server.
+ // Warning the request is deleted when this call returns.
+ void SendRequestToTranslationServer(TranslationRequest* request);
+
+ // Called by the URLFetcherDelegate when the translation associated with
+ // |url_fetcher| has been performed. Sends the appropriate message back to
+ // the renderer and deletes the URLFetcher.
+ void SendResponseToRenderer(const URLFetcher* url_fetcher,
+ int error_code,
+ const TextChunksList& text_chunks_list);
+
+ // Notifies the renderer that we failed to translate the request associated
+ // with |url_fetcher|.
+ void TranslationFailed(const URLFetcher* source);
+
+ // Merges all text chunks to be translated into a single string that can be
+ // sent to the translate server, surrounding each chunk with an anchor tag
+ // to preserve chunk order in the translated version.
+ static string16 MergeTextChunks(const TextChunks& text_chunks);
+
+ // Splits the translated text into its original text chunks, removing the
+ // anchor tags wrapper that were added to preserve order.
+ static void SplitTextChunks(const string16& translated_text,
+ TextChunks* text_chunks);
+
+ // Removes the HTML anchor tag surrounding |text| and returns the resulting
+ // string.
+ static string16 RemoveTag(const string16& text);
+
+ // Adds |text| to the string request in/out param |request|. If |request| is
+ // empty, then the source, target language as well as the secure parameters
+ // are also added.
+ static void AddTextToRequestString(std::string* request,
+ const std::string& text,
+ const std::string& source_language,
+ const std::string& target_language,
+ bool secure);
+
+ // The channel used to communicate with the renderer.
+ IPC::Message::Sender* message_sender_;
+
+ // Map used to retrieve the context of requests when the URLFetcher notifies
+ // that it got a response.
+ RendererRequestInfoMap renderer_request_infos_;
+
+ TranslationRequestMap pending_translation_requests_;
+ TranslationRequestMap pending_secure_translation_requests_;
DISALLOW_COPY_AND_ASSIGN(TranslationService);
};