Skip to content

Commit 0f354d9

Browse files
author
ntwigg
committed
Unregistering a textarea works too.
1 parent 3ab68d7 commit 0f354d9

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

browser-extension/src/datamodel/textarea-registry.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ export class TextareaRegistry {
55

66
register<T extends CommentContext>(textareaInfo: TextareaInfo<T>): void {
77
this.textareas.set(textareaInfo.element, textareaInfo);
8+
// TODO: register as a draft in progress with the global list
9+
}
10+
11+
unregisterDueToModification(textarea: HTMLTextAreaElement): void {
12+
if (this.textareas.has(textarea)) {
13+
// TODO: register as abandoned or maybe submitted with the global list
14+
this.textareas.delete(textarea);
15+
}
816
}
917

1018
get(textarea: HTMLTextAreaElement): TextareaInfo<any> | undefined {

browser-extension/src/entrypoints/content.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default defineContentScript({
1010
main() {
1111
const textAreasOnPageLoad = document.querySelectorAll<HTMLTextAreaElement>(`textarea`)
1212
for (const textarea of textAreasOnPageLoad) {
13-
initializeMaybeIsPageload(textarea, true)
13+
initializeMaybeIsPageload(textarea)
1414
}
1515
const observer = new MutationObserver(handleMutations)
1616
observer.observe(document.body, {
@@ -25,25 +25,43 @@ export default defineContentScript({
2525

2626
function handleMutations(mutations: MutationRecord[]): void {
2727
for (const mutation of mutations) {
28+
// Handle added nodes
2829
for (const node of mutation.addedNodes) {
2930
if (node.nodeType === Node.ELEMENT_NODE) {
3031
const element = node as Element
3132
if (element.tagName === 'TEXTAREA') {
32-
initializeMaybeIsPageload(element as HTMLTextAreaElement, false)
33+
initializeMaybeIsPageload(element as HTMLTextAreaElement)
3334
}
3435
// Also check for textareas within added subtrees
3536
const textareas = element.querySelectorAll?.('textarea')
3637
if (textareas) {
3738
for (const textarea of textareas) {
38-
initializeMaybeIsPageload(textarea, false)
39+
initializeMaybeIsPageload(textarea)
40+
}
41+
}
42+
}
43+
}
44+
45+
// Handle removed nodes
46+
for (const node of mutation.removedNodes) {
47+
if (node.nodeType === Node.ELEMENT_NODE) {
48+
const element = node as Element
49+
if (element.tagName === 'TEXTAREA') {
50+
textareaRegistry.unregisterDueToModification(element as HTMLTextAreaElement)
51+
}
52+
// Also check for textareas within removed subtrees
53+
const textareas = element.querySelectorAll?.('textarea')
54+
if (textareas) {
55+
for (const textarea of textareas) {
56+
textareaRegistry.unregisterDueToModification(textarea)
3957
}
4058
}
4159
}
4260
}
4361
}
4462
}
4563

46-
function initializeMaybeIsPageload(textarea: HTMLTextAreaElement, isPageload: boolean) {
64+
function initializeMaybeIsPageload(textarea: HTMLTextAreaElement) {
4765
// Check if this textarea is already registered
4866
if (textareaRegistry.get(textarea)) {
4967
logger.debug('textarea already registered {}', textarea)

0 commit comments

Comments
 (0)