Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make the caret visible in the text layer in caret browsing mode #17533

Merged
merged 1 commit into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/display/base_factory.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class BaseFilterFactory {
return "none";
}

addHighlightHCMFilter(fgColor, bgColor, newFgColor, newBgColor) {
addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {
return "none";
}

Expand Down
83 changes: 50 additions & 33 deletions src/display/display_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,7 @@ class DOMFilterFactory extends BaseFilterFactory {

#document;

#hcmFilter;

#hcmKey;

#hcmUrl;

#hcmHighlightFilter;

#hcmHighlightKey;

#hcmHighlightUrl;
#_hcmCache;

#id = 0;

Expand All @@ -81,6 +71,10 @@ class DOMFilterFactory extends BaseFilterFactory {
return (this.#_cache ||= new Map());
}

get #hcmCache() {
return (this.#_hcmCache ||= new Map());
}

get #defs() {
if (!this.#_defs) {
const div = this.#document.createElement("div");
Expand Down Expand Up @@ -161,16 +155,28 @@ class DOMFilterFactory extends BaseFilterFactory {

addHCMFilter(fgColor, bgColor) {
const key = `${fgColor}-${bgColor}`;
if (this.#hcmKey === key) {
return this.#hcmUrl;
const filterName = "base";
let info = this.#hcmCache.get(filterName);
if (info?.key === key) {
return info.url;
}

this.#hcmKey = key;
this.#hcmUrl = "none";
this.#hcmFilter?.remove();
if (info) {
info.filter?.remove();
info.key = key;
info.url = "none";
info.filter = null;
} else {
info = {
key,
url: "none",
filter: null,
};
this.#hcmCache.set(filterName, info);
}

if (!fgColor || !bgColor) {
return this.#hcmUrl;
return info.url;
}

const fgRGB = this.#getRGB(fgColor);
Expand All @@ -183,7 +189,7 @@ class DOMFilterFactory extends BaseFilterFactory {
(fgColor === "#000000" && bgColor === "#ffffff") ||
fgColor === bgColor
) {
return this.#hcmUrl;
return info.url;
}

// https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_Colors_and_Luminance
Expand All @@ -203,7 +209,7 @@ class DOMFilterFactory extends BaseFilterFactory {
const table = map.join(",");

const id = `g_${this.#docId}_hcm_filter`;
const filter = (this.#hcmHighlightFilter = this.#createFilter(id));
const filter = (info.filter = this.#createFilter(id));
this.#addTransferMapConversion(table, table, table, filter);
this.#addGrayConversion(filter);

Expand All @@ -223,22 +229,33 @@ class DOMFilterFactory extends BaseFilterFactory {
filter
);

this.#hcmUrl = `url(#${id})`;
return this.#hcmUrl;
info.url = `url(#${id})`;
return info.url;
}

addHighlightHCMFilter(fgColor, bgColor, newFgColor, newBgColor) {
addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {
const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;
if (this.#hcmHighlightKey === key) {
return this.#hcmHighlightUrl;
let info = this.#hcmCache.get(filterName);
if (info?.key === key) {
return info.url;
}

this.#hcmHighlightKey = key;
this.#hcmHighlightUrl = "none";
this.#hcmHighlightFilter?.remove();
if (info) {
info.filter?.remove();
info.key = key;
info.url = "none";
info.filter = null;
} else {
info = {
key,
url: "none",
filter: null,
};
this.#hcmCache.set(filterName, info);
}

if (!fgColor || !bgColor) {
return this.#hcmHighlightUrl;
return info.url;
}

const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));
Expand Down Expand Up @@ -294,8 +311,8 @@ class DOMFilterFactory extends BaseFilterFactory {
return arr.join(",");
};

const id = `g_${this.#docId}_hcm_highlight_filter`;
const filter = (this.#hcmHighlightFilter = this.#createFilter(id));
const id = `g_${this.#docId}_hcm_${filterName}_filter`;
const filter = (info.filter = this.#createFilter(id));

this.#addGrayConversion(filter);
this.#addTransferMapConversion(
Expand All @@ -305,12 +322,12 @@ class DOMFilterFactory extends BaseFilterFactory {
filter
);

this.#hcmHighlightUrl = `url(#${id})`;
return this.#hcmHighlightUrl;
info.url = `url(#${id})`;
return info.url;
}

destroy(keepHCM = false) {
if (keepHCM && (this.#hcmUrl || this.#hcmHighlightUrl)) {
if (keepHCM && this.#hcmCache.size !== 0) {
return;
}
if (this.#_defs) {
Expand Down
1 change: 0 additions & 1 deletion web/annotation_layer_builder.css
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
--input-disabled-border-color: GrayText;
--input-hover-border-color: Highlight;
--link-outline: 1.5px solid LinkText;
--hcm-highlight-filter: invert(100%);

.textWidgetAnnotation :is(input, textarea):required,
.choiceWidgetAnnotation select:required,
Expand Down
11 changes: 11 additions & 0 deletions web/pdf_page_view.js
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,17 @@ class PDFPageView {
this._container?.style.setProperty(
"--hcm-highlight-filter",
pdfPage.filterFactory.addHighlightHCMFilter(
"highlight",
"CanvasText",
"Canvas",
"HighlightText",
"Highlight"
)
);
this._container?.style.setProperty(
"--hcm-highlight-selected-filter",
pdfPage.filterFactory.addHighlightHCMFilter(
"highlight_selected",
"CanvasText",
"Canvas",
"HighlightText",
Expand Down
5 changes: 5 additions & 0 deletions web/pdf_viewer.css
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@
--scale-factor: 1;

padding-bottom: var(--pdfViewer-padding-bottom);

--hcm-highlight-filter: none;
@media screen and (forced-colors: active) {
--hcm-highlight-filter: invert(100%);
}
}

.pdfViewer .canvasWrapper {
Expand Down
11 changes: 11 additions & 0 deletions web/pdf_viewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -884,12 +884,23 @@ class PDFViewer {
this.viewer.style.setProperty(
"--hcm-highlight-filter",
pdfDocument.filterFactory.addHighlightHCMFilter(
"highlight",
"CanvasText",
"Canvas",
"HighlightText",
"Highlight"
)
);
this.viewer.style.setProperty(
"--hcm-highlight-selected-filter",
pdfDocument.filterFactory.addHighlightHCMFilter(
"highlight_selected",
"CanvasText",
"Canvas",
"HighlightText",
"ButtonText"
)
);
}

for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
Expand Down
25 changes: 18 additions & 7 deletions web/text_layer_builder.css
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@
text-align: initial;
inset: 0;
overflow: hidden;
opacity: 0.25;
opacity: 1;
Snuffleupagus marked this conversation as resolved.
Show resolved Hide resolved
line-height: 1;
text-size-adjust: none;
forced-color-adjust: none;
transform-origin: 0 0;
z-index: 2;
caret-color: CanvasText;

&.drawing {
touch-action: none;
Expand All @@ -47,17 +48,25 @@
/*#endif*/

.highlight {
--highlight-bg-color: rgb(180 0 170);
--highlight-selected-bg-color: rgb(0 100 0);
--highlight-bg-color: rgb(180 0 170 / 0.25);
--highlight-selected-bg-color: rgb(0 100 0 / 0.25);
--highlight-backdrop-filter: none;
--highlight-selected-backdrop-filter: none;
--mix-blend-mode: exclusion;

@media screen and (forced-colors: active) {
--highlight-bg-color: Highlight;
--highlight-selected-bg-color: ButtonText;
--highlight-bg-color: transparent;
--highlight-selected-bg-color: transparent;
--highlight-backdrop-filter: var(--hcm-highlight-filter);
--highlight-selected-backdrop-filter: var(
--hcm-highlight-selected-filter
);
}

margin: -1px;
padding: 1px;
background-color: var(--highlight-bg-color);
backdrop-filter: var(--highlight-backdrop-filter);
border-radius: 4px;

&.appended {
Expand All @@ -78,14 +87,16 @@

&.selected {
background-color: var(--highlight-selected-bg-color);
backdrop-filter: var(--highlight-selected-backdrop-filter);
}
}

::selection {
/*#if !MOZCENTRAL*/
background: blue;
background: rgba(0 0 255 / 0.25);
/*#endif*/
background: AccentColor; /* stylelint-disable-line declaration-block-no-duplicate-properties */
/* stylelint-disable-next-line declaration-block-no-duplicate-properties */
background: color-mix(in srgb, AccentColor, transparent 75%);
}

/* Avoids https://github.com/mozilla/pdf.js/issues/13840 in Chrome */
Expand Down