| OLD | NEW | 
|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/renderer/translate_helper.h" | 5 #include "chrome/renderer/translate_helper.h" | 
| 6 | 6 | 
| 7 #include "base/bind.h" | 7 #include "base/bind.h" | 
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" | 
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" | 
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 21 #include "v8/include/v8.h" | 21 #include "v8/include/v8.h" | 
| 22 #include "webkit/glue/dom_operations.h" | 22 #include "webkit/glue/dom_operations.h" | 
| 23 | 23 | 
| 24 using WebKit::WebDocument; | 24 using WebKit::WebDocument; | 
| 25 using WebKit::WebElement; | 25 using WebKit::WebElement; | 
| 26 using WebKit::WebFrame; | 26 using WebKit::WebFrame; | 
| 27 using WebKit::WebScriptSource; | 27 using WebKit::WebScriptSource; | 
| 28 using WebKit::WebString; | 28 using WebKit::WebString; | 
| 29 using WebKit::WebView; | 29 using WebKit::WebView; | 
| 30 | 30 | 
| 31 // The delay in millliseconds that we'll wait before checking to see if the | 31 // The delay in milliseconds that we'll wait before checking to see if the | 
| 32 // translate library injected in the page is ready. | 32 // translate library injected in the page is ready. | 
| 33 static const int kTranslateInitCheckDelayMs = 150; | 33 static const int kTranslateInitCheckDelayMs = 150; | 
| 34 | 34 | 
| 35 // The maximum number of times we'll check to see if the translate library | 35 // The maximum number of times we'll check to see if the translate library | 
| 36 // injected in the page is ready. | 36 // injected in the page is ready. | 
| 37 static const int kMaxTranslateInitCheckAttempts = 5; | 37 static const int kMaxTranslateInitCheckAttempts = 5; | 
| 38 | 38 | 
| 39 // The delay we wait in milliseconds before checking whether the translation has | 39 // The delay we wait in milliseconds before checking whether the translation has | 
| 40 // finished. | 40 // finished. | 
| 41 static const int kTranslateStatusCheckDelayMs = 400; | 41 static const int kTranslateStatusCheckDelayMs = 400; | 
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 332     translation_pending_ = false; | 332     translation_pending_ = false; | 
| 333 | 333 | 
| 334     // Notify the browser we are done. | 334     // Notify the browser we are done. | 
| 335     render_view()->Send(new ChromeViewHostMsg_PageTranslated( | 335     render_view()->Send(new ChromeViewHostMsg_PageTranslated( | 
| 336         render_view()->GetRoutingId(), render_view()->GetPageId(), | 336         render_view()->GetRoutingId(), render_view()->GetPageId(), | 
| 337         actual_source_lang, target_lang_, TranslateErrors::NONE)); | 337         actual_source_lang, target_lang_, TranslateErrors::NONE)); | 
| 338     return; | 338     return; | 
| 339   } | 339   } | 
| 340 | 340 | 
| 341   // The translation is still pending, check again later. | 341   // The translation is still pending, check again later. | 
| 342   MessageLoop::current()->PostDelayedTask(FROM_HERE, | 342   MessageLoop::current()->PostDelayedTask( | 
|  | 343       FROM_HERE, | 
| 343       base::Bind(&TranslateHelper::CheckTranslateStatus, | 344       base::Bind(&TranslateHelper::CheckTranslateStatus, | 
| 344                  weak_method_factory_.GetWeakPtr()), | 345                  weak_method_factory_.GetWeakPtr()), | 
| 345       DontDelayTasks() ? 0 : kTranslateStatusCheckDelayMs); | 346       base::TimeDelta::FromMilliseconds( | 
|  | 347           DontDelayTasks() ? 0 : kTranslateStatusCheckDelayMs)); | 
| 346 } | 348 } | 
| 347 | 349 | 
| 348 bool TranslateHelper::ExecuteScript(const std::string& script) { | 350 bool TranslateHelper::ExecuteScript(const std::string& script) { | 
| 349   WebFrame* main_frame = GetMainFrame(); | 351   WebFrame* main_frame = GetMainFrame(); | 
| 350   if (!main_frame) | 352   if (!main_frame) | 
| 351     return false; | 353     return false; | 
| 352   main_frame->executeScript(WebScriptSource(ASCIIToUTF16(script))); | 354   main_frame->executeScript(WebScriptSource(ASCIIToUTF16(script))); | 
| 353   return true; | 355   return true; | 
| 354 } | 356 } | 
| 355 | 357 | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 394   if (page_id_ != render_view()->GetPageId() || !render_view()->GetWebView()) | 396   if (page_id_ != render_view()->GetPageId() || !render_view()->GetWebView()) | 
| 395     return; | 397     return; | 
| 396 | 398 | 
| 397   if (!IsTranslateLibReady()) { | 399   if (!IsTranslateLibReady()) { | 
| 398     // The library is not ready, try again later, unless we have tried several | 400     // The library is not ready, try again later, unless we have tried several | 
| 399     // times unsucessfully already. | 401     // times unsucessfully already. | 
| 400     if (++count >= kMaxTranslateInitCheckAttempts) { | 402     if (++count >= kMaxTranslateInitCheckAttempts) { | 
| 401       NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); | 403       NotifyBrowserTranslationFailed(TranslateErrors::INITIALIZATION_ERROR); | 
| 402       return; | 404       return; | 
| 403     } | 405     } | 
| 404     MessageLoop::current()->PostDelayedTask(FROM_HERE, | 406     MessageLoop::current()->PostDelayedTask( | 
|  | 407         FROM_HERE, | 
| 405         base::Bind(&TranslateHelper::TranslatePageImpl, | 408         base::Bind(&TranslateHelper::TranslatePageImpl, | 
| 406                    weak_method_factory_.GetWeakPtr(), count), | 409                    weak_method_factory_.GetWeakPtr(), count), | 
| 407         DontDelayTasks() ? 0 : count * kTranslateInitCheckDelayMs); | 410         base::TimeDelta::FromMilliseconds( | 
|  | 411             DontDelayTasks() ? 0 : count * kTranslateInitCheckDelayMs)); | 
| 408     return; | 412     return; | 
| 409   } | 413   } | 
| 410 | 414 | 
| 411   if (!StartTranslation()) { | 415   if (!StartTranslation()) { | 
| 412     NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); | 416     NotifyBrowserTranslationFailed(TranslateErrors::TRANSLATION_ERROR); | 
| 413     return; | 417     return; | 
| 414   } | 418   } | 
| 415   // Check the status of the translation. | 419   // Check the status of the translation. | 
| 416   MessageLoop::current()->PostDelayedTask(FROM_HERE, | 420   MessageLoop::current()->PostDelayedTask( | 
|  | 421       FROM_HERE, | 
| 417       base::Bind(&TranslateHelper::CheckTranslateStatus, | 422       base::Bind(&TranslateHelper::CheckTranslateStatus, | 
| 418                  weak_method_factory_.GetWeakPtr()), | 423                  weak_method_factory_.GetWeakPtr()), | 
| 419       DontDelayTasks() ? 0 : kTranslateStatusCheckDelayMs); | 424       base::TimeDelta::FromMilliseconds( | 
|  | 425           DontDelayTasks() ? 0 : kTranslateStatusCheckDelayMs)); | 
| 420 } | 426 } | 
| 421 | 427 | 
| 422 void TranslateHelper::NotifyBrowserTranslationFailed( | 428 void TranslateHelper::NotifyBrowserTranslationFailed( | 
| 423     TranslateErrors::Type error) { | 429     TranslateErrors::Type error) { | 
| 424   translation_pending_ = false; | 430   translation_pending_ = false; | 
| 425   // Notify the browser there was an error. | 431   // Notify the browser there was an error. | 
| 426   render_view()->Send(new ChromeViewHostMsg_PageTranslated( | 432   render_view()->Send(new ChromeViewHostMsg_PageTranslated( | 
| 427       render_view()->GetRoutingId(), page_id_, source_lang_, | 433       render_view()->GetRoutingId(), page_id_, source_lang_, | 
| 428       target_lang_, error)); | 434       target_lang_, error)); | 
| 429 } | 435 } | 
| 430 | 436 | 
| 431 WebFrame* TranslateHelper::GetMainFrame() { | 437 WebFrame* TranslateHelper::GetMainFrame() { | 
| 432   WebView* web_view = render_view()->GetWebView(); | 438   WebView* web_view = render_view()->GetWebView(); | 
| 433   if (!web_view) { | 439   if (!web_view) { | 
| 434     // When the WebView is going away, the render view should have called | 440     // When the WebView is going away, the render view should have called | 
| 435     // CancelPendingTranslation() which should have stopped any pending work, so | 441     // CancelPendingTranslation() which should have stopped any pending work, so | 
| 436     // that case should not happen. | 442     // that case should not happen. | 
| 437     NOTREACHED(); | 443     NOTREACHED(); | 
| 438     return NULL; | 444     return NULL; | 
| 439   } | 445   } | 
| 440   return web_view->mainFrame(); | 446   return web_view->mainFrame(); | 
| 441 } | 447 } | 
| OLD | NEW | 
|---|