diff --git a/content/html/content/src/nsHTMLAtoms.cpp b/content/html/content/src/nsHTMLAtoms.cpp index 64de63c6f0e..982b3e7712a 100644 --- a/content/html/content/src/nsHTMLAtoms.cpp +++ b/content/html/content/src/nsHTMLAtoms.cpp @@ -140,6 +140,7 @@ nsIAtom* nsHTMLAtoms::httpEquiv; nsIAtom* nsHTMLAtoms::ibPseudo; nsIAtom* nsHTMLAtoms::id; nsIAtom* nsHTMLAtoms::iframe; +nsIAtom* nsHTMLAtoms::ilayer; nsIAtom* nsHTMLAtoms::img; nsIAtom* nsHTMLAtoms::index; nsIAtom* nsHTMLAtoms::input; @@ -147,6 +148,7 @@ nsIAtom* nsHTMLAtoms::ismap; nsIAtom* nsHTMLAtoms::label; nsIAtom* nsHTMLAtoms::labelContentPseudo; nsIAtom* nsHTMLAtoms::lang; +nsIAtom* nsHTMLAtoms::layer; nsIAtom* nsHTMLAtoms::layout; nsIAtom* nsHTMLAtoms::li; nsIAtom* nsHTMLAtoms::link; @@ -274,6 +276,7 @@ nsIAtom* nsHTMLAtoms::width; nsIAtom* nsHTMLAtoms::wrap; nsIAtom* nsHTMLAtoms::wrappedFramePseudo; nsIAtom* nsHTMLAtoms::zindex; +nsIAtom* nsHTMLAtoms::z_index; static nsrefcnt gRefCnt; @@ -403,6 +406,7 @@ void nsHTMLAtoms::AddrefAtoms() ibPseudo = NS_NewAtom(":ib-pseudo"); id = NS_NewAtom("id"); iframe = NS_NewAtom("iframe"); + ilayer = NS_NewAtom("ilayer"); img = NS_NewAtom("img"); index = NS_NewAtom("index"); input = NS_NewAtom("input"); @@ -410,6 +414,7 @@ void nsHTMLAtoms::AddrefAtoms() label = NS_NewAtom("label"); labelContentPseudo = NS_NewAtom(":label-content"); lang = NS_NewAtom("lang"); + layer = NS_NewAtom("layer"); layout = NS_NewAtom("layout"); li = NS_NewAtom("li"); link = NS_NewAtom("link"); @@ -537,6 +542,7 @@ void nsHTMLAtoms::AddrefAtoms() wrap = NS_NewAtom("wrap"); wrappedFramePseudo = NS_NewAtom(":wrapped-frame"); zindex = NS_NewAtom("zindex"); + z_index = NS_NewAtom("z-index"); } ++gRefCnt; } @@ -657,6 +663,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(ibPseudo); NS_RELEASE(id); NS_RELEASE(iframe); + NS_RELEASE(ilayer); NS_RELEASE(img); NS_RELEASE(index); NS_RELEASE(input); @@ -664,6 +671,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(label); NS_RELEASE(labelContentPseudo); NS_RELEASE(lang); + NS_RELEASE(layer); NS_RELEASE(layout); NS_RELEASE(li); NS_RELEASE(link); @@ -786,6 +794,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(wrap); NS_RELEASE(wrappedFramePseudo); NS_RELEASE(zindex); + NS_RELEASE(z_index); } } diff --git a/content/html/content/src/nsHTMLAtoms.h b/content/html/content/src/nsHTMLAtoms.h index 3fb2f97a00b..ac38f76eb8f 100644 --- a/content/html/content/src/nsHTMLAtoms.h +++ b/content/html/content/src/nsHTMLAtoms.h @@ -167,6 +167,7 @@ public: static nsIAtom* ibPseudo; static nsIAtom* id; static nsIAtom* iframe; + static nsIAtom* ilayer; static nsIAtom* img; static nsIAtom* index; static nsIAtom* input; @@ -175,6 +176,7 @@ public: static nsIAtom* label; static nsIAtom* labelContentPseudo; static nsIAtom* lang; + static nsIAtom* layer; static nsIAtom* layout; static nsIAtom* li; static nsIAtom* link; @@ -313,6 +315,7 @@ public: static nsIAtom* wrappedFramePseudo; static nsIAtom* zindex; + static nsIAtom* z_index; }; #endif /* nsHTMLAtoms_h___ */ diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index 3331128cc01..ec4f0cb3216 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -70,6 +70,9 @@ const PRInt32 kBackward = 1; #include "nsHTMLContentSinkStream.h" #endif +// XXX Used to control whether we implement document.layers +//#define NS_IMPLEMENT_DOCUMENT_LAYERS + static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID); static NS_DEFINE_IID(kIDocumentIID, NS_IDOCUMENT_IID); static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID); @@ -110,6 +113,7 @@ nsHTMLDocument::nsHTMLDocument() mEmbeds = nsnull; mLinks = nsnull; mAnchors = nsnull; + mLayers = nsnull; mNamedItems = nsnull; mParser = nsnull; nsHTMLAtoms::AddrefAtoms(); @@ -144,6 +148,7 @@ nsHTMLDocument::~nsHTMLDocument() NS_IF_RELEASE(mEmbeds); NS_IF_RELEASE(mLinks); NS_IF_RELEASE(mAnchors); + NS_IF_RELEASE(mLayers); if (nsnull != mAttrStyleSheet) { mAttrStyleSheet->SetOwningDocument(nsnull); NS_RELEASE(mAttrStyleSheet); @@ -231,6 +236,7 @@ nsHTMLDocument::Reset(nsIURL *aURL) NS_IF_RELEASE(mEmbeds); NS_IF_RELEASE(mLinks); NS_IF_RELEASE(mAnchors); + NS_IF_RELEASE(mLayers); for (i = 0; i < mImageMaps.Count(); i++) { nsIDOMHTMLMapElement* map = (nsIDOMHTMLMapElement*)mImageMaps.ElementAt(i); @@ -1570,11 +1576,42 @@ nsHTMLDocument::GetEmbeds(nsIDOMHTMLCollection** aEmbeds) return NS_OK; } +PRBool +nsHTMLDocument::MatchLayers(nsIContent *aContent, nsString* aData) +{ + nsIAtom *name; + aContent->GetTag(name); + nsAutoString attr; + PRBool result = PR_FALSE; + + if ((nsnull != name) && + ((nsHTMLAtoms::layer == name) || (nsHTMLAtoms::ilayer == name))) { + result = PR_TRUE; + } + + NS_IF_RELEASE(name); + return result; +} + NS_IMETHODIMP nsHTMLDocument::GetLayers(nsIDOMHTMLCollection** aLayers) { - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; +#ifdef NS_IMPLEMENT_DOCUMENT_LAYERS + if (nsnull == mLayers) { + mAnchors = new nsContentList(this, MatchLayers, nsnull); + if (nsnull == mLayers) { + return NS_ERROR_OUT_OF_MEMORY; + } + NS_ADDREF(mLayers); + } + + *aLayers = (nsIDOMHTMLCollection *)mLayers; + NS_ADDREF(mLayers); +#else + *aLayers = nsnull; +#endif + + return NS_OK; } NS_IMETHODIMP @@ -1615,7 +1652,7 @@ IsNamedItem(nsIContent* aContent, nsIAtom *aTag, PRBool aInForm, nsString& aName) { // Only the content types reflected in Level 0 with a NAME - // attribute are registered. Images and forms always get + // attribute are registered. Images, layers and forms always get // reflected up to the document. Applets and embeds only go // to the closest container (which could be a form). if ((aTag == nsHTMLAtoms::img) || (aTag == nsHTMLAtoms::form) || @@ -1626,6 +1663,13 @@ IsNamedItem(nsIContent* aContent, nsIAtom *aTag, } } + if ((aTag == nsHTMLAtoms::layer) || (aTag == nsHTMLAtoms::ilayer)) { + if ((NS_CONTENT_ATTR_HAS_VALUE == aContent->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::name, aName)) || + (NS_CONTENT_ATTR_HAS_VALUE == aContent->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::id, aName))) { + return PR_TRUE; + } + } + return PR_FALSE; } diff --git a/content/html/document/src/nsHTMLDocument.h b/content/html/document/src/nsHTMLDocument.h index e6563de4408..bf0c972bf1d 100644 --- a/content/html/document/src/nsHTMLDocument.h +++ b/content/html/document/src/nsHTMLDocument.h @@ -167,6 +167,7 @@ protected: virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet); static PRBool MatchLinks(nsIContent *aContent, nsString* aData); static PRBool MatchAnchors(nsIContent *aContent, nsString* aData); + static PRBool MatchLayers(nsIContent *aContent, nsString* aData); static PRBool MatchNameAttribute(nsIContent* aContent, nsString* aData); PRBool GetBodyContent(); @@ -192,6 +193,7 @@ protected: nsContentList *mLinks; nsContentList *mAnchors; nsContentList *mForms; + nsContentList *mLayers; PLHashTable *mNamedItems; diff --git a/content/shared/public/nsHTMLAtoms.h b/content/shared/public/nsHTMLAtoms.h index 3fb2f97a00b..ac38f76eb8f 100644 --- a/content/shared/public/nsHTMLAtoms.h +++ b/content/shared/public/nsHTMLAtoms.h @@ -167,6 +167,7 @@ public: static nsIAtom* ibPseudo; static nsIAtom* id; static nsIAtom* iframe; + static nsIAtom* ilayer; static nsIAtom* img; static nsIAtom* index; static nsIAtom* input; @@ -175,6 +176,7 @@ public: static nsIAtom* label; static nsIAtom* labelContentPseudo; static nsIAtom* lang; + static nsIAtom* layer; static nsIAtom* layout; static nsIAtom* li; static nsIAtom* link; @@ -313,6 +315,7 @@ public: static nsIAtom* wrappedFramePseudo; static nsIAtom* zindex; + static nsIAtom* z_index; }; #endif /* nsHTMLAtoms_h___ */ diff --git a/content/shared/src/nsHTMLAtoms.cpp b/content/shared/src/nsHTMLAtoms.cpp index 64de63c6f0e..982b3e7712a 100644 --- a/content/shared/src/nsHTMLAtoms.cpp +++ b/content/shared/src/nsHTMLAtoms.cpp @@ -140,6 +140,7 @@ nsIAtom* nsHTMLAtoms::httpEquiv; nsIAtom* nsHTMLAtoms::ibPseudo; nsIAtom* nsHTMLAtoms::id; nsIAtom* nsHTMLAtoms::iframe; +nsIAtom* nsHTMLAtoms::ilayer; nsIAtom* nsHTMLAtoms::img; nsIAtom* nsHTMLAtoms::index; nsIAtom* nsHTMLAtoms::input; @@ -147,6 +148,7 @@ nsIAtom* nsHTMLAtoms::ismap; nsIAtom* nsHTMLAtoms::label; nsIAtom* nsHTMLAtoms::labelContentPseudo; nsIAtom* nsHTMLAtoms::lang; +nsIAtom* nsHTMLAtoms::layer; nsIAtom* nsHTMLAtoms::layout; nsIAtom* nsHTMLAtoms::li; nsIAtom* nsHTMLAtoms::link; @@ -274,6 +276,7 @@ nsIAtom* nsHTMLAtoms::width; nsIAtom* nsHTMLAtoms::wrap; nsIAtom* nsHTMLAtoms::wrappedFramePseudo; nsIAtom* nsHTMLAtoms::zindex; +nsIAtom* nsHTMLAtoms::z_index; static nsrefcnt gRefCnt; @@ -403,6 +406,7 @@ void nsHTMLAtoms::AddrefAtoms() ibPseudo = NS_NewAtom(":ib-pseudo"); id = NS_NewAtom("id"); iframe = NS_NewAtom("iframe"); + ilayer = NS_NewAtom("ilayer"); img = NS_NewAtom("img"); index = NS_NewAtom("index"); input = NS_NewAtom("input"); @@ -410,6 +414,7 @@ void nsHTMLAtoms::AddrefAtoms() label = NS_NewAtom("label"); labelContentPseudo = NS_NewAtom(":label-content"); lang = NS_NewAtom("lang"); + layer = NS_NewAtom("layer"); layout = NS_NewAtom("layout"); li = NS_NewAtom("li"); link = NS_NewAtom("link"); @@ -537,6 +542,7 @@ void nsHTMLAtoms::AddrefAtoms() wrap = NS_NewAtom("wrap"); wrappedFramePseudo = NS_NewAtom(":wrapped-frame"); zindex = NS_NewAtom("zindex"); + z_index = NS_NewAtom("z-index"); } ++gRefCnt; } @@ -657,6 +663,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(ibPseudo); NS_RELEASE(id); NS_RELEASE(iframe); + NS_RELEASE(ilayer); NS_RELEASE(img); NS_RELEASE(index); NS_RELEASE(input); @@ -664,6 +671,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(label); NS_RELEASE(labelContentPseudo); NS_RELEASE(lang); + NS_RELEASE(layer); NS_RELEASE(layout); NS_RELEASE(li); NS_RELEASE(link); @@ -786,6 +794,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(wrap); NS_RELEASE(wrappedFramePseudo); NS_RELEASE(zindex); + NS_RELEASE(z_index); } } diff --git a/layout/html/base/src/nsHTMLAtoms.cpp b/layout/html/base/src/nsHTMLAtoms.cpp index 64de63c6f0e..982b3e7712a 100644 --- a/layout/html/base/src/nsHTMLAtoms.cpp +++ b/layout/html/base/src/nsHTMLAtoms.cpp @@ -140,6 +140,7 @@ nsIAtom* nsHTMLAtoms::httpEquiv; nsIAtom* nsHTMLAtoms::ibPseudo; nsIAtom* nsHTMLAtoms::id; nsIAtom* nsHTMLAtoms::iframe; +nsIAtom* nsHTMLAtoms::ilayer; nsIAtom* nsHTMLAtoms::img; nsIAtom* nsHTMLAtoms::index; nsIAtom* nsHTMLAtoms::input; @@ -147,6 +148,7 @@ nsIAtom* nsHTMLAtoms::ismap; nsIAtom* nsHTMLAtoms::label; nsIAtom* nsHTMLAtoms::labelContentPseudo; nsIAtom* nsHTMLAtoms::lang; +nsIAtom* nsHTMLAtoms::layer; nsIAtom* nsHTMLAtoms::layout; nsIAtom* nsHTMLAtoms::li; nsIAtom* nsHTMLAtoms::link; @@ -274,6 +276,7 @@ nsIAtom* nsHTMLAtoms::width; nsIAtom* nsHTMLAtoms::wrap; nsIAtom* nsHTMLAtoms::wrappedFramePseudo; nsIAtom* nsHTMLAtoms::zindex; +nsIAtom* nsHTMLAtoms::z_index; static nsrefcnt gRefCnt; @@ -403,6 +406,7 @@ void nsHTMLAtoms::AddrefAtoms() ibPseudo = NS_NewAtom(":ib-pseudo"); id = NS_NewAtom("id"); iframe = NS_NewAtom("iframe"); + ilayer = NS_NewAtom("ilayer"); img = NS_NewAtom("img"); index = NS_NewAtom("index"); input = NS_NewAtom("input"); @@ -410,6 +414,7 @@ void nsHTMLAtoms::AddrefAtoms() label = NS_NewAtom("label"); labelContentPseudo = NS_NewAtom(":label-content"); lang = NS_NewAtom("lang"); + layer = NS_NewAtom("layer"); layout = NS_NewAtom("layout"); li = NS_NewAtom("li"); link = NS_NewAtom("link"); @@ -537,6 +542,7 @@ void nsHTMLAtoms::AddrefAtoms() wrap = NS_NewAtom("wrap"); wrappedFramePseudo = NS_NewAtom(":wrapped-frame"); zindex = NS_NewAtom("zindex"); + z_index = NS_NewAtom("z-index"); } ++gRefCnt; } @@ -657,6 +663,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(ibPseudo); NS_RELEASE(id); NS_RELEASE(iframe); + NS_RELEASE(ilayer); NS_RELEASE(img); NS_RELEASE(index); NS_RELEASE(input); @@ -664,6 +671,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(label); NS_RELEASE(labelContentPseudo); NS_RELEASE(lang); + NS_RELEASE(layer); NS_RELEASE(layout); NS_RELEASE(li); NS_RELEASE(link); @@ -786,6 +794,7 @@ void nsHTMLAtoms::ReleaseAtoms() NS_RELEASE(wrap); NS_RELEASE(wrappedFramePseudo); NS_RELEASE(zindex); + NS_RELEASE(z_index); } } diff --git a/layout/html/base/src/nsHTMLAtoms.h b/layout/html/base/src/nsHTMLAtoms.h index 3fb2f97a00b..ac38f76eb8f 100644 --- a/layout/html/base/src/nsHTMLAtoms.h +++ b/layout/html/base/src/nsHTMLAtoms.h @@ -167,6 +167,7 @@ public: static nsIAtom* ibPseudo; static nsIAtom* id; static nsIAtom* iframe; + static nsIAtom* ilayer; static nsIAtom* img; static nsIAtom* index; static nsIAtom* input; @@ -175,6 +176,7 @@ public: static nsIAtom* label; static nsIAtom* labelContentPseudo; static nsIAtom* lang; + static nsIAtom* layer; static nsIAtom* layout; static nsIAtom* li; static nsIAtom* link; @@ -313,6 +315,7 @@ public: static nsIAtom* wrappedFramePseudo; static nsIAtom* zindex; + static nsIAtom* z_index; }; #endif /* nsHTMLAtoms_h___ */ diff --git a/layout/html/content/src/nsHTMLLayerElement.cpp b/layout/html/content/src/nsHTMLLayerElement.cpp index 886159ceec5..9b703fa1a6b 100644 --- a/layout/html/content/src/nsHTMLLayerElement.cpp +++ b/layout/html/content/src/nsHTMLLayerElement.cpp @@ -18,7 +18,10 @@ */ #include "nsIDOMHTMLElement.h" #include "nsIScriptObjectOwner.h" +#include "nsIDOMHTMLLayerElement.h" #include "nsIDOMEventReceiver.h" +#include "nsIDOMDocument.h" +#include "nsIDocument.h" #include "nsIHTMLContent.h" #include "nsGenericHTMLElement.h" #include "nsHTMLAtoms.h" @@ -30,12 +33,13 @@ #define _I32_MIN (-2147483647 - 1) /* minimum signed 32 bit value */ -static NS_DEFINE_IID(kIDOMHTMLLayerElementIID, NS_IDOMHTMLELEMENT_IID); +static NS_DEFINE_IID(kIDOMHTMLLayerElementIID, NS_IDOMHTMLLAYERELEMENT_IID); +static NS_DEFINE_IID(kIDOMDocumentIID, NS_IDOMDOCUMENT_IID); -class nsHTMLLayerElement : public nsIDOMHTMLElement,/* XXX need layer api */ - public nsIScriptObjectOwner, - public nsIDOMEventReceiver, - public nsIHTMLContent +class nsHTMLLayerElement : public nsIDOMHTMLLayerElement, + public nsIScriptObjectOwner, + public nsIDOMEventReceiver, + public nsIHTMLContent { public: nsHTMLLayerElement(nsIAtom* aTag); @@ -54,8 +58,21 @@ public: NS_IMPL_IDOMHTMLELEMENT_USING_GENERIC(mInner) // nsIDOMHTMLLayerElement - NS_IMETHOD GetCite(nsString& aCite); - NS_IMETHOD SetCite(const nsString& aCite); + NS_IMETHOD GetTop(PRInt32* aTop); + NS_IMETHOD SetTop(PRInt32 aTop); + NS_IMETHOD GetLeft(PRInt32* aLeft); + NS_IMETHOD SetLeft(PRInt32 aLeft); + NS_IMETHOD GetVisibility(nsString& aVisibility); + NS_IMETHOD SetVisibility(const nsString& aVisibility); + NS_IMETHOD GetBackground(nsString& aBackground); + NS_IMETHOD SetBackground(const nsString& aBackground); + NS_IMETHOD GetBgColor(nsString& aBgColor); + NS_IMETHOD SetBgColor(const nsString& aBgColor); + NS_IMETHOD GetName(nsString& aName); + NS_IMETHOD SetName(const nsString& aName); + NS_IMETHOD GetZIndex(PRInt32* aZIndex); + NS_IMETHOD SetZIndex(PRInt32 aZIndex); + NS_IMETHOD GetDocument(nsIDOMDocument** aReturn); // nsIScriptObjectOwner NS_IMPL_ISCRIPTOBJECTOWNER_USING_GENERIC(mInner) @@ -105,17 +122,43 @@ nsresult nsHTMLLayerElement::QueryInterface(REFNSIID aIID, void** aInstancePtr) { NS_IMPL_HTML_CONTENT_QUERY_INTERFACE(aIID, aInstancePtr, this) -#if XXX if (aIID.Equals(kIDOMHTMLLayerElementIID)) { nsIDOMHTMLLayerElement* tmp = this; *aInstancePtr = (void*) tmp; mRefCnt++; return NS_OK; } -#endif return NS_NOINTERFACE; } +NS_IMPL_INT_ATTR(nsHTMLLayerElement, Top, top) +NS_IMPL_INT_ATTR(nsHTMLLayerElement, Left, left) +NS_IMPL_STRING_ATTR(nsHTMLLayerElement, Visibility, visibility) +NS_IMPL_STRING_ATTR(nsHTMLLayerElement, Background, background) +NS_IMPL_STRING_ATTR(nsHTMLLayerElement, BgColor, bgcolor) +NS_IMPL_STRING_ATTR(nsHTMLLayerElement, Name, name) +NS_IMPL_INT_ATTR(nsHTMLLayerElement, ZIndex, zindex) + +NS_IMETHODIMP +nsHTMLLayerElement::GetDocument(nsIDOMDocument** aDocument) +{ + // XXX This is cheating. We should really return the layer's + // internal document. + nsresult result = NS_OK; + nsIDocument* document; + + result = mInner.GetDocument(document); + if (NS_SUCCEEDED(result)) { + result = document->QueryInterface(kIDOMDocumentIID, (void**)&aDocument); + NS_RELEASE(document); + } + else { + *aDocument = nsnull; + } + + return result; +} + nsresult nsHTMLLayerElement::CloneNode(PRBool aDeep, nsIDOMNode** aReturn) { @@ -127,11 +170,12 @@ nsHTMLLayerElement::CloneNode(PRBool aDeep, nsIDOMNode** aReturn) return it->QueryInterface(kIDOMNodeIID, (void**) aReturn); } -NS_IMPL_STRING_ATTR(nsHTMLLayerElement, Cite, cite) - static nsGenericHTMLElement::EnumTable kVisibilityTable[] = { - {"hide", NS_STYLE_VISIBILITY_HIDDEN}, + {"hidden", NS_STYLE_VISIBILITY_HIDDEN}, {"visible", NS_STYLE_VISIBILITY_VISIBLE}, + {"show", NS_STYLE_VISIBILITY_VISIBLE}, + {"hide", NS_STYLE_VISIBILITY_HIDDEN}, + {"inherit", NS_STYLE_VISIBILITY_VISIBLE}, {0} }; @@ -159,7 +203,8 @@ nsHTMLLayerElement::StringToAttribute(nsIAtom* aAttribute, return NS_CONTENT_ATTR_HAS_VALUE; } } - else if (aAttribute == nsHTMLAtoms::zindex) { + else if ((aAttribute == nsHTMLAtoms::zindex) || + (aAttribute == nsHTMLAtoms::z_index)) { if (nsGenericHTMLElement::ParseValue(aValue, 0, aResult, eHTMLUnit_Integer)) { return NS_CONTENT_ATTR_HAS_VALUE; } @@ -251,6 +296,10 @@ MapAttributesInto(nsIHTMLAttributes* aAttributes, if (value.GetUnit() == eHTMLUnit_Integer) { position->mZIndex.SetIntValue(value.GetIntValue(), eStyleUnit_Integer); } + aAttributes->GetAttribute(nsHTMLAtoms::z_index, value); + if (value.GetUnit() == eHTMLUnit_Integer) { + position->mZIndex.SetIntValue(value.GetIntValue(), eStyleUnit_Integer); + } // Visibility aAttributes->GetAttribute(nsHTMLAtoms::visibility, value); @@ -293,6 +342,17 @@ nsHTMLLayerElement::GetStyleHintForAttributeChange( const nsIAtom* aAttribute, PRInt32 *aHint) const { - nsGenericHTMLElement::GetStyleHintForCommonAttributes(this, aAttribute, aHint); + if ((aAttribute == nsHTMLAtoms::visibility) || + (aAttribute == nsHTMLAtoms::z_index) || + (aAttribute == nsHTMLAtoms::zindex)) { + *aHint = NS_STYLE_HINT_VISUAL; + } + else if ((aAttribute == nsHTMLAtoms::top) || + (aAttribute == nsHTMLAtoms::left)) { + *aHint = NS_STYLE_HINT_REFLOW; + } + else { + nsGenericHTMLElement::GetStyleHintForCommonAttributes(this, aAttribute, aHint); + } return NS_OK; } diff --git a/layout/html/document/src/nsHTMLDocument.cpp b/layout/html/document/src/nsHTMLDocument.cpp index 3331128cc01..ec4f0cb3216 100644 --- a/layout/html/document/src/nsHTMLDocument.cpp +++ b/layout/html/document/src/nsHTMLDocument.cpp @@ -70,6 +70,9 @@ const PRInt32 kBackward = 1; #include "nsHTMLContentSinkStream.h" #endif +// XXX Used to control whether we implement document.layers +//#define NS_IMPLEMENT_DOCUMENT_LAYERS + static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID); static NS_DEFINE_IID(kIDocumentIID, NS_IDOCUMENT_IID); static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID); @@ -110,6 +113,7 @@ nsHTMLDocument::nsHTMLDocument() mEmbeds = nsnull; mLinks = nsnull; mAnchors = nsnull; + mLayers = nsnull; mNamedItems = nsnull; mParser = nsnull; nsHTMLAtoms::AddrefAtoms(); @@ -144,6 +148,7 @@ nsHTMLDocument::~nsHTMLDocument() NS_IF_RELEASE(mEmbeds); NS_IF_RELEASE(mLinks); NS_IF_RELEASE(mAnchors); + NS_IF_RELEASE(mLayers); if (nsnull != mAttrStyleSheet) { mAttrStyleSheet->SetOwningDocument(nsnull); NS_RELEASE(mAttrStyleSheet); @@ -231,6 +236,7 @@ nsHTMLDocument::Reset(nsIURL *aURL) NS_IF_RELEASE(mEmbeds); NS_IF_RELEASE(mLinks); NS_IF_RELEASE(mAnchors); + NS_IF_RELEASE(mLayers); for (i = 0; i < mImageMaps.Count(); i++) { nsIDOMHTMLMapElement* map = (nsIDOMHTMLMapElement*)mImageMaps.ElementAt(i); @@ -1570,11 +1576,42 @@ nsHTMLDocument::GetEmbeds(nsIDOMHTMLCollection** aEmbeds) return NS_OK; } +PRBool +nsHTMLDocument::MatchLayers(nsIContent *aContent, nsString* aData) +{ + nsIAtom *name; + aContent->GetTag(name); + nsAutoString attr; + PRBool result = PR_FALSE; + + if ((nsnull != name) && + ((nsHTMLAtoms::layer == name) || (nsHTMLAtoms::ilayer == name))) { + result = PR_TRUE; + } + + NS_IF_RELEASE(name); + return result; +} + NS_IMETHODIMP nsHTMLDocument::GetLayers(nsIDOMHTMLCollection** aLayers) { - //XXX TBI - return NS_ERROR_NOT_IMPLEMENTED; +#ifdef NS_IMPLEMENT_DOCUMENT_LAYERS + if (nsnull == mLayers) { + mAnchors = new nsContentList(this, MatchLayers, nsnull); + if (nsnull == mLayers) { + return NS_ERROR_OUT_OF_MEMORY; + } + NS_ADDREF(mLayers); + } + + *aLayers = (nsIDOMHTMLCollection *)mLayers; + NS_ADDREF(mLayers); +#else + *aLayers = nsnull; +#endif + + return NS_OK; } NS_IMETHODIMP @@ -1615,7 +1652,7 @@ IsNamedItem(nsIContent* aContent, nsIAtom *aTag, PRBool aInForm, nsString& aName) { // Only the content types reflected in Level 0 with a NAME - // attribute are registered. Images and forms always get + // attribute are registered. Images, layers and forms always get // reflected up to the document. Applets and embeds only go // to the closest container (which could be a form). if ((aTag == nsHTMLAtoms::img) || (aTag == nsHTMLAtoms::form) || @@ -1626,6 +1663,13 @@ IsNamedItem(nsIContent* aContent, nsIAtom *aTag, } } + if ((aTag == nsHTMLAtoms::layer) || (aTag == nsHTMLAtoms::ilayer)) { + if ((NS_CONTENT_ATTR_HAS_VALUE == aContent->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::name, aName)) || + (NS_CONTENT_ATTR_HAS_VALUE == aContent->GetAttribute(kNameSpaceID_HTML, nsHTMLAtoms::id, aName))) { + return PR_TRUE; + } + } + return PR_FALSE; } diff --git a/layout/html/document/src/nsHTMLDocument.h b/layout/html/document/src/nsHTMLDocument.h index e6563de4408..bf0c972bf1d 100644 --- a/layout/html/document/src/nsHTMLDocument.h +++ b/layout/html/document/src/nsHTMLDocument.h @@ -167,6 +167,7 @@ protected: virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet); static PRBool MatchLinks(nsIContent *aContent, nsString* aData); static PRBool MatchAnchors(nsIContent *aContent, nsString* aData); + static PRBool MatchLayers(nsIContent *aContent, nsString* aData); static PRBool MatchNameAttribute(nsIContent* aContent, nsString* aData); PRBool GetBodyContent(); @@ -192,6 +193,7 @@ protected: nsContentList *mLinks; nsContentList *mAnchors; nsContentList *mForms; + nsContentList *mLayers; PLHashTable *mNamedItems;