Closed
Bug 176606
Opened 22 years ago
Closed 21 years ago
Unable to extend HTML elements
Categories
(Core :: XBL, defect)
Tracking
()
RESOLVED
FIXED
People
(Reporter: hyatt, Assigned: hyatt)
References
Details
(Keywords: regression)
Attachments
(1 file, 4 obsolete files)
28.83 KB,
patch
|
Details | Diff | Splinter Review |
Extension of HTML elements has been broken. This is a regression and prevents XBL from being used to extend basic elements like <img>.
Assignee | ||
Updated•22 years ago
|
Status: NEW → ASSIGNED
Keywords: mozilla1.2,
regression
Assignee | ||
Comment 1•22 years ago
|
||
This was broken by jst in the fix for 132478. This change restricted the creation of HTML frames such that only HTML content nodes could make them.
Assignee | ||
Comment 2•22 years ago
|
||
The namespace checks here were intentional and (looking at the patch for the bug), it appears that other conversions to IsContentOfType were made, all of which break XML elements in other namespaces that extend both XUL and HTML elements.
Assignee | ||
Updated•22 years ago
|
Summary: Unable to extend HTML elements → Unable to extend HTML/XUL elements
Assignee | ||
Comment 3•22 years ago
|
||
As an example, I have been playing around with implementing xhtml2 using CSS/XBL, and this prevents me from simply extending existing HTML elements via XBL. As a side note it does look like you can still extend XUL at least, since the ConstructXULFrame method was not changed, although the root XUL elements will not extend correctly now.
Assignee | ||
Updated•22 years ago
|
Target Milestone: --- → mozilla1.2final
Assignee | ||
Comment 4•22 years ago
|
||
Oops, the bug was 134278. I had the digits inverted.
Updated•22 years ago
|
Target Milestone: mozilla1.2final → ---
Updated•22 years ago
|
Target Milestone: --- → mozilla1.2final
Assignee | ||
Comment 5•22 years ago
|
||
This patch adds support for XHTML2 elements, and makes sure they get treated like XHTML1 elements. I also implemented the ability to jump to anchors in XHTML2 (which uses id rather than name).
Comment 6•22 years ago
|
||
Don't you need to put the uri in gURIArray? > + gURIToIDTable->Put(&mathmlKey, NS_INT32_TO_PTR(kNameSpaceID_XHTML2)); Wrong key? > // XXX This is incorrect!!!!!!!!!!!!!!!! > + // XXX It could be XHTML or XHTML2 or... etc. etc. The reason GetNamespaceID is hacked like this is because it's used in style resolution. This means that if you want XHTML2 elements to match rules in the XHTML2 namespace this function needs to return the right namespace id.... Perhaps this function should check the nodeinfo namespace id and if that's kNameSpaceID_None (I think that's the right thing to check for) it should fall back on kNameSpaceID_HTML? > + cssParser->SetCaseSensitive(mNodeInfo->NamespaceEquals(kNameSpaceID_XHTML) || > + mNodeInfo->NamespaceEquals(kNameSpaceID_XHTML2)); Here, also, it may be better to switch to SetCaseSensitive(!mNodeInfo->NamespaceEquals(kNameSpaceID_None)), assuming that does the right thing. > + if (mNodeInfo->NamespaceEquals(kNameSpaceID_XHTML) || > + mNodeInfo->NamespaceEquals(kNameSpaceID_XHTML2)) { And here...I'll stop commenting on this; we should just decide what the right approach is for callsites like these, where we know we have HTML and just don't know whether it's tag-soup or not. Scrolling to id should work in XHTML and HTML4.0, not just in XHTML2.... and it applies to all elements, not just <a>. I would hope we have code that already does that (checks for <a name="foo"> first, then just does document.getElementById("foo") if we are going to #foo). If we do not, we should. See http://www.w3.org/TR/html401/struct/links.html#h-12.2.3
Assignee | ||
Updated•22 years ago
|
Attachment #104074 -
Attachment is obsolete: true
Assignee | ||
Comment 7•22 years ago
|
||
Duh. Missed the id checking code at the top of the function. Verifying with my XHTML2 sample now...
Assignee | ||
Comment 8•22 years ago
|
||
I tried returning kNameSpaceID_None in the HTML element function, but that causes the UA sheet not to match (which surprised me). So I've left that alone. I fixed the other problem though (of assuming None).
Assignee | ||
Comment 9•22 years ago
|
||
Assignee | ||
Comment 10•22 years ago
|
||
Bah. ROFL. Ignore the changes to nsPresShell.cpp in that patch. Just look at the rest.
Comment 11•22 years ago
|
||
Comment on attachment 104084 [details] [diff] [review] Better patch. This one was actually compiled and tested (gasp!). nsGenericHTMLElement::GetNameSpaceID(PRInt32& aID) const { - // XXX - // XXX This is incorrect!!!!!!!!!!!!!!!! - // XXX - aID = kNameSpaceID_XHTML; + aID = kNameSpaceID_XHTML; // XXX Return this for XHTML and XHTML2, so that UA styles can apply to both. -dwh return NS_OK; } Do *NOT* remove that XXX comment, that method is broken, the method should return what you get from mNodeInfo->GetNameSpaceID(), but as you realized, mozilla kinda falls appart if you do that. That however is a bug in the style system, not a problem with this code...
Comment 12•22 years ago
|
||
Oh, and in stead of checking if an element's namespace ID is kNameSpaceID_XHTML2? use nsIContent::IsContentOfType(nsIContent::eHTML) when possible.
Assignee | ||
Comment 13•22 years ago
|
||
Attachment #104084 -
Attachment is obsolete: true
Comment 14•22 years ago
|
||
My point was that the style system uses GetNamespaceID() to get the namespace... so if you have a sheet in the XHTML namespace it will match (with that patch), but one in the XHTML2 namespace will not.... So how exactly are you applying the UA rules to XHTML2 elements (eg the XBL bindings)? By putting them in a sheet in the XHTML namespace? That magic namespace directive is sounding mighty nice.... that would move this CSS-specific hack over into the CSS part of the style system...
Assignee | ||
Comment 15•22 years ago
|
||
Correct, my new sheets are in the XHTML namespace instead of the XHTML2 namespace. I do think eventually we should use a magic directive in the CSS files, but I'm content to use the wrong namespace in my UA sheet for now (although you're right that namespaced author sheets in the XHTML2 namespace will not apply correctly). I'd be happy to do this before landing if the reviewers feel like it's required. I'd need pointers to the CSS code though.
Comment 16•22 years ago
|
||
IMHO namespaced author sheets in the XHTML2 namespace not applying correctly is a big deal.
Assignee | ||
Updated•22 years ago
|
Summary: Unable to extend HTML/XUL elements → Unable to extend HTML elements
Assignee | ||
Comment 17•22 years ago
|
||
Ok, this patch fixes the bug with GetNameSpaceID in HTML element and just returns the node info's namespace ID. I patched the style system to understand kNameSpaceID_None, and I implemented a new magic namespace called http://www.mozilla.org/xhtml-generic that matches HTML, XHTML and XHTML2. This patch also fixes ConstructHTMLFrame to also check the XHTML and XHTML2 namespaces in the event that the content node is not HTML but extends an HTML namespace (which happens when using XBL). I have also adjusted all stylesheets (including the prefs sheet) to use the new magic namespace where appropriate. Ready for comments/feedback (or r/sr if you like it that much right out of the box). ;)
Assignee | ||
Updated•22 years ago
|
Attachment #104087 -
Attachment is obsolete: true
Comment 18•22 years ago
|
||
This seems wrong, both before and after your patch: Index: content/html/style/src/nsDOMCSSAttrDeclaration.cpp // look up our namespace. If we're XHTML, we need to be case-sensitive // Otherwise, we should not be - (*aCSSParser)->SetCaseSensitive(nodeInfo->NamespaceEquals(kNameSpaceID_XHTML)); + (*aCSSParser)->SetCaseSensitive(nodeInfo->NamespaceEquals(kNameSpaceID_XHTML) || + nodeInfo->NamespaceEquals(kNameSpaceID_XHTML2));
Comment 19•22 years ago
|
||
Shouldn't you be checking that the content is HTML content in the kNameSpaceID_None cases in selector-matching? We don't want to match non-namespaced XML content with xhtml-namespaced CSS... Hixie, the code you quote is correct because that's all working with HTML elements only, so the only question there is just whether it's SGML-based HTML or XHTML.
I really don't like this bogus generic namespace. If the DOM WG really insists on being so pedantically correct rather than having a useful API, then the CSS WG probably needs to reconsider the interaction of selectors and namespaces. What does this change imply for our compliance to the css3-namespaces draft and the parts of it in css3-selectors?
(Actually, though, I'm having trouble finding the part of http://www.w3.org/TR/DOM-Level-2-Core/ or http://www.w3.org/TR/DOM-Level-2-HTML/ that says how DOM representations of SGML-based documents must handle namespace-related methods and properties. What says so?)
Assignee | ||
Comment 22•22 years ago
|
||
Another idea (although even more involved) is to enable @namespace to support multiple URIs (i.e., allow the establishing of multiple default namespaces), and/or the defining of prefixes that match multiple namespaces.
Assignee | ||
Comment 23•22 years ago
|
||
Ok, ignoring the controversial XHTML2 portion of the patch, here is the patch to just fix the XBL regression (without introducing anything regarding XHTML2).
Comment 24•22 years ago
|
||
dbaron: I don't think this patch changes our compliance in any measurable way (except if a test actually uses the magic namespace, which would be like a test using a -vnd-foo property). All it does is make the @namespace rule for a particular namespace match three namespaces rather than one. The DOM is not affected in any way. @namespace rules for XHTML namespaces will continue to match in the same way. Note that we actually already have this hack in a way, as before this patch the XHTML1 namespace also matched HTML4 content, which is incorrect. This patch fixes this as well.
Comment 25•22 years ago
|
||
Comment on attachment 104158 [details] [diff] [review] Patch that just fixes the XBL problem. r/sr=bzbarsky
Attachment #104158 -
Flags: superreview+
Boarf. DavidH, your problem is only caused by badly chosen namespace URIs. xhtml2 namespace should be http://www.w3.org/html/xhtml2/2002/06, not http://www.w3.org/2002/06/xhtml2. Then you could just use @namespace html url("http://www.w3.org/html/"); to select all namespaces "under" this URI, including html, xhtml1, xhtml2. DavidH, your proposal of multiple URIs per @namespace rule could perfectly raised to the WG. Ian, I think you are wrong, this patch changes our conformance to Selectors CR. Perhaps not from a test suite POV, but one unique @namespace cannot match both xhtml1 and xhtml2 languages.
Comment 27•22 years ago
|
||
The problem, of course, is that xhtml1 and xhtml2 are not really distinct languages... I'm not sure I follow what a different namespace for xhtml2 would enable us to do, but if it would help, is XHTML2 so far advanced that changing its namespace would be impossible at this point?
Assignee | ||
Comment 28•22 years ago
|
||
I'm fairly certain we don't treat the @namespace directive as a prefix match, but probably require an identical match. Even if we did, that is a more expensive computation that must be performed (testing for prefix matching). I suppose there are clever things we could do for known namespaces. As bz said, though, is the xhtml2 namespace likely to change? The chosen namespace may be deliberate, since they claim not to be backwards compatible with xhtml1 (and thus may want to intentionally set themselves apart). Despite this claim, many of the tags are absolutely identical and it makes no sense for us to duplicate all our UA rules. :)
Comment 29•22 years ago
|
||
> Then you could just use @namespace html url("http://www.w3.org/html/"); > to select all namespaces "under" this URI, including html, xhtml1, xhtml2. This is incorrect; namespace URIs are by definition opaque and prefix matching is therefore out of the question. > Ian, I think you are wrong, this patch changes our conformance to Selectors CR It's an extension. Extensions are legitimate, and are not considered to break conformance, if they are carefully insulated from standard usage, as in this case. With properties, our extensions are denoted by a '-moz-' prefix, with namespaces, our extensions are denoted by namespaces in the mozilla.arg space.
Assignee | ||
Comment 30•22 years ago
|
||
Can someone r= the XBL-only patch? :)
> namespace URIs are by definition opaque and prefix matching
> is therefore out of the question.
Absolutely. That's my point : it's a design mistake. It's a namespace URI and
not a namespace URN. It uses all the bad from URNs and not the good from URIs.
Anyway.
Comment 32•22 years ago
|
||
Comment on attachment 104158 [details] [diff] [review] Patch that just fixes the XBL problem. r/sr=jst
Attachment #104158 -
Flags: review+
Updated•21 years ago
|
Keywords: mozilla1.2
Target Milestone: mozilla1.2final → ---
Comment 33•21 years ago
|
||
hyatt, are you planning to check in that reviewed patch sometime?
Comment 34•21 years ago
|
||
Comment on attachment 104158 [details] [diff] [review] Patch that just fixes the XBL problem. I just checked this patch in.
Attachment #104158 -
Attachment is obsolete: true
Comment 35•21 years ago
|
||
Wouahhhh. I often follow checkin activities, but this one, with more 13 months between review and checkin is I think a candidate for a record!
Updated•21 years ago
|
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•