diff options
author | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-18 22:21:18 +0000 |
---|---|---|
committer | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-18 22:21:18 +0000 |
commit | 493471842fef2fc2bee331a715058cc3c4839c95 (patch) | |
tree | 2d8da465f14c78ea53ea9a447393b4c06f754812 /chrome | |
parent | 908f687c4eed587612c2d179dcc58c54ee1d2cbf (diff) | |
download | chromium_src-493471842fef2fc2bee331a715058cc3c4839c95.zip chromium_src-493471842fef2fc2bee331a715058cc3c4839c95.tar.gz chromium_src-493471842fef2fc2bee331a715058cc3c4839c95.tar.bz2 |
This CL makes switching the target back to the original language
revert the translation.
It also simplifies the page translator logic. We are initializing the PageTranslator states when a new page is translated. Further translations reuse the text nodes already retrieved.
Also an unused method has been removed from RenderView.
BUG=36073
TEST=See bug. Thoroughly test the translation feature.
Review URL: http://codereview.chromium.org/647030
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39384 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/translate/translate_infobars_delegates.cc | 3 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 10 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 6 | ||||
-rw-r--r-- | chrome/renderer/translate/page_translator.cc | 79 | ||||
-rw-r--r-- | chrome/renderer/translate/page_translator.h | 3 |
5 files changed, 52 insertions, 49 deletions
diff --git a/chrome/browser/translate/translate_infobars_delegates.cc b/chrome/browser/translate/translate_infobars_delegates.cc index 9f76e85..ad0b8d5 100644 --- a/chrome/browser/translate/translate_infobars_delegates.cc +++ b/chrome/browser/translate/translate_infobars_delegates.cc @@ -97,8 +97,7 @@ void TranslateInfoBarDelegate::GetAvailableTargetLanguages( } void TranslateInfoBarDelegate::Translate() { - if (original_lang_index_ != target_lang_index_) - tab_contents_->TranslatePage(original_lang_code(), target_lang_code()); + tab_contents_->TranslatePage(original_lang_code(), target_lang_code()); } void TranslateInfoBarDelegate::TranslationDeclined() { diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 6c287d0..953c734 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -3249,16 +3249,6 @@ void RenderView::OnFind(int request_id, const string16& search_text, } } -std::string RenderView::DetectLanguage() { - if (!webview() || is_loading_) - return kUnknownLanguageCode; - - WebFrame* main_frame = webview()->mainFrame(); - std::wstring contents; - CaptureText(main_frame, &contents); - return DetermineTextLanguage(contents); -} - // static std::string RenderView::DetermineTextLanguage(const std::wstring& text) { std::string language = kUnknownLanguageCode; diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 60deea6..691ce8a 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -452,12 +452,6 @@ class RenderView : public RenderWidget, PageTranslator* page_translator() const { return page_translator_.get(); } - // Returns the ISO 639 language code of the current page (e.g. en, fr). - // If ISO 639-1 code is not available for the language, ISO 639-2 3-letter - // code will be returned (e.g. fil for Filipino and und for undtermined). For - // traditional and simplified Chinse, 'zh-TW' and 'zh-CN' will be returned. - std::string DetectLanguage(); - #if defined(OS_MACOSX) // Helper routines for GPU plugin support. Used by the // WebPluginDelegateProxy, which has a pointer to the RenderView. diff --git a/chrome/renderer/translate/page_translator.cc b/chrome/renderer/translate/page_translator.cc index e2c5692..22e24be 100644 --- a/chrome/renderer/translate/page_translator.cc +++ b/chrome/renderer/translate/page_translator.cc @@ -77,45 +77,42 @@ void PageTranslator::TranslatePage(int page_id, ResetPageStates(); page_id_ = page_id; secure_page_ = static_cast<GURL>(main_frame->top()->url()).SchemeIsSecure(); - } - if (original_language_.empty()) { + original_language_ = source_lang; - current_language_ = source_lang; - } + current_language_ = target_lang; - if (original_language_ != current_language_) { - // The page has already been translated. - if (target_lang == current_language_) { - NOTREACHED(); - return; + // Translate all frames contained within the main-frame. + for (WebKit::WebFrame* frame = main_frame; + frame; frame = frame->traverseNext(false)) { + TranslateFrame(frame); } - // Any pending translation is now useless. - ClearPendingTranslations(); - // No need to parse again the DOM, we have all the text nodes and their - // original text in |text_nodes_| and |text_chunks_|. - std::vector<NodeList*>::iterator text_nodes_iter = text_nodes_.begin(); - std::vector<TextChunks*>::iterator text_chunks_iter = text_chunks_.begin(); - for (;text_nodes_iter != text_nodes_.end(); - ++text_nodes_iter, ++text_chunks_iter) { - DCHECK(text_chunks_iter != text_chunks_.end()); - int work_id = - text_translator_->Translate(**text_chunks_iter, - source_lang, target_lang, - secure_page_, this); - pending_translations_[work_id] = *text_nodes_iter; - } - current_language_ = target_lang; return; } - // We are about to start the translation process. - current_language_ = target_lang; + // The page has already been translated, the text nodes are already available. + DCHECK(!text_nodes_.empty()); - // Translate all frames contained within the main-frame. - for (WebKit::WebFrame* frame = main_frame; - frame; frame = frame->traverseNext(false)) { - TranslateFrame(frame); + if (target_lang == original_language_) { + // Special case where we want to revert to the original language. + RevertTranslation(); + return; } + + // Any pending translation is now useless. + ClearPendingTranslations(); + // No need to parse again the DOM, we have all the text nodes and their + // original text in |text_nodes_| and |text_chunks_|. + std::vector<NodeList*>::iterator text_nodes_iter = text_nodes_.begin(); + std::vector<TextChunks*>::iterator text_chunks_iter = text_chunks_.begin(); + for (;text_nodes_iter != text_nodes_.end(); + ++text_nodes_iter, ++text_chunks_iter) { + DCHECK(text_chunks_iter != text_chunks_.end()); + int work_id = text_translator_->Translate(**text_chunks_iter, + source_lang, target_lang, + secure_page_, this); + pending_translations_[work_id] = *text_nodes_iter; + } + current_language_ = target_lang; } void PageTranslator::TranslateFrame(WebKit::WebFrame* web_frame) { @@ -301,3 +298,23 @@ void PageTranslator::ResetPageStates() { void PageTranslator::ClearPendingTranslations() { pending_translations_.clear(); } + +void PageTranslator::RevertTranslation() { + ClearPendingTranslations(); + + DCHECK(!text_nodes_.empty()); + + std::vector<NodeList*>::iterator text_nodes_iter = text_nodes_.begin(); + std::vector<TextChunks*>::iterator text_chunks_iter = text_chunks_.begin(); + for (;text_nodes_iter != text_nodes_.end(); + ++text_nodes_iter, ++text_chunks_iter) { + DCHECK(text_chunks_iter != text_chunks_.end()); + DCHECK((*text_nodes_iter)->size() == (*text_chunks_iter)->size()); + NodeList::iterator node_iter = (*text_nodes_iter)->begin(); + TextChunks::const_iterator text_iter = (*text_chunks_iter)->begin(); + for (; node_iter != (*text_nodes_iter)->end(); ++node_iter, ++text_iter) { + node_iter->setNodeValue(*text_iter); + } + } + current_language_ = original_language_; +} diff --git a/chrome/renderer/translate/page_translator.h b/chrome/renderer/translate/page_translator.h index 1d8bbc7..2ec5401 100644 --- a/chrome/renderer/translate/page_translator.h +++ b/chrome/renderer/translate/page_translator.h @@ -110,6 +110,9 @@ class PageTranslator : public TextTranslator::Delegate { // request received after this call will be ignored. void ClearPendingTranslations(); + // Reverts the text nodes in the page to their original text. + void RevertTranslation(); + // Our delegate (notified when a page is translated). PageTranslatorDelegate* delegate_; |