Closed
Bug 909953
Opened 12 years ago
Closed 12 years ago
Introduce a HTMLAllCollection class
Categories
(Core :: DOM: Core & HTML, defect)
Core
DOM: Core & HTML
Tracking
()
RESOLVED
FIXED
mozilla26
People
(Reporter: Ms2ger, Assigned: Ms2ger)
References
Details
Attachments
(1 file, 1 obsolete file)
|
16.32 KB,
patch
|
Ms2ger
:
review+
|
Details | Diff | Splinter Review |
I want to move more stuff into it, but that's for another bug.
Attachment #796293 -
Flags: review?(bugs)
Comment 1•12 years ago
|
||
Comment on attachment 796293 [details] [diff] [review]
Patch v1
>From: Ms2ger <ms2ger@gmail.com>
>
>diff --git a/content/base/public/nsINode.h b/content/base/public/nsINode.h
>--- a/content/base/public/nsINode.h
>+++ b/content/base/public/nsINode.h
>@@ -1743,16 +1743,28 @@ inline nsINode* NODE_FROM(C& aContent, D
> {
> if (aContent)
> return static_cast<nsINode*>(aContent);
> return static_cast<nsINode*>(aDocument);
> }
>
> NS_DEFINE_STATIC_IID_ACCESSOR(nsINode, NS_INODE_IID)
>
>+inline nsISupports*
>+ToSupports(nsINode* aPointer)
>+{
>+ return aPointer;
>+}
>+
>+inline nsISupports*
>+ToCanonicalSupports(nsINode* aPointer)
>+{
>+ return aPointer;
>+}
Not sure how this is related, but ok change anyway.
>+HTMLAllCollection::GetObject(JSContext* aCx, JS::Handle<JSObject*> aObject,
>+ ErrorResult& aRv)
>+{
>+ MOZ_ASSERT(aCx);
>+ MOZ_ASSERT(aObject);
>+
>+ if (!mObject) {
>+ JSAutoCompartment ac(aCx, aObject);
>+ mObject = JS_NewObject(aCx, &sHTMLDocumentAllClass, nullptr,
>+ JS_GetGlobalForObject(aCx, aObject));
>+ if (!mObject) {
>+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
>+ return nullptr;
>+ }
>+
>+ // Make the JSObject hold a reference to the document.
>+ JS_SetPrivate(mObject, ToSupports(mDocument));
>+ NS_ADDREF(mDocument);
>+
>+ mDocument->PreserveWrapper(ToSupports(mDocument));
I sure hope we have wrapper here. We should have, as far as I see.
>+ }
>+
>+ return mObject;
Could you call xpc_UnmarkGrayObject here before returning.
I know it is missing from the current code.
> NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsHTMLDocument, nsDocument)
>- tmp->mAll = nullptr;
>+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mAll)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mImages)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mApplets)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mEmbeds)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mLinks)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mAnchors)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mScripts)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mForms)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mFormControls)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mWyciwygChannel)
> NS_IMPL_CYCLE_COLLECTION_UNLINK(mMidasCommandManager)
> NS_IMPL_CYCLE_COLLECTION_UNLINK_END
Couldn't you now use some macro to traverse/unlink all these?
Attachment #796293 -
Flags: review?(bugs) → review+
Comment 2•12 years ago
|
||
I think the JS pointer in there makes it hard to use a macro.
| Assignee | ||
Comment 3•12 years ago
|
||
(In reply to Olli Pettay [:smaug] from comment #1)
> Comment on attachment 796293 [details] [diff] [review]
> Patch v1
>
> >From: Ms2ger <ms2ger@gmail.com>
> >
> >diff --git a/content/base/public/nsINode.h b/content/base/public/nsINode.h
> >--- a/content/base/public/nsINode.h
> >+++ b/content/base/public/nsINode.h
> >@@ -1743,16 +1743,28 @@ inline nsINode* NODE_FROM(C& aContent, D
> > {
> > if (aContent)
> > return static_cast<nsINode*>(aContent);
> > return static_cast<nsINode*>(aDocument);
> > }
> >
> > NS_DEFINE_STATIC_IID_ACCESSOR(nsINode, NS_INODE_IID)
> >
> >+inline nsISupports*
> >+ToSupports(nsINode* aPointer)
> >+{
> >+ return aPointer;
> >+}
> >+
> >+inline nsISupports*
> >+ToCanonicalSupports(nsINode* aPointer)
> >+{
> >+ return aPointer;
> >+}
> Not sure how this is related, but ok change anyway.
I wanted to call ToSupports from HTMLAllCollection::GetObject, but I also didn't want to include nsDOMQS.h :)
>
> >+HTMLAllCollection::GetObject(JSContext* aCx, JS::Handle<JSObject*> aObject,
> >+ ErrorResult& aRv)
> >+{
> >+ MOZ_ASSERT(aCx);
> >+ MOZ_ASSERT(aObject);
> >+
> >+ if (!mObject) {
> >+ JSAutoCompartment ac(aCx, aObject);
> >+ mObject = JS_NewObject(aCx, &sHTMLDocumentAllClass, nullptr,
> >+ JS_GetGlobalForObject(aCx, aObject));
> >+ if (!mObject) {
> >+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
> >+ return nullptr;
> >+ }
> >+
> >+ // Make the JSObject hold a reference to the document.
> >+ JS_SetPrivate(mObject, ToSupports(mDocument));
> >+ NS_ADDREF(mDocument);
> >+
> >+ mDocument->PreserveWrapper(ToSupports(mDocument));
> I sure hope we have wrapper here. We should have, as far as I see.
So assert mDocument->PreservingWrapper()?
> >+ }
> >+
> >+ return mObject;
> Could you call xpc_UnmarkGrayObject here before returning.
> I know it is missing from the current code.
Will do.
> > NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsHTMLDocument, nsDocument)
> >- tmp->mAll = nullptr;
> >+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mAll)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mImages)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mApplets)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mEmbeds)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mLinks)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mAnchors)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mScripts)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mForms)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mFormControls)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mWyciwygChannel)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK(mMidasCommandManager)
> > NS_IMPL_CYCLE_COLLECTION_UNLINK_END
> Couldn't you now use some macro to traverse/unlink all these?
That would lose
NS_ASSERTION(!nsCCUncollectableMarker::InGeneration(cb, tmp->GetMarkedCCGeneration()),
"Shouldn't traverse nsHTMLDocument!");
Is that ok?
| Assignee | ||
Comment 4•12 years ago
|
||
We discussed this on IRC: http://logbot.glob.com.au/?c=mozilla%23content#c122511
Attachment #796293 -
Attachment is obsolete: true
Attachment #796837 -
Flags: review+
| Assignee | ||
Comment 5•12 years ago
|
||
Status: ASSIGNED → RESOLVED
Closed: 12 years ago
Flags: in-testsuite-
Resolution: --- → FIXED
Target Milestone: --- → mozilla26
Updated•6 years ago
|
Component: DOM → DOM: Core & HTML
You need to log in
before you can comment on or make changes to this bug.
Description
•