1// Copyright 2010 Google Inc. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15/** 16 * @fileoverview Code to execute before Closure's base.js. 17 * 18 * @author dmazzoni@google.com (Dominic Mazzoni) 19 */ 20 21/** 22 * Tell Closure to load JavaScript code from the extension root directory. 23 * @type {boolean} 24 */ 25window.CLOSURE_BASE_PATH = chrome.extension.getURL('/closure/'); 26 27/** 28 * Tell Closure not to load deps.js; it's included by manifest.json already. 29 * @type {boolean} 30 */ 31window.CLOSURE_NO_DEPS = true; 32 33/** 34 * Array of urls that should be included next, in order. 35 * @type {Array} 36 * @private 37 */ 38window.queue_ = []; 39 40/** 41 * Custom function for importing ChromeVox scripts. 42 * @param {string} src The JS file to import. 43 * @return {boolean} Whether the script was imported. 44 */ 45window.CLOSURE_IMPORT_SCRIPT = function(src) { 46 // Only run our version of the import script 47 // when trying to inject ChromeVox scripts. 48 if (src.indexOf('chrome-extension://') == 0) { 49 if (!goog.inHtmlDocument_() || 50 goog.dependencies_.written[src]) { 51 return false; 52 } 53 goog.dependencies_.written[src] = true; 54 function loadNextScript() { 55 if (goog.global.queue_.length == 0) 56 return; 57 58 var src = goog.global.queue_[0]; 59 60 if (window.CLOSURE_USE_EXT_MESSAGES) { 61 var relativeSrc = src.substr(src.indexOf('closure/..') + 11); 62 chrome.extension.sendMessage( 63 {'srcFile': relativeSrc}, 64 function(response) { 65 try { 66 eval(response['code']); 67 } catch (e) { 68 console.error('Script error: ' + e + ' in ' + src); 69 } 70 goog.global.queue_ = goog.global.queue_.slice(1); 71 loadNextScript(); 72 }); 73 return; 74 } 75 window.console.log('Using XHR'); 76 77 // Load the script by fetching its source and running 'eval' on it 78 // directly, with a magic comment that makes Chrome treat it like it 79 // loaded normally. Wait until it's fetched before loading the 80 // next script. 81 var xhr = new XMLHttpRequest(); 82 var url = src + '?' + new Date().getTime(); 83 xhr.onreadystatechange = function() { 84 if (xhr.readyState == 4) { 85 var scriptText = xhr.responseText; 86 // Add a magic comment to the bottom of the file so that 87 // Chrome knows the name of the script in the JavaScript debugger. 88 scriptText += '\n//# sourceURL=' + src + '\n'; 89 eval(scriptText); 90 goog.global.queue_ = goog.global.queue_.slice(1); 91 loadNextScript(); 92 } 93 }; 94 xhr.open('GET', url, false); 95 xhr.send(null); 96 } 97 goog.global.queue_.push(src); 98 if (goog.global.queue_.length == 1) { 99 loadNextScript(); 100 } 101 return true; 102 } else { 103 return goog.writeScriptTag_(src); 104 } 105}; 106