Remove aForceType argument of LoadObject, make it a capability instead

bug 322128 r+sr=bz
This commit is contained in:
cbiesinger%web.de 2006-01-05 13:30:19 +00:00
Родитель 6baa9b5031
Коммит 97aaafa544
5 изменённых файлов: 19 добавлений и 364 удалений

Просмотреть файл

@ -702,7 +702,6 @@ nsresult
nsObjectLoadingContent::LoadObject(const nsAString& aURI,
PRBool aNotify,
const nsCString& aTypeHint,
PRBool aForceType,
PRBool aForceLoad)
{
LOG(("OBJLC [%p]: Loading object: URI string=<%s> notify=%i type=<%s> forcetype=%i forceload=%i\n",
@ -730,18 +729,17 @@ nsObjectLoadingContent::LoadObject(const nsAString& aURI,
return NS_OK;
}
return LoadObject(uri, aNotify, aTypeHint, aForceType, aForceLoad);
return LoadObject(uri, aNotify, aTypeHint, aForceLoad);
}
nsresult
nsObjectLoadingContent::LoadObject(nsIURI* aURI,
PRBool aNotify,
const nsCString& aTypeHint,
PRBool aForceType,
PRBool aForceLoad)
{
LOG(("OBJLC [%p]: Loading object: URI=<%p> notify=%i type=<%s> forcetype=%i forceload=%i\n",
this, aURI, aNotify, aTypeHint.get(), aForceType, aForceLoad));
LOG(("OBJLC [%p]: Loading object: URI=<%p> notify=%i type=<%s> forceload=%i\n",
this, aURI, aNotify, aTypeHint.get(), aForceLoad));
if (mURI && aURI && !aForceLoad) {
PRBool equal;
@ -849,10 +847,13 @@ nsObjectLoadingContent::LoadObject(nsIURI* aURI,
// change the order of the declarations!
AutoFallback fallback(this, &rv);
if (aForceType && !aTypeHint.IsEmpty()) {
PRUint32 caps = GetCapabilities();
LOG(("OBJLC [%p]: Capabilities: %04x\n", this, caps));
if ((caps & eOverrideServerType) && !aTypeHint.IsEmpty()) {
ObjectType newType = GetTypeOfContent(aTypeHint);
if (newType != mType) {
LOG(("OBJLC [%p]: (aForceType) Changing type from %u to %u\n", this, mType, newType));
LOG(("OBJLC [%p]: (eOverrideServerType) Changing type from %u to %u\n", this, mType, newType));
UnloadContent();
@ -908,7 +909,7 @@ nsObjectLoadingContent::LoadObject(nsIURI* aURI,
PRBool isSupportedClassID = PR_FALSE;
nsCAutoString typeForID; // Will be set iff isSupportedClassID == PR_TRUE
PRBool hasID = PR_FALSE;
if (GetCapabilities() & eSupportClassID) {
if (caps & eSupportClassID) {
nsAutoString classid;
thisContent->GetAttr(kNameSpaceID_None, nsHTMLAtoms::classid, classid);
if (!classid.IsEmpty()) {

Просмотреть файл

@ -126,9 +126,8 @@ class nsObjectLoadingContent : public nsImageLoadingContent
* @param aURI The URI to load.
* @param aNotify If true, nsIDocumentObserver state change notifications
* will be sent as needed.
* @param aTypeHint MIME Type hint. Overridden by the server.
* @param aForceType Whether to always use aTypeHint as the type, instead
* of letting the server override it.
* @param aTypeHint MIME Type hint. Overridden by the server unless this
* class has the eOverrideServerType capability.
* @param aForceLoad If true, the object will be refetched even if the URI
* is the same as the currently-loaded object.
* @note Prefer the nsIURI-taking version of this function if a URI object
@ -139,7 +138,6 @@ class nsObjectLoadingContent : public nsImageLoadingContent
nsresult LoadObject(const nsAString& aURI,
PRBool aNotify,
const nsCString& aTypeHint = EmptyCString(),
PRBool aForceType = PR_FALSE,
PRBool aForceLoad = PR_FALSE);
/**
* Loads the object from the given URI.
@ -165,16 +163,12 @@ class nsObjectLoadingContent : public nsImageLoadingContent
* Otherwise a request to that URI is made and the type sent by the server
* is used to find a suitable handler.
*
* @param aForceType Whether the passed-in type should override
* server-supplied MIME types. Will be ignored if
* aTypeHint is empty.
* @param aForceLoad If true, the object will be refetched even if the URI
* is the same as the currently-loaded object.
*/
nsresult LoadObject(nsIURI* aURI,
PRBool aNotify,
const nsCString& aTypeHint = EmptyCString(),
PRBool aForceType = PR_FALSE,
PRBool aForceLoad = PR_FALSE);
enum Capabilities {
@ -186,7 +180,9 @@ class nsObjectLoadingContent : public nsImageLoadingContent
#ifdef MOZ_SVG
eSupportSVG = PR_BIT(3), // SVG is supported (image/svg+xml)
#endif
eSupportClassID = PR_BIT(4) // The classid attribute is supported
eSupportClassID = PR_BIT(4), // The classid attribute is supported
eOverrideServerType = PR_BIT(5) // The server-sent MIME type is ignored
// (ignored if no type is specified)
};
/**

Просмотреть файл

@ -1,342 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Pierre Phaneuf <pp@ludusdesign.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsIDOMHTMLAppletElement.h"
#include "nsIDOMEventReceiver.h"
#include "nsGenericHTMLElement.h"
#include "nsHTMLAtoms.h"
#include "nsStyleConsts.h"
#include "nsPresContext.h"
#include "nsIDocument.h"
#include "nsObjectLoadingContent.h"
// XXX this is to get around conflicts with windows.h defines
// introduced through jni.h
#if defined (XP_WIN) && ! defined (WINCE)
#undef GetClassName
#undef GetObject
#endif
class nsHTMLAppletElement : public nsGenericHTMLElement,
public nsObjectLoadingContent,
public nsIDOMHTMLAppletElement
{
public:
nsHTMLAppletElement(nsINodeInfo *aNodeInfo, PRBool aFromParser = PR_FALSE);
virtual ~nsHTMLAppletElement();
// nsISupports
NS_DECL_ISUPPORTS_INHERITED
// nsIDOMNode
NS_FORWARD_NSIDOMNODE_NO_CLONENODE(nsGenericHTMLElement::)
// nsIDOMElement
NS_FORWARD_NSIDOMELEMENT(nsGenericHTMLElement::)
// nsIDOMHTMLElement
NS_FORWARD_NSIDOMHTMLELEMENT(nsGenericHTMLElement::)
// nsIDOMHTMLAppletElement
NS_DECL_NSIDOMHTMLAPPLETELEMENT
virtual void DoneAddingChildren(PRBool aHaveNotified);
virtual PRBool IsDoneAddingChildren();
// nsIContent
// Have to override tabindex for <embed> to act right
NS_IMETHOD GetTabIndex(PRInt32* aTabIndex);
NS_IMETHOD SetTabIndex(PRInt32 aTabIndex);
// Let applet decide whether it wants focus from mouse clicks
virtual PRBool IsFocusable(PRInt32 *aTabIndex = nsnull);
virtual PRUint32 GetDesiredIMEState();
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
PRBool aCompileEventHandlers);
virtual void UnbindFromTree(PRBool aDeep = PR_TRUE,
PRBool aNullParent = PR_TRUE);
virtual nsresult SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
nsIAtom* aPrefix, const nsAString& aValue,
PRBool aNotify);
virtual PRBool ParseAttribute(PRInt32 aNamespaceID,
nsIAtom* aAttribute,
const nsAString& aValue,
nsAttrValue& aResult);
virtual nsMapRuleToAttributesFunc GetAttributeMappingFunction() const;
NS_IMETHOD_(PRBool) IsAttributeMapped(const nsIAtom* aAttribute) const;
virtual PRInt32 IntrinsicState() const;
// nsObjectLoadingContent
virtual PRUint32 GetCapabilities() const;
protected:
/**
* Calls LoadObject with the correct arguments to start the plugin
* load.
*/
NS_HIDDEN_(void) StartAppletLoad(PRBool aNotify);
PRPackedBool mReflectedApplet;
PRPackedBool mIsDoneAddingChildren;
};
NS_IMPL_NS_NEW_HTML_ELEMENT_CHECK_PARSER(Applet)
nsHTMLAppletElement::nsHTMLAppletElement(nsINodeInfo *aNodeInfo, PRBool aFromParser)
: nsGenericHTMLElement(aNodeInfo), mReflectedApplet(PR_FALSE),
mIsDoneAddingChildren(!aFromParser)
{
}
nsHTMLAppletElement::~nsHTMLAppletElement()
{
}
PRBool
nsHTMLAppletElement::IsDoneAddingChildren()
{
return mIsDoneAddingChildren;
}
PRUint32
nsHTMLAppletElement::GetCapabilities() const
{
return eSupportPlugins;
}
void
nsHTMLAppletElement::DoneAddingChildren(PRBool aHaveNotified)
{
mIsDoneAddingChildren = PR_TRUE;
// If we're already in the document, start the load, because BindToTree
// didn't.
if (IsInDoc()) {
StartAppletLoad(aHaveNotified);
}
}
NS_IMPL_ADDREF_INHERITED(nsHTMLAppletElement, nsGenericElement)
NS_IMPL_RELEASE_INHERITED(nsHTMLAppletElement, nsGenericElement)
// QueryInterface implementation for nsHTMLAppletElement
NS_HTML_CONTENT_INTERFACE_MAP_BEGIN(nsHTMLAppletElement, nsGenericHTMLElement)
NS_INTERFACE_MAP_ENTRY(nsIDOMHTMLAppletElement)
NS_INTERFACE_MAP_ENTRY(imgIDecoderObserver)
NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
NS_INTERFACE_MAP_ENTRY(nsIFrameLoaderOwner)
NS_INTERFACE_MAP_ENTRY(nsIObjectLoadingContent)
NS_INTERFACE_MAP_ENTRY(nsIImageLoadingContent)
NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
NS_INTERFACE_MAP_ENTRY(nsIChannelEventSink)
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(HTMLAppletElement)
NS_HTML_CONTENT_INTERFACE_MAP_END
NS_IMPL_DOM_CLONENODE(nsHTMLAppletElement)
NS_IMPL_STRING_ATTR(nsHTMLAppletElement, Align, align)
NS_IMPL_STRING_ATTR(nsHTMLAppletElement, Alt, alt)
NS_IMPL_STRING_ATTR(nsHTMLAppletElement, Archive, archive)
NS_IMPL_STRING_ATTR(nsHTMLAppletElement, Code, code)
NS_IMPL_URI_ATTR(nsHTMLAppletElement, CodeBase, codebase)
NS_IMPL_STRING_ATTR(nsHTMLAppletElement, Height, height)
NS_IMPL_INT_ATTR(nsHTMLAppletElement, Hspace, hspace)
NS_IMPL_STRING_ATTR(nsHTMLAppletElement, Name, name)
NS_IMPL_STRING_ATTR(nsHTMLAppletElement, Object, object)
NS_IMPL_INT_ATTR(nsHTMLAppletElement, Vspace, vspace)
NS_IMPL_STRING_ATTR(nsHTMLAppletElement, Width, width)
NS_IMPL_INT_ATTR(nsHTMLAppletElement, TabIndex, tabindex)
PRBool
nsHTMLAppletElement::ParseAttribute(PRInt32 aNamespaceID,
nsIAtom* aAttribute,
const nsAString& aValue,
nsAttrValue& aResult)
{
if (aNamespaceID == kNameSpaceID_None) {
if (aAttribute == nsHTMLAtoms::align) {
return nsGenericHTMLElement::ParseAlignValue(aValue, aResult);
}
if (nsGenericHTMLElement::ParseImageAttribute(aAttribute,
aValue, aResult)) {
return PR_TRUE;
}
}
return nsGenericHTMLElement::ParseAttribute(aNamespaceID, aAttribute, aValue,
aResult);
}
static void
MapAttributesIntoRule(const nsMappedAttributes* aAttributes,
nsRuleData* aData)
{
nsGenericHTMLElement::MapImageBorderAttributeInto(aAttributes, aData);
nsGenericHTMLElement::MapImageMarginAttributeInto(aAttributes, aData);
nsGenericHTMLElement::MapImageSizeAttributesInto(aAttributes, aData);
nsGenericHTMLElement::MapImageAlignAttributeInto(aAttributes, aData);
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
}
NS_IMETHODIMP_(PRBool)
nsHTMLAppletElement::IsAttributeMapped(const nsIAtom* aAttribute) const
{
static const MappedAttributeEntry* const map[] = {
sCommonAttributeMap,
sImageMarginSizeAttributeMap,
sImageAlignAttributeMap,
sImageBorderAttributeMap
};
return FindAttributeDependence(aAttribute, map, NS_ARRAY_LENGTH(map));
}
nsMapRuleToAttributesFunc
nsHTMLAppletElement::GetAttributeMappingFunction() const
{
return &MapAttributesIntoRule;
}
nsresult
nsHTMLAppletElement::BindToTree(nsIDocument* aDocument,
nsIContent* aParent,
nsIContent* aBindingParent,
PRBool aCompileEventHandlers)
{
nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent,
aBindingParent,
aCompileEventHandlers);
if (NS_FAILED(rv)) {
return rv;
}
// Must start loading stuff after being in the document, but only when we
// already have all our children.
if (mIsDoneAddingChildren) {
// Don't need to notify: We have no frames yet, since we weren't in a
// document
StartAppletLoad(PR_FALSE);
}
return rv;
}
void
nsHTMLAppletElement::UnbindFromTree(PRBool aDeep,
PRBool aNullParent)
{
RemovedFromDocument();
nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent);
}
nsresult
nsHTMLAppletElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
nsIAtom* aPrefix, const nsAString& aValue,
PRBool aNotify)
{
// If we plan to call LoadObject, we want to do it first so that the
// object load kicks off _before_ the reflow triggered by the SetAttr. But if
// aNotify is false, we are coming from the parser or some such place; we'll
// get bound after all the attributes have been set, so we'll do the
// object load from BindToTree/DoneAddingChildren.
// Skip the LoadObject call in that case.
if (aNotify &&
aNameSpaceID == kNameSpaceID_None && aName == nsHTMLAtoms::code) {
LoadObject(aValue, aNotify,
NS_LITERAL_CSTRING("application/x-java-vm"),
PR_TRUE, PR_TRUE);
}
return nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix,
aValue, aNotify);
}
void
nsHTMLAppletElement::StartAppletLoad(PRBool aNotify)
{
nsAutoString uri;
if (GetAttr(kNameSpaceID_None, nsHTMLAtoms::code, uri)) {
LoadObject(uri, aNotify,
NS_LITERAL_CSTRING("application/x-java-vm"), PR_TRUE);
} else {
// The constructor set the type to eType_Loading; but if we have no code
// attribute, then we aren't really a plugin
Fallback(aNotify);
}
}
PRInt32
nsHTMLAppletElement::IntrinsicState() const
{
return nsGenericHTMLElement::IntrinsicState() | ObjectState();
}
PRBool
nsHTMLAppletElement::IsFocusable(PRInt32 *aTabIndex)
{
if (Type() == eType_Plugin) {
// Has plugin content (java): let the plugin decide what to do in terms of
// internal focus from mouse clicks
if (aTabIndex) {
GetTabIndex(aTabIndex);
}
return PR_TRUE;
}
return nsGenericHTMLElement::IsFocusable(aTabIndex);
}
PRUint32
nsHTMLAppletElement::GetDesiredIMEState()
{
if (Type() == eType_Plugin)
return nsIContent::IME_STATUS_ENABLE;
return nsGenericHTMLElement::GetDesiredIMEState();
}

Просмотреть файл

@ -233,7 +233,7 @@ nsHTMLObjectElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
aNameSpaceID == kNameSpaceID_None && aName == nsHTMLAtoms::data) {
nsAutoString type;
GetAttr(kNameSpaceID_None, nsHTMLAtoms::type, type);
LoadObject(aValue, aNotify, NS_ConvertUTF16toUTF8(type), PR_FALSE, PR_TRUE);
LoadObject(aValue, aNotify, NS_ConvertUTF16toUTF8(type), PR_TRUE);
}

Просмотреть файл

@ -532,11 +532,11 @@ nsHTMLSharedElement::BindToTree(nsIDocument* aDocument,
nsAutoString uri;
if (GetAttr(kNameSpaceID_None, nsHTMLAtoms::src, uri)) {
// Don't notify: We aren't in a document yet, so we have no frames
LoadObject(uri, PR_FALSE, NS_ConvertUTF16toUTF8(type), PR_TRUE);
LoadObject(uri, PR_FALSE, NS_ConvertUTF16toUTF8(type));
} else {
// Sometimes, code uses <embed> with no src attributes, for example using
// code="...". Handle that case.
LoadObject(nsnull, PR_FALSE, NS_ConvertUTF16toUTF8(type), PR_TRUE);
LoadObject(nsnull, PR_FALSE, NS_ConvertUTF16toUTF8(type));
}
}
return rv;
@ -569,7 +569,7 @@ nsHTMLSharedElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
aNameSpaceID == kNameSpaceID_None && aName == nsHTMLAtoms::src) {
nsAutoString type;
GetAttr(kNameSpaceID_None, nsHTMLAtoms::type, type);
LoadObject(aValue, aNotify, NS_ConvertUTF16toUTF8(type), PR_TRUE, PR_TRUE);
LoadObject(aValue, aNotify, NS_ConvertUTF16toUTF8(type), PR_TRUE);
}
}
@ -580,7 +580,7 @@ nsHTMLSharedElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
PRUint32
nsHTMLSharedElement::GetCapabilities() const
{
return eSupportImages | eSupportPlugins
return eSupportImages | eSupportPlugins | eOverrideServerType
#ifdef MOZ_SVG
| eSupportSVG
#endif