Merge pull request #11771 from Snuffleupagus/issue-11762
Fail early, in modern `GENERIC` builds, if certain required browser functionality is missing (issue 11762)
This commit is contained in:
		
						commit
						7ed71a0d7c
					
				
							
								
								
									
										4
									
								
								external/dist/lib/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								external/dist/lib/README.md
									
									
									
									
										vendored
									
									
								
							| @ -3,5 +3,5 @@ pre-built library as found in e.g. the `/build`, `/web`, and `/image_decoders` | |||||||
| folders in the root of this repository. | folders in the root of this repository. | ||||||
| 
 | 
 | ||||||
| Please note that the "lib" build target exists mostly to enable unit-testing in | Please note that the "lib" build target exists mostly to enable unit-testing in | ||||||
| Node.js/Travis, and that you'll need to handle e.g. any Node.js dependencies | Node.js/Travis, and that you'll need to handle e.g. any necessary polyfills | ||||||
| yourself if using the files in this folder. | and/or Node.js dependencies yourself if using the files in this folder. | ||||||
|  | |||||||
							
								
								
									
										175
									
								
								gulpfile.js
									
									
									
									
									
								
							
							
						
						
									
										175
									
								
								gulpfile.js
									
									
									
									
									
								
							| @ -1150,92 +1150,105 @@ gulp.task("jsdoc", function(done) { | |||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | function buildLib(defines, dir) { | ||||||
|  |   // When we create a bundle, webpack is run on the source and it will replace
 | ||||||
|  |   // require with __webpack_require__. When we want to use the real require,
 | ||||||
|  |   // __non_webpack_require__ has to be used.
 | ||||||
|  |   // In this target, we don't create a bundle, so we have to replace the
 | ||||||
|  |   // occurences of __non_webpack_require__ ourselves.
 | ||||||
|  |   function babelPluginReplaceNonWebPackRequire(babel) { | ||||||
|  |     return { | ||||||
|  |       visitor: { | ||||||
|  |         Identifier(curPath, state) { | ||||||
|  |           if (curPath.node.name === "__non_webpack_require__") { | ||||||
|  |             curPath.replaceWith(babel.types.identifier("require")); | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |   function preprocess(content) { | ||||||
|  |     var skipBabel = | ||||||
|  |       bundleDefines.SKIP_BABEL || /\/\*\s*no-babel-preset\s*\*\//.test(content); | ||||||
|  |     content = preprocessor2.preprocessPDFJSCode(ctx, content); | ||||||
|  |     content = babel.transform(content, { | ||||||
|  |       sourceType: "module", | ||||||
|  |       presets: skipBabel ? undefined : ["@babel/preset-env"], | ||||||
|  |       plugins: [ | ||||||
|  |         "@babel/plugin-transform-modules-commonjs", | ||||||
|  |         [ | ||||||
|  |           "@babel/plugin-transform-runtime", | ||||||
|  |           { | ||||||
|  |             helpers: false, | ||||||
|  |             regenerator: true, | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |         babelPluginReplaceNonWebPackRequire, | ||||||
|  |       ], | ||||||
|  |     }).code; | ||||||
|  |     var removeCjsSrc = /^(var\s+\w+\s*=\s*(_interopRequireDefault\()?require\(".*?)(?:\/src)(\/[^"]*"\)\)?;)$/gm; | ||||||
|  |     content = content.replace(removeCjsSrc, (all, prefix, interop, suffix) => { | ||||||
|  |       return prefix + suffix; | ||||||
|  |     }); | ||||||
|  |     return licenseHeaderLibre + content; | ||||||
|  |   } | ||||||
|  |   var babel = require("@babel/core"); | ||||||
|  |   var versionInfo = getVersionJSON(); | ||||||
|  |   var bundleDefines = builder.merge(defines, { | ||||||
|  |     BUNDLE_VERSION: versionInfo.version, | ||||||
|  |     BUNDLE_BUILD: versionInfo.commit, | ||||||
|  |     TESTING: process.env["TESTING"] === "true", | ||||||
|  |   }); | ||||||
|  |   var ctx = { | ||||||
|  |     rootPath: __dirname, | ||||||
|  |     saveComments: false, | ||||||
|  |     defines: bundleDefines, | ||||||
|  |     map: { | ||||||
|  |       "pdfjs-lib": "../pdf", | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  |   var licenseHeaderLibre = fs | ||||||
|  |     .readFileSync("./src/license_header_libre.js") | ||||||
|  |     .toString(); | ||||||
|  |   var preprocessor2 = require("./external/builder/preprocessor2.js"); | ||||||
|  |   return merge([ | ||||||
|  |     gulp.src( | ||||||
|  |       [ | ||||||
|  |         "src/{core,display,shared}/*.js", | ||||||
|  |         "!src/shared/{cffStandardStrings,fonts_utils}.js", | ||||||
|  |         "src/{pdf,pdf.worker}.js", | ||||||
|  |       ], | ||||||
|  |       { base: "src/" } | ||||||
|  |     ), | ||||||
|  |     gulp.src( | ||||||
|  |       ["examples/node/domstubs.js", "web/*.js", "!web/{pdfjs,viewer}.js"], | ||||||
|  |       { base: "." } | ||||||
|  |     ), | ||||||
|  |     gulp.src("test/unit/*.js", { base: "." }), | ||||||
|  |   ]) | ||||||
|  |     .pipe(transform("utf8", preprocess)) | ||||||
|  |     .pipe(gulp.dest(dir)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| gulp.task( | gulp.task( | ||||||
|   "lib", |   "lib", | ||||||
|   gulp.series("buildnumber", "default_preferences", function() { |   gulp.series("buildnumber", "default_preferences", function() { | ||||||
|     // When we create a bundle, webpack is run on the source and it will replace
 |     var defines = builder.merge(DEFINES, { GENERIC: true, LIB: true }); | ||||||
|     // require with __webpack_require__. When we want to use the real require,
 | 
 | ||||||
|     // __non_webpack_require__ has to be used.
 |     return buildLib(defines, "build/lib/"); | ||||||
|     // In this target, we don't create a bundle, so we have to replace the
 |   }) | ||||||
|     // occurences of __non_webpack_require__ ourselves.
 | ); | ||||||
|     function babelPluginReplaceNonWebPackRequire(babel) { | 
 | ||||||
|       return { | gulp.task( | ||||||
|         visitor: { |   "lib-es5", | ||||||
|           Identifier(curPath, state) { |   gulp.series("buildnumber", "default_preferences", function() { | ||||||
|             if (curPath.node.name === "__non_webpack_require__") { |     var defines = builder.merge(DEFINES, { | ||||||
|               curPath.replaceWith(babel.types.identifier("require")); |  | ||||||
|             } |  | ||||||
|           }, |  | ||||||
|         }, |  | ||||||
|       }; |  | ||||||
|     } |  | ||||||
|     function preprocess(content) { |  | ||||||
|       var skipBabel = |  | ||||||
|         bundleDefines.SKIP_BABEL || |  | ||||||
|         /\/\*\s*no-babel-preset\s*\*\//.test(content); |  | ||||||
|       content = preprocessor2.preprocessPDFJSCode(ctx, content); |  | ||||||
|       content = babel.transform(content, { |  | ||||||
|         sourceType: "module", |  | ||||||
|         presets: skipBabel ? undefined : ["@babel/preset-env"], |  | ||||||
|         plugins: [ |  | ||||||
|           "@babel/plugin-transform-modules-commonjs", |  | ||||||
|           [ |  | ||||||
|             "@babel/plugin-transform-runtime", |  | ||||||
|             { |  | ||||||
|               helpers: false, |  | ||||||
|               regenerator: true, |  | ||||||
|             }, |  | ||||||
|           ], |  | ||||||
|           babelPluginReplaceNonWebPackRequire, |  | ||||||
|         ], |  | ||||||
|       }).code; |  | ||||||
|       var removeCjsSrc = /^(var\s+\w+\s*=\s*(_interopRequireDefault\()?require\(".*?)(?:\/src)(\/[^"]*"\)\)?;)$/gm; |  | ||||||
|       content = content.replace( |  | ||||||
|         removeCjsSrc, |  | ||||||
|         (all, prefix, interop, suffix) => { |  | ||||||
|           return prefix + suffix; |  | ||||||
|         } |  | ||||||
|       ); |  | ||||||
|       return licenseHeaderLibre + content; |  | ||||||
|     } |  | ||||||
|     var babel = require("@babel/core"); |  | ||||||
|     var versionInfo = getVersionJSON(); |  | ||||||
|     var bundleDefines = builder.merge(DEFINES, { |  | ||||||
|       GENERIC: true, |       GENERIC: true, | ||||||
|       LIB: true, |       LIB: true, | ||||||
|       BUNDLE_VERSION: versionInfo.version, |       SKIP_BABEL: false, | ||||||
|       BUNDLE_BUILD: versionInfo.commit, |  | ||||||
|       TESTING: process.env["TESTING"] === "true", |  | ||||||
|     }); |     }); | ||||||
|     var ctx = { | 
 | ||||||
|       rootPath: __dirname, |     return buildLib(defines, "build/lib-es5/"); | ||||||
|       saveComments: false, |  | ||||||
|       defines: bundleDefines, |  | ||||||
|       map: { |  | ||||||
|         "pdfjs-lib": "../pdf", |  | ||||||
|       }, |  | ||||||
|     }; |  | ||||||
|     var licenseHeaderLibre = fs |  | ||||||
|       .readFileSync("./src/license_header_libre.js") |  | ||||||
|       .toString(); |  | ||||||
|     var preprocessor2 = require("./external/builder/preprocessor2.js"); |  | ||||||
|     return merge([ |  | ||||||
|       gulp.src( |  | ||||||
|         [ |  | ||||||
|           "src/{core,display,shared}/*.js", |  | ||||||
|           "!src/shared/{cffStandardStrings,fonts_utils}.js", |  | ||||||
|           "src/{pdf,pdf.worker}.js", |  | ||||||
|         ], |  | ||||||
|         { base: "src/" } |  | ||||||
|       ), |  | ||||||
|       gulp.src( |  | ||||||
|         ["examples/node/domstubs.js", "web/*.js", "!web/{pdfjs,viewer}.js"], |  | ||||||
|         { base: "." } |  | ||||||
|       ), |  | ||||||
|       gulp.src("test/unit/*.js", { base: "." }), |  | ||||||
|     ]) |  | ||||||
|       .pipe(transform("utf8", preprocess)) |  | ||||||
|       .pipe(gulp.dest("build/lib/")); |  | ||||||
|   }) |   }) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| @ -1371,7 +1384,7 @@ gulp.task("baseline", function(done) { | |||||||
| 
 | 
 | ||||||
| gulp.task( | gulp.task( | ||||||
|   "unittestcli", |   "unittestcli", | ||||||
|   gulp.series("testing-pre", "lib", function(done) { |   gulp.series("testing-pre", "lib-es5", function(done) { | ||||||
|     var options = [ |     var options = [ | ||||||
|       "node_modules/jasmine/bin/jasmine", |       "node_modules/jasmine/bin/jasmine", | ||||||
|       "JASMINE_CONFIG_PATH=test/unit/clitests.json", |       "JASMINE_CONFIG_PATH=test/unit/clitests.json", | ||||||
|  | |||||||
| @ -136,6 +136,21 @@ var WorkerMessageHandler = { | |||||||
|             "; thus breaking e.g. `for...in` iteration of `Array`s." |             "; thus breaking e.g. `for...in` iteration of `Array`s." | ||||||
|         ); |         ); | ||||||
|       } |       } | ||||||
|  | 
 | ||||||
|  |       // Ensure that (primarily) Node.js users won't accidentally attempt to use
 | ||||||
|  |       // a non-translated/non-polyfilled build of the library, since that would
 | ||||||
|  |       // quickly fail anyway because of missing functionality (such as e.g.
 | ||||||
|  |       // `ReadableStream).
 | ||||||
|  |       if ( | ||||||
|  |         (typeof PDFJSDev === "undefined" || PDFJSDev.test("SKIP_BABEL")) && | ||||||
|  |         typeof ReadableStream === "undefined" | ||||||
|  |       ) { | ||||||
|  |         throw new Error( | ||||||
|  |           "The browser/environment lacks native support for critical " + | ||||||
|  |             "functionality used by the PDF.js library (e.g. `ReadableStream`); " + | ||||||
|  |             "please use an ES5-compatible build instead." | ||||||
|  |         ); | ||||||
|  |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     var docId = docParams.docId; |     var docId = docParams.docId; | ||||||
|  | |||||||
| @ -14,11 +14,9 @@ | |||||||
|  */ |  */ | ||||||
| /* eslint no-var: error */ | /* eslint no-var: error */ | ||||||
| 
 | 
 | ||||||
| // Skip compatibility checks for modern builds (unless we're running the
 | // Skip compatibility checks for modern builds and if we already ran the module.
 | ||||||
| // unit-tests in Node.js/Travis) and if we already ran the module.
 |  | ||||||
| if ( | if ( | ||||||
|   (typeof PDFJSDev === "undefined" || |   (typeof PDFJSDev === "undefined" || !PDFJSDev.test("SKIP_BABEL")) && | ||||||
|     PDFJSDev.test("!SKIP_BABEL || (LIB && TESTING)")) && |  | ||||||
|   (typeof globalThis === "undefined" || !globalThis._pdfjsCompatibilityChecked) |   (typeof globalThis === "undefined" || !globalThis._pdfjsCompatibilityChecked) | ||||||
| ) { | ) { | ||||||
|   // Provides support for globalThis in legacy browsers.
 |   // Provides support for globalThis in legacy browsers.
 | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
|   "spec_dir": "build/lib/test/unit", |   "spec_dir": "build/lib-es5/test/unit", | ||||||
| 
 | 
 | ||||||
|   "helpers": [ |   "helpers": [ | ||||||
|     "clitests_helper.js" |     "clitests_helper.js" | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user