summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/translate/page_translator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/translate/page_translator.cc')
-rw-r--r--chrome/renderer/translate/page_translator.cc79
1 files changed, 48 insertions, 31 deletions
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_;
+}