Merge upstream. Use new l10n.

This commit is contained in:
Brendan Dahl 2012-05-15 10:33:01 -07:00
commit 080c3e79fc
15 changed files with 374 additions and 61 deletions

1
extensions/chrome/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
content/

View file

@ -1,2 +1,4 @@
content/
metadata.inc
chrome.manifest.inc
locale/

View file

@ -0,0 +1,3 @@
# Additional resources for pdf.js
# PDFJS_SUPPORTED_LOCALES

View file

@ -14,15 +14,26 @@ const PDF_CONTENT_TYPE = 'application/pdf';
const EXT_ID = 'uriloader@pdf.js';
const EXT_PREFIX = 'extensions.' + EXT_ID;
const MAX_DATABASE_LENGTH = 4096;
const FIREFOX_ID = '{ec8030f7-c20a-464f-9b0e-13a3a9e97384}';
const SEAMONKEY_ID = '{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}';
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/NetUtil.jsm');
Cu.import('resource://gre/modules/AddonManager.jsm');
let privateBrowsing = Cc['@mozilla.org/privatebrowsing;1']
.getService(Ci.nsIPrivateBrowsingService);
let inPrivateBrowswing = privateBrowsing.privateBrowsingEnabled;
let appInfo = Cc['@mozilla.org/xre/app-info;1']
.getService(Ci.nsIXULAppInfo);
let privateBrowsing, inPrivateBrowsing;
if (appInfo.ID === FIREFOX_ID) {
privateBrowsing = Cc['@mozilla.org/privatebrowsing;1']
.getService(Ci.nsIPrivateBrowsingService);
inPrivateBrowsing = privateBrowsing.privateBrowsingEnabled;
} else if (appInfo.ID === SEAMONKEY_ID) {
privateBrowsing = null;
inPrivateBrowsing = false;
}
function getBoolPref(pref, def) {
try {
@ -61,17 +72,37 @@ function getDOMWindow(aChannel) {
return win;
}
// Fake l10n until we get the real l10n sorted out.
var mozL10n = {
get: function(key, args, fallback) {
return fallback;
function getLocalizedStrings(path) {
var stringBundle = Cc['@mozilla.org/intl/stringbundle;1'].
getService(Ci.nsIStringBundleService).
createBundle('chrome://pdf.js/locale/' + path);
var map = {};
var enumerator = stringBundle.getSimpleEnumeration();
while (enumerator.hasMoreElements()) {
var string = enumerator.getNext().QueryInterface(Ci.nsIPropertyElement);
var key = string.key, property = 'textContent';
var i = key.lastIndexOf('.');
if (i >= 0) {
property = key.substring(i + 1);
key = key.substring(0, i);
}
if (!(key in map))
map[key] = {};
map[key][property] = string.value;
}
};
return map;
}
function getLocalizedString(strings, id) {
if (id in strings)
return strings[id]['textContent'];
return id;
}
// All the priviledged actions.
function ChromeActions() {
this.inPrivateBrowswing = privateBrowsing.privateBrowsingEnabled;
}
ChromeActions.prototype = {
download: function(data) {
let mimeService = Cc['@mozilla.org/mime;1'].getService(Ci.nsIMIMEService);
@ -107,7 +138,7 @@ ChromeActions.prototype = {
channel.asyncOpen(listener, null);
},
setDatabase: function(data) {
if (this.inPrivateBrowswing)
if (inPrivateBrowsing)
return;
// Protect against something sending tons of data to setDatabase.
if (data.length > MAX_DATABASE_LENGTH)
@ -115,31 +146,43 @@ ChromeActions.prototype = {
setStringPref(EXT_PREFIX + '.database', data);
},
getDatabase: function() {
if (this.inPrivateBrowswing)
if (inPrivateBrowsing)
return '{}';
return getStringPref(EXT_PREFIX + '.database', '{}');
},
getLocale: function() {
return getStringPref('general.useragent.locale', 'en-US');
},
getStrings: function(data) {
try {
// Lazy initialization of localizedStrings
if (!('localizedStrings' in this))
this.localizedStrings = getLocalizedStrings('viewer.properties');
var result = this.localizedStrings[data];
return JSON.stringify(result || null);
} catch (e) {
log('Unable to retrive localized strings: ' + e);
return 'null';
}
},
pdfBugEnabled: function() {
return getBoolPref(EXT_PREFIX + '.pdfBugEnabled', false);
},
fallback: function(url) {
var strings = getLocalizedStrings('chrome.properties');
var self = this;
var message = mozL10n.get('unsupported_feature', null,
'An unsupported feature was detected in this PDF document.');
var message = getLocalizedString(strings, 'unsupported_feature');
var win = Services.wm.getMostRecentWindow('navigator:browser');
var notificationBox = win.gBrowser.getNotificationBox();
var buttons = [{
label: mozL10n.get('download_document', null, 'Download Document'),
label: getLocalizedString(strings, 'download_document'),
accessKey: null,
callback: function() {
self.download(url);
}
}, {
label: mozL10n.get('disable_viewer', null,
'Disable Mozilla PDF Viewer'),
label: getLocalizedString(strings, 'disable_viewer'),
accessKey: null,
callback: function() {
AddonManager.getAddonByID(EXT_ID, function(aAddon) {

View file

@ -8,11 +8,22 @@
<!-- PDFJS_LOCALIZED_METADATA -->
<em:name>PDF Viewer</em:name>
<em:version>PDFJSSCRIPT_VERSION</em:version>
<!-- Firefox -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>6.0</em:minVersion>
<em:maxVersion>14.0a1</em:maxVersion>
<em:maxVersion>15.0a1</em:maxVersion>
</Description>
</em:targetApplication>
<!-- SeaMonkey -->
<em:targetApplication>
<Description>
<em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
<em:minVersion>2.1.*</em:minVersion>
<em:maxVersion>2.12a1</em:maxVersion>
</Description>
</em:targetApplication>
<em:bootstrap>true</em:bootstrap>

View file

@ -0,0 +1,114 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
'use strict';
// Small subset of the webL10n API by Fabien Cazenave for pdf.js extension.
(function(window) {
var gLanguage = '';
// fetch an l10n objects
function getL10nData(key) {
var response = FirefoxCom.request('getStrings', key);
var data = JSON.parse(response);
if (!data)
console.warn('[l10n] #' + key + ' missing for [' + gLanguage + ']');
return data;
}
// replace {{arguments}} with their values
function substArguments(text, args) {
if (!args)
return text;
return text.replace(/\{\{\s*(\w+)\s*\}\}/g, function(all, name) {
return name in args ? args[name] : '{{' + name + '}}';
});
}
// translate a string
function translateString(key, args, fallback) {
var data = getL10nData(key);
if (!data && fallback)
data = {textContent: fallback};
if (!data)
return '{{' + key + '}}';
return substArguments(data.textContent, args);
}
// translate an HTML element
function translateElement(element) {
if (!element || !element.dataset)
return;
// get the related l10n object
var data = getL10nData(element.dataset.l10nId);
if (!data)
return;
// get arguments (if any)
// TODO: more flexible parser?
var args;
if (element.dataset.l10nArgs) try {
args = JSON.parse(element.dataset.l10nArgs);
} catch (e) {
console.warn('[l10n] could not parse arguments for #' + key + '');
}
// translate element
// TODO: security check?
for (var k in data)
element[k] = substArguments(data[k], args);
}
// translate an HTML subtree
function translateFragment(element) {
element = element || document.querySelector('html');
// check all translatable children (= w/ a `data-l10n-id' attribute)
var children = element.querySelectorAll('*[data-l10n-id]');
var elementCount = children.length;
for (var i = 0; i < elementCount; i++)
translateElement(children[i]);
// translate element itself if necessary
if (element.dataset.l10nId)
translateElement(element);
}
window.addEventListener('DOMContentLoaded', function() {
gLanguage = FirefoxCom.request('getLocale', null);
translateFragment();
// fire a 'localized' DOM event
var evtObject = document.createEvent('Event');
evtObject.initEvent('localized', false, false);
evtObject.language = gLanguage;
window.dispatchEvent(evtObject);
});
// Public API
document.mozL10n = {
// get a localized string
get: translateString,
// get|set the document language and direction
get language() {
return {
// get|set the document language (ISO-639-1)
get code() { return gLanguage; },
// get the direction (ltr|rtl) of the current language
get direction() {
// http://www.w3.org/International/questions/qa-scripts
// Arabic, Hebrew, Farsi, Pashto, Urdu
var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
return (rtlList.indexOf(gLanguage) >= 0) ? 'rtl' : 'ltr';
}
};
}
};
})(this);