Move the permissions handling into the BaseViewer (PR 11789 follow-up)
				
					
				
			Besides making the permissions-functionality directly available in the viewer-components, these changes are also necessary for the next patch.
This commit is contained in:
		
							parent
							
								
									d856ed9395
								
							
						
					
					
						commit
						b03281de18
					
				
							
								
								
									
										35
									
								
								web/app.js
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								web/app.js
									
									
									
									
									
								
							@ -51,7 +51,6 @@ import {
 | 
				
			|||||||
  MissingPDFException,
 | 
					  MissingPDFException,
 | 
				
			||||||
  OPS,
 | 
					  OPS,
 | 
				
			||||||
  PDFWorker,
 | 
					  PDFWorker,
 | 
				
			||||||
  PermissionFlag,
 | 
					 | 
				
			||||||
  shadow,
 | 
					  shadow,
 | 
				
			||||||
  UnexpectedResponseException,
 | 
					  UnexpectedResponseException,
 | 
				
			||||||
  UNSUPPORTED_FEATURES,
 | 
					  UNSUPPORTED_FEATURES,
 | 
				
			||||||
@ -82,7 +81,6 @@ import { ViewHistory } from "./view_history.js";
 | 
				
			|||||||
const DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; // ms
 | 
					const DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; // ms
 | 
				
			||||||
const FORCE_PAGES_LOADED_TIMEOUT = 10000; // ms
 | 
					const FORCE_PAGES_LOADED_TIMEOUT = 10000; // ms
 | 
				
			||||||
const WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; // ms
 | 
					const WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; // ms
 | 
				
			||||||
const ENABLE_PERMISSIONS_CLASS = "enablePermissions";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ViewOnLoad = {
 | 
					const ViewOnLoad = {
 | 
				
			||||||
  UNKNOWN: -1,
 | 
					  UNKNOWN: -1,
 | 
				
			||||||
@ -530,6 +528,7 @@ const PDFViewerApplication = {
 | 
				
			|||||||
      enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"),
 | 
					      enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"),
 | 
				
			||||||
      useOnlyCssZoom: AppOptions.get("useOnlyCssZoom"),
 | 
					      useOnlyCssZoom: AppOptions.get("useOnlyCssZoom"),
 | 
				
			||||||
      maxCanvasPixels: AppOptions.get("maxCanvasPixels"),
 | 
					      maxCanvasPixels: AppOptions.get("maxCanvasPixels"),
 | 
				
			||||||
 | 
					      enablePermissions: AppOptions.get("enablePermissions"),
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    pdfRenderingQueue.setViewer(this.pdfViewer);
 | 
					    pdfRenderingQueue.setViewer(this.pdfViewer);
 | 
				
			||||||
    pdfLinkService.setViewer(this.pdfViewer);
 | 
					    pdfLinkService.setViewer(this.pdfViewer);
 | 
				
			||||||
@ -841,7 +840,6 @@ const PDFViewerApplication = {
 | 
				
			|||||||
      this.pdfLinkService.setDocument(null);
 | 
					      this.pdfLinkService.setDocument(null);
 | 
				
			||||||
      this.pdfDocumentProperties.setDocument(null);
 | 
					      this.pdfDocumentProperties.setDocument(null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    webViewerResetPermissions();
 | 
					 | 
				
			||||||
    this.pdfLinkService.externalLinkEnabled = true;
 | 
					    this.pdfLinkService.externalLinkEnabled = true;
 | 
				
			||||||
    this._fellback = false;
 | 
					    this._fellback = false;
 | 
				
			||||||
    this.store = null;
 | 
					    this.store = null;
 | 
				
			||||||
@ -1326,10 +1324,6 @@ const PDFViewerApplication = {
 | 
				
			|||||||
            pdfViewer.focus();
 | 
					            pdfViewer.focus();
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          // Currently only the "copy"-permission is supported, hence we delay
 | 
					 | 
				
			||||||
          // the `getPermissions` API call until *after* rendering has started.
 | 
					 | 
				
			||||||
          this._initializePermissions(pdfDocument);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          // For documents with different page sizes, once all pages are
 | 
					          // For documents with different page sizes, once all pages are
 | 
				
			||||||
          // resolved, ensure that the correct location becomes visible on load.
 | 
					          // resolved, ensure that the correct location becomes visible on load.
 | 
				
			||||||
          // (To reduce the risk, in very large and/or slow loading documents,
 | 
					          // (To reduce the risk, in very large and/or slow loading documents,
 | 
				
			||||||
@ -1709,24 +1703,6 @@ const PDFViewerApplication = {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
   * @private
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  async _initializePermissions(pdfDocument) {
 | 
					 | 
				
			||||||
    const permissions = await pdfDocument.getPermissions();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (pdfDocument !== this.pdfDocument) {
 | 
					 | 
				
			||||||
      return; // The document was closed while the permissions resolved.
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (!permissions || !AppOptions.get("enablePermissions")) {
 | 
					 | 
				
			||||||
      return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // Currently only the "copy"-permission is supported.
 | 
					 | 
				
			||||||
    if (!permissions.includes(PermissionFlag.COPY)) {
 | 
					 | 
				
			||||||
      this.appConfig.viewerContainer.classList.add(ENABLE_PERMISSIONS_CLASS);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * @private
 | 
					   * @private
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
@ -2335,15 +2311,6 @@ function webViewerOpenFileViaURL(file) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function webViewerResetPermissions() {
 | 
					 | 
				
			||||||
  const { appConfig } = PDFViewerApplication;
 | 
					 | 
				
			||||||
  if (!appConfig) {
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  // Currently only the "copy"-permission is supported.
 | 
					 | 
				
			||||||
  appConfig.viewerContainer.classList.remove(ENABLE_PERMISSIONS_CLASS);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function webViewerPageRendered({ pageNumber, error }) {
 | 
					function webViewerPageRendered({ pageNumber, error }) {
 | 
				
			||||||
  // If the page is still visible when it has finished rendering,
 | 
					  // If the page is still visible when it has finished rendering,
 | 
				
			||||||
  // ensure that the page number input loading indicator is hidden.
 | 
					  // ensure that the page number input loading indicator is hidden.
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,7 @@
 | 
				
			|||||||
import {
 | 
					import {
 | 
				
			||||||
  AnnotationMode,
 | 
					  AnnotationMode,
 | 
				
			||||||
  createPromiseCapability,
 | 
					  createPromiseCapability,
 | 
				
			||||||
 | 
					  PermissionFlag,
 | 
				
			||||||
  PixelsPerInch,
 | 
					  PixelsPerInch,
 | 
				
			||||||
  version,
 | 
					  version,
 | 
				
			||||||
} from "pdfjs-lib";
 | 
					} from "pdfjs-lib";
 | 
				
			||||||
@ -53,6 +54,7 @@ import { TextLayerBuilder } from "./text_layer_builder.js";
 | 
				
			|||||||
import { XfaLayerBuilder } from "./xfa_layer_builder.js";
 | 
					import { XfaLayerBuilder } from "./xfa_layer_builder.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const DEFAULT_CACHE_SIZE = 10;
 | 
					const DEFAULT_CACHE_SIZE = 10;
 | 
				
			||||||
 | 
					const ENABLE_PERMISSIONS_CLASS = "enablePermissions";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const PagesCountLimit = {
 | 
					const PagesCountLimit = {
 | 
				
			||||||
  FORCE_SCROLL_MODE_PAGE: 15000,
 | 
					  FORCE_SCROLL_MODE_PAGE: 15000,
 | 
				
			||||||
@ -95,6 +97,8 @@ const PagesCountLimit = {
 | 
				
			|||||||
 *   total pixels, i.e. width * height. Use -1 for no limit. The default value
 | 
					 *   total pixels, i.e. width * height. Use -1 for no limit. The default value
 | 
				
			||||||
 *   is 4096 * 4096 (16 mega-pixels).
 | 
					 *   is 4096 * 4096 (16 mega-pixels).
 | 
				
			||||||
 * @property {IL10n} l10n - Localization service.
 | 
					 * @property {IL10n} l10n - Localization service.
 | 
				
			||||||
 | 
					 * @property {boolean} [enablePermissions] - Enables PDF document permissions,
 | 
				
			||||||
 | 
					 *   when they exist. The default value is `false`.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PDFPageViewBuffer {
 | 
					class PDFPageViewBuffer {
 | 
				
			||||||
@ -171,6 +175,8 @@ class PDFPageViewBuffer {
 | 
				
			|||||||
class BaseViewer {
 | 
					class BaseViewer {
 | 
				
			||||||
  #buffer = null;
 | 
					  #buffer = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  #enablePermissions = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #previousContainerHeight = 0;
 | 
					  #previousContainerHeight = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #scrollModePageState = null;
 | 
					  #scrollModePageState = null;
 | 
				
			||||||
@ -227,6 +233,7 @@ class BaseViewer {
 | 
				
			|||||||
    this.useOnlyCssZoom = options.useOnlyCssZoom || false;
 | 
					    this.useOnlyCssZoom = options.useOnlyCssZoom || false;
 | 
				
			||||||
    this.maxCanvasPixels = options.maxCanvasPixels;
 | 
					    this.maxCanvasPixels = options.maxCanvasPixels;
 | 
				
			||||||
    this.l10n = options.l10n || NullL10n;
 | 
					    this.l10n = options.l10n || NullL10n;
 | 
				
			||||||
 | 
					    this.#enablePermissions = options.enablePermissions || false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.defaultRenderingQueue = !options.renderingQueue;
 | 
					    this.defaultRenderingQueue = !options.renderingQueue;
 | 
				
			||||||
    if (this.defaultRenderingQueue) {
 | 
					    if (this.defaultRenderingQueue) {
 | 
				
			||||||
@ -472,10 +479,20 @@ class BaseViewer {
 | 
				
			|||||||
    return this.pdfDocument ? this._pagesCapability.promise : null;
 | 
					    return this.pdfDocument ? this._pagesCapability.promise : null;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  #initializePermissions(permissions, pdfDocument) {
 | 
				
			||||||
   * @private
 | 
					    if (pdfDocument !== this.pdfDocument) {
 | 
				
			||||||
   */
 | 
					      return; // The document was closed while the permissions resolved.
 | 
				
			||||||
  _onePageRenderedOrForceFetch() {
 | 
					    }
 | 
				
			||||||
 | 
					    if (!permissions || !this.#enablePermissions) {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Currently only the "copy"-permission is supported.
 | 
				
			||||||
 | 
					    if (!permissions.includes(PermissionFlag.COPY)) {
 | 
				
			||||||
 | 
					      this.viewer.classList.add(ENABLE_PERMISSIONS_CLASS);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  #onePageRenderedOrForceFetch() {
 | 
				
			||||||
    // Unless the viewer *and* its pages are visible, rendering won't start and
 | 
					    // Unless the viewer *and* its pages are visible, rendering won't start and
 | 
				
			||||||
    // `this._onePageRenderedCapability` thus won't be resolved.
 | 
					    // `this._onePageRenderedCapability` thus won't be resolved.
 | 
				
			||||||
    // To ensure that automatic printing, on document load, still works even in
 | 
					    // To ensure that automatic printing, on document load, still works even in
 | 
				
			||||||
@ -520,6 +537,7 @@ class BaseViewer {
 | 
				
			|||||||
    const firstPagePromise = pdfDocument.getPage(1);
 | 
					    const firstPagePromise = pdfDocument.getPage(1);
 | 
				
			||||||
    // Rendering (potentially) depends on this, hence fetching it immediately.
 | 
					    // Rendering (potentially) depends on this, hence fetching it immediately.
 | 
				
			||||||
    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();
 | 
					    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();
 | 
				
			||||||
 | 
					    const permissionsPromise = pdfDocument.getPermissions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Given that browsers don't handle huge amounts of DOM-elements very well,
 | 
					    // Given that browsers don't handle huge amounts of DOM-elements very well,
 | 
				
			||||||
    // enforce usage of PAGE-scrolling when loading *very* long/large documents.
 | 
					    // enforce usage of PAGE-scrolling when loading *very* long/large documents.
 | 
				
			||||||
@ -564,10 +582,11 @@ class BaseViewer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Fetch a single page so we can get a viewport that will be the default
 | 
					    // Fetch a single page so we can get a viewport that will be the default
 | 
				
			||||||
    // viewport for all pages
 | 
					    // viewport for all pages
 | 
				
			||||||
    firstPagePromise
 | 
					    Promise.all([firstPagePromise, permissionsPromise])
 | 
				
			||||||
      .then(firstPdfPage => {
 | 
					      .then(([firstPdfPage, permissions]) => {
 | 
				
			||||||
        this._firstPageCapability.resolve(firstPdfPage);
 | 
					        this._firstPageCapability.resolve(firstPdfPage);
 | 
				
			||||||
        this._optionalContentConfigPromise = optionalContentConfigPromise;
 | 
					        this._optionalContentConfigPromise = optionalContentConfigPromise;
 | 
				
			||||||
 | 
					        this.#initializePermissions(permissions, pdfDocument);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const viewerElement =
 | 
					        const viewerElement =
 | 
				
			||||||
          this._scrollMode === ScrollMode.PAGE ? null : this.viewer;
 | 
					          this._scrollMode === ScrollMode.PAGE ? null : this.viewer;
 | 
				
			||||||
@ -626,7 +645,7 @@ class BaseViewer {
 | 
				
			|||||||
        // Fetch all the pages since the viewport is needed before printing
 | 
					        // Fetch all the pages since the viewport is needed before printing
 | 
				
			||||||
        // starts to create the correct size canvas. Wait until one page is
 | 
					        // starts to create the correct size canvas. Wait until one page is
 | 
				
			||||||
        // rendered so we don't tie up too many resources early on.
 | 
					        // rendered so we don't tie up too many resources early on.
 | 
				
			||||||
        this._onePageRenderedOrForceFetch().then(async () => {
 | 
					        this.#onePageRenderedOrForceFetch().then(async () => {
 | 
				
			||||||
          if (this.findController) {
 | 
					          if (this.findController) {
 | 
				
			||||||
            this.findController.setDocument(pdfDocument); // Enable searching.
 | 
					            this.findController.setDocument(pdfDocument); // Enable searching.
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@ -750,6 +769,9 @@ class BaseViewer {
 | 
				
			|||||||
    this.viewer.textContent = "";
 | 
					    this.viewer.textContent = "";
 | 
				
			||||||
    // ... and reset the Scroll mode CSS class(es) afterwards.
 | 
					    // ... and reset the Scroll mode CSS class(es) afterwards.
 | 
				
			||||||
    this._updateScrollMode();
 | 
					    this._updateScrollMode();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Reset all PDF document permissions.
 | 
				
			||||||
 | 
					    this.viewer.classList.remove(ENABLE_PERMISSIONS_CLASS);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #ensurePageViewVisible() {
 | 
					  #ensurePageViewVisible() {
 | 
				
			||||||
 | 
				
			|||||||
@ -141,6 +141,11 @@
 | 
				
			|||||||
  background: none;
 | 
					  background: none;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.pdfViewer.enablePermissions .textLayer span {
 | 
				
			||||||
 | 
					  user-select: none !important;
 | 
				
			||||||
 | 
					  cursor: not-allowed;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.pdfPresentationMode .pdfViewer {
 | 
					.pdfPresentationMode .pdfViewer {
 | 
				
			||||||
  padding-bottom: 0;
 | 
					  padding-bottom: 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -204,11 +204,6 @@ select {
 | 
				
			|||||||
  display: none !important;
 | 
					  display: none !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.pdfViewer.enablePermissions .textLayer span {
 | 
					 | 
				
			||||||
  user-select: none !important;
 | 
					 | 
				
			||||||
  cursor: not-allowed;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#viewerContainer.pdfPresentationMode:fullscreen {
 | 
					#viewerContainer.pdfPresentationMode:fullscreen {
 | 
				
			||||||
  top: 0;
 | 
					  top: 0;
 | 
				
			||||||
  background-color: rgba(0, 0, 0, 1);
 | 
					  background-color: rgba(0, 0, 0, 1);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user