mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-09 01:08:39 +09:00
Issue #2135 - Bug 1066965: Make contentEditable and spellchecking to work in Shadow DOM
This commit is contained in:
parent
b2c77e5eda
commit
010db07bf3
10 changed files with 60 additions and 30 deletions
|
|
@ -1725,10 +1725,11 @@ Element::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|||
if (!hadParent) {
|
||||
uint32_t editableDescendantChange = EditableInclusiveDescendantCount(this);
|
||||
if (editableDescendantChange != 0) {
|
||||
// If we are binding a subtree root to the document, we need to update
|
||||
// the editable descendant count of all the ancestors.
|
||||
// If we are binding a subtree root to the document, we need to update
|
||||
// the editable descendant count of all the ancestors. However, we don't
|
||||
// cross the Shadow DOM boundary (expected behavior is unclear).
|
||||
nsIContent* parent = GetParent();
|
||||
while (parent) {
|
||||
while (parent && parent->IsElement()) {
|
||||
parent->ChangeEditableDescendantCount(editableDescendantChange);
|
||||
parent = parent->GetParent();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -273,6 +273,18 @@ nsINode* nsINode::GetRootNode(const GetRootNodeOptions& aOptions)
|
|||
return SubtreeRoot();
|
||||
}
|
||||
|
||||
// TODO: was marked as constant.
|
||||
nsINode*
|
||||
nsINode::GetParentOrHostNode()
|
||||
{
|
||||
if (mParent) {
|
||||
return mParent;
|
||||
}
|
||||
|
||||
ShadowRoot* shadowRoot = ShadowRoot::FromNode(this);
|
||||
return shadowRoot ? shadowRoot->GetHost() : nullptr;
|
||||
}
|
||||
|
||||
nsINode*
|
||||
nsINode::SubtreeRoot() const
|
||||
{
|
||||
|
|
|
|||
|
|
@ -942,6 +942,12 @@ public:
|
|||
return mParent;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is similar to above, but in case 'this' is ShadowRoot, we return its
|
||||
* host element.
|
||||
*/
|
||||
nsINode* GetParentOrHostNode();
|
||||
|
||||
/**
|
||||
* Returns the node that is the parent of this node in the flattened
|
||||
* tree. This differs from the normal parent if the node is filtered
|
||||
|
|
|
|||
|
|
@ -463,7 +463,7 @@ nsGenericHTMLElement::IntrinsicState() const
|
|||
uint32_t
|
||||
nsGenericHTMLElement::EditableInclusiveDescendantCount()
|
||||
{
|
||||
bool isEditable = IsInUncomposedDoc() && HasFlag(NODE_IS_EDITABLE) &&
|
||||
bool isEditable = IsInComposedDoc() && HasFlag(NODE_IS_EDITABLE) &&
|
||||
GetContentEditableValue() == eTrue;
|
||||
return EditableDescendantCount() + isEditable;
|
||||
}
|
||||
|
|
@ -484,12 +484,14 @@ nsGenericHTMLElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|||
aDocument->
|
||||
AddToNameTable(this, GetParsedAttr(nsGkAtoms::name)->GetAtomValue());
|
||||
}
|
||||
}
|
||||
|
||||
if (HasFlag(NODE_IS_EDITABLE) && GetContentEditableValue() == eTrue) {
|
||||
nsCOMPtr<nsIHTMLDocument> htmlDocument = do_QueryInterface(aDocument);
|
||||
if (htmlDocument) {
|
||||
htmlDocument->ChangeContentEditableCount(this, +1);
|
||||
}
|
||||
if (HasFlag(NODE_IS_EDITABLE) && GetContentEditableValue() == eTrue &&
|
||||
IsInComposedDoc()) {
|
||||
nsCOMPtr<nsIHTMLDocument> htmlDocument =
|
||||
do_QueryInterface(GetComposedDoc());
|
||||
if (htmlDocument) {
|
||||
htmlDocument->ChangeContentEditableCount(this, +1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -514,8 +516,7 @@ nsGenericHTMLElement::UnbindFromTree(bool aDeep, bool aNullParent)
|
|||
RemoveFromNameTable();
|
||||
|
||||
if (GetContentEditableValue() == eTrue) {
|
||||
//XXXsmaug Fix this for Shadow DOM, bug 1066965.
|
||||
nsCOMPtr<nsIHTMLDocument> htmlDocument = do_QueryInterface(GetUncomposedDoc());
|
||||
nsCOMPtr<nsIHTMLDocument> htmlDocument = do_QueryInterface(GetComposedDoc());
|
||||
if (htmlDocument) {
|
||||
htmlDocument->ChangeContentEditableCount(this, -1);
|
||||
}
|
||||
|
|
@ -2774,8 +2775,7 @@ MakeContentDescendantsEditable(nsIContent *aContent, nsIDocument *aDocument)
|
|||
void
|
||||
nsGenericHTMLElement::ChangeEditableState(int32_t aChange)
|
||||
{
|
||||
//XXXsmaug Fix this for Shadow DOM, bug 1066965.
|
||||
nsIDocument* document = GetUncomposedDoc();
|
||||
nsIDocument* document = GetComposedDoc();
|
||||
if (!document) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -2788,7 +2788,8 @@ nsGenericHTMLElement::ChangeEditableState(int32_t aChange)
|
|||
}
|
||||
|
||||
nsIContent* parent = GetParent();
|
||||
while (parent) {
|
||||
// Don't update across Shadow DOM boundary.
|
||||
while (parent && parent->IsElement()) {
|
||||
parent->ChangeEditableDescendantCount(aChange);
|
||||
parent = parent->GetParent();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue