diff --git a/external/builder/builder.js b/external/builder/builder.js index 044741d88daf8..637e35d757a4f 100644 --- a/external/builder/builder.js +++ b/external/builder/builder.js @@ -123,6 +123,15 @@ function preprocessCSS(mode, source, destination) { deprecatedInMozcentral.test(line)); } + function expandImports(content, baseUrl) { + return content.replace(/^\s*@import\s+url\(([^\)]+)\);\s*$/gm, + function(all, url) { + var file = path.join(path.dirname(baseUrl), url); + var imported = fs.readFileSync(file, 'utf8').toString(); + return expandImports(imported, file); + }); + } + function removePrefixed(content, hasPrefixedFilter) { var lines = content.split(/\r?\n/g); var i = 0; @@ -168,14 +177,17 @@ function preprocessCSS(mode, source, destination) { return lines.join('\n'); } - if (mode !== 'firefox' && mode !== 'mozcentral') { + if (!mode) { throw new Error('Invalid CSS preprocessor mode'); } - var content = fs.readFileSync(source, 'utf8'); - var out = removePrefixed(content, - mode === 'mozcentral' ? hasPrefixedMozcentral : hasPrefixedFirefox); - fs.writeFileSync(destination, out); + var content = fs.readFileSync(source, 'utf8').toString(); + content = expandImports(content, source); + if (mode === 'mozcentral' || mode === 'firefox') { + content = removePrefixed(content, mode === 'mozcentral' ? + hasPrefixedMozcentral : hasPrefixedFirefox); + } + fs.writeFileSync(destination, content); } exports.preprocessCSS = preprocessCSS; diff --git a/make.js b/make.js index e257c11a9fd4d..278c505e0fe91 100644 --- a/make.js +++ b/make.js @@ -126,7 +126,6 @@ target.generic = function() { [COMMON_WEB_FILES, GENERIC_DIR + '/web'], ['LICENSE', GENERIC_DIR], ['external/webL10n/l10n.js', GENERIC_DIR + '/web'], - ['web/viewer.css', GENERIC_DIR + '/web'], ['web/compatibility.js', GENERIC_DIR + '/web'], ['web/compressed.tracemonkey-pldi-09.pdf', GENERIC_DIR + '/web'], ['external/bcmaps/*', GENERIC_DIR + '/web/cmaps/'], @@ -135,11 +134,16 @@ target.generic = function() { preprocess: [ [BUILD_TARGETS, GENERIC_DIR + BUILD_DIR], [COMMON_WEB_FILES_PREPROCESS, GENERIC_DIR + '/web'] + ], + preprocessCSS: [ + ['generic', 'web/viewer.css', + GENERIC_DIR + '/web/viewer.css'] ] }; builder.build(setup); cleanupJSSource(GENERIC_DIR + '/web/viewer.js'); + cleanupCSSSource(GENERIC_DIR + '/web/viewer.css'); }; target.jsdoc = function() { @@ -557,6 +561,16 @@ function cleanupJSSource(file) { content.to(file); } +function cleanupCSSSource(file) { + var content = cat(file); + + // Strip out all license headers in the middle. + var reg = /\n\/\* Copyright(.|\n)*?Mozilla Foundation(.|\n)*?\*\//g; + content = content.replace(reg, ''); + + content.to(file); +} + // // make minified // Builds the minified production viewer that should be compatible with most @@ -588,7 +602,6 @@ target.minified = function() { defines: defines, copy: [ [COMMON_WEB_FILES, MINIFIED_DIR + '/web'], - ['web/viewer.css', MINIFIED_DIR + '/web'], ['web/compressed.tracemonkey-pldi-09.pdf', MINIFIED_DIR + '/web'], ['external/bcmaps/*', MINIFIED_DIR + '/web/cmaps'], ['web/locale', MINIFIED_DIR + '/web'] @@ -596,10 +609,16 @@ target.minified = function() { preprocess: [ [BUILD_TARGETS, MINIFIED_DIR + BUILD_DIR], [COMMON_WEB_FILES_PREPROCESS, MINIFIED_DIR + '/web'] + ], + preprocessCSS: [ + ['minified', 'web/viewer.css', + MINIFIED_DIR + '/web/viewer.css'] ] }; builder.build(setup); + cleanupCSSSource(MINIFIED_DIR + '/web/viewer.css'); + var viewerFiles = [ 'web/compatibility.js', 'external/webL10n/l10n.js', @@ -750,6 +769,7 @@ target.firefox = function() { cleanupJSSource(FIREFOX_BUILD_CONTENT_DIR + '/web/viewer.js'); cleanupJSSource(FIREFOX_BUILD_DIR + 'bootstrap.js'); cleanupJSSource(FIREFOX_BUILD_CONTENT_DIR + 'PdfjsChromeUtils.jsm'); + cleanupCSSSource(FIREFOX_BUILD_CONTENT_DIR + '/web/viewer.css'); // Remove '.DS_Store' and other hidden files find(FIREFOX_BUILD_DIR).forEach(function(file) { @@ -872,6 +892,7 @@ target.mozcentral = function() { cleanupJSSource(MOZCENTRAL_CONTENT_DIR + '/web/viewer.js'); cleanupJSSource(MOZCENTRAL_CONTENT_DIR + '/PdfJs.jsm'); cleanupJSSource(MOZCENTRAL_CONTENT_DIR + '/PdfjsChromeUtils.jsm'); + cleanupCSSSource(MOZCENTRAL_CONTENT_DIR + '/web/viewer.css'); // Remove '.DS_Store' and other hidden files find(MOZCENTRAL_DIR).forEach(function(file) { @@ -982,18 +1003,22 @@ target.chromium = function() { CHROME_BUILD_DIR], ['extensions/chromium/pageAction/*.*', CHROME_BUILD_DIR + '/pageAction'], ['external/webL10n/l10n.js', CHROME_BUILD_CONTENT_DIR + '/web'], - ['web/viewer.css', CHROME_BUILD_CONTENT_DIR + '/web'], ['external/bcmaps/*', CHROME_BUILD_CONTENT_DIR + '/web/cmaps'], ['web/locale', CHROME_BUILD_CONTENT_DIR + '/web'] ], preprocess: [ [BUILD_TARGETS, CHROME_BUILD_CONTENT_DIR + BUILD_DIR], [COMMON_WEB_FILES_PREPROCESS, CHROME_BUILD_CONTENT_DIR + '/web'] + ], + preprocessCSS: [ + ['chrome', 'web/viewer.css', + CHROME_BUILD_CONTENT_DIR + '/web/viewer.css'] ] }; builder.build(setup); cleanupJSSource(CHROME_BUILD_CONTENT_DIR + '/web/viewer.js'); + cleanupCSSSource(CHROME_BUILD_CONTENT_DIR + '/web/viewer.css'); // Update the build version number sed('-i', /PDFJSSCRIPT_VERSION/, VERSION, diff --git a/web/pdf_viewer.css b/web/pdf_viewer.css new file mode 100644 index 0000000000000..0c907fcb7dfc6 --- /dev/null +++ b/web/pdf_viewer.css @@ -0,0 +1,123 @@ +/* Copyright 2014 Mozilla Foundation + * + * 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. + */ +@import url(text_layer_builder.css); + +.pdfViewer .canvasWrapper { + overflow: hidden; +} + +.pdfViewer .page { + direction: ltr; + width: 816px; + height: 1056px; + margin: 1px auto -8px auto; + position: relative; + overflow: visible; + border: 9px solid transparent; + background-clip: content-box; + border-image: url(images/shadow.png) 9 9 repeat; + background-color: white; +} + +.pdfViewer .page canvas { + margin: 0; + display: block; +} + +.pdfViewer .page .loadingIcon { + position: absolute; + display: block; + left: 0; + top: 0; + right: 0; + bottom: 0; + background: url('images/loading-icon.gif') center no-repeat; +} + +.pdfViewer .page .annotLink > a:hover { + opacity: 0.2; + background: #ff0; + box-shadow: 0px 2px 10px #ff0; +} + +:-webkit-full-screen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +:-moz-full-screen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +:-ms-fullscreen .pdfViewer .page { + margin-bottom: 100% !important; + border: 0; +} + +:fullscreen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +.pdfViewer .page .annotationHighlight { + position: absolute; + border: 2px #FFFF99 solid; +} + +.pdfViewer .page .annotText > img { + position: absolute; + cursor: pointer; +} + +.pdfViewer .page .annotTextContentWrapper { + position: absolute; + width: 20em; +} + +.pdfViewer .page .annotTextContent { + z-index: 200; + float: left; + max-width: 20em; + background-color: #FFFF99; + box-shadow: 0px 2px 5px #333; + border-radius: 2px; + padding: 0.6em; + cursor: pointer; +} + +.pdfViewer .page .annotTextContent > h1 { + font-size: 1em; + border-bottom: 1px solid #000000; + padding-bottom: 0.2em; +} + +.pdfViewer .page .annotTextContent > p { + padding-top: 0.2em; +} + +.pdfViewer .page .annotLink > a { + position: absolute; + font-size: 1em; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.pdfViewer .page .annotLink > a /* -ms-a */ { + background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAA\ + LAAAAAABAAEAAAIBRAA7") 0 0 repeat; +} diff --git a/web/text_layer_builder.css b/web/text_layer_builder.css new file mode 100644 index 0000000000000..32f7c497b34dd --- /dev/null +++ b/web/text_layer_builder.css @@ -0,0 +1,59 @@ +/* Copyright 2014 Mozilla Foundation + * + * 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. + */ + +.textLayer { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; +} + +.textLayer > div { + color: transparent; + position: absolute; + white-space: pre; + cursor: text; + -webkit-transform-origin: 0% 0%; + -moz-transform-origin: 0% 0%; + -o-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; +} + +.textLayer .highlight { + margin: -1px; + padding: 1px; + + background-color: rgb(180, 0, 170); + border-radius: 4px; +} + +.textLayer .highlight.begin { + border-radius: 4px 0px 0px 4px; +} + +.textLayer .highlight.end { + border-radius: 0px 4px 4px 0px; +} + +.textLayer .highlight.middle { + border-radius: 0px; +} + +.textLayer .highlight.selected { + background-color: rgb(0, 100, 0); +} diff --git a/web/viewer.css b/web/viewer.css index b6974dee53b43..f202916d912e9 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -1,4 +1,4 @@ -/* Copyright 2012 Mozilla Foundation +/* Copyright 2014 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,8 @@ * limitations under the License. */ +@import url(pdf_viewer.css); + * { padding: 0; margin: 0; @@ -88,26 +90,6 @@ select { cursor: none; } -:-webkit-full-screen .page { - margin-bottom: 100%; - border: 0; -} - -:-moz-full-screen .page { - margin-bottom: 100%; - border: 0; -} - -:-ms-fullscreen .page { - margin-bottom: 100% !important; - border: 0; -} - -:fullscreen .page { - margin-bottom: 100%; - border: 0; -} - :-webkit-full-screen a:not(.internalLink) { display: none; } @@ -1264,88 +1246,6 @@ html[dir='rtl'] .attachmentsItem > button { cursor: default; } -.canvasWrapper { - overflow: hidden; -} - -canvas { - margin: 0; - display: block; -} - -.page { - direction: ltr; - width: 816px; - height: 1056px; - margin: 1px auto -8px auto; - position: relative; - overflow: visible; - border: 9px solid transparent; - background-clip: content-box; - border-image: url(images/shadow.png) 9 9 repeat; - background-color: white; -} - -.annotLink > a:hover { - opacity: 0.2; - background: #ff0; - box-shadow: 0px 2px 10px #ff0; -} - -.loadingIcon { - position: absolute; - display: block; - left: 0; - top: 0; - right: 0; - bottom: 0; - background: url('images/loading-icon.gif') center no-repeat; -} - -.textLayer { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - overflow: hidden; -} - -.textLayer > div { - color: transparent; - position: absolute; - white-space: pre; - cursor: text; - -webkit-transform-origin: 0% 0%; - -moz-transform-origin: 0% 0%; - -o-transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - transform-origin: 0% 0%; -} - -.textLayer .highlight { - margin: -1px; - padding: 1px; - - background-color: rgb(180, 0, 170); - border-radius: 4px; -} - -.textLayer .highlight.begin { - border-radius: 4px 0px 0px 4px; -} - -.textLayer .highlight.end { - border-radius: 0px 4px 4px 0px; -} - -.textLayer .highlight.middle { - border-radius: 0px; -} - -.textLayer .highlight.selected { - background-color: rgb(0, 100, 0); -} /* TODO: file FF bug to support ::-moz-selection:window-inactive so we can override the opaque grey background when the window is inactive; @@ -1359,56 +1259,6 @@ canvas { opacity: 0.2; } -.annotationHighlight { - position: absolute; - border: 2px #FFFF99 solid; -} - -.annotText > img { - position: absolute; - cursor: pointer; -} - -.annotTextContentWrapper { - position: absolute; - width: 20em; -} - -.annotTextContent { - z-index: 200; - float: left; - max-width: 20em; - background-color: #FFFF99; - box-shadow: 0px 2px 5px #333; - border-radius: 2px; - padding: 0.6em; - cursor: pointer; -} - -.annotTextContent > h1 { - font-size: 1em; - border-bottom: 1px solid #000000; - padding-bottom: 0.2em; -} - -.annotTextContent > p { - padding-top: 0.2em; -} - -.annotLink > a { - position: absolute; - font-size: 1em; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.annotLink > a /* -ms-a */ { - background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAA\ - LAAAAAABAAEAAAIBRAA7") 0 0 repeat; -} - #errorWrapper { background: none repeat scroll 0 0 #FF5555; color: white; diff --git a/web/viewer.html b/web/viewer.html index 471d0361a368f..b89d9aed51c0f 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -300,7 +300,7 @@