Bug 1947961 - Implement basic "update pseudo-element styles" steps. r=view-transitions-reviewers,boris
Pretty bare bones (some properties missing), but this allows the transition pseudo-elements to be in the right place. We need to implement live capturing / integrate nical's work to display the "new" image properly, but we'll get to that. Meanwhile this should be uncontroversial. Differential Revision: https://phabricator.services.mozilla.com/D238005
This commit is contained in:
@@ -4630,66 +4630,7 @@ static Element* SearchViewTransitionPseudo(const Element* aElement,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Element* root = vt->GetRoot();
|
||||
if (!root) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (aRequest.mType == PseudoStyleType::viewTransition) {
|
||||
return root;
|
||||
}
|
||||
|
||||
// Linear search ::view-transition-group by |aRequest.mIdentifier|.
|
||||
// Note: perhaps we can add a hashtable to improve the performance if it's
|
||||
// common that there are a lot of view-transition-names.
|
||||
Element* group = root->GetFirstElementChild();
|
||||
for (; group; group = group->GetNextElementSibling()) {
|
||||
MOZ_ASSERT(group->HasName(),
|
||||
"The generated ::view-transition-group() should have a name");
|
||||
nsAtom* name = group->GetParsedAttr(nsGkAtoms::name)->GetAtomValue();
|
||||
if (name == aRequest.mIdentifier) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// No one specifies view-transition-name or we mismatch all names.
|
||||
if (!group) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (aRequest.mType == PseudoStyleType::viewTransitionGroup) {
|
||||
return group;
|
||||
}
|
||||
|
||||
Element* imagePair = group->GetFirstElementChild();
|
||||
MOZ_ASSERT(imagePair, "::view-transition-image-pair() should exist always");
|
||||
if (aRequest.mType == PseudoStyleType::viewTransitionImagePair) {
|
||||
return imagePair;
|
||||
}
|
||||
|
||||
Element* child = imagePair->GetFirstElementChild();
|
||||
// Neither ::view-transition-old() nor ::view-transition-new() doesn't exist.
|
||||
if (!child) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Check if the first element matches our request.
|
||||
const PseudoStyleType type = child->GetPseudoElementType();
|
||||
if (type == aRequest.mType) {
|
||||
return child;
|
||||
}
|
||||
|
||||
// Since the second child is either ::view-transition-new() or nullptr, so we
|
||||
// can reject viewTransitionOld request here.
|
||||
if (aRequest.mType == PseudoStyleType::viewTransitionOld) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
child = child->GetNextElementSibling();
|
||||
MOZ_ASSERT(aRequest.mType == PseudoStyleType::viewTransitionNew);
|
||||
MOZ_ASSERT(!child || !child->GetNextElementSibling(),
|
||||
"No more psuedo elements in this subtree");
|
||||
return child;
|
||||
return vt->FindPseudo(aRequest);
|
||||
}
|
||||
|
||||
Element* Element::GetPseudoElement(const PseudoStyleRequest& aRequest) const {
|
||||
|
||||
Reference in New Issue
Block a user