Граф коммитов

11677 Коммитов

Автор SHA1 Сообщение Дата
Masayuki Nakano ee7a27d122 Bug 1922149 - Make `HTMLEditor::ComputeEditingHostInternal` use common ancestor of all selection ranges r=m_kato
Selection ranges can cross editing host boundaries if no editing host has focus.
Therefore, `Selection.focusNode` may be in an editing host but there may be
no active/focused editing host.

The computation may be expensive if there are a lot of ranges and selecting
in slotted shadow tree.  However, it's rare case, so, I think it's okay for
now.

Differential Revision: https://phabricator.services.mozilla.com/D224282
2024-10-07 23:06:55 +00:00
Masayuki Nakano 2dc15e652e Bug 1922457 - Get rid of `editor.block_inline_check.use_computed_style` pref r=m_kato
It was shipped in 123 and now in the ESR.  We don't have regression report in
the wild.  So, it must be fine to get rid of the pref.

Differential Revision: https://phabricator.services.mozilla.com/D224559
2024-10-07 23:05:15 +00:00
Masayuki Nakano dd16910196 Bug 1921162 - part 1: Make `HTMLEditor` handle `Enter` key press as `insertLineBreak` if it's in `contenteditable=plaintext-only` r=m_kato
Chrome treats `Enter` key press as `insertLineBreak` instead of
`insertParagraph`.  Additionally, Chrome handles `insertParagraph` command
work as same as when `contenteditable=true`.  Therefore, `HTMLEditor` needs
to change the behavior at handling `eKeyPress` event.

Depends on D224184

Differential Revision: https://phabricator.services.mozilla.com/D224185
2024-10-04 00:08:45 +00:00
Masayuki Nakano ede8ff25ca Bug 1921701 - Update `test_bug430392.html` for the new behavior changed in bug 1921705 r=m_kato
Before bug 1921705, the first `ArrowRight` key press moves caret to end of the
non-editable character "A".  Therefore, nothing is changed by pressing `Enter`
nor `Backspace`.  However, `beforeinput` events are fired due to bug 1921700.

In bug 1921705, we fix the caret move issue.  Then, this test starts editing.
Therefore, `input` events should be fired as same as `beforeinput` events.
Additionally, due to the complicated collapsible white-space handling, some
results are not same as original text content.  Therefore, we need to adjust
the expected results.

Depends on D224183

Differential Revision: https://phabricator.services.mozilla.com/D224184
2024-10-03 02:39:22 +00:00
Masayuki Nakano dc004f95b6 Bug 1920646 - part 2: Make `HTMLEditor` handle `insertHTML` as inserting plaintext converted from given source r=m_kato
Differential Revision: https://phabricator.services.mozilla.com/D223909
2024-10-02 21:42:10 +00:00
Masayuki Nakano 7e9bbe23c8 Bug 1920646 - part 1: Make `HTMLEditor` paste/drop things as plaintext when `contenteditable=plaintext-only` r=m_kato
Chrome sets `beforeinput.data` instead of `beforeinput.dataTransfer`, but
Input Events Level 2 spec defines that browsers should set `dataTransfer` when
**contenteditable** [1].  Therefore, the new WPT expects `dataTransfer`.

However, it's unclear that the `dataTransfer` should have `text/html` or only
`text/plain`.  From web apps point of view, `text/html` data may make them
serialize the rich text format to plaintext without any dependencies of browsers
and OS.  On the other hand, they cannot distinguish whether the user tries to
paste with or without formatting when `contenteditable=true`.  Therefore, I
filed a spec issue for this.  We need to be back later about this issue.

1. https://w3c.github.io/input-events/#overview
2. https://github.com/w3c/input-events/issues/162

Differential Revision: https://phabricator.services.mozilla.com/D223908
2024-10-02 21:42:09 +00:00
Masayuki Nakano 7fe5d3ae1c Bug 1920647 - part 2: Make `nsITableEditor` methods do not modify the DOM if editing host is `plaintext-only` r=m_kato
Differential Revision: https://phabricator.services.mozilla.com/D223670
2024-10-01 04:21:54 +00:00
Masayuki Nakano ef73f35608 Bug 1920647 - part 1: Make `HTMLEditor` won't show Gecko specific editing UI in `contenteditable=plaintext-only` r=m_kato
Depends on D223277

Differential Revision: https://phabricator.services.mozilla.com/D223669
2024-10-01 04:21:54 +00:00
Masayuki Nakano 20a5213d23 Bug 1920622 - Make the style setter public methods of `HTMLEditor` stop handling their jobs if the editing host is `plaintext-only` r=m_kato
Unfortunately, (even tough we're the last implementor of this feature`,) there
are not editing behavior tests in web-platform tests.  Therefore, this patch
creates new `plaintext-only` directory into `editing` and make the feature
enabled in its `__dir__.ini` to check the implementing behavior with new tests.

This patch also changes how to compute the editing host (whether using `<body>`
or not when selection is outside it), but the new behavior (not limited in the
`<body>`) should work fine in the most cases and I believe that it's better
than current implementation in some methods.

Note that Chrome considers whether the style should be updated or not with
the closest inclusive ancestor of the **focus node** of `Selection`.  However,
it's odd and aligning to the behavior requires bigger change.  Therefore, I'd
like to implement this feature only with checking the focused editing host.

Differential Revision: https://phabricator.services.mozilla.com/D223277
2024-09-30 21:35:42 +00:00
Gregory Pappas 73916fe623 Bug 1920268 - Remove unnecessary MochiKit.js includes in tests (editor/libeditor/) r=masayuki
Depends on D223029

Differential Revision: https://phabricator.services.mozilla.com/D223030
2024-09-23 22:35:39 +00:00
Masayuki Nakano df7aad424e Bug 1916081 - Make `HTMLEditor::FocusedElementOrDocumentBecomesNotEditable` stop using `aHTMLEditor` at adjusting IME state r=m_kato
`aHTMLEditor` may be `nullptr` and there may have been an `HTMLEditor` before
it's called.  Therefore, it may need to adjust IME state even if `aHTMLEditor`
is `nullptr`.  So, it should adjust IME state from `aDocument` which should be
same as `aHTMLEditor->GetDocument()` if `aHTMLEditor` is not `nullptr`.

Note that if `IMEStateManager` thinks another `nsPresContext` has focus, it does
not touch IME state.  Therefore, it's safe to skip checking the focus state of
the `Document`.

Differential Revision: https://phabricator.services.mozilla.com/D220772
2024-09-05 00:52:58 +00:00
Masayuki Nakano c13abd36f2 Bug 1915057 - Make `HTMLEditor::NotifyRootChanged()` notifies `IMEStateManager` of the editor root change r=smaug,m_kato
When `HTMLEditor` handles the design mode, `IMEContentObserver` observes the
`<body>` if there is.  However, web apps may remove it.  Then, we need to
recreate `IMEContentObserver` with emulating a focus move because it's difficult
to compute the difference between the old root and the new root (IME focus
notification sends all content to the parent, it's faster in most cases in this
situation). This was fixed in bug 1911010.  However, there are remaining issues
after that.

When new `<body>` or the original `<body>` is connected again,
`IMEContentObserver` does not restart to observe the new `<body>`.  So,
`IMEContentObserver` working differently after the `<body>` is even temporarily
removed.  This make it harder to reproduce reported bugs.

Additionally, if the document element is removed, `IMEContentObserver` won't
be recreated until the document gets focus again even after new root and/or
`<body>` element is connected.  This makes IME users inconvenient with such
tricky editors.

This patch makes `HTMLEditor::NotifyRootChanged` notifies `IMEStateManager`
of the editor root element change.  Then, the new method of `IMEStateManager`
updates IME enabled state and recreate `IMEContentObserver` with emulating
a focus move.

Differential Revision: https://phabricator.services.mozilla.com/D220362
2024-09-05 00:35:50 +00:00
Norisz Fay 31c9c0f6e5 Backed out changeset 3138300cf7c8 (bug 1916081) for causing Wc failures on replace_documentElement_children_after_window_closed.html CLOSED TREE 2024-09-04 06:58:57 +03:00
Masayuki Nakano 3f1398db93 Bug 1916081 - Make `HTMLEditor::FocusedElementOrDocumentBecomesNotEditable` stop using `aHTMLEditor` at adjusting IME state r=m_kato
`aHTMLEditor` may be `nullptr` and there may have been an `HTMLEditor` before
it's called.  Therefore, it may need to adjust IME state even if `aHTMLEditor`
is `nullptr`.  So, it should adjust IME state from `aDocument` which should be
same as `aHTMLEditor->GetDocument()` if `aHTMLEditor` is not `nullptr`.

Note that if `IMEStateManager` thinks another `nsPresContext` has focus, it does
not touch IME state.  Therefore, it's safe to skip checking the focus state of
the `Document`.

Differential Revision: https://phabricator.services.mozilla.com/D220772
2024-09-04 01:57:51 +00:00
Olli Pettay e1fad67026 Bug 1914513 - Add a pref to disable mutation events, r=masayuki
Differential Revision: https://phabricator.services.mozilla.com/D219934
2024-09-02 13:29:57 +00:00
Masayuki Nakano b546eb7e32 Bug 1911010 - Make `IMEContentObserver` observe `ParentChainChanged` and let `IMEStateManager` know that r=smaug
`mozAutoDocUpdate` does not make it in a document change when container node
of `insertBefore` has already been removed from the tree.  Therefore, once
`IMEContentObserver::mRootElement` is removed from the DOM tree without a
focus move, `IMEContentObserver` is notified mutations not in a document change.

Similar situations are handled in `IMEStateManager::OnRemoveContent` with
emulating a focus change and that will destroy the active `IMEContentObserver`.
Therefore, if `IMEContentObserver::mRootElement` is removed, we should emulate
a focus move when `IMEStateManager` does not have focused element but there
is active `IMEContentObserver` (that means it is/was in the design mode).

However, checking whether the removed node contains the observing node of the
active `IMEContentObserver` may be expensive.  So, doing expensive things in
`IMEStateManager::OnRemoveContent` may make mutations slower.  Therefore, this
patch makes `IMEContentObserver` observe `ParentChainChanged` and it let
`IMEStateManager` know that with calling its
`OnParentChainChangedOfObservingElement`.  Finally, it calls
`IMEStateManager::OnRemoveContent` to emulate "blur" (and refocus if it's
required).

Differential Revision: https://phabricator.services.mozilla.com/D218696
2024-08-27 07:55:26 +00:00
Stanca Serban ada4e189a4 Backed out changeset 125344f9e446 (bug 1911010) for causing linux bustages in nsINode.cpp. 2024-08-27 07:54:54 +03:00
Masayuki Nakano b9ef2f71b3 Bug 1911010 - Make `IMEContentObserver` observe `ParentChainChanged` and let `IMEStateManager` know that r=smaug
`mozAutoDocUpdate` does not make it in a document change when container node
of `insertBefore` has already been removed from the tree.  Therefore, once
`IMEContentObserver::mRootElement` is removed from the DOM tree without a
focus move, `IMEContentObserver` is notified mutations not in a document change.

Similar situations are handled in `IMEStateManager::OnRemoveContent` with
emulating a focus change and that will destroy the active `IMEContentObserver`.
Therefore, if `IMEContentObserver::mRootElement` is removed, we should emulate
a focus move when `IMEStateManager` does not have focused element but there
is active `IMEContentObserver` (that means it is/was in the design mode).

However, checking whether the removed node contains the observing node of the
active `IMEContentObserver` may be expensive.  So, doing expensive things in
`IMEStateManager::OnRemoveContent` may make mutations slower.  Therefore, this
patch makes `IMEContentObserver` observe `ParentChainChanged` and it let
`IMEStateManager` know that with calling its
`OnParentChainChangedOfObservingElement`.  Finally, it calls
`IMEStateManager::OnRemoveContent` to emulate "blur" (and refocus if it's
required).

Differential Revision: https://phabricator.services.mozilla.com/D218696
2024-08-27 00:39:49 +00:00
Masayuki Nakano 66d2f119a5 Bug 1906559 - Make `AutoInlineStyleSetter::OnHandled()` never set point in `aContent` if it's not a container r=m_kato
When `HTMLEditor::InsertLinkAroundSelectionAsAction()` calls
`HTMLEditor::SetInlinePropertiesAsSubAction()`, it adds 2 elements to the array.
One is for `_moz_dirty` attribute and the other is for `href` attribute because
`InsertTagCommand::DoCommandParam()` uses
`HTMLEditor::CreateElementWithDefaults()`.

Then, `HTMLEditor::SetInlinePropertiesAsSubAction()` wraps the `<img>` into
`<a _moz_dirty="">` with calling `AutoInlineStyleSetter::ApplyStyle()`. Then,
it calls `OnHandle()` with the `<img>` and it collapse the applied range into
the `<img>`.  Therefore, when `SetInlinePropertiesAsSubAction()` handles `href`,
there is only collapsed range and it just puts the style into the cache for
applying the style when the user types new text.

So, first, `OnHandle()` should not set the boundary points of the applied range
into non-container node. And also `InsertLinkAroundSelectionAsAction()` should
ignore `_moz_dirty` attribute because if it's truly required,
`AutoInlineStyleSetter` should set the attribute to every new element.

Note that this causes new failure in `editing/run/fontname.html?1001-200`,
but it was accidentally passed.  The case is, `queryCommandValue("fontname")`
result after calling `execCommand("fontname", false, "sans-serif")` for
`foo<tt>{<br></tt>}bar`.  The result of the DOM tree is
`foo<tt><font face="sans-serif"><br></font></tt>bar` and `Selection` was
collapsed in the `<br>` before, but with this patch, the `<br>` is selected.
Therefore, the result is changed but similar cases in the tests fail too. So I
believe that it accidentally passed with odd `Selection`.

Differential Revision: https://phabricator.services.mozilla.com/D219127
2024-08-19 00:35:33 +00:00
Masayuki Nakano a895c665da Bug 1910800 - Make `HTMLEditor::ComputeEditingHostInternal()` stop referring `mIsInDesignMode` and refer focused element in the window r=m_kato
The method may be called without focus.  Therefore, it shouldn't refer
`mIsInDesignMode` and it should refer focused element in the window (including
shadows) if there is no selection ranges.

Differential Revision: https://phabricator.services.mozilla.com/D218726
2024-08-13 00:08:58 +00:00
Tom Schuster 52ab587ab4 Bug 1809713 - Make DataTransfer use Maybe<ClipboardType>. r=edgar
Differential Revision: https://phabricator.services.mozilla.com/D214585
2024-07-29 11:52:34 +00:00
Tom Schuster fdabe0cf72 Bug 1809713 - Use ClipboardType in editor. r=masayuki
Differential Revision: https://phabricator.services.mozilla.com/D214584
2024-07-29 11:52:33 +00:00
Makoto Kato 6b14dceb59 Bug 1149826 - Part 1. Add eContentCommandReplaceText. r=masayuki
When using autocorrect, we should use `insertReplacementText` according
to https://github.com/w3c/input-events/issues/152. So I would like to
add eContentCommandReplaceText command for this.

Also, this command has an option that is source string text. When
processing text subsitution, parent process doesn't know whether
target replaced text is modified. So I add this option for check.

Differential Revision: https://phabricator.services.mozilla.com/D213511
2024-07-26 06:38:52 +00:00
Masayuki Nakano 2cd0487511 Bug 1906727 - Make `HTMLEditor::SplitAncestorStyledInlineElementsAt` check attr value type first r=peterv
Differential Revision: https://phabricator.services.mozilla.com/D215990
2024-07-25 00:41:49 +00:00
Masayuki Nakano 33a24a0600 Bug 1909577 - Make some `nsFocusManager::GetFocusedElement()` users use its static version instead r=emilio,credential-management-reviewers,issammani
Now, we have `nsFocusManager::GetFocusedElementStatic()` which returns focused
element if the `nsFocusManager` instance is available.  Therefore, if
`nsFocusManager::GetFocusedElement()` users do not use other methods of
`nsFocusManager`, they can use `nsFocusManager::GetFocusedElementStatic()` and
make themselves simpler.

Note that some callers return early if `nsFocusManager` is not available, but
they do not return error and `nsFocusManager` instance is available in most
time of the life time of the process.  Therefore, we can simply stop using the
early return.

Differential Revision: https://phabricator.services.mozilla.com/D217527
2024-07-25 00:33:58 +00:00
Masayuki Nakano 4ec66e983c Bug 1908239 - Make `HTMLEditor::FocusedElementOrDocumentBecomesNotEditable` set `HTMLEditor::mIsInDesignMode` r=m_kato
This is a simple mistake, it does not reset `mIsInDesignMode` when it emulates
a "blur".

Additionally, I realized that it does not check whether the focused element is
in the document or not and emulates "focus" of itself it the focused element is
in a different document.  In such case, the editor shouldn't have focus, so,
this is a hidden bug, but "blur" notification may occur asynchronously.
Therefore, this could be a bug only in some edge cases.

Differential Revision: https://phabricator.services.mozilla.com/D216907
2024-07-22 14:09:34 +00:00
Sylvestre Ledru 45030f6970 Bug 1519636 - Reformat recent changes to the Google coding style r=emilio,necko-reviewers,geckoview-reviewers,application-update-reviewers,media-playback-reviewers,devtools-reviewers,anti-tracking-reviewers,profiler-reviewers,win-reviewers,migration-reviewers,padenot,mconley,nchevobbe,kershaw,gstoll,mstange,bytesized,m_kato
This new version of clang 17 also slightly changed the formatting.

# ignore-this-changeset

Differential Revision: https://phabricator.services.mozilla.com/D215914
2024-07-17 11:15:31 +00:00
Sean Feng 877a44bc34 Bug 1906388 - Ensure dragend uses the same target as dragstart r=masayuki,dom-core
Since this issue is too obvious, I am not even sure I am doing the right
thing. This looks like it should be discovered years ago....

As far as I can tell from the spec, dragstart and dragend use the same node
as the target, but it's not always the same node in Firefox.

Differential Revision: https://phabricator.services.mozilla.com/D215827
2024-07-16 14:53:18 +00:00
Masayuki Nakano 7288d5710c Bug 1798379 - Make `HTMLEditor` store whether it has/had focus and is/was in the `designMode` by itself r=m_kato
`HTMLEditor` currently checks whether it's in the `designMode` or not with
checking the `Document` node is in the `designMode`.  I.e., it checks the
real-time state of the `Document` node.  However, if an instance was in the
`designMode`, it needs to finalize `Selection` even after the `Document` node
becomes not in the `designMode`.  Additionally, elements in a shadow DOM in the
`designMode` can have `contenteditable` to make it editable.  Then, the editable
elements should works as in the `contenteditable` mode rather than in the
`designMode`.  Therefore, current `HTMLEditor::IsInDesignMode()` returns
wrong state when the finalization is called asynchronously or when an editing
host in a shadow DOM whose composed document is in the `designMode`.

This patch fixes known cases of these issues with improving the finalization
(and re-initialization with the new editing mode) and the caller side in
`Document`.

Differential Revision: https://phabricator.services.mozilla.com/D216022
2024-07-12 04:45:01 +00:00
Tamas Szentpeteri 09a574aa90 Backed out changeset 71abd7d91e8f (bug 1798379) for causing bustages related to HTMLEditor.cpp. CLOSED TREE 2024-07-12 03:39:33 +03:00
Masayuki Nakano 88ff425989 Bug 1798379 - Make `HTMLEditor` store whether it has/had focus and is/was in the `designMode` by itself r=m_kato
`HTMLEditor` currently checks whether it's in the `designMode` or not with
checking the `Document` node is in the `designMode`.  I.e., it checks the
real-time state of the `Document` node.  However, if an instance was in the
`designMode`, it needs to finalize `Selection` even after the `Document` node
becomes not in the `designMode`.  Additionally, elements in a shadow DOM in the
`designMode` can have `contenteditable` to make it editable.  Then, the editable
elements should works as in the `contenteditable` mode rather than in the
`designMode`.  Therefore, current `HTMLEditor::IsInDesignMode()` returns
wrong state when the finalization is called asynchronously or when an editing
host in a shadow DOM whose composed document is in the `designMode`.

This patch fixes known cases of these issues with improving the finalization
(and re-initialization with the new editing mode) and the caller side in
`Document`.

Differential Revision: https://phabricator.services.mozilla.com/D216022
2024-07-12 00:13:51 +00:00
Masayuki Nakano 518f238fa3 Bug 1906015 - part 2: Make the most `do_QueryInterface` users for `nsIFormControl` use new getter methods r=smaug,credential-management-reviewers,sessionstore-reviewers,sclements
Unfortunately, the following QIs are still required.
https://searchfox.org/mozilla-central/rev/cbdfa503a87597b20719aae5f6a1efccd6cb3b7b/dom/html/nsIConstraintValidation.cpp#101,121

Depends on D215576

Differential Revision: https://phabricator.services.mozilla.com/D215577
2024-07-10 00:46:59 +00:00
Otto Länd f27ae4577c Bug 1893119: apply code formatting via Lando
# ignore-this-changeset
2024-07-04 07:52:52 +00:00
David P c0b01c8672 Bug 1893119: Part 10 - Move MaybeEditorDeletedSourceNode from nsIDragService to nsIDragSession r=gstoll,masayuki
MaybeEditorDeletedSourceNode was defined on nsIDragService but is more appropriately defined on nsIDragSession.  This was not an issue previously since those were the same object.

Differential Revision: https://phabricator.services.mozilla.com/D211074
2024-07-04 07:48:06 +00:00
David P 18f01ba217 Bug 1893119: Part 5 - Fix coordinates use in dispatchDOMEventViaPresShellForTesting r=masayuki,mconley,places-reviewers,tabbrowser-reviewers,dao
Since we now add the widget to the event in
dispatchDOMEventViaPresShellForTesting, WidgetGUIEvents that are sent in
mochitests via that method need to transform their screen coordinates by
nsIWidget::WidgetToScreenOffset, to mirror the transformation by
BrowserParent::TransformParentToChild that they don't get because they
skip the parent process.

This exposes a bunch of things that were done to work around this bug.  They
are cleaned up here.

Differential Revision: https://phabricator.services.mozilla.com/D211068
2024-07-04 07:48:04 +00:00
David P 207cb76b2a Bug 1893119: Part 3 - Add widget to nsContentUtils::GetDragSession r=gstoll,rkraesig
Updates each client of the nsContentUtils method to get the right drag session -- the one for the widget that is currently the source or target of the drag session.
The change to nsDOMWindowUtils::DispatchDOMEventViaPresShellForTesting() supports the change to WidgetDragEvent::InitDropEffectForTests() and enabled a
large number of test fixes in the next patch.

Differential Revision: https://phabricator.services.mozilla.com/D211067
2024-07-04 07:48:04 +00:00
Masayuki Nakano a9a18ed278 Bug 1892514 - part 5-3: Enable the assertions in `IMEContentObserver::FlatTextCache` in some automated tests r=smaug
This patch enables the assertions when running:
* The `nsITextInputProcessor` tests
* The IME composition tests under `widget/`
* Under `editor/libeditor/tests`
* Under `editor/libeditor/crashtests`
* Under testing/web-platform/tests/editing`
* Under testing/web-platform/tests/input-events`

Differential Revision: https://phabricator.services.mozilla.com/D211835
2024-07-03 08:04:28 +00:00
Norisz Fay a67f926110 Backed out 14 changesets (bug 1892514) for causing bustage on IMEContentObserver.cpp CLOSED TREE
Backed out changeset 56d8807b6c36 (bug 1892514)
Backed out changeset 2b9fecca5d45 (bug 1892514)
Backed out changeset 153feaf168c8 (bug 1892514)
Backed out changeset 6042902c7e2f (bug 1892514)
Backed out changeset eb87fcf58d1a (bug 1892514)
Backed out changeset d9cf5bfd4c34 (bug 1892514)
Backed out changeset e65d0b826f1d (bug 1892514)
Backed out changeset 1686b6177ab0 (bug 1892514)
Backed out changeset 6ed15cfce6df (bug 1892514)
Backed out changeset ae6dd25f6e60 (bug 1892514)
Backed out changeset c514cf8a7e6d (bug 1892514)
Backed out changeset beebf7370041 (bug 1892514)
Backed out changeset dd42ed4c05f9 (bug 1892514)
Backed out changeset 71837d871833 (bug 1892514)
2024-07-03 09:07:23 +03:00
Masayuki Nakano 5fd525bf80 Bug 1892514 - part 5-3: Enable the assertions in `IMEContentObserver::FlatTextCache` in some automated tests r=smaug
This patch enables the assertions when running:
* The `nsITextInputProcessor` tests
* The IME composition tests under `widget/`
* Under `editor/libeditor/tests`
* Under `editor/libeditor/crashtests`
* Under testing/web-platform/tests/editing`
* Under testing/web-platform/tests/input-events`

Differential Revision: https://phabricator.services.mozilla.com/D211835
2024-07-03 03:54:25 +00:00
Masayuki Nakano 4354450caa Bug 1904192 - Make `TextControlState::SetValue` suppress `TextEditor` to dispatch `input` events even after dispatching `input` event during composition r=m_kato,geckoview-reviewers
`input` event listeners may be async functions and may set the text control
element value after the editor ends dispatching an `input` event.  Even in this
case, the `input` event listener should not be called recursively by committing
composition which is caused by setting the value because the value is
overwritten by the setting value which was intended by the web app.

Unfortunately, we cannot check whether the value setter is an async `input`
event listener.  Therefore, we need to suppress `input` events even after the
editor ends dispatching `input` event.

On the other hand, we should not suppress `input` event if the value is set
by a `compositionupdate` event listener which runs before the editor starts
handling the latest composition change because once we do that, the app won't
receive `input` event for the composition.  Therefore, we should not suppress
the editor starts handling the composition change (including during
`beforeinput` event dispatching, but the `beforeinput` is not cancelable, so,
the result will be odd, therefore, we have no tests for the cases).

Therefore, this patch adds a new method to `TextComposition` to make
`TextControlState::SetValue` can check whether the editor is handling the
latest composition change or after that.  So, during composition, setting
value should cause `input` events between `TextComposition` starts dispatching a
`compositionupdate` event and `EditorBase` starts handling `eCompositionChange`
event which is dispatched after `compositionupdate`.

Differential Revision: https://phabricator.services.mozilla.com/D214676
2024-06-25 03:52:54 +00:00
Masayuki Nakano 52b0fcc9a1 Bug 1897865 - Make `TextEditor` stop dispatching `beforeinput`/`input` events during committing composition caused by setting its value r=m_kato
As far as testing on Chrome, they don't dispatch any events during setting
text control value (including `compositionupdate` and `compositionend`).
However, we dispatch `compositionupdate`, `compositionend`, `beforeinput` and
`input` synchronously.  Therefore, `input` event listener may run again with
the old value.  This may make web apps confused because they may not expect
the nested `input` event listener call which is not caused by user intention
nor a `Document.execCommand` call.  Therefore, we should stop dispatching
the nested `beforeinput` and `input` events which are caused by committing
composition for setting value since the value will be updated soon, so,
the input caused by committing composition does not occur actually.  However,
`compositionend` event should be fired even in the nested event loop because
the web apps may manage whether they has a composition with a pair of
`compositionstart` and `compositionend` event listeners even though that won't
work on Chrome.

Additionally, the nested `compositionupdate` and `compositionend` event may
cause a `Document.execCommand` call.  However, that must be unexpected behavior
for web apps and anyway the value will be overwritten to the new value.
Therefore, let's make `Document::ExecCommand` do nothing in the situation.

Differential Revision: https://phabricator.services.mozilla.com/D213756
2024-06-18 00:30:49 +00:00
Masayuki Nakano 899c9b469c Bug 1675847 - part 2: Rename some methods which handle "MouseClick" r=smaug
Differential Revision: https://phabricator.services.mozilla.com/D213000
2024-06-14 00:18:46 +00:00
Masayuki Nakano 2fb07300f9 Bug 1675847 - part 1: Rename `eMouseClick` and `eMouseAuxClick` r=smaug
Differential Revision: https://phabricator.services.mozilla.com/D212999
2024-06-14 00:18:46 +00:00
Masayuki Nakano ae22ac0c53 Bug 1728566 - Make the `HTMLEditor::InsertParagraphSeparatorAsSubAction` callers compute the editing host no limited in the `<body>` r=m_kato
While handling an "insertParagraph" command, it's closed at least in the editing
host.  Therefore, it's file to use editing host outside `<body>` because it
won't make the tree messy outside the editing host.

Differential Revision: https://phabricator.services.mozilla.com/D213376
2024-06-14 00:16:17 +00:00
Andrew McCreight 1911f0174a Bug 1902344 - Remove outdated data structure references in "Using C++ in Mozilla code" and elsewhere. r=xpcom-reviewers,nika DONTBUILD
nsAutoTArray was renamed to AutoTArray.

nsDataHashtable and nsJSThingHashtable don't exist any more.

nsTHashMap and nsTHashSet now exist.

nsDeque is properly typed now.

Pair is now CompactPair.

Differential Revision: https://phabricator.services.mozilla.com/D213624
2024-06-13 22:41:51 +00:00
Gregory Pappas 82e064164d Bug 1848966 - Remove dom.document.exec_command.nested_calls_allowed pref r=masayuki
Differential Revision: https://phabricator.services.mozilla.com/D212578
2024-06-05 02:48:31 +00:00
Mike Hommey cc3cc60ea9 Bug 1900164 - Add missing empty template argument list in function call. r=masayuki
clang 19 will start complaining about it. See
https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#96

Differential Revision: https://phabricator.services.mozilla.com/D212496
2024-06-04 01:19:41 +00:00
Masayuki Nakano ed99e91ef8 Bug 1898408 - Make our editor disconnect `<br>` element temporarily when its type is changed from or to padding one r=m_kato
Currently, the `<br>` element type -- whether normal `<br>` element or padding
`<br>` element for empty editor or last line -- is managed by the flags of
`nsINode`.  Therefore, changing the flag does not cause mutation, so
`IMEContentObserver` cannot observe the type changes.  However,
`ContentEventHandler` treats the padding `<br>` elements as invisible.
Therefore, when a `<br>` element becomes a padding one, `IMEContentObserver`
needs to notify IME of atext removed notification, and also when a `<br>`
element becomes a normal one (i.e., visible), `IMEContentObserver` needs to
notify IME of a text added notification.

Therefore, this patch makes `EditorBase` disconnect the `<br>` element
temporarily to make `IMEContentObserver` observable the type change.

Depends on D211698

Differential Revision: https://phabricator.services.mozilla.com/D211699
2024-05-31 00:42:13 +00:00
Masayuki Nakano d8f302fe60 Bug 1893351 - part 2: Make `HTMLEditor::HandleInsertText` stop inserting text into existing text nodes if it's a middle line of inserting text r=m_kato
When 2nd or later line, the method inserts one-line text to start of a `Text`
node following `<br>` which is inserted by the method.  Then, splits the `Text`
node to insert another `<br>`.  This creates a lot of unnecessary
`SplitNodeTransaction`s and that causes a lot of copying memory operation to
set the data of the right `Text` node.

This patch makes the method creates a `Text` node when inserting a middle line
of inserting text.  Therefore, `SplitNodeTransaction` is created at most one
(to split a `Text` node if the caller wants to insert a text middle of it).

Depends on D211697

Differential Revision: https://phabricator.services.mozilla.com/D211698
2024-05-30 00:42:41 +00:00
Masayuki Nakano 08de69e4f7 Bug 1893351 - part 1: Add an option to make `EditorBase::InsertTextWithTransaction` always create a `Text` node r=m_kato
Differential Revision: https://phabricator.services.mozilla.com/D211697
2024-05-30 00:42:41 +00:00