Closed Bug 28825 Opened 25 years ago Closed 20 years ago

Notify function called twice (HTML) or not at all (XML) for one tag

Categories

(Core :: DOM: HTML Parser, defect, P3)

x86
Windows NT
defect

Tracking

()

RESOLVED WONTFIX
Future

People

(Reporter: toml, Assigned: harishd)

References

Details

(Keywords: xhtml, Whiteboard: [nsbeta2-])

Should the nsDTDUtils.cpp method CObserverService::RegisterObservers keep a 
seperate queue for NS_PARSER_SUBJECT and NS_XMLPARSER_SUBJECT?

Currently, if you perform an AddObserver for NS_PARSER_SUBJECT and 
NS_XMLPARSER_SUBJECT, to become an ElementObserver, for the same tag, "META" for 
example, you are notified twice for each tag in an HTML file and not all if it 
is in an XML file.

Since the method is using a common queue for the subjects, each registration for 
a tag in a different subject results in two entries.  So when CNavDTD.cpp 
performs the Notify call loop it results in two notifications for one tag.

For XML, there doesn't appear to be any Observer->Notify(...) call in the XML 
DTD nsWellFormedDTD.cpp module so it results on no notifications for the tag.
I forgot to mention the level of the build.  This has been confirmed on a pull 
and build of the latest level of the code (02/22/2000).
After doing some additional investigation I've also found another problem with 
this interface.  It turns out that whenever class nsObserverReleaser: public 
nsDequeFunctor is invoked it performs an NS_RELEASE against each queue observer 
entry.  However, only one NS_ADDREF was performed for the observer during the 
CObserverService::RegisterObservers function.  If the loop to call 
Observer->GetTagNameAt is only executed once this is OK (Observer is only 
interested in one tag).  However, if the Observer->GetTagNameAt wants to return 
multiple tags of interest and gets called multiple times, then problems arise 
because the mRefCnt goes to zero during the nsObserverReleaser: public 
nsDequeFunctor when it shouldn't.  An easy way to check this is to modify 
mozilla\intl\chardet\src\nsMetaCharsetObserver.cpp to return two or more tags of 
interest (it just ignores them during Notify processing).
I'll need this as well for editor frameset detection.
Status: UNCONFIRMED → NEW
Ever confirmed: true
This is a good suggestion, and I've implemented it in my tree. It will land 
shortly.
Status: NEW → ASSIGNED
Landed tonight as changed to CDTDUtils.cpp.
Status: ASSIGNED → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
I tested the fix and it resolves the multiple calls for a particular tag.  
However, it does not invoke the "Notify" routine for an XML tag.  The "Notify" 
routine interface should probably be modified to pass in an indication of the 
language or language namespace so that HTML and XML can be discerned and tags 
that exist in multiple namespaces can be discerned (this would obviously be a 
change to the ElementObserver interface).

Also, the problem with the class nsObserverReleaser: public 
nsDequeFunctor still exists.  I modified 
mozilla\intl\chardet\src\nsMetaCharsetObserver.cpp to return two tags instead of 
one and after the first invocation of the "Notify" routines it is never called 
again (I believe this is because of the nsSupportsWeakReference).  If I add an 
NS_ADDREF( this ) to the "GetTagNameAt" routine, then the ElementObserver 
interface functions correctly (for HTML).  The NS_RELEASE in the nsDequeFunctor 
should not be done.
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
Tom: the notify protocol is based on a topic; current text/html and text/xml. 
The parsers use the mimetype in their notification process. If you're 
registerting the _same_ observer for both topics, you won't be able to 
differentiate. But we expect folks to use a seperate observer. 

I'll update the code to deal with the addref/release problem.
Status: REOPENED → ASSIGNED
I've fixed the addref/release problem. We were not properly addref'ing 
observers.
Status: ASSIGNED → RESOLVED
Closed: 24 years ago24 years ago
Resolution: --- → FIXED
Ok, that's not a problem to have two separate observers to differentiate between 
HTML and XML.  Tested your fixes and the ADDREF/RELEASE problem is fixed.

However, XML tags are not driving the observer.  The HTML tags are driven from 
CNavDTD.cpp calling into nsDTDUtils.cpp. The XML tags should be driven from 
nsWellFormedDTD.cpp calling into nsDTDUtils.cpp, but this is not occurring (or 
coded).  Also, for the XML Notify function, is there a way to determine the XML 
namespace for the tag/element that the observer is being notified about?  If the 
same tag, for example "XYZ", is defined in two different XML namespaces I can 
see components/observers wanting to process the "XYZ" tag only if it is part of 
a particular namespace for which that component/observer has provided support.
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
I'm handing the XML observer over to nisheeth for completion. Nisheeth: You 
should be able to copy the code from CNavDTD.
Assignee: rickg → nisheeth
Status: REOPENED → NEW
I am concerned about the performance implications of this.  In the HTML world, 
we use atoms for doing string comparisons of tags.  In XML, we will probably 
need to do a strcmp() on each incoming tag to determine if we need to notify an 
observer.  What do you guys think?

Tom, please provide a little background around why you need to observe XML 
elements.  Maybe there's a less costly way to get you what you want.
Status: NEW → ASSIGNED
I'm working on implementing P3P within Mozilla.  P3P relies on being able to 
specify information within a "META" tag (soon to be changed to a "LINK" tag) 
within the HTML.  So, I'm relying on the ElementObserver interface to be 
notified of these tags and process them accordingly without having to insert 
P3P related code into the content sink(s).  Since you can have an XML version of 
HTML, I need to observe XML tags also (which is why the interface should have 
the XML namespace associated with the tag as an argument also).
Scheduling for M16...
Target Milestone: --- → M16
Harish, thanks for volunteering to own this.  Re-assigning this to you...
Assignee: nisheeth → harishd
Status: ASSIGNED → NEW
nominating for nsbeta2
Status: NEW → ASSIGNED
Keywords: nsbeta2
Putting on [nsbeta2-] radar. 
Whiteboard: [nsbeta2-]
Tom, I'll provide a patch to unblock you. Will that work?

Moving to M17.
Target Milestone: M16 → M17
Don't worry about a patch, i'm not blocked right now because I still have the 
HTML path with which I can verify everything I'm doing.  I will eventually need 
to be able to recognize HTML tags within XML but for now I can work around it.
Target Milestone: M17 → Future
Adding rtm to the keyword.
Keywords: rtm
changing rtm to nsbeta3.
Keywords: rtmnsbeta3
Target Milestone: Future → M18
This bug has been marked "future" because we have determined that it is not 
critical for netscape6.0. If you feel this is an error, or if it blocks your 
work in some way -- please attach your concern to the bug for reconsideration.
Target Milestone: M18 → Future
Keywords: nsbeta3
Removed nsbeta3 nomination from futured bugs.
I'm ok with you moving this out.  This will only cause problems for me when HTML 
is XMLized.  Should any XHTML/HXML be encountered that is using the LINK tag to 
indicate the use of P3P, then the privacy support won't be active.
Blocks: 62399
updated qa contact.
QA Contact: janc → bsharma
Blocks: 96683
No longer blocks: 96683
QA Contact: bsharma → moied
Keywords: xhtml
The observer service stuff is gone (see bug 96364).

Further, the tag observer stuff relies on parser nodes and XML parsing hasn't
used those in a good long while.

So tag observers as they currently exist are an HTML-only beast.  Are they
something we want to hack in for XML?
f*&$k no! :-) If we want something like that, lets set up a SAX chain system
with the sinks being just one link in the chain (most of the time the last and
only one). Tag observers should die, but that won't happen, but let's not make
them spread farther.
Right.  Marking wontfix.
Status: ASSIGNED → RESOLVED
Closed: 24 years ago20 years ago
Resolution: --- → WONTFIX
You need to log in before you can comment on or make changes to this bug.