diff --git a/Makefile b/Makefile deleted file mode 100644 index d4833a561..000000000 --- a/Makefile +++ /dev/null @@ -1,342 +0,0 @@ -REPO = git@github.com:mozilla/pdf.js.git -BUILD_DIR := build -BUILD_TARGET := $(BUILD_DIR)/pdf.js -DEFAULT_BROWSERS := resources/browser_manifests/browser_manifest.json -DEFAULT_TESTS := test_manifest.json -DEFAULT_PYTHON := python2.7 - -EXTENSION_SRC := ./extensions/ -EXTENSION_BASE_VERSION := f0f0418a9c6637981fe1182b9212c2d592774c7d -FIREFOX_EXTENSION_NAME := pdf.js.xpi -FIREFOX_AMO_EXTENSION_NAME := pdf.js.amo.xpi -CHROME_EXTENSION_NAME := pdf.js.crx - -all: bundle - -# Let folks define custom rules for their clones. --include local.mk - -# JS files needed for pdf.js. -PDF_JS_FILES = \ - core.js \ - util.js \ - api.js \ - canvas.js \ - obj.js \ - function.js \ - charsets.js \ - cidmaps.js \ - colorspace.js \ - crypto.js \ - evaluator.js \ - fonts.js \ - glyphlist.js \ - image.js \ - metrics.js \ - parser.js \ - pattern.js \ - stream.js \ - worker.js \ - ../external/jpgjs/jpg.js \ - jpx.js \ - bidi.js \ - metadata.js \ - $(NULL) - -# make server -# -# This target starts a local web server at localhost:8888. This can be -# used for testing all browsers. -server: - @cd test; $(DEFAULT_PYTHON) test.py --port=8888; - -# make test -# -# This target runs all the tests excluding the unit-test. This can be used for -# testing all browsers. -test: shell-test browser-test - -# -# Create production output (pdf.js, and corresponding changes to web files) -# -production: | bundle - @echo "Preparing web/viewer-production.html"; \ - cd web; \ - sed '/PDFJSSCRIPT_REMOVE_CORE/d' viewer.html > viewer-1.tmp; \ - sed '/PDFJSSCRIPT_INCLUDE_BUILD/ r viewer-snippet.html' viewer-1.tmp > viewer-production.html; \ - rm -f *.tmp; \ - cd .. - -# -# Bundle pdf.js -# -bundle: | $(BUILD_DIR) - @echo "Bundling source files into $(BUILD_TARGET)" - @cd src; \ - cat $(PDF_JS_FILES) > all_files.tmp; \ - sed '/PDFJSSCRIPT_INCLUDE_ALL/ r all_files.tmp' pdf.js > ../$(BUILD_TARGET); \ - cp ../$(BUILD_TARGET) ../$(BUILD_TARGET).bak; \ - sed "s/PDFJSSCRIPT_BUNDLE_VER/`git log --format="%h" -n 1`/" ../$(BUILD_TARGET).bak > ../$(BUILD_TARGET); \ - rm -f ../$(BUILD_TARGET).bak; \ - rm -f *.tmp; \ - cd .. - -# make unit-test -# -# This target runs in-browser unit tests with js-test-driver and jasmine unit -# test framework. -unit-test: - @cd test/unit/ ; make ; - -# make browser-test -# -# This target runs in-browser tests using two primary arguments: a -# test manifest file, and a browser manifest file. Both are simple -# JSON formats, and examples can be found in the test/ directory. The -# target will inspect the environment for the PDF_TESTS and -# PDF_BROWSERS variables, and use those if found. Otherwise, the -# defaults at the top of this file are used. -ifeq ($(PDF_TESTS),) -PDF_TESTS := $(DEFAULT_TESTS) -endif -ifeq ($(PDF_BROWSERS),) -PDF_BROWSERS := $(DEFAULT_BROWSERS) -endif - -browser-test: - @if [ ! -f "test/$(PDF_BROWSERS)" ]; then \ - echo "Browser manifest file $(PDF_BROWSERS) does not exist."; \ - echo "Try copying one of the examples" \ - "in test/resources/browser_manifests/"; \ - exit 1; \ - fi; - - cd test; \ - $(DEFAULT_PYTHON) test.py --reftest \ - --browserManifestFile=$(PDF_BROWSERS) \ - --manifestFile=$(PDF_TESTS) - -# # make shell-test -# # -# # This target runs all of the tests that can be run in a JS shell. -# # The shell used is taken from the JS_SHELL environment variable. If -# # that variable is not defined, the script will attempt to use the copy -# # of Rhino that comes with the Closure compiler used for producing the -# # website. -# SHELL_TARGET = $(NULL) -# ifeq ($(JS_SHELL),) -# JS_SHELL := "java -cp $(BUILD_DIR)/compiler.jar" -# JS_SHELL += "com.google.javascript.jscomp.mozilla.rhino.tools.shell.Main" -# SHELL_TARGET = compiler -# endif -# -# shell-test: shell-msg $(SHELL_TARGET) font-test -# shell-msg: -# ifeq ($(SHELL_TARGET), compiler) -# @echo "No JS_SHELL env variable present." -# @echo "The default is to find a copy of Rhino and try that." -# endif -# @echo "JS shell command is: $(JS_SHELL)" -# -# font-test: -# @echo "font test stub." - -# make lint -# -# This target runs the Closure Linter on most of our JS files. -# To install gjslint, see: -# -# -SRC_DIRS := src utils web test examples/helloworld extensions/firefox \ - extensions/firefox/components extensions/chrome test/unit -GJSLINT_FILES = $(foreach DIR, $(SRC_DIRS), $(wildcard $(DIR)/*.js)) -lint: - gjslint --nojsdoc $(GJSLINT_FILES) - -# make web -# -# This target produces the website for the project, by checking out -# the gh-pages branch underneath the build directory, and then move -# the various viewer files into place. -# -# TODO: Use the Closure compiler to optimize the pdf.js files. -# -GH_PAGES = $(BUILD_DIR)/gh-pages -web: | production extension compiler pages-repo - @cp $(BUILD_TARGET) $(GH_PAGES)/$(BUILD_TARGET) - @cp -R web/* $(GH_PAGES)/web - @cp web/images/* $(GH_PAGES)/web/images - @cp $(FIREFOX_BUILD_DIR)/$(FIREFOX_EXTENSION_NAME) \ - $(FIREFOX_BUILD_DIR)/$(FIREFOX_AMO_EXTENSION_NAME) \ - $(FIREFOX_BUILD_DIR)/update.rdf \ - $(GH_PAGES)/$(EXTENSION_SRC)/firefox/ - @cp $(GH_PAGES)/web/index.html.template $(GH_PAGES)/index.html; - @mv -f $(GH_PAGES)/web/viewer-production.html $(GH_PAGES)/web/viewer.html; - @cd $(GH_PAGES); git add -A; - @echo - @echo "Website built in $(GH_PAGES)." - @echo "Don't forget to cd into $(GH_PAGES)/ and issue 'git commit' to push changes." - -# make pages-repo -# -# This target clones the gh-pages repo into the build directory. It -# deletes the current contents of the repo, since we overwrite -# everything with data from the master repo. The 'make web' target -# then uses 'git add -A' to track additions, modifications, moves, -# and deletions. -pages-repo: | $(BUILD_DIR) - @if [ ! -d "$(GH_PAGES)" ]; then \ - git clone --depth 1 -b gh-pages $(REPO) $(GH_PAGES); \ - rm -rf $(GH_PAGES)/*; \ - fi; - @mkdir -p $(GH_PAGES)/web; - @mkdir -p $(GH_PAGES)/web/images; - @mkdir -p $(GH_PAGES)/build; - @mkdir -p $(GH_PAGES)/$(EXTENSION_SRC)/firefox; - -# # make compiler -# # -# # This target downloads the Closure compiler, and places it in the -# # build directory. This target is also useful when the user doesn't -# # have a JS shell available--we can have them use the Rhino shell that -# # comes with Closure. -# COMPILER_URL = http://closure-compiler.googlecode.com/files/compiler-latest.zip -# -# compiler: $(BUILD_DIR)/compiler.zip -# $(BUILD_DIR)/compiler.zip: | $(BUILD_DIR) -# curl $(COMPILER_URL) > $(BUILD_DIR)/compiler.zip; -# cd $(BUILD_DIR); unzip compiler.zip compiler.jar; - -# make extension -# -# This target produce a restartless firefox extension containing a -# copy of the pdf.js source. -CONTENT_DIR := content -BUILD_NUMBER := `git log --format=oneline $(EXTENSION_BASE_VERSION).. | wc -l | awk '{print $$1}'` -PDFJSSCRIPT_VERSION := 0.3.$(BUILD_NUMBER) -EXTENSION_WEB_FILES = \ - web/images \ - web/viewer.css \ - web/viewer.js \ - web/viewer.html \ - web/viewer-production.html \ - web/debugger.js \ - $(NULL) - -FIREFOX_BUILD_DIR := $(BUILD_DIR)/firefox -FIREFOX_BUILD_CONTENT := $(FIREFOX_BUILD_DIR)/$(CONTENT_DIR)/ -FIREFOX_CONTENT_DIR := $(EXTENSION_SRC)/firefox/$(CONTENT_DIR)/ -FIREFOX_EXTENSION_FILES_TO_COPY = \ - *.js \ - *.rdf \ - *.png \ - install.rdf.in \ - README.mozilla \ - components \ - ../../LICENSE \ - $(NULL) -FIREFOX_EXTENSION_FILES = \ - bootstrap.js \ - install.rdf \ - icon.png \ - icon64.png \ - components \ - content \ - LICENSE \ - $(NULL) -FIREFOX_MC_EXTENSION_FILES = \ - bootstrap.js \ - icon.png \ - icon64.png \ - components \ - content \ - LICENSE \ - $(NULL) - -CHROME_BUILD_DIR := $(BUILD_DIR)/chrome -CHROME_CONTENT_DIR := $(EXTENSION_SRC)/chrome/$(CONTENT_DIR)/ -CHROME_BUILD_CONTENT := $(CHROME_BUILD_DIR)/$(CONTENT_DIR)/ -CHROME_EXTENSION_FILES = \ - extensions/chrome/*.json \ - extensions/chrome/*.html \ - $(NULL) -extension: | production - # Clear out everything in the firefox extension build directory - @rm -Rf $(FIREFOX_BUILD_DIR) - @mkdir -p $(FIREFOX_BUILD_CONTENT) - @mkdir -p $(FIREFOX_BUILD_CONTENT)/$(BUILD_DIR) - @mkdir -p $(FIREFOX_BUILD_CONTENT)/web - @cd extensions/firefox; cp -r $(FIREFOX_EXTENSION_FILES_TO_COPY) ../../$(FIREFOX_BUILD_DIR)/ - # Copy a standalone version of pdf.js inside the content directory - @cp $(BUILD_TARGET) $(FIREFOX_BUILD_CONTENT)/$(BUILD_DIR)/ - @cp -r $(EXTENSION_WEB_FILES) $(FIREFOX_BUILD_CONTENT)/web/ - @rm $(FIREFOX_BUILD_CONTENT)/web/viewer-production.html - # Copy over the firefox extension snippet so we can inline pdf.js in it - @cp web/viewer-snippet-firefox-extension.html $(FIREFOX_BUILD_CONTENT)/web/ - # Modify the viewer so it does all the extension only stuff. - @cd $(FIREFOX_BUILD_CONTENT)/web; \ - cp viewer-snippet-firefox-extension.html viewer-snippet-firefox-extension.html.bak; \ - sed '/PDFJSSCRIPT_INCLUDE_BUNDLE/ r ../build/pdf.js' viewer-snippet-firefox-extension.html.bak > viewer-snippet-firefox-extension.html; \ - cp viewer.html viewer.html.bak; \ - sed '/PDFJSSCRIPT_REMOVE_CORE/d' viewer.html.bak > viewer.html; \ - cp viewer.html viewer.html.bak; \ - sed '/PDFJSSCRIPT_REMOVE_FIREFOX_EXTENSION/d' viewer.html.bak > viewer.html; \ - cp viewer.html viewer.html.bak; \ - sed '/PDFJSSCRIPT_INCLUDE_FIREFOX_EXTENSION/ r viewer-snippet-firefox-extension.html' viewer.html.bak > viewer.html; \ - rm -f *.bak; - # We don't need pdf.js anymore since its inlined - @rm -Rf $(FIREFOX_BUILD_CONTENT)/$(BUILD_DIR)/; - # Update the build version number - cp $(FIREFOX_BUILD_DIR)/install.rdf $(FIREFOX_BUILD_DIR)/install.rdf.bak - @sed "s/PDFJSSCRIPT_VERSION/$(PDFJSSCRIPT_VERSION)/" $(FIREFOX_BUILD_DIR)/install.rdf.bak > $(FIREFOX_BUILD_DIR)/install.rdf - cp $(FIREFOX_BUILD_DIR)/install.rdf.in $(FIREFOX_BUILD_DIR)/install.rdf.in.bak - @sed "s/PDFJSSCRIPT_VERSION/$(PDFJSSCRIPT_VERSION)/" $(FIREFOX_BUILD_DIR)/install.rdf.in.bak > $(FIREFOX_BUILD_DIR)/install.rdf.in - cp $(FIREFOX_BUILD_DIR)/update.rdf $(FIREFOX_BUILD_DIR)/update.rdf.bak - @sed "s/PDFJSSCRIPT_VERSION/$(PDFJSSCRIPT_VERSION)/" $(FIREFOX_BUILD_DIR)/update.rdf.bak > $(FIREFOX_BUILD_DIR)/update.rdf - cp $(FIREFOX_BUILD_DIR)/README.mozilla $(FIREFOX_BUILD_DIR)/README.mozilla.bak - @sed "s/PDFJSSCRIPT_VERSION/$(PDFJSSCRIPT_VERSION)/" $(FIREFOX_BUILD_DIR)/README.mozilla.bak > $(FIREFOX_BUILD_DIR)/README.mozilla - @rm -f $(FIREFOX_BUILD_DIR)/*.bak - @find $(FIREFOX_BUILD_DIR) -name ".*" -delete - # Create the xpi - @cd $(FIREFOX_BUILD_DIR); zip -r $(FIREFOX_EXTENSION_NAME) $(FIREFOX_EXTENSION_FILES) - @echo "extension created: " $(FIREFOX_EXTENSION_NAME) - # Build the amo extension too (remove the updateUrl) - cp $(FIREFOX_BUILD_DIR)/install.rdf $(FIREFOX_BUILD_DIR)/install.rdf.bak - @sed "/updateURL/d" $(FIREFOX_BUILD_DIR)/install.rdf.bak > $(FIREFOX_BUILD_DIR)/install.rdf - @rm -f $(FIREFOX_BUILD_DIR)/*.bak - @cd $(FIREFOX_BUILD_DIR); zip -r $(FIREFOX_AMO_EXTENSION_NAME) $(FIREFOX_EXTENSION_FILES) - @echo "AMO extension created: " $(FIREFOX_AMO_EXTENSION_NAME) - # List all files for mozilla-central - @cd $(FIREFOX_BUILD_DIR); find $(FIREFOX_MC_EXTENSION_FILES) -type f > extension-files - - # Clear out everything in the chrome extension build directory - @rm -Rf $(CHROME_BUILD_DIR) - @mkdir -p $(CHROME_BUILD_CONTENT) - @mkdir -p $(CHROME_BUILD_CONTENT)/$(BUILD_DIR) - @mkdir -p $(CHROME_BUILD_CONTENT)/web - @cp -R $(CHROME_EXTENSION_FILES) $(CHROME_BUILD_DIR)/ - # Copy a standalone version of pdf.js inside the content directory - @cp $(BUILD_TARGET) $(CHROME_BUILD_CONTENT)/$(BUILD_DIR)/ - @cp -r $(EXTENSION_WEB_FILES) $(CHROME_BUILD_CONTENT)/web/ - @mv -f $(CHROME_BUILD_CONTENT)/web/viewer-production.html $(CHROME_BUILD_CONTENT)/web/viewer.html - - # Create the crx - #TODO - - - -# Make sure there's a build directory. -$(BUILD_DIR): - mkdir -p $(BUILD_DIR) - -clean: - rm -rf $(BUILD_DIR) - -# make help -# -# This target just prints out a message to read these comments. :) -help: - @echo "Read the comments in the Makefile for guidance."; - -.PHONY:: production test browser-test font-test shell-test \ - shell-msg lint clean web compiler help server diff --git a/README.md b/README.md index 4c6fc1e18..3b8d86bb1 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Also, note that the development extension is updated on every merge and by defau auto-update extensions on a daily basis (you can change this through the `extensions.update.interval` option in `about:config`). -For an experimental Chrome extension, get the code as explained below and issue `make extension`. +For an experimental Chrome extension, get the code as explained below and issue `node make extension`. Then open Chrome, go to `Tools > Extension` and load the (unpackaged) extension from the directory `build/chrome`. @@ -50,9 +50,10 @@ To get a local copy of the current code, clone it using git: Next, you need to start a local web server as some browsers don't allow opening PDF files for a file:// url: - $ make server + $ node make server -If everything worked out, you can now serve +You can install Node via [nvm](https://github.com/creationix/nvm) or the +[official package](http://nodejs.org). If everything worked out, you can now serve + http://localhost:8888/web/viewer.html @@ -64,7 +65,7 @@ You can also view all the test pdf files on the right side serving In order to bundle all `src/` files into a final `pdf.js`, issue: - $ make + $ node make bundle This will generate the file `build/pdf.js` that can be included in your final project. (WARNING: That's a large file! Consider minifying it). @@ -73,8 +74,8 @@ This will generate the file `build/pdf.js` that can be included in your final pr You can play with the PDF.js API directly from your browser through the live demos below: -+ Hello world: http://jsbin.com/pdfjs-helloworld/edit#html,live -+ Simple reader with prev/next page controls: http://jsbin.com/pdfjs-prevnext/edit#html,live ++ Hello world: http://jsbin.com/pdfjs-helloworld-v2/edit#html,live ++ Simple reader with prev/next page controls: http://jsbin.com/pdfjs-prevnext-v2/edit#html,live The repo contains a hello world example that you can run locally: diff --git a/extensions/firefox/.gitignore b/extensions/firefox/.gitignore index 3eb92306c..08a23850c 100644 --- a/extensions/firefox/.gitignore +++ b/extensions/firefox/.gitignore @@ -1 +1,2 @@ content/ +metadata.inc diff --git a/extensions/firefox/components/PdfStreamConverter.js b/extensions/firefox/components/PdfStreamConverter.js index f4b5b7712..af9cf41b8 100644 --- a/extensions/firefox/components/PdfStreamConverter.js +++ b/extensions/firefox/components/PdfStreamConverter.js @@ -58,6 +58,9 @@ ChromeActions.prototype = { return '{}'; return application.prefs.getValue(EXT_PREFIX + '.database', '{}'); }, + getLocale: function() { + return application.prefs.getValue('general.useragent.locale', 'en-US'); + }, pdfBugEnabled: function() { return application.prefs.getValue(EXT_PREFIX + '.pdfBugEnabled', false); } diff --git a/extensions/firefox/install.rdf b/extensions/firefox/install.rdf index 0a0d813b2..d7eea9319 100644 --- a/extensions/firefox/install.rdf +++ b/extensions/firefox/install.rdf @@ -5,6 +5,7 @@ uriloader@pdf.js + PDF Viewer PDFJSSCRIPT_VERSION diff --git a/extensions/firefox/install.rdf.in b/extensions/firefox/install.rdf.in index feab3e7ad..084d6dc2d 100644 --- a/extensions/firefox/install.rdf.in +++ b/extensions/firefox/install.rdf.in @@ -7,6 +7,7 @@ uriloader@pdf.js + PDF Viewer PDFJSSCRIPT_VERSION diff --git a/external/jasmine/jasmine-html.js b/external/jasmine/jasmine-html.js new file mode 100644 index 000000000..3de4e8a5f --- /dev/null +++ b/external/jasmine/jasmine-html.js @@ -0,0 +1,676 @@ +jasmine.HtmlReporterHelpers = {}; + +jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { + var el = document.createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(document.createTextNode(child)); + } else { + if (child) { + el.appendChild(child); + } + } + } + + for (var attr in attrs) { + if (attr == "className") { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; +}; + +jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { + var results = child.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.skipped) { + status = 'skipped'; + } + + return status; +}; + +jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { + var parentDiv = this.dom.summary; + var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; + var parent = child[parentSuite]; + + if (parent) { + if (typeof this.views.suites[parent.id] == 'undefined') { + this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); + } + parentDiv = this.views.suites[parent.id].element; + } + + parentDiv.appendChild(childElement); +}; + + +jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { + for(var fn in jasmine.HtmlReporterHelpers) { + ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; + } +}; + +jasmine.HtmlReporter = function(_doc) { + var self = this; + var doc = _doc || window.document; + + var reporterView; + + var dom = {}; + + // Jasmine Reporter Public Interface + self.logRunningSpecs = false; + + self.reportRunnerStarting = function(runner) { + var specs = runner.specs() || []; + + if (specs.length == 0) { + return; + } + + createReporterDom(runner.env.versionString()); + doc.body.appendChild(dom.reporter); + + reporterView = new jasmine.HtmlReporter.ReporterView(dom); + reporterView.addSpecs(specs, self.specFilter); + }; + + self.reportRunnerResults = function(runner) { + reporterView.complete(); + }; + + self.reportSuiteResults = function(suite) { + reporterView.suiteComplete(suite); + }; + + self.reportSpecStarting = function(spec) { + if (self.logRunningSpecs) { + self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); + } + }; + + self.reportSpecResults = function(spec) { + reporterView.specComplete(spec); + }; + + self.log = function() { + var console = jasmine.getGlobal().console; + if (console && console.log) { + if (console.log.apply) { + console.log.apply(console, arguments); + } else { + console.log(arguments); // ie fix: console.log.apply doesn't exist on ie + } + } + }; + + self.specFilter = function(spec) { + if (!focusedSpecName()) { + return true; + } + + return spec.getFullName().indexOf(focusedSpecName()) === 0; + }; + + return self; + + function focusedSpecName() { + var specName; + + (function memoizeFocusedSpec() { + if (specName) { + return; + } + + var paramMap = []; + var params = doc.location.search.substring(1).split('&'); + + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); + } + + specName = paramMap.spec; + })(); + + return specName; + } + + function createReporterDom(version) { + dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, + dom.banner = self.createDom('div', { className: 'banner' }, + self.createDom('span', { className: 'title' }, "Jasmine "), + self.createDom('span', { className: 'version' }, version)), + + dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), + dom.alert = self.createDom('div', {className: 'alert'}), + dom.results = self.createDom('div', {className: 'results'}, + dom.summary = self.createDom('div', { className: 'summary' }), + dom.details = self.createDom('div', { id: 'details' })) + ); + } +}; +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporterHelpers = {}; + +jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { + var el = document.createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(document.createTextNode(child)); + } else { + if (child) { + el.appendChild(child); + } + } + } + + for (var attr in attrs) { + if (attr == "className") { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; +}; + +jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { + var results = child.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.skipped) { + status = 'skipped'; + } + + return status; +}; + +jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { + var parentDiv = this.dom.summary; + var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; + var parent = child[parentSuite]; + + if (parent) { + if (typeof this.views.suites[parent.id] == 'undefined') { + this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); + } + parentDiv = this.views.suites[parent.id].element; + } + + parentDiv.appendChild(childElement); +}; + + +jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { + for(var fn in jasmine.HtmlReporterHelpers) { + ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; + } +}; + +jasmine.HtmlReporter.ReporterView = function(dom) { + this.startedAt = new Date(); + this.runningSpecCount = 0; + this.completeSpecCount = 0; + this.passedCount = 0; + this.failedCount = 0; + this.skippedCount = 0; + + this.createResultsMenu = function() { + this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, + this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), + ' | ', + this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); + + this.summaryMenuItem.onclick = function() { + dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); + }; + + this.detailsMenuItem.onclick = function() { + showDetails(); + }; + }; + + this.addSpecs = function(specs, specFilter) { + this.totalSpecCount = specs.length; + + this.views = { + specs: {}, + suites: {} + }; + + for (var i = 0; i < specs.length; i++) { + var spec = specs[i]; + this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); + if (specFilter(spec)) { + this.runningSpecCount++; + } + } + }; + + this.specComplete = function(spec) { + this.completeSpecCount++; + + if (isUndefined(this.views.specs[spec.id])) { + this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); + } + + var specView = this.views.specs[spec.id]; + + switch (specView.status()) { + case 'passed': + this.passedCount++; + break; + + case 'failed': + this.failedCount++; + break; + + case 'skipped': + this.skippedCount++; + break; + } + + specView.refresh(); + this.refresh(); + }; + + this.suiteComplete = function(suite) { + var suiteView = this.views.suites[suite.id]; + if (isUndefined(suiteView)) { + return; + } + suiteView.refresh(); + }; + + this.refresh = function() { + + if (isUndefined(this.resultsMenu)) { + this.createResultsMenu(); + } + + // currently running UI + if (isUndefined(this.runningAlert)) { + this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"}); + dom.alert.appendChild(this.runningAlert); + } + this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); + + // skipped specs UI + if (isUndefined(this.skippedAlert)) { + this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"}); + } + + this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; + + if (this.skippedCount === 1 && isDefined(dom.alert)) { + dom.alert.appendChild(this.skippedAlert); + } + + // passing specs UI + if (isUndefined(this.passedAlert)) { + this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"}); + } + this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); + + // failing specs UI + if (isUndefined(this.failedAlert)) { + this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); + } + this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); + + if (this.failedCount === 1 && isDefined(dom.alert)) { + dom.alert.appendChild(this.failedAlert); + dom.alert.appendChild(this.resultsMenu); + } + + // summary info + this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); + this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; + }; + + this.complete = function() { + dom.alert.removeChild(this.runningAlert); + + this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; + + if (this.failedCount === 0) { + dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); + } else { + showDetails(); + } + + dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); + }; + + return this; + + function showDetails() { + if (dom.reporter.className.search(/showDetails/) === -1) { + dom.reporter.className += " showDetails"; + } + } + + function isUndefined(obj) { + return typeof obj === 'undefined'; + } + + function isDefined(obj) { + return !isUndefined(obj); + } + + function specPluralizedFor(count) { + var str = count + " spec"; + if (count > 1) { + str += "s" + } + return str; + } + +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); + + +jasmine.HtmlReporter.SpecView = function(spec, dom, views) { + this.spec = spec; + this.dom = dom; + this.views = views; + + this.symbol = this.createDom('li', { className: 'pending' }); + this.dom.symbolSummary.appendChild(this.symbol); + + this.summary = this.createDom('div', { className: 'specSummary' }, + this.createDom('a', { + className: 'description', + href: '?spec=' + encodeURIComponent(this.spec.getFullName()), + title: this.spec.getFullName() + }, this.spec.description) + ); + + this.detail = this.createDom('div', { className: 'specDetail' }, + this.createDom('a', { + className: 'description', + href: '?spec=' + encodeURIComponent(this.spec.getFullName()), + title: this.spec.getFullName() + }, this.spec.getFullName()) + ); +}; + +jasmine.HtmlReporter.SpecView.prototype.status = function() { + return this.getSpecStatus(this.spec); +}; + +jasmine.HtmlReporter.SpecView.prototype.refresh = function() { + this.symbol.className = this.status(); + + switch (this.status()) { + case 'skipped': + break; + + case 'passed': + this.appendSummaryToSuiteDiv(); + break; + + case 'failed': + this.appendSummaryToSuiteDiv(); + this.appendFailureDetail(); + break; + } +}; + +jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { + this.summary.className += ' ' + this.status(); + this.appendToSummary(this.spec, this.summary); +}; + +jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { + this.detail.className += ' ' + this.status(); + + var resultItems = this.spec.results().getItems(); + var messagesDiv = this.createDom('div', { className: 'messages' }); + + for (var i = 0; i < resultItems.length; i++) { + var result = resultItems[i]; + + if (result.type == 'log') { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); + } else if (result.type == 'expect' && result.passed && !result.passed()) { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); + + if (result.trace.stack) { + messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); + } + } + } + + if (messagesDiv.childNodes.length > 0) { + this.detail.appendChild(messagesDiv); + this.dom.details.appendChild(this.detail); + } +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { + this.suite = suite; + this.dom = dom; + this.views = views; + + this.element = this.createDom('div', { className: 'suite' }, + this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description) + ); + + this.appendToSummary(this.suite, this.element); +}; + +jasmine.HtmlReporter.SuiteView.prototype.status = function() { + return this.getSpecStatus(this.suite); +}; + +jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { + this.element.className += " " + this.status(); +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); + +/* @deprecated Use jasmine.HtmlReporter instead + */ +jasmine.TrivialReporter = function(doc) { + this.document = doc || document; + this.suiteDivs = {}; + this.logRunningSpecs = false; +}; + +jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { + var el = document.createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(document.createTextNode(child)); + } else { + if (child) { el.appendChild(child); } + } + } + + for (var attr in attrs) { + if (attr == "className") { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; +}; + +jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { + var showPassed, showSkipped; + + this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, + this.createDom('div', { className: 'banner' }, + this.createDom('div', { className: 'logo' }, + this.createDom('span', { className: 'title' }, "Jasmine"), + this.createDom('span', { className: 'version' }, runner.env.versionString())), + this.createDom('div', { className: 'options' }, + "Show ", + showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), + this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), + showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), + this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") + ) + ), + + this.runnerDiv = this.createDom('div', { className: 'runner running' }, + this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), + this.runnerMessageSpan = this.createDom('span', {}, "Running..."), + this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) + ); + + this.document.body.appendChild(this.outerDiv); + + var suites = runner.suites(); + for (var i = 0; i < suites.length; i++) { + var suite = suites[i]; + var suiteDiv = this.createDom('div', { className: 'suite' }, + this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), + this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); + this.suiteDivs[suite.id] = suiteDiv; + var parentDiv = this.outerDiv; + if (suite.parentSuite) { + parentDiv = this.suiteDivs[suite.parentSuite.id]; + } + parentDiv.appendChild(suiteDiv); + } + + this.startedAt = new Date(); + + var self = this; + showPassed.onclick = function(evt) { + if (showPassed.checked) { + self.outerDiv.className += ' show-passed'; + } else { + self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); + } + }; + + showSkipped.onclick = function(evt) { + if (showSkipped.checked) { + self.outerDiv.className += ' show-skipped'; + } else { + self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); + } + }; +}; + +jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { + var results = runner.results(); + var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; + this.runnerDiv.setAttribute("class", className); + //do it twice for IE + this.runnerDiv.setAttribute("className", className); + var specs = runner.specs(); + var specCount = 0; + for (var i = 0; i < specs.length; i++) { + if (this.specFilter(specs[i])) { + specCount++; + } + } + var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); + message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; + this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); + + this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); +}; + +jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { + var results = suite.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.totalCount === 0) { // todo: change this to check results.skipped + status = 'skipped'; + } + this.suiteDivs[suite.id].className += " " + status; +}; + +jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { + if (this.logRunningSpecs) { + this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); + } +}; + +jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { + var results = spec.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.skipped) { + status = 'skipped'; + } + var specDiv = this.createDom('div', { className: 'spec ' + status }, + this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), + this.createDom('a', { + className: 'description', + href: '?spec=' + encodeURIComponent(spec.getFullName()), + title: spec.getFullName() + }, spec.description)); + + + var resultItems = results.getItems(); + var messagesDiv = this.createDom('div', { className: 'messages' }); + for (var i = 0; i < resultItems.length; i++) { + var result = resultItems[i]; + + if (result.type == 'log') { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); + } else if (result.type == 'expect' && result.passed && !result.passed()) { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); + + if (result.trace.stack) { + messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); + } + } + } + + if (messagesDiv.childNodes.length > 0) { + specDiv.appendChild(messagesDiv); + } + + this.suiteDivs[spec.suite.id].appendChild(specDiv); +}; + +jasmine.TrivialReporter.prototype.log = function() { + var console = jasmine.getGlobal().console; + if (console && console.log) { + if (console.log.apply) { + console.log.apply(console, arguments); + } else { + console.log(arguments); // ie fix: console.log.apply doesn't exist on ie + } + } +}; + +jasmine.TrivialReporter.prototype.getLocation = function() { + return this.document.location; +}; + +jasmine.TrivialReporter.prototype.specFilter = function(spec) { + var paramMap = {}; + var params = this.getLocation().search.substring(1).split('&'); + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); + } + + if (!paramMap.spec) { + return true; + } + return spec.getFullName().indexOf(paramMap.spec) === 0; +}; diff --git a/external/jasmine/jasmine.css b/external/jasmine/jasmine.css new file mode 100644 index 000000000..826e57531 --- /dev/null +++ b/external/jasmine/jasmine.css @@ -0,0 +1,81 @@ +body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } + +#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } +#HTMLReporter a { text-decoration: none; } +#HTMLReporter a:hover { text-decoration: underline; } +#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } +#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } +#HTMLReporter #jasmine_content { position: fixed; right: 100%; } +#HTMLReporter .version { color: #aaaaaa; } +#HTMLReporter .banner { margin-top: 14px; } +#HTMLReporter .duration { color: #aaaaaa; float: right; } +#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } +#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } +#HTMLReporter .symbolSummary li.passed { font-size: 14px; } +#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } +#HTMLReporter .symbolSummary li.failed { line-height: 9px; } +#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } +#HTMLReporter .symbolSummary li.skipped { font-size: 14px; } +#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } +#HTMLReporter .symbolSummary li.pending { line-height: 11px; } +#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } +#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } +#HTMLReporter .runningAlert { background-color: #666666; } +#HTMLReporter .skippedAlert { background-color: #aaaaaa; } +#HTMLReporter .skippedAlert:first-child { background-color: #333333; } +#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } +#HTMLReporter .passingAlert { background-color: #a6b779; } +#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } +#HTMLReporter .failingAlert { background-color: #cf867e; } +#HTMLReporter .failingAlert:first-child { background-color: #b03911; } +#HTMLReporter .results { margin-top: 14px; } +#HTMLReporter #details { display: none; } +#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } +#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } +#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } +#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } +#HTMLReporter.showDetails .summary { display: none; } +#HTMLReporter.showDetails #details { display: block; } +#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } +#HTMLReporter .summary { margin-top: 14px; } +#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } +#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } +#HTMLReporter .summary .specSummary.failed a { color: #b03911; } +#HTMLReporter .description + .suite { margin-top: 0; } +#HTMLReporter .suite { margin-top: 14px; } +#HTMLReporter .suite a { color: #333333; } +#HTMLReporter #details .specDetail { margin-bottom: 28px; } +#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } +#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } +#HTMLReporter .resultMessage span.result { display: block; } +#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } + +#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } +#TrivialReporter a:visited, #TrivialReporter a { color: #303; } +#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } +#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } +#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } +#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } +#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } +#TrivialReporter .runner.running { background-color: yellow; } +#TrivialReporter .options { text-align: right; font-size: .8em; } +#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } +#TrivialReporter .suite .suite { margin: 5px; } +#TrivialReporter .suite.passed { background-color: #dfd; } +#TrivialReporter .suite.failed { background-color: #fdd; } +#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } +#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } +#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } +#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } +#TrivialReporter .spec.skipped { background-color: #bbb; } +#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } +#TrivialReporter .passed { background-color: #cfc; display: none; } +#TrivialReporter .failed { background-color: #fbb; } +#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } +#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } +#TrivialReporter .resultMessage .mismatch { color: black; } +#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } +#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } +#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } +#TrivialReporter #jasmine_content { position: fixed; right: 100%; } +#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } diff --git a/external/jasmine/jasmine_favicon.png b/external/jasmine/jasmine_favicon.png new file mode 100644 index 000000000..218f3b437 Binary files /dev/null and b/external/jasmine/jasmine_favicon.png differ diff --git a/external/jasmineAdapter/JasmineAdapter.js b/external/jasmineAdapter/JasmineAdapter.js deleted file mode 100644 index 3b0fb2d76..000000000 --- a/external/jasmineAdapter/JasmineAdapter.js +++ /dev/null @@ -1,198 +0,0 @@ -/** - * @fileoverview Jasmine JsTestDriver Adapter. - * @author misko@hevery.com (Misko Hevery) - */ -(function(window) { - var rootDescribes = new Describes(window); - var describePath = []; - rootDescribes.collectMode(); - - var JASMINE_TYPE = 'jasmine test case'; - TestCase('Jasmine Adapter Tests', null, JASMINE_TYPE); - - var jasminePlugin = { - name:'jasmine', - - getTestRunsConfigurationFor: function(testCaseInfos, expressions, testRunsConfiguration) { - for (var i = 0; i < testCaseInfos.length; i++) { - if (testCaseInfos[i].getType() == JASMINE_TYPE) { - testRunsConfiguration.push(new jstestdriver.TestRunConfiguration(testCaseInfos[i], [])); - } - } - return false; - }, - - runTestConfiguration: function(testRunConfiguration, onTestDone, onTestRunConfigurationComplete){ - if (testRunConfiguration.getTestCaseInfo().getType() != JASMINE_TYPE) return false; - - var jasmineEnv = jasmine.currentEnv_ = new jasmine.Env(); - rootDescribes.playback(); - var specLog = jstestdriver.console.log_ = []; - var start; - jasmineEnv.specFilter = function(spec) { - return rootDescribes.isExclusive(spec); - }; - jasmineEnv.reporter = { - log: function(str){ - specLog.push(str); - }, - - reportRunnerStarting: function(runner) { }, - - reportSpecStarting: function(spec) { - specLog = jstestdriver.console.log_ = []; - start = new Date().getTime(); - }, - - reportSpecResults: function(spec) { - var suite = spec.suite; - var results = spec.results(); - if (results.skipped) return; - var end = new Date().getTime(); - var messages = []; - var resultItems = results.getItems(); - var state = 'passed'; - for ( var i = 0; i < resultItems.length; i++) { - if (!resultItems[i].passed()) { - state = resultItems[i].message.match(/AssertionError:/) ? 'error' : 'failed'; - messages.push({ - message: resultItems[i].toString(), - name: resultItems[i].trace.name, - stack: formatStack(resultItems[i].trace.stack) - }); - } - } - onTestDone( - new jstestdriver.TestResult( - suite.getFullName(), - spec.description, - state, - jstestdriver.angular.toJson(messages), - specLog.join('\n'), - end - start)); - }, - - reportSuiteResults: function(suite) {}, - - reportRunnerResults: function(runner) { - onTestRunConfigurationComplete(); - } - }; - jasmineEnv.execute(); - return true; - }, - - onTestsFinish: function(){ - jasmine.currentEnv_ = null; - rootDescribes.collectMode(); - } - }; - jstestdriver.pluginRegistrar.register(jasminePlugin); - - function formatStack(stack) { - var lines = (stack||'').split(/\r?\n/); - var frames = []; - for (i = 0; i < lines.length; i++) { - if (!lines[i].match(/\/jasmine[\.-]/)) { - frames.push(lines[i].replace(/https?:\/\/\w+(:\d+)?\/test\//, '').replace(/^\s*/, ' ')); - } - } - return frames.join('\n'); - } - - function noop(){} - function Describes(window){ - var describes = {}; - var beforeEachs = {}; - var afterEachs = {}; - // Here we store: - // 0: everyone runs - // 1: run everything under ddescribe - // 2: run only iits (ignore ddescribe) - var exclusive = 0; - var collectMode = true; - intercept('describe', describes); - intercept('xdescribe', describes); - intercept('beforeEach', beforeEachs); - intercept('afterEach', afterEachs); - - function intercept(functionName, collection){ - window[functionName] = function(desc, fn){ - if (collectMode) { - collection[desc] = function(){ - jasmine.getEnv()[functionName](desc, fn); - }; - } else { - jasmine.getEnv()[functionName](desc, fn); - } - }; - } - window.ddescribe = function(name, fn){ - if (exclusive < 1) { - exclusive = 1; // run ddescribe only - } - window.describe(name, function(){ - var oldIt = window.it; - window.it = function(name, fn){ - fn.exclusive = 1; // run anything under ddescribe - jasmine.getEnv().it(name, fn); - }; - try { - fn.call(this); - } finally { - window.it = oldIt; - }; - }); - }; - window.iit = function(name, fn){ - exclusive = fn.exclusive = 2; // run only iits - jasmine.getEnv().it(name, fn); - }; - - - this.collectMode = function() { - collectMode = true; - exclusive = 0; // run everything - }; - this.playback = function(){ - collectMode = false; - playback(beforeEachs); - playback(afterEachs); - playback(describes); - - function playback(set) { - for ( var name in set) { - set[name](); - } - } - }; - - this.isExclusive = function(spec) { - if (exclusive) { - var blocks = spec.queue.blocks; - for ( var i = 0; i < blocks.length; i++) { - if (blocks[i].func.exclusive >= exclusive) { - return true; - } - } - return false; - } - return true; - }; - } - -})(window); - -// Patch Jasmine for proper stack traces -jasmine.Spec.prototype.fail = function (e) { - var expectationResult = new jasmine.ExpectationResult({ - passed: false, - message: e ? jasmine.util.formatException(e) : 'Exception' - }); - // PATCH - if (e) { - expectationResult.trace = e; - } - this.results_.addResult(expectationResult); -}; - diff --git a/external/jasmineAdapter/MIT.LICENSE b/external/jasmineAdapter/MIT.LICENSE deleted file mode 100644 index f650924e6..000000000 --- a/external/jasmineAdapter/MIT.LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2010 - Misko Hevery - Olmo Maldonado - Christoph Pojer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/external/jpgjs/jpg.js b/external/jpgjs/jpg.js index dc8956ac0..103153d9d 100644 --- a/external/jpgjs/jpg.js +++ b/external/jpgjs/jpg.js @@ -637,7 +637,10 @@ var JpegImage = (function jpegImage() { tableData[z] = data[offset++]; } } else if ((quantizationTableSpec >> 4) === 1) { //16 bit - tableData[j] = readUint16(); + for (j = 0; j < 64; j++) { + var z = dctZigZag[j]; + tableData[z] = readUint16(); + } } else throw "DQT: invalid table spec"; quantizationTables[quantizationTableSpec & 15] = tableData; @@ -652,7 +655,8 @@ var JpegImage = (function jpegImage() { frame.precision = data[offset++]; frame.scanLines = readUint16(); frame.samplesPerLine = readUint16(); - frame.components = []; + frame.components = {}; + frame.componentsOrder = []; var componentsCount = data[offset++], componentId; var maxH = 0, maxV = 0; for (i = 0; i < componentsCount; i++) { @@ -660,6 +664,7 @@ var JpegImage = (function jpegImage() { var h = data[offset + 1] >> 4; var v = data[offset + 1] & 15; var qId = data[offset + 2]; + frame.componentsOrder.push(componentId); frame.components[componentId] = { h: h, v: v, @@ -728,14 +733,13 @@ var JpegImage = (function jpegImage() { this.jfif = jfif; this.adobe = adobe; this.components = []; - for (var id in frame.components) { - if (frame.components.hasOwnProperty(id)) { - this.components.push({ - lines: buildComponentData(frame, frame.components[id]), - scaleX: frame.components[id].h / frame.maxH, - scaleY: frame.components[id].v / frame.maxV - }); - } + for (var i = 0; i < frame.componentsOrder.length; i++) { + var component = frame.components[frame.componentsOrder[i]]; + this.components.push({ + lines: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV + }); } }, getData: function getData(width, height) { diff --git a/external/jsTestDriver/JsTestDriver-1.3.3d.jar b/external/jsTestDriver/JsTestDriver-1.3.3d.jar deleted file mode 100644 index 9de7cf64a..000000000 Binary files a/external/jsTestDriver/JsTestDriver-1.3.3d.jar and /dev/null differ diff --git a/external/jsTestDriver/LICENSE-2.0.txt b/external/jsTestDriver/LICENSE-2.0.txt deleted file mode 100644 index d64569567..000000000 --- a/external/jsTestDriver/LICENSE-2.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/external/webL10n/README.md b/external/webL10n/README.md new file mode 100644 index 000000000..52995522c --- /dev/null +++ b/external/webL10n/README.md @@ -0,0 +1,3 @@ +The source code for the library can be found at + + https://github.com/fabi1cazenave/webL10n diff --git a/external/webL10n/l10n.js b/external/webL10n/l10n.js new file mode 100644 index 000000000..f6c11c178 --- /dev/null +++ b/external/webL10n/l10n.js @@ -0,0 +1,322 @@ +/* Copyright (c) 2011-2012 Fabien Cazenave, Mozilla. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +/* + Additional modifications for PDF.js project: + - Loading resources from + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/.gitignore b/web/.gitignore index 2c0f5df71..588e0e724 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -1 +1,2 @@ viewer-production.html +locale.properties diff --git a/web/debugger.js b/web/debugger.js index 610a63854..aeb3ab4ce 100644 --- a/web/debugger.js +++ b/web/debugger.js @@ -423,8 +423,9 @@ var PDFBug = (function PDFBugClosure() { panels.setAttribute('class', 'panels'); ui.appendChild(panels); - document.body.appendChild(ui); - document.body.style.paddingRight = panelWidth + 'px'; + var container = document.getElementById('viewerContainer'); + container.appendChild(ui); + container.style.right = panelWidth + 'px'; // Initialize all the debugging tools. var tools = this.tools; diff --git a/web/images/check.svg b/web/images/annotation-check.svg similarity index 100% rename from web/images/check.svg rename to web/images/annotation-check.svg diff --git a/web/images/comment.svg b/web/images/annotation-comment.svg similarity index 100% rename from web/images/comment.svg rename to web/images/annotation-comment.svg diff --git a/web/images/text.svg b/web/images/annotation-text.svg similarity index 100% rename from web/images/text.svg rename to web/images/annotation-text.svg diff --git a/web/images/bookmark.svg b/web/images/bookmark.svg deleted file mode 100644 index bee6efefd..000000000 --- a/web/images/bookmark.svg +++ /dev/null @@ -1,662 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - New Bookmark - - - bookmark - remember - favorite - - - - - - Andreas Nilsson - - - - - - Jakub Steiner - - - create bookmark action - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/images/document-print.svg b/web/images/document-print.svg deleted file mode 100644 index 4d062fbb6..000000000 --- a/web/images/document-print.svg +++ /dev/null @@ -1,533 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - Print Document - - - Jakub Steiner - - - - http://jimmac.musichall.cz - - - document - lpr - print - local - laser - bubblejet - inkjet - print - output - cups - lpd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/images/download.svg b/web/images/download.svg deleted file mode 100644 index 884e3deed..000000000 --- a/web/images/download.svg +++ /dev/null @@ -1,620 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - Save - - - Jakub Steiner - - - - - hdd - hard drive - save - io - store - - - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/images/go-down.svg b/web/images/go-down.svg deleted file mode 100644 index 655fdba16..000000000 --- a/web/images/go-down.svg +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - Go Down - - - go - lower - down - arrow - pointer - > - - - - - Andreas Nilsson - - - - - - - - - - - - - - - - - - - diff --git a/web/images/go-up.svg b/web/images/go-up.svg deleted file mode 100644 index 5e2f9a2c6..000000000 --- a/web/images/go-up.svg +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - Go Up - - - go - higher - up - arrow - pointer - > - - - - - Andreas Nilsson - - - - - - - - - - - - - - - - - diff --git a/web/images/nav-outline.svg b/web/images/nav-outline.svg deleted file mode 100644 index 4d4323ce3..000000000 --- a/web/images/nav-outline.svg +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/images/nav-thumbs.svg b/web/images/nav-thumbs.svg deleted file mode 100644 index 8737b8cb6..000000000 --- a/web/images/nav-thumbs.svg +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/images/pin-down.svg b/web/images/pin-down.svg deleted file mode 100644 index 357667600..000000000 --- a/web/images/pin-down.svg +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/web/images/pin-up.svg b/web/images/pin-up.svg deleted file mode 100644 index e55cec7a0..000000000 --- a/web/images/pin-up.svg +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/web/images/texture.png b/web/images/texture.png new file mode 100644 index 000000000..df0086493 Binary files /dev/null and b/web/images/texture.png differ diff --git a/web/images/toolbarButton-bookmark.png b/web/images/toolbarButton-bookmark.png new file mode 100644 index 000000000..1e5259a97 Binary files /dev/null and b/web/images/toolbarButton-bookmark.png differ diff --git a/web/images/toolbarButton-download.png b/web/images/toolbarButton-download.png new file mode 100644 index 000000000..8676d8e2c Binary files /dev/null and b/web/images/toolbarButton-download.png differ diff --git a/web/images/toolbarButton-menuArrows.png b/web/images/toolbarButton-menuArrows.png new file mode 100644 index 000000000..31b06b5af Binary files /dev/null and b/web/images/toolbarButton-menuArrows.png differ diff --git a/web/images/toolbarButton-pageDown-rtl.png b/web/images/toolbarButton-pageDown-rtl.png new file mode 100644 index 000000000..c0051f8f0 Binary files /dev/null and b/web/images/toolbarButton-pageDown-rtl.png differ diff --git a/web/images/toolbarButton-pageDown.png b/web/images/toolbarButton-pageDown.png new file mode 100644 index 000000000..762ac43e0 Binary files /dev/null and b/web/images/toolbarButton-pageDown.png differ diff --git a/web/images/toolbarButton-pageUp-rtl.png b/web/images/toolbarButton-pageUp-rtl.png new file mode 100644 index 000000000..0d49d8e95 Binary files /dev/null and b/web/images/toolbarButton-pageUp-rtl.png differ diff --git a/web/images/toolbarButton-pageUp.png b/web/images/toolbarButton-pageUp.png new file mode 100644 index 000000000..3155b8bd2 Binary files /dev/null and b/web/images/toolbarButton-pageUp.png differ diff --git a/web/images/toolbarButton-print.png b/web/images/toolbarButton-print.png new file mode 100644 index 000000000..fef84dd59 Binary files /dev/null and b/web/images/toolbarButton-print.png differ diff --git a/web/images/toolbarButton-sidebarToggle.png b/web/images/toolbarButton-sidebarToggle.png new file mode 100644 index 000000000..5a937c712 Binary files /dev/null and b/web/images/toolbarButton-sidebarToggle.png differ diff --git a/web/images/toolbarButton-viewOutline.png b/web/images/toolbarButton-viewOutline.png new file mode 100644 index 000000000..cb3967b7f Binary files /dev/null and b/web/images/toolbarButton-viewOutline.png differ diff --git a/web/images/toolbarButton-viewThumbnail.png b/web/images/toolbarButton-viewThumbnail.png new file mode 100644 index 000000000..3a27f0439 Binary files /dev/null and b/web/images/toolbarButton-viewThumbnail.png differ diff --git a/web/images/toolbarButton-zoomIn.png b/web/images/toolbarButton-zoomIn.png new file mode 100644 index 000000000..670acd93f Binary files /dev/null and b/web/images/toolbarButton-zoomIn.png differ diff --git a/web/images/toolbarButton-zoomOut.png b/web/images/toolbarButton-zoomOut.png new file mode 100644 index 000000000..810fbf989 Binary files /dev/null and b/web/images/toolbarButton-zoomOut.png differ diff --git a/web/images/zoom-in.svg b/web/images/zoom-in.svg deleted file mode 100644 index 48ee42dd9..000000000 --- a/web/images/zoom-in.svg +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - Add - 2006-01-04 - - - Andreas Nilsson - - - http://tango-project.org - - - add - plus - - - - - - - - - - - - - - - - - - diff --git a/web/images/zoom-out.svg b/web/images/zoom-out.svg deleted file mode 100644 index eb13b60e3..000000000 --- a/web/images/zoom-out.svg +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - Remove - 2006-01-04 - - - Andreas Nilsson - - - http://tango-project.org - - - remove - delete - - - - - - - - - - - - - - - - - diff --git a/web/viewer-snippet-firefox-extension.html b/web/viewer-snippet-firefox-extension.html index a3d3502a8..57d7875eb 100644 --- a/web/viewer-snippet-firefox-extension.html +++ b/web/viewer-snippet-firefox-extension.html @@ -1,5 +1,9 @@ + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
- +
- - -
- - - - / - -- - -
- - - - -
- - - -
- - - - - -
- - - -
- - - Bookmark - - -
- - -