Closed Bug 693145 Opened 13 years ago Closed 13 years ago

simplify class animation processing

Categories

(Core :: SVG, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla10

People

(Reporter: longsonr, Assigned: longsonr)

References

Details

Attachments

(1 file, 3 obsolete files)

If we move all processing to nsSVGStylableElement then we don't need virtual methods in nsSVGElement to animate class attributes.
Attached patch patch (obsolete) — Splinter Review
Assignee: nobody → longsonr
Attachment #565794 - Flags: review?(dholbert)
Comment on attachment 565794 [details] [diff] [review]
patch

Drive-by nits:

>--- a/content/svg/content/src/nsSVGClass.cpp
>+++ b/content/svg/content/src/nsSVGClass.cpp

>+#include "nsSVGStylableElement.h"
> #include "nsSVGClass.h"

Foo.h should be included first in Foo.cpp, to ensure Foo.h compiles on it own.

>+nsSVGClass::GetBaseValue(nsAString& aValue, nsSVGStylableElement *aSVGElement) const
>+{
>+  aSVGElement->GetAttr(kNameSpaceID_None, nsGkAtoms::_class, aValue);

aSVGElement can be const.

>--- a/content/svg/content/src/nsSVGStylableElement.cpp
>+++ b/content/svg/content/src/nsSVGStylableElement.cpp

>+nsSVGStylableElement::ParseAttribute(PRInt32 aNamespaceID,
>+                                     nsIAtom* aAttribute,
>+                                     const nsAString& aValue,
>+                                     nsAttrValue& aResult)
>+{
>+  if (aAttribute == nsGkAtoms::_class) {
>+    mClassAttribute.SetBaseValue(aValue, this, PR_FALSE);
>+    aResult.ParseAtomArray(aValue);
>+    return PR_TRUE;

false/true
(In reply to Ms2ger from comment #2)
> Comment on attachment 565794 [details] [diff] [review] [diff] [details] [review]
> patch
> 
> Drive-by nits:
> 
> >--- a/content/svg/content/src/nsSVGClass.cpp
> >+++ b/content/svg/content/src/nsSVGClass.cpp
> 
> >+#include "nsSVGStylableElement.h"
> > #include "nsSVGClass.h"
> 
> Foo.h should be included first in Foo.cpp, to ensure Foo.h compiles on it
> own.

Both classes reference each other. Change of order results in non-compilation.

> >+{
> >+  if (aAttribute == nsGkAtoms::_class) {
> >+    mClassAttribute.SetBaseValue(aValue, this, PR_FALSE);
> >+    aResult.ParseAtomArray(aValue);
> >+    return PR_TRUE;
> 
> false/true

bug 690892 will do that.
(In reply to Robert Longson from comment #3)
> (In reply to Ms2ger from comment #2)
> > Comment on attachment 565794 [details] [diff] [review] [diff] [details] [review] [diff] [details] [review]
> > patch
> > 
> > Drive-by nits:
> > 
> > >--- a/content/svg/content/src/nsSVGClass.cpp
> > >+++ b/content/svg/content/src/nsSVGClass.cpp
> > 
> > >+#include "nsSVGStylableElement.h"
> > > #include "nsSVGClass.h"
> > 
> > Foo.h should be included first in Foo.cpp, to ensure Foo.h compiles on it
> > own.
> 
> Both classes reference each other. Change of order results in
> non-compilation.

I see, but that's a bug by itself.
Attached patch make GetBaseValue argument const (obsolete) — Splinter Review
Attachment #565794 - Attachment is obsolete: true
Attachment #565794 - Flags: review?(dholbert)
Attachment #565796 - Flags: review?(dholbert)
(In reply to Ms2ger from comment #4)
> I see, but that's a bug by itself.

nsSVGStyleable element contains nsSVGClass as a member so you need a concrete nsSVGClass to compile it.

nsSVGClass contains nsSVGStyleable as a pointer so you can get by with just a class nsSVGClass in the header but you need a concrete class in the cpp and that needs to come first to compile.

This change saves 8 bytes for each svg tag as there are 2 fewer virtual functions. It's also faster as we're refreshing once instead of twice when the class attribute changes now.
When I say each svg tag I mean each tag in the svg namespace not just the <svg> tag itself.
This patch doesn't seem to apply cleanly on mozilla-central (even with -F10) -- does it layer on top of something else?  Or perhaps something landed that bitrotted it?
Attached patch unbitrotted (obsolete) — Splinter Review
Attachment #565796 - Attachment is obsolete: true
Attachment #565796 - Flags: review?(dholbert)
Attachment #565999 - Flags: review?(dholbert)
oh and it only saves 8 byes per class, not per instance.
(In reply to Ms2ger from comment #2)
> >--- a/content/svg/content/src/nsSVGClass.cpp
> >+++ b/content/svg/content/src/nsSVGClass.cpp
> 
> >+#include "nsSVGStylableElement.h"
> > #include "nsSVGClass.h"
> 
> Foo.h should be included first in Foo.cpp, to ensure Foo.h compiles on it
> own.
[...]
(In reply to Robert Longson from comment #6)
> nsSVGClass contains nsSVGStyleable as a pointer so you can get by with just
> a class nsSVGClass in the header but you need a concrete class in the cpp
> and that needs to come first to compile.

No, it [nsSVGStyleable] only needs to come first to compile because nsSVGClass is missing some #includes. :)  (which switching the ordering reveals)

Specifically, nsSVGClass.h needs #includes for "nsAutoPtr.h" and "nsCycleCollectionParticipant.h".  With those, you can have nsSVGClass.h as the first include in nsSVGClass.cpp, and everything works fine.

(also, there's still some bitrot from bug 550047's s/return rv/return/ tweaks to UnsetAttr/UnsetAttrInternal/)

(Still reviewing, that's just what I've got so far. :))
Comment on attachment 565999 [details] [diff] [review]
unbitrotted

>diff --git a/content/svg/content/src/nsSVGClass.h b/content/svg/content/src/nsSVGClass.h
>   void SetBaseValue(const nsAString& aValue,
>-                    nsSVGElement *aSVGElement,
>+                    nsSVGStylableElement *aSVGStylableElement,

Revert the argument-name-change here.  There are a lot of lines in nsSVGClass.* with "aSVGElement" and "mSVGElement", and they probably all want to be renamed after this patch lands, but this is the only line of your path with such a rename. (and note that the definition of this function in the .cpp file still uses the old name "aSVGElement")

I agree that we should rename these variables, but I think it'd be best to do that in a followup patch (or followup bug), since it's more of a mechanical change which would make the exact same change to a whole bunch of lines.  (Also, "aSVGStylableElement" might be an overly long name -- I think "aElement" would probably be fine here -- but it doesn't matter much to me.)

>+bool
>+nsSVGStylableElement::ParseAttribute(PRInt32 aNamespaceID,
>+                                     nsIAtom* aAttribute,
[...]
>+{
>+  if (aAttribute == nsGkAtoms::_class) {
>+    mClassAttribute.SetBaseValue(aValue, this, PR_FALSE);

This looks like it needs a check for "aNamespaceID == kNameSpaceID_None".

>+nsresult
>+nsSVGStylableElement::UnsetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
>+                                bool aNotify)
>+{
>+  if (aName == nsGkAtoms::_class) {
>+    mClassAttribute.Init();
>+    return nsSVGElementBase::UnsetAttr(aNamespaceID, aName, aNotify);
>+  }
>+  return nsSVGStylableElementBase::UnsetAttr(aNamespaceID, aName, aNotify);

This too.

Also: I'm not sold on the "nsSVGElementBase::UnsetAttr" early-return in the above chunk.  It looks like you're doing that as a shortcut, because you know that nsSVGStylableElementBase (aka nsSVGElement) won't do anything special for "class", so you're jumping straight *its* final line where it passes off to its base class.  It seems fragile to hardcode that assumption (and the implicit assumption about class-ancestry) here, though.

I'd rather we get rid of this early-return, and just unconditionally hit the "nsSVGStylableElementBase::UnsetAttr()" call.

(If we were to keep the nsSVGElementBase::UnsetAttr early-return, though, we should definitely have a comment explaining why it's there.)

>+++ b/content/svg/content/src/nsSVGStylableElement.h
>+  virtual bool ParseAttribute(PRInt32 aNamespaceID, nsIAtom* aAttribute,
>+                                const nsAString& aValue, nsAttrValue& aResult);

Fix up indentation before "const nsAString& aValue" there.

>+++ b/content/svg/content/src/nsSVGElement.cpp
>-void
>-nsSVGElement::DidAnimateClass()
>-{
>-  nsIFrame* frame = GetPrimaryFrame();
>-
>-  if (frame) {
>-    frame->AttributeChanged(kNameSpaceID_None, nsGkAtoms::_class,
>-                            nsIDOMMutationEvent::MODIFICATION);
>-  }

So, the patch removes this function -- but the corresponding function in nsSVGStylableElement doesn't notify the frame, so it looks like we'll no longer be sending frame->AttributeChanged() notifications when "class" changes.  Is that a problem?
Attachment #565999 - Attachment is obsolete: true
Attachment #565999 - Flags: review?(dholbert)
Attachment #567297 - Flags: review?(dholbert)
(In reply to Daniel Holbert [:dholbert] from comment #12)
> 
> So, the patch removes this function -- but the corresponding function in
> nsSVGStylableElement doesn't notify the frame, so it looks like we'll no
> longer be sending frame->AttributeChanged() notifications when "class"
> changes.  Is that a problem?

It appears not to be, class animations refresh normally and the reftests that check that still pass.
Comment on attachment 567297 [details] [diff] [review]
address review comments

ok, thanks! r=me
Attachment #567297 - Flags: review?(dholbert) → review+
Flags: in-testsuite-
https://hg.mozilla.org/mozilla-central/rev/d7295730c0ef
Status: NEW → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla10
Depends on: 698534
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: