diff --git a/content/base/src/nsImageLoadingContent.cpp b/content/base/src/nsImageLoadingContent.cpp index bc565bee3abc..c7acfb4a11fe 100644 --- a/content/base/src/nsImageLoadingContent.cpp +++ b/content/base/src/nsImageLoadingContent.cpp @@ -60,6 +60,7 @@ #include "nsThreadUtils.h" #include "nsNetUtil.h" #include "nsAsyncDOMEvent.h" +#include "nsGenericHTMLElement.h" #include "nsIPresShell.h" #include "nsEventStates.h" @@ -774,9 +775,9 @@ nsImageLoadingContent::LoadImage(nsIURI* aNewURI, nsLoadFlags loadFlags = aLoadFlags; PRInt32 corsmode = GetCORSMode(); - if (corsmode == nsImageLoadingContent::CORS_ANONYMOUS) { + if (corsmode == nsGenericHTMLElement::CORS_ANONYMOUS) { loadFlags |= imgILoader::LOAD_CORS_ANONYMOUS; - } else if (corsmode == nsImageLoadingContent::CORS_USE_CREDENTIALS) { + } else if (corsmode == nsGenericHTMLElement::CORS_USE_CREDENTIALS) { loadFlags |= imgILoader::LOAD_CORS_USE_CREDENTIALS; } @@ -1186,8 +1187,8 @@ nsImageLoadingContent::CreateStaticImageClone(nsImageLoadingContent* aDest) cons aDest->mSuppressed = mSuppressed; } -nsImageLoadingContent::CORSMode +nsGenericHTMLElement::CORSMode nsImageLoadingContent::GetCORSMode() { - return CORS_NONE; + return nsGenericHTMLElement::CORS_NONE; } diff --git a/content/base/src/nsImageLoadingContent.h b/content/base/src/nsImageLoadingContent.h index c5aea1966520..dbeef6e14d90 100644 --- a/content/base/src/nsImageLoadingContent.h +++ b/content/base/src/nsImageLoadingContent.h @@ -53,6 +53,7 @@ #include "nsContentUtils.h" // NS_CONTENT_DELETE_LIST_MEMBER #include "nsString.h" #include "nsEventStates.h" +#include "nsGenericHTMLElement.h" class nsIURI; class nsIDocument; @@ -70,25 +71,6 @@ public: NS_DECL_IMGIDECODEROBSERVER NS_DECL_NSIIMAGELOADINGCONTENT - enum CORSMode { - /** - * The default of not using CORS to validate cross-origin loads. - */ - CORS_NONE, - - /** - * Validate cross-site loads using CORS, but do not send any credentials - * (cookies, HTTP auth logins, etc) along with the request. - */ - CORS_ANONYMOUS, - - /** - * Validate cross-site loads using CORS, and send credentials such as cookies - * and HTTP auth logins along with the request. - */ - CORS_USE_CREDENTIALS - }; - protected: /** * LoadImage is called by subclasses when the appropriate @@ -199,9 +181,9 @@ protected: /** * Returns the CORS mode that will be used for all future image loads. The - * default implementation returns CORS_NONE unconditionally. + * default implementation returns nsGenericHTMLElement::CORS_NONE unconditionally. */ - virtual CORSMode GetCORSMode(); + virtual nsGenericHTMLElement::CORSMode GetCORSMode(); private: /** diff --git a/content/html/content/src/nsGenericHTMLElement.cpp b/content/html/content/src/nsGenericHTMLElement.cpp index 41ef30cf0b08..7897ffd19fc6 100644 --- a/content/html/content/src/nsGenericHTMLElement.cpp +++ b/content/html/content/src/nsGenericHTMLElement.cpp @@ -2884,6 +2884,14 @@ nsGenericHTMLFormElement::PreHandleEvent(nsEventChainPreVisitor& aVisitor) return nsGenericHTMLElement::PreHandleEvent(aVisitor); } +const nsAttrValue::EnumTable nsGenericHTMLElement::kCORSAttributeTable[] = { + // Order matters here + // See ParseAttribute in nsHTMLImageElement or nsHTMLMediaElement + { "anonymous", nsGenericHTMLElement::CORS_ANONYMOUS }, + { "use-credentials", nsGenericHTMLElement::CORS_USE_CREDENTIALS }, + { 0 } +}; + /* virtual */ bool nsGenericHTMLFormElement::IsDisabled() const diff --git a/content/html/content/src/nsGenericHTMLElement.h b/content/html/content/src/nsGenericHTMLElement.h index f79ba6ef1eab..f23c8ea76a09 100644 --- a/content/html/content/src/nsGenericHTMLElement.h +++ b/content/html/content/src/nsGenericHTMLElement.h @@ -542,6 +542,32 @@ public: return HasAttr(kNameSpaceID_None, nsGkAtoms::hidden); } + /** + * Shared cross-origin resource sharing attributes so they don't get + * duplicated on every CORS-enabled element + */ + + enum CORSMode { + /** + * The default of not using CORS to validate cross-origin loads. + */ + CORS_NONE, + + /** + * Validate cross-site loads using CORS, but do not send any credentials + * (cookies, HTTP auth logins, etc) along with the request. + */ + CORS_ANONYMOUS, + + /** + * Validate cross-site loads using CORS, and send credentials such as cookies + * and HTTP auth logins along with the request. + */ + CORS_USE_CREDENTIALS + }; + + const static nsAttrValue::EnumTable kCORSAttributeTable[]; + protected: /** * Add/remove this element to the documents name cache diff --git a/content/html/content/src/nsHTMLImageElement.cpp b/content/html/content/src/nsHTMLImageElement.cpp index 0cd7d940a3ae..cf210cfb2dff 100644 --- a/content/html/content/src/nsHTMLImageElement.cpp +++ b/content/html/content/src/nsHTMLImageElement.cpp @@ -126,7 +126,7 @@ public: NS_DECL_NSIDOMHTMLIMAGEELEMENT // override from nsImageLoadingContent - nsImageLoadingContent::CORSMode GetCORSMode(); + nsGenericHTMLElement::CORSMode GetCORSMode(); // nsIJSNativeInitializer NS_IMETHOD Initialize(nsISupports* aOwner, JSContext* aContext, @@ -245,13 +245,6 @@ NS_IMPL_URI_ATTR(nsHTMLImageElement, Src, src) NS_IMPL_STRING_ATTR(nsHTMLImageElement, UseMap, usemap) NS_IMPL_INT_ATTR(nsHTMLImageElement, Vspace, vspace) -static const nsAttrValue::EnumTable kCrossOriginTable[] = { - // Order matters here; see ParseAttribute - { "anonymous", nsImageLoadingContent::CORS_ANONYMOUS }, - { "use-credentials", nsImageLoadingContent::CORS_USE_CREDENTIALS }, - { 0 } -}; - // crossorigin is not "limited to only known values" per spec, so it's // just a string attr purposes of the DOM crossOrigin property. NS_IMPL_STRING_ATTR(nsHTMLImageElement, CrossOrigin, crossorigin) @@ -370,10 +363,10 @@ nsHTMLImageElement::ParseAttribute(PRInt32 aNamespaceID, return ParseAlignValue(aValue, aResult); } if (aAttribute == nsGkAtoms::crossorigin) { - return aResult.ParseEnumValue(aValue, kCrossOriginTable, false, + return aResult.ParseEnumValue(aValue, nsGenericHTMLElement::kCORSAttributeTable, false, // default value is anonymous if aValue is // not a value we understand - &kCrossOriginTable[0]); + &nsGenericHTMLElement::kCORSAttributeTable[0]); } if (ParseImageAttribute(aAttribute, aValue, aResult)) { return true; @@ -669,16 +662,16 @@ nsHTMLImageElement::CopyInnerTo(nsGenericElement* aDest) const return nsGenericHTMLElement::CopyInnerTo(aDest); } -nsImageLoadingContent::CORSMode +nsGenericHTMLElement::CORSMode nsHTMLImageElement::GetCORSMode() { - nsImageLoadingContent::CORSMode ret = nsImageLoadingContent::CORS_NONE; + nsGenericHTMLElement::CORSMode ret = nsGenericHTMLElement::CORS_NONE; const nsAttrValue* value = GetParsedAttr(nsGkAtoms::crossorigin); if (value) { NS_ASSERTION(value->Type() == nsAttrValue::eEnum, "Why is this not an enum value?"); - ret = nsImageLoadingContent::CORSMode(value->GetEnumValue()); + ret = nsGenericHTMLElement::CORSMode(value->GetEnumValue()); } return ret; diff --git a/layout/svg/base/src/Makefile.in b/layout/svg/base/src/Makefile.in index dcb6ae37f4d4..7fd1dc6913bb 100644 --- a/layout/svg/base/src/Makefile.in +++ b/layout/svg/base/src/Makefile.in @@ -106,6 +106,7 @@ LOCAL_INCLUDES = \ -I$(srcdir)/../../../xul/base/src \ -I$(srcdir)/../../../../content/svg/content/src \ -I$(srcdir)/../../../../content/base/src \ + -I$(srcdir)/../../../../content/html/content/src \ $(NULL) libs::