diff options
author | toyoshim@chromium.org <toyoshim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 13:40:29 +0000 |
---|---|---|
committer | toyoshim@chromium.org <toyoshim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 13:40:29 +0000 |
commit | 48e4ce36faebbaf6f19c18f1d73eea024b31d038 (patch) | |
tree | adf83cdcb5a855efd3fe0b96e70fde3bd7751d7c | |
parent | 58983d47406302f93e94c4b67347ac530824066d (diff) | |
download | chromium_src-48e4ce36faebbaf6f19c18f1d73eea024b31d038.zip chromium_src-48e4ce36faebbaf6f19c18f1d73eea024b31d038.tar.gz chromium_src-48e4ce36faebbaf6f19c18f1d73eea024b31d038.tar.bz2 |
Translate: use server providing hooks to use custom loaders
Remove code to hijack resource loading, and use server providing hooks
to use callbacks to load resources.
BUG=271956
Review URL: https://chromiumcodereview.appspot.com/22783002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@218009 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/resources/translate.js | 79 | ||||
-rw-r--r-- | chrome/browser/translate/translate_browsertest.cc | 4 | ||||
-rw-r--r-- | chrome/browser/translate/translate_script.cc | 26 | ||||
-rw-r--r-- | chrome/test/data/translate/pseudo_main.js | 5 |
4 files changed, 58 insertions, 56 deletions
diff --git a/chrome/browser/resources/translate.js b/chrome/browser/resources/translate.js index 66584067..eba4d80 100644 --- a/chrome/browser/resources/translate.js +++ b/chrome/browser/resources/translate.js @@ -78,55 +78,6 @@ cr.googleTranslate = (function() { */ var endTime = 0.0; - // Create another call point for appendChild. - var head = document.head; - head._appendChild = head.appendChild; - - // TODO(toyoshim): This is temporary solution and will be removed once server - // side fixed to use https always. See also, http://crbug.com/164584 . - function forceToHttps(url) { - if (url.indexOf('http:') == 0) - return url.replace('http', 'https'); - - return url; - } - - /** - * Inserts CSS element into the main world. - * @param {Object} child Link element for CSS. - */ - function insertCSS(child) { - child.href = forceToHttps(child.href); - head._appendChild(child); - } - - /** - * Inserts JavaScript into the isolated world. - * @param {string} src JavaScript URL. - */ - function insertJS(src) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', forceToHttps(src), true); - xhr.onreadystatechange = function() { - if (this.readyState != this.DONE || this.status != 200) - return; - eval(this.responseText); - } - xhr.send(); - } - - /** - * Alternate implementation of appendChild. In the isolated world, appendChild - * for the first head element is replaced with this function in order to make - * CSS link tag and script tag injection work fine like the main world. - */ - head.appendChild = function(child) { - if (child.type == 'text/css') - insertCSS(child); - else - insertJS(child.src); - }; - function checkLibReady() { if (lib.isAvailable()) { readyTime = performance.now(); @@ -276,6 +227,36 @@ cr.googleTranslate = (function() { // The TranslateService is not available immediately as it needs to start // Flash. Let's wait until it is ready. checkLibReady(); + }, + + /** + * Entry point called by the Translate Element when it want to load an + * external CSS resource into the page. + * @param {string} url URL of an external CSS resource to load. + */ + onLoadCSS: function(url) { + var element = document.createElement('link'); + element.type = 'text/css'; + element.rel = 'stylesheet'; + element.charset = 'UTF-8'; + element.href = url; + document.head.appendChild(element); + }, + + /** + * Entry point called by the Translate Element when it want to load and run + * an external JavaScript on the page. + * @param {string} url URL of an external JavaScript to load. + */ + onLoadJavascript: function(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function() { + if (this.readyState != this.DONE || this.status != 200) + return; + eval(this.responseText); + } + xhr.send(); } }; })(); diff --git a/chrome/browser/translate/translate_browsertest.cc b/chrome/browser/translate/translate_browsertest.cc index 35581cd..61b13e6 100644 --- a/chrome/browser/translate/translate_browsertest.cc +++ b/chrome/browser/translate/translate_browsertest.cc @@ -162,9 +162,7 @@ IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, TranslateInIsolatedWorld) { element_js += "google = { 'translate' : { 'TranslateService' : function() { return {\n" " isAvailable: function() {\n" - " var script = document.createElement('script');\n" - " script.src = main_script_url;\n" - " document.getElementsByTagName('head')[0].appendChild(script);\n" + " cr.googleTranslate.onLoadJavascript(main_script_url);\n" " return true;\n" " },\n" " translatePage: function(sl, tl, cb) {\n" diff --git a/chrome/browser/translate/translate_script.cc b/chrome/browser/translate/translate_script.cc index d2af738..8e638b4 100644 --- a/chrome/browser/translate/translate_script.cc +++ b/chrome/browser/translate/translate_script.cc @@ -33,6 +33,20 @@ const char kCallbackQueryName[] = "cb"; const char kCallbackQueryValue[] = "cr.googleTranslate.onTranslateElementLoad"; +// Used in kTranslateScriptURL to specify using always ssl to load resources. +const char kAlwaysUseSslQueryName[] = "aus"; +const char kAlwaysUseSslQueryValue[] = "true"; + +// Used in kTranslateScriptURL to specify a CSS loader callback function name. +const char kCssLoaderCallbackQueryName[] = "clc"; +const char kCssLoaderCallbackQueryValue[] = "cr.googleTranslate.onLoadCSS"; + +// Used in kTranslateScriptURL to specify a JavaScript loader callback function +// name. +const char kJavascriptLoaderCallbackQueryName[] = "jlc"; +const char kJavascriptLoaderCallbackQueryValue[] = + "cr.googleTranslate.onLoadJavascript"; + } // namespace TranslateScript::TranslateScript() @@ -76,6 +90,18 @@ void TranslateScript::Request(const Callback& callback) { translate_script_url, kCallbackQueryName, kCallbackQueryValue); + translate_script_url = net::AppendQueryParameter( + translate_script_url, + kAlwaysUseSslQueryName, + kAlwaysUseSslQueryValue); + translate_script_url = net::AppendQueryParameter( + translate_script_url, + kCssLoaderCallbackQueryName, + kCssLoaderCallbackQueryValue); + translate_script_url = net::AppendQueryParameter( + translate_script_url, + kJavascriptLoaderCallbackQueryName, + kJavascriptLoaderCallbackQueryValue); translate_script_url = TranslateURLUtil::AddHostLocaleToUrl(translate_script_url); diff --git a/chrome/test/data/translate/pseudo_main.js b/chrome/test/data/translate/pseudo_main.js index 7da6442..cab4309 100644 --- a/chrome/test/data/translate/pseudo_main.js +++ b/chrome/test/data/translate/pseudo_main.js @@ -15,7 +15,4 @@ if (typeof world != 'undefined') { } div_log('The first script pseudo_main.js is loaded'); div_log('Loading the second script pseudo_element_main.js ...'); -var head = document.getElementsByTagName('head')[0]; -var script = document.createElement('script'); -script.src = element_main_script_url; -head.appendChild(script); +cr.googleTranslate.onLoadJavascript(element_main_script_url); |