From 5b93cc102cc4ab45d28b7abc4230136da27d2e78 Mon Sep 17 00:00:00 2001
From: Yury Delendik <ydelendik@mozilla.com>
Date: Wed, 10 Sep 2014 11:10:04 -0500
Subject: [PATCH 1/2] Adds css import preprocessing

---
 external/builder/builder.js | 22 +++++++++++++++++-----
 make.js                     | 31 ++++++++++++++++++++++++++++---
 2 files changed, 45 insertions(+), 8 deletions(-)

diff --git a/external/builder/builder.js b/external/builder/builder.js
index 044741d88..637e35d75 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 e257c11a9..278c505e0 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,

From 70a093573750945c78995e923ee4220ea850d079 Mon Sep 17 00:00:00 2001
From: Yury Delendik <ydelendik@mozilla.com>
Date: Tue, 30 Sep 2014 10:48:29 -0500
Subject: [PATCH 2/2] Move text_layer_builder and pdf_viewer styles out

---
 web/pdf_viewer.css         | 123 +++++++++++++++++++++++++++++
 web/text_layer_builder.css |  59 ++++++++++++++
 web/viewer.css             | 156 +------------------------------------
 web/viewer.html            |   2 +-
 4 files changed, 186 insertions(+), 154 deletions(-)
 create mode 100644 web/pdf_viewer.css
 create mode 100644 web/text_layer_builder.css

diff --git a/web/pdf_viewer.css b/web/pdf_viewer.css
new file mode 100644
index 000000000..0c907fcb7
--- /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 000000000..32f7c497b
--- /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 b6974dee5..f202916d9 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 471d0361a..b89d9aed5 100644
--- a/web/viewer.html
+++ b/web/viewer.html
@@ -300,7 +300,7 @@ http://sourceforge.net/adobe/cmap/wiki/License/
         </menu>
 
         <div id="viewerContainer" tabindex="0">
-          <div id="viewer"></div>
+          <div id="viewer" class="pdfViewer"></div>
         </div>
 
         <div id="errorWrapper" hidden='true'>