summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/pdf/elements/viewer-ink-host')
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/BUILD.gn19
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/viewer-ink-host.html19
-rw-r--r--chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/viewer-ink-host.js332
3 files changed, 0 insertions, 370 deletions
diff --git a/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/BUILD.gn b/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/BUILD.gn
deleted file mode 100644
index 32ca2b04311..00000000000
--- a/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-js_type_check("closure_compile") {
- deps = [
- ":viewer-ink-host",
- ]
-}
-
-js_library("viewer-ink-host") {
- deps = [
- "//chrome/browser/resources/pdf:metrics",
- "//chrome/browser/resources/pdf:viewport",
- "//chrome/browser/resources/pdf/ink:ink_api",
- ]
-}
diff --git a/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/viewer-ink-host.html b/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/viewer-ink-host.html
deleted file mode 100644
index 1a7a2ff73ea..00000000000
--- a/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/viewer-ink-host.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-
-<dom-module id="viewer-ink-host">
- <template>
- <style>
- :host {
- visibility: hidden;
- }
- iframe {
- border: 0;
- height: 100%;
- pointer-events: none;
- width: 100%;
- }
- </style>
- <iframe id=frame></iframe>
- </template>
- <script src="viewer-ink-host.js"></script>
-</dom-module>
diff --git a/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/viewer-ink-host.js b/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/viewer-ink-host.js
deleted file mode 100644
index 285edf8a35d..00000000000
--- a/chromium/chrome/browser/resources/pdf/elements/viewer-ink-host/viewer-ink-host.js
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/** @enum {string} */
-const State = {
- LOADING: 'loading',
- ACTIVE: 'active',
- IDLE: 'idle'
-};
-
-const BACKGROUND_COLOR = '#525659';
-
-/**
- * Hosts the Ink component which is responsible for both PDF rendering and
- * annotation when in annotation mode.
- */
-Polymer({
- is: 'viewer-ink-host',
-
- /** @private {InkAPI} */
- ink_: null,
-
- /** @private {?string} */
- fileName_: null,
-
- /** @private {ArrayBuffer} */
- buffer_: null,
-
- /** @private {State} */
- state_: State.IDLE,
-
- /** @private {PointerEvent} */
- activePointer_: null,
-
- /** @private {?number} */
- lastZoom_: null,
-
- /**
- * Used to conditionally allow a 'touchstart' event to cause
- * a gesture. If we receive a 'touchstart' with this timestamp
- * we will skip calling `preventDefault()`.
- * @private {?number}
- */
- allowTouchStartTimeStamp_: null,
-
- /** @private {boolean} */
- penMode_: false,
-
- /** @type {?Viewport} */
- viewport: null,
-
- /** @type {?AnnotationTool} */
- tool_: null,
-
- /**
- * Whether we should suppress pointer events due to a gesture,
- * eg. pinch-zoom.
- *
- * @private {boolean}
- */
- pointerGesture_: false,
-
- listeners: {
- pointerdown: 'onPointerDown_',
- pointerup: 'onPointerUpOrCancel_',
- pointermove: 'onPointerMove_',
- pointercancel: 'onPointerUpOrCancel_',
- pointerleave: 'onPointerLeave_',
- touchstart: 'onTouchStart_',
- },
-
- /** Turns off pen mode if it is active. */
- resetPenMode() {
- this.penMode_ = false;
- },
-
- /** @param {AnnotationTool} tool */
- setAnnotationTool(tool) {
- this.tool_ = tool;
- if (this.state_ == State.ACTIVE) {
- this.ink_.setAnnotationTool(tool);
- }
- },
-
- /** @param {PointerEvent} e */
- isActivePointer_: function(e) {
- return this.activePointer_ && this.activePointer_.pointerId == e.pointerId;
- },
-
- /**
- * Dispatches a pointer event to Ink.
- *
- * @param {PointerEvent} e
- */
- dispatchPointerEvent_: function(e) {
- // TODO(dstockwell) come up with a solution to propagate e.timeStamp.
- this.ink_.dispatchPointerEvent(e.type, {
- pointerId: e.pointerId,
- pointerType: e.pointerType,
- clientX: e.clientX,
- clientY: e.clientY,
- pressure: e.pressure,
- buttons: e.buttons,
- });
- },
-
- /** @param {TouchEvent} e */
- onTouchStart_: function(e) {
- if (e.timeStamp !== this.allowTouchStartTimeStamp_) {
- e.preventDefault();
- }
- this.allowTouchStartTimeStamp_ = null;
- },
-
- /** @param {PointerEvent} e */
- onPointerDown_: function(e) {
- if (e.pointerType == 'mouse' && e.buttons != 1 || this.pointerGesture_) {
- return;
- }
-
- if (e.pointerType == 'pen') {
- this.penMode_ = true;
- }
-
- if (this.activePointer_) {
- if (this.activePointer_.pointerType == 'touch' &&
- e.pointerType == 'touch') {
- // A multi-touch gesture has started with the active pointer. Cancel
- // the active pointer and suppress further events until it is released.
- this.pointerGesture_ = true;
- this.ink_.dispatchPointerEvent('pointercancel', {
- pointerId: this.activePointer_.pointerId,
- pointerType: this.activePointer_.pointerType,
- });
- }
- return;
- }
-
- if (!this.viewport.isPointInsidePage({x: e.clientX, y: e.clientY}) &&
- (e.pointerType == 'touch' || e.pointerType == 'pen')) {
- // If a touch or pen is outside the page, we allow pan gestures to start.
- this.allowTouchStartTimeStamp_ = e.timeStamp;
- return;
- }
-
- if (e.pointerType == 'touch' && this.penMode_) {
- // If we see a touch after having seen a pen, we allow touches to start
- // pan gestures anywhere and suppress all touches from drawing.
- this.allowTouchStartTimeStamp_ = e.timeStamp;
- return;
- }
-
- this.activePointer_ = e;
- this.dispatchPointerEvent_(e);
- },
-
- /** @param {PointerEvent} e */
- onPointerLeave_: function(e) {
- if (e.pointerType != 'mouse' || !this.isActivePointer_(e)) {
- return;
- }
- this.onPointerUpOrCancel_(new PointerEvent('pointerup', e));
- },
-
- /** @param {PointerEvent} e */
- onPointerUpOrCancel_: function(e) {
- if (!this.isActivePointer_(e)) {
- return;
- }
- this.activePointer_ = null;
- if (!this.pointerGesture_) {
- this.dispatchPointerEvent_(e);
- // If the stroke was not cancelled (type == pointercanel),
- // notify about mutation and record metrics.
- if (e.type == 'pointerup') {
- this.dispatchEvent(new CustomEvent('stroke-added'));
- if (e.pointerType == 'mouse') {
- PDFMetrics.record(PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_MOUSE);
- } else if (e.pointerType == 'pen') {
- PDFMetrics.record(PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_PEN);
- } else if (e.pointerType == 'touch') {
- PDFMetrics.record(PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_TOUCH);
- }
- if (this.tool_.tool == 'eraser') {
- PDFMetrics.record(PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_ERASER);
- } else if (this.tool_.tool == 'pen') {
- PDFMetrics.record(PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_PEN);
- } else if (this.tool_.tool == 'highlighter') {
- PDFMetrics.record(
- PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_HIGHLIGHTER);
- }
- }
- }
- this.pointerGesture_ = false;
- },
-
- /** @param {PointerEvent} e */
- onPointerMove_: function(e) {
- if (!this.isActivePointer_(e) || this.pointerGesture_) {
- return;
- }
-
- let events = e.getCoalescedEvents();
- if (events.length == 0) {
- events = [e];
- }
- for (const event of events) {
- this.dispatchPointerEvent_(event);
- }
- },
-
- /**
- * Begins annotation mode with the document represented by `data`.
- * When the return value resolves the Ink component will be ready
- * to render immediately.
- *
- * @param {string} fileName The name of the PDF file.
- * @param {!ArrayBuffer} data The contents of the PDF document.
- * @return {!Promise} void value.
- */
- load: async function(fileName, data) {
- this.fileName_ = fileName;
- this.state_ = State.LOADING;
- this.$.frame.src = 'ink/index.html';
- await new Promise(resolve => this.$.frame.onload = resolve);
- this.ink_ = await this.$.frame.contentWindow.initInk();
- this.ink_.addUndoStateListener(
- e => this.dispatchEvent(
- new CustomEvent('undo-state-changed', {detail: e})));
- this.ink_.setPDF(data);
- this.state_ = State.ACTIVE;
- this.viewportChanged();
- // Wait for the next task to avoid a race where Ink drops the background
- // color.
- await new Promise(resolve => setTimeout(resolve));
- this.ink_.setOutOfBoundsColor(BACKGROUND_COLOR);
- const spacing = Viewport.PAGE_SHADOW.top + Viewport.PAGE_SHADOW.bottom;
- this.ink_.setPageSpacing(spacing);
- this.style.visibility = 'visible';
- },
-
- viewportChanged: function() {
- if (this.state_ != State.ACTIVE) {
- return;
- }
- const viewport = this.viewport;
- const pos = viewport.position;
- const size = viewport.size;
- const zoom = viewport.getZoom();
- const documentWidth = viewport.getDocumentDimensions().width * zoom;
- // Adjust for page shadows.
- const y = pos.y - Viewport.PAGE_SHADOW.top * zoom;
- let x = pos.x - Viewport.PAGE_SHADOW.left * zoom;
- // Center the document if the width is smaller than the viewport.
- if (documentWidth < size.width) {
- x += (documentWidth - size.width) / 2;
- }
- // Invert the Y-axis and convert Pixels to Points.
- const pixelsToPoints = 72 / 96;
- const scale = pixelsToPoints / zoom;
- const camera = {
- top: (-y) * scale,
- left: (x) * scale,
- right: (x + size.width) * scale,
- bottom: (-y - size.height) * scale,
- };
- // Ink doesn't scale the shadow, so we must update it each time the zoom
- // changes.
- if (this.lastZoom_ !== zoom) {
- this.lastZoom_ = zoom;
- this.updateShadow_(zoom);
- }
- this.ink_.setCamera(camera);
- },
-
- /** Undo the last edit action. */
- undo() {
- this.ink_.undo();
- },
-
- /** Redo the last undone edit action. */
- redo() {
- this.ink_.redo();
- },
-
- /**
- * @return {!Promise<{fileName: string, dataToSave: ArrayBuffer}>}
- * The serialized PDF document including any annotations that were made.
- */
- saveDocument: async function() {
- if (this.state_ == State.ACTIVE) {
- this.buffer_ = await this.ink_.getPDFDestructive().buffer;
- this.state_ = State.IDLE;
- }
- return {
- fileName: /** @type {string} */ (this.fileName_),
- dataToSave: this.buffer_,
- };
- },
-
- /** @param {number} zoom */
- updateShadow_(zoom) {
- const boxWidth = (50 * zoom) |0;
- const shadowWidth = (8 * zoom) |0;
- const width = boxWidth + shadowWidth * 2 + 2;
- const boxOffset = (width - boxWidth) / 2;
-
- const canvas = document.createElement('canvas');
- canvas.width = width;
- canvas.height = width;
-
- const ctx = canvas.getContext('2d');
- ctx.fillStyle = 'black';
- ctx.shadowColor = 'black';
- ctx.shadowBlur = shadowWidth;
- ctx.fillRect(boxOffset, boxOffset, boxWidth, boxWidth);
- ctx.shadowBlur = 0;
-
- // 9-piece markers
- for (let i = 0; i < 4; i++) {
- ctx.fillStyle = 'white';
- ctx.fillRect(0, 0, width, 1);
- ctx.fillStyle = 'black';
- ctx.fillRect(shadowWidth + 1, 0, boxWidth, 1);
- ctx.rotate(0.5 * Math.PI);
- ctx.translate(0, -width);
- }
-
- this.ink_.setBorderImage(canvas.toDataURL());
- }
-});