summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-18 22:21:18 +0000
committerjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-18 22:21:18 +0000
commit493471842fef2fc2bee331a715058cc3c4839c95 (patch)
tree2d8da465f14c78ea53ea9a447393b4c06f754812 /chrome
parent908f687c4eed587612c2d179dcc58c54ee1d2cbf (diff)
downloadchromium_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.cc3
-rw-r--r--chrome/renderer/render_view.cc10
-rw-r--r--chrome/renderer/render_view.h6
-rw-r--r--chrome/renderer/translate/page_translator.cc79
-rw-r--r--chrome/renderer/translate/page_translator.h3
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_;