mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 710231 - Part 2: Move nsGenericHTMLFrameElement into its own file. r=smaug
--HG-- extra : rebase_source : 91a8636ff2d6cc5892ceb8f0235079f8201b6065
This commit is contained in:
parent
ff743fa577
commit
8b4101d719
@ -57,6 +57,7 @@ CPPSRCS = \
|
|||||||
nsClientRect.cpp \
|
nsClientRect.cpp \
|
||||||
nsHTMLDNSPrefetch.cpp \
|
nsHTMLDNSPrefetch.cpp \
|
||||||
nsGenericHTMLElement.cpp \
|
nsGenericHTMLElement.cpp \
|
||||||
|
nsGenericHTMLFrameElement.cpp \
|
||||||
nsFormSubmission.cpp \
|
nsFormSubmission.cpp \
|
||||||
nsTextEditorState.cpp \
|
nsTextEditorState.cpp \
|
||||||
nsHTMLElement.cpp \
|
nsHTMLElement.cpp \
|
||||||
|
@ -2552,8 +2552,6 @@ nsGenericHTMLElement::GetContextMenu(nsIDOMHTMLMenuElement** aContextMenu)
|
|||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
NS_IMPL_INT_ATTR(nsGenericHTMLFrameElement, TabIndex, tabindex)
|
|
||||||
|
|
||||||
nsGenericHTMLFormElement::nsGenericHTMLFormElement(already_AddRefed<nsINodeInfo> aNodeInfo)
|
nsGenericHTMLFormElement::nsGenericHTMLFormElement(already_AddRefed<nsINodeInfo> aNodeInfo)
|
||||||
: nsGenericHTMLElement(aNodeInfo)
|
: nsGenericHTMLElement(aNodeInfo)
|
||||||
, mForm(nsnull)
|
, mForm(nsnull)
|
||||||
@ -2664,24 +2662,6 @@ nsGenericHTMLFormElement::GetDesiredIMEState()
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
nsGenericHTMLFrameElement::IsHTMLFocusable(bool aWithMouse,
|
|
||||||
bool *aIsFocusable,
|
|
||||||
PRInt32 *aTabIndex)
|
|
||||||
{
|
|
||||||
if (nsGenericHTMLElement::IsHTMLFocusable(aWithMouse, aIsFocusable, aTabIndex)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
*aIsFocusable = nsContentUtils::IsSubDocumentTabbable(this);
|
|
||||||
|
|
||||||
if (!*aIsFocusable && aTabIndex) {
|
|
||||||
*aTabIndex = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericHTMLFormElement::BindToTree(nsIDocument* aDocument,
|
nsGenericHTMLFormElement::BindToTree(nsIDocument* aDocument,
|
||||||
nsIContent* aParent,
|
nsIContent* aParent,
|
||||||
@ -3207,230 +3187,6 @@ nsGenericHTMLFormElement::FieldSetDisabledChanged(bool aNotify)
|
|||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
nsGenericHTMLFrameElement::~nsGenericHTMLFrameElement()
|
|
||||||
{
|
|
||||||
if (mFrameLoader) {
|
|
||||||
mFrameLoader->Destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMPL_CYCLE_COLLECTION_CLASS(nsGenericHTMLFrameElement)
|
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsGenericHTMLFrameElement,
|
|
||||||
nsGenericHTMLElement)
|
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mFrameLoader, nsIFrameLoader)
|
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
|
||||||
|
|
||||||
NS_INTERFACE_TABLE_HEAD(nsGenericHTMLFrameElement)
|
|
||||||
NS_INTERFACE_TABLE_INHERITED1(nsGenericHTMLFrameElement,
|
|
||||||
nsIFrameLoaderOwner)
|
|
||||||
NS_INTERFACE_TABLE_TO_MAP_SEGUE_CYCLE_COLLECTION(nsGenericHTMLFrameElement)
|
|
||||||
NS_INTERFACE_MAP_END_INHERITING(nsGenericHTMLElement)
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsGenericHTMLFrameElement::GetContentDocument(nsIDOMDocument** aContentDocument)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(aContentDocument, "Null out param");
|
|
||||||
*aContentDocument = nsnull;
|
|
||||||
|
|
||||||
nsCOMPtr<nsIDOMWindow> win;
|
|
||||||
GetContentWindow(getter_AddRefs(win));
|
|
||||||
|
|
||||||
if (!win) {
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return win->GetDocument(aContentDocument);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsGenericHTMLFrameElement::GetContentWindow(nsIDOMWindow** aContentWindow)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(aContentWindow, "Null out param");
|
|
||||||
*aContentWindow = nsnull;
|
|
||||||
|
|
||||||
nsresult rv = EnsureFrameLoader();
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
if (!mFrameLoader) {
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool depthTooGreat = false;
|
|
||||||
mFrameLoader->GetDepthTooGreat(&depthTooGreat);
|
|
||||||
if (depthTooGreat) {
|
|
||||||
// Claim to have no contentWindow
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsCOMPtr<nsIDocShell> doc_shell;
|
|
||||||
mFrameLoader->GetDocShell(getter_AddRefs(doc_shell));
|
|
||||||
|
|
||||||
nsCOMPtr<nsPIDOMWindow> win(do_GetInterface(doc_shell));
|
|
||||||
|
|
||||||
if (!win) {
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_ASSERTION(win->IsOuterWindow(),
|
|
||||||
"Uh, this window should always be an outer window!");
|
|
||||||
|
|
||||||
return CallQueryInterface(win, aContentWindow);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsGenericHTMLFrameElement::EnsureFrameLoader()
|
|
||||||
{
|
|
||||||
if (!GetParent() || !IsInDoc() || mFrameLoader) {
|
|
||||||
// If frame loader is there, we just keep it around, cached
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
mFrameLoader = nsFrameLoader::Create(this, mNetworkCreated);
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsGenericHTMLFrameElement::GetFrameLoader(nsIFrameLoader **aFrameLoader)
|
|
||||||
{
|
|
||||||
NS_IF_ADDREF(*aFrameLoader = mFrameLoader);
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP_(already_AddRefed<nsFrameLoader>)
|
|
||||||
nsGenericHTMLFrameElement::GetFrameLoader()
|
|
||||||
{
|
|
||||||
nsRefPtr<nsFrameLoader> loader = mFrameLoader;
|
|
||||||
return loader.forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsGenericHTMLFrameElement::SwapFrameLoaders(nsIFrameLoaderOwner* aOtherOwner)
|
|
||||||
{
|
|
||||||
// We don't support this yet
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsGenericHTMLFrameElement::LoadSrc()
|
|
||||||
{
|
|
||||||
nsresult rv = EnsureFrameLoader();
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
if (!mFrameLoader) {
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = mFrameLoader->LoadFrame();
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
NS_WARNING("failed to load URL");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsGenericHTMLFrameElement::BindToTree(nsIDocument* aDocument,
|
|
||||||
nsIContent* aParent,
|
|
||||||
nsIContent* aBindingParent,
|
|
||||||
bool aCompileEventHandlers)
|
|
||||||
{
|
|
||||||
nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent,
|
|
||||||
aBindingParent,
|
|
||||||
aCompileEventHandlers);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
if (aDocument) {
|
|
||||||
NS_ASSERTION(!nsContentUtils::IsSafeToRunScript(),
|
|
||||||
"Missing a script blocker!");
|
|
||||||
// We're in a document now. Kick off the frame load.
|
|
||||||
LoadSrc();
|
|
||||||
}
|
|
||||||
|
|
||||||
// We're now in document and scripts may move us, so clear
|
|
||||||
// the mNetworkCreated flag.
|
|
||||||
mNetworkCreated = false;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsGenericHTMLFrameElement::UnbindFromTree(bool aDeep, bool aNullParent)
|
|
||||||
{
|
|
||||||
if (mFrameLoader) {
|
|
||||||
// This iframe is being taken out of the document, destroy the
|
|
||||||
// iframe's frame loader (doing that will tear down the window in
|
|
||||||
// this iframe).
|
|
||||||
// XXXbz we really want to only partially destroy the frame
|
|
||||||
// loader... we don't want to tear down the docshell. Food for
|
|
||||||
// later bug.
|
|
||||||
mFrameLoader->Destroy();
|
|
||||||
mFrameLoader = nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsGenericHTMLFrameElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
|
|
||||||
nsIAtom* aPrefix, const nsAString& aValue,
|
|
||||||
bool aNotify)
|
|
||||||
{
|
|
||||||
nsresult rv = nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix,
|
|
||||||
aValue, aNotify);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
if (aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::src) {
|
|
||||||
// Don't propagate error here. The attribute was successfully set, that's
|
|
||||||
// what we should reflect.
|
|
||||||
LoadSrc();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsGenericHTMLFrameElement::DestroyContent()
|
|
||||||
{
|
|
||||||
if (mFrameLoader) {
|
|
||||||
mFrameLoader->Destroy();
|
|
||||||
mFrameLoader = nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsGenericHTMLElement::DestroyContent();
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsGenericHTMLFrameElement::CopyInnerTo(nsGenericElement* aDest) const
|
|
||||||
{
|
|
||||||
nsresult rv = nsGenericHTMLElement::CopyInnerTo(aDest);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
nsIDocument* doc = aDest->OwnerDoc();
|
|
||||||
if (doc->IsStaticDocument() && mFrameLoader) {
|
|
||||||
nsGenericHTMLFrameElement* dest =
|
|
||||||
static_cast<nsGenericHTMLFrameElement*>(aDest);
|
|
||||||
nsFrameLoader* fl = nsFrameLoader::Create(dest, false);
|
|
||||||
NS_ENSURE_STATE(fl);
|
|
||||||
dest->mFrameLoader = fl;
|
|
||||||
static_cast<nsFrameLoader*>(mFrameLoader.get())->CreateStaticClone(fl);
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRInt64
|
|
||||||
nsGenericHTMLFrameElement::SizeOf() const
|
|
||||||
{
|
|
||||||
PRInt64 size = MemoryReporter::GetBasicSize<nsGenericHTMLFrameElement,
|
|
||||||
nsGenericHTMLElement>(this);
|
|
||||||
// TODO: need to implement SizeOf() in nsFrameLoader, bug 672539.
|
|
||||||
size += mFrameLoader ? sizeof(*mFrameLoader.get()) : 0;
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsGenericHTMLElement::Blur()
|
nsGenericHTMLElement::Blur()
|
||||||
{
|
{
|
||||||
|
@ -42,7 +42,6 @@
|
|||||||
#include "nsIDOMHTMLElement.h"
|
#include "nsIDOMHTMLElement.h"
|
||||||
#include "nsINameSpaceManager.h" // for kNameSpaceID_None
|
#include "nsINameSpaceManager.h" // for kNameSpaceID_None
|
||||||
#include "nsIFormControl.h"
|
#include "nsIFormControl.h"
|
||||||
#include "nsIDOMHTMLFrameElement.h"
|
|
||||||
#include "nsFrameLoader.h"
|
#include "nsFrameLoader.h"
|
||||||
#include "nsGkAtoms.h"
|
#include "nsGkAtoms.h"
|
||||||
#include "nsContentCreatorFunctions.h"
|
#include "nsContentCreatorFunctions.h"
|
||||||
@ -1014,73 +1013,6 @@ PR_STATIC_ASSERT(ELEMENT_TYPE_SPECIFIC_BITS_OFFSET + 1 < 32);
|
|||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
|
||||||
* A helper class for frame elements
|
|
||||||
*/
|
|
||||||
|
|
||||||
class nsGenericHTMLFrameElement : public nsGenericHTMLElement,
|
|
||||||
public nsIFrameLoaderOwner
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
nsGenericHTMLFrameElement(already_AddRefed<nsINodeInfo> aNodeInfo,
|
|
||||||
mozilla::dom::FromParser aFromParser)
|
|
||||||
: nsGenericHTMLElement(aNodeInfo)
|
|
||||||
{
|
|
||||||
mNetworkCreated = aFromParser == mozilla::dom::FROM_PARSER_NETWORK;
|
|
||||||
}
|
|
||||||
virtual ~nsGenericHTMLFrameElement();
|
|
||||||
|
|
||||||
NS_DECL_DOM_MEMORY_REPORTER_SIZEOF
|
|
||||||
|
|
||||||
// nsISupports
|
|
||||||
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
|
|
||||||
|
|
||||||
// nsIFrameLoaderOwner
|
|
||||||
NS_DECL_NSIFRAMELOADEROWNER
|
|
||||||
|
|
||||||
// nsIContent
|
|
||||||
virtual bool IsHTMLFocusable(bool aWithMouse, bool *aIsFocusable, PRInt32 *aTabIndex);
|
|
||||||
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|
||||||
nsIContent* aBindingParent,
|
|
||||||
bool aCompileEventHandlers);
|
|
||||||
virtual void UnbindFromTree(bool aDeep = true,
|
|
||||||
bool aNullParent = true);
|
|
||||||
nsresult SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
|
|
||||||
const nsAString& aValue, bool aNotify)
|
|
||||||
{
|
|
||||||
return SetAttr(aNameSpaceID, aName, nsnull, aValue, aNotify);
|
|
||||||
}
|
|
||||||
virtual nsresult SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
|
|
||||||
nsIAtom* aPrefix, const nsAString& aValue,
|
|
||||||
bool aNotify);
|
|
||||||
virtual void DestroyContent();
|
|
||||||
|
|
||||||
nsresult CopyInnerTo(nsGenericElement* aDest) const;
|
|
||||||
|
|
||||||
// nsIDOMHTMLElement
|
|
||||||
NS_IMETHOD GetTabIndex(PRInt32 *aTabIndex);
|
|
||||||
NS_IMETHOD SetTabIndex(PRInt32 aTabIndex);
|
|
||||||
|
|
||||||
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_NO_UNLINK(nsGenericHTMLFrameElement,
|
|
||||||
nsGenericHTMLElement)
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// This doesn't really ensure a frame loade in all cases, only when
|
|
||||||
// it makes sense.
|
|
||||||
nsresult EnsureFrameLoader();
|
|
||||||
nsresult LoadSrc();
|
|
||||||
nsresult GetContentDocument(nsIDOMDocument** aContentDocument);
|
|
||||||
nsresult GetContentWindow(nsIDOMWindow** aContentWindow);
|
|
||||||
|
|
||||||
nsRefPtr<nsFrameLoader> mFrameLoader;
|
|
||||||
// True when the element is created by the parser
|
|
||||||
// using NS_FROM_PARSER_NETWORK flag.
|
|
||||||
// If the element is modified, it may lose the flag.
|
|
||||||
bool mNetworkCreated;
|
|
||||||
};
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A macro to implement the getter and setter for a given string
|
* A macro to implement the getter and setter for a given string
|
||||||
* valued content property. The method uses the generic GetAttr and
|
* valued content property. The method uses the generic GetAttr and
|
||||||
|
255
content/html/content/src/nsGenericHTMLFrameElement.cpp
Normal file
255
content/html/content/src/nsGenericHTMLFrameElement.cpp
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set tw=80 expandtab softtabstop=2 ts=2 sw=2: */
|
||||||
|
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "nsGenericHTMLFrameElement.h"
|
||||||
|
#include "nsIInterfaceRequestorUtils.h"
|
||||||
|
#include "nsContentUtils.h"
|
||||||
|
#include "nsDOMMemoryReporter.h"
|
||||||
|
|
||||||
|
using namespace mozilla::dom;
|
||||||
|
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_CLASS(nsGenericHTMLFrameElement)
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsGenericHTMLFrameElement,
|
||||||
|
nsGenericHTMLElement)
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mFrameLoader, nsIFrameLoader)
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||||
|
|
||||||
|
NS_INTERFACE_TABLE_HEAD(nsGenericHTMLFrameElement)
|
||||||
|
NS_INTERFACE_TABLE_INHERITED1(nsGenericHTMLFrameElement,
|
||||||
|
nsIFrameLoaderOwner)
|
||||||
|
NS_INTERFACE_TABLE_TO_MAP_SEGUE_CYCLE_COLLECTION(nsGenericHTMLFrameElement)
|
||||||
|
NS_INTERFACE_MAP_END_INHERITING(nsGenericHTMLElement)
|
||||||
|
|
||||||
|
NS_IMPL_INT_ATTR(nsGenericHTMLFrameElement, TabIndex, tabindex)
|
||||||
|
|
||||||
|
nsGenericHTMLFrameElement::~nsGenericHTMLFrameElement()
|
||||||
|
{
|
||||||
|
if (mFrameLoader) {
|
||||||
|
mFrameLoader->Destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericHTMLFrameElement::GetContentDocument(nsIDOMDocument** aContentDocument)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(aContentDocument, "Null out param");
|
||||||
|
*aContentDocument = nsnull;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMWindow> win;
|
||||||
|
GetContentWindow(getter_AddRefs(win));
|
||||||
|
|
||||||
|
if (!win) {
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return win->GetDocument(aContentDocument);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericHTMLFrameElement::GetContentWindow(nsIDOMWindow** aContentWindow)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(aContentWindow, "Null out param");
|
||||||
|
*aContentWindow = nsnull;
|
||||||
|
|
||||||
|
nsresult rv = EnsureFrameLoader();
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
if (!mFrameLoader) {
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool depthTooGreat = false;
|
||||||
|
mFrameLoader->GetDepthTooGreat(&depthTooGreat);
|
||||||
|
if (depthTooGreat) {
|
||||||
|
// Claim to have no contentWindow
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDocShell> doc_shell;
|
||||||
|
mFrameLoader->GetDocShell(getter_AddRefs(doc_shell));
|
||||||
|
|
||||||
|
nsCOMPtr<nsPIDOMWindow> win(do_GetInterface(doc_shell));
|
||||||
|
|
||||||
|
if (!win) {
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_ASSERTION(win->IsOuterWindow(),
|
||||||
|
"Uh, this window should always be an outer window!");
|
||||||
|
|
||||||
|
return CallQueryInterface(win, aContentWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericHTMLFrameElement::EnsureFrameLoader()
|
||||||
|
{
|
||||||
|
if (!GetParent() || !IsInDoc() || mFrameLoader) {
|
||||||
|
// If frame loader is there, we just keep it around, cached
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
mFrameLoader = nsFrameLoader::Create(this, mNetworkCreated);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsGenericHTMLFrameElement::GetFrameLoader(nsIFrameLoader **aFrameLoader)
|
||||||
|
{
|
||||||
|
NS_IF_ADDREF(*aFrameLoader = mFrameLoader);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP_(already_AddRefed<nsFrameLoader>)
|
||||||
|
nsGenericHTMLFrameElement::GetFrameLoader()
|
||||||
|
{
|
||||||
|
nsRefPtr<nsFrameLoader> loader = mFrameLoader;
|
||||||
|
return loader.forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsGenericHTMLFrameElement::SwapFrameLoaders(nsIFrameLoaderOwner* aOtherOwner)
|
||||||
|
{
|
||||||
|
// We don't support this yet
|
||||||
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericHTMLFrameElement::LoadSrc()
|
||||||
|
{
|
||||||
|
nsresult rv = EnsureFrameLoader();
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
if (!mFrameLoader) {
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = mFrameLoader->LoadFrame();
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
NS_WARNING("failed to load URL");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericHTMLFrameElement::BindToTree(nsIDocument* aDocument,
|
||||||
|
nsIContent* aParent,
|
||||||
|
nsIContent* aBindingParent,
|
||||||
|
bool aCompileEventHandlers)
|
||||||
|
{
|
||||||
|
nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent,
|
||||||
|
aBindingParent,
|
||||||
|
aCompileEventHandlers);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
if (aDocument) {
|
||||||
|
NS_ASSERTION(!nsContentUtils::IsSafeToRunScript(),
|
||||||
|
"Missing a script blocker!");
|
||||||
|
// We're in a document now. Kick off the frame load.
|
||||||
|
LoadSrc();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We're now in document and scripts may move us, so clear
|
||||||
|
// the mNetworkCreated flag.
|
||||||
|
mNetworkCreated = false;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsGenericHTMLFrameElement::UnbindFromTree(bool aDeep, bool aNullParent)
|
||||||
|
{
|
||||||
|
if (mFrameLoader) {
|
||||||
|
// This iframe is being taken out of the document, destroy the
|
||||||
|
// iframe's frame loader (doing that will tear down the window in
|
||||||
|
// this iframe).
|
||||||
|
// XXXbz we really want to only partially destroy the frame
|
||||||
|
// loader... we don't want to tear down the docshell. Food for
|
||||||
|
// later bug.
|
||||||
|
mFrameLoader->Destroy();
|
||||||
|
mFrameLoader = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericHTMLFrameElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
|
||||||
|
nsIAtom* aPrefix, const nsAString& aValue,
|
||||||
|
bool aNotify)
|
||||||
|
{
|
||||||
|
nsresult rv = nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix,
|
||||||
|
aValue, aNotify);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
if (aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::src) {
|
||||||
|
// Don't propagate error here. The attribute was successfully set, that's
|
||||||
|
// what we should reflect.
|
||||||
|
LoadSrc();
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsGenericHTMLFrameElement::DestroyContent()
|
||||||
|
{
|
||||||
|
if (mFrameLoader) {
|
||||||
|
mFrameLoader->Destroy();
|
||||||
|
mFrameLoader = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsGenericHTMLElement::DestroyContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsGenericHTMLFrameElement::CopyInnerTo(nsGenericElement* aDest) const
|
||||||
|
{
|
||||||
|
nsresult rv = nsGenericHTMLElement::CopyInnerTo(aDest);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
nsIDocument* doc = aDest->OwnerDoc();
|
||||||
|
if (doc->IsStaticDocument() && mFrameLoader) {
|
||||||
|
nsGenericHTMLFrameElement* dest =
|
||||||
|
static_cast<nsGenericHTMLFrameElement*>(aDest);
|
||||||
|
nsFrameLoader* fl = nsFrameLoader::Create(dest, false);
|
||||||
|
NS_ENSURE_STATE(fl);
|
||||||
|
dest->mFrameLoader = fl;
|
||||||
|
static_cast<nsFrameLoader*>(mFrameLoader.get())->CreateStaticClone(fl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
nsGenericHTMLFrameElement::IsHTMLFocusable(bool aWithMouse,
|
||||||
|
bool *aIsFocusable,
|
||||||
|
PRInt32 *aTabIndex)
|
||||||
|
{
|
||||||
|
if (nsGenericHTMLElement::IsHTMLFocusable(aWithMouse, aIsFocusable, aTabIndex)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
*aIsFocusable = nsContentUtils::IsSubDocumentTabbable(this);
|
||||||
|
|
||||||
|
if (!*aIsFocusable && aTabIndex) {
|
||||||
|
*aTabIndex = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt64
|
||||||
|
nsGenericHTMLFrameElement::SizeOf() const
|
||||||
|
{
|
||||||
|
PRInt64 size = MemoryReporter::GetBasicSize<nsGenericHTMLFrameElement,
|
||||||
|
nsGenericHTMLElement>(this);
|
||||||
|
// TODO: need to implement SizeOf() in nsFrameLoader, bug 672539.
|
||||||
|
size += mFrameLoader ? sizeof(*mFrameLoader.get()) : 0;
|
||||||
|
return size;
|
||||||
|
}
|
73
content/html/content/src/nsGenericHTMLFrameElement.h
Normal file
73
content/html/content/src/nsGenericHTMLFrameElement.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim:set tw=80 expandtab softtabstop=2 ts=2 sw=2: */
|
||||||
|
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "nsGenericHTMLElement.h"
|
||||||
|
#include "nsIDOMHTMLFrameElement.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class for frame elements
|
||||||
|
*/
|
||||||
|
class nsGenericHTMLFrameElement : public nsGenericHTMLElement,
|
||||||
|
public nsIFrameLoaderOwner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsGenericHTMLFrameElement(already_AddRefed<nsINodeInfo> aNodeInfo,
|
||||||
|
mozilla::dom::FromParser aFromParser)
|
||||||
|
: nsGenericHTMLElement(aNodeInfo)
|
||||||
|
{
|
||||||
|
mNetworkCreated = aFromParser == mozilla::dom::FROM_PARSER_NETWORK;
|
||||||
|
}
|
||||||
|
virtual ~nsGenericHTMLFrameElement();
|
||||||
|
|
||||||
|
NS_DECL_DOM_MEMORY_REPORTER_SIZEOF
|
||||||
|
|
||||||
|
// nsISupports
|
||||||
|
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
|
||||||
|
|
||||||
|
// nsIFrameLoaderOwner
|
||||||
|
NS_DECL_NSIFRAMELOADEROWNER
|
||||||
|
|
||||||
|
// nsIContent
|
||||||
|
virtual bool IsHTMLFocusable(bool aWithMouse, bool *aIsFocusable, PRInt32 *aTabIndex);
|
||||||
|
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
||||||
|
nsIContent* aBindingParent,
|
||||||
|
bool aCompileEventHandlers);
|
||||||
|
virtual void UnbindFromTree(bool aDeep = true,
|
||||||
|
bool aNullParent = true);
|
||||||
|
nsresult SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
|
||||||
|
const nsAString& aValue, bool aNotify)
|
||||||
|
{
|
||||||
|
return SetAttr(aNameSpaceID, aName, nsnull, aValue, aNotify);
|
||||||
|
}
|
||||||
|
virtual nsresult SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
|
||||||
|
nsIAtom* aPrefix, const nsAString& aValue,
|
||||||
|
bool aNotify);
|
||||||
|
virtual void DestroyContent();
|
||||||
|
|
||||||
|
nsresult CopyInnerTo(nsGenericElement* aDest) const;
|
||||||
|
|
||||||
|
// nsIDOMHTMLElement
|
||||||
|
NS_IMETHOD GetTabIndex(PRInt32 *aTabIndex);
|
||||||
|
NS_IMETHOD SetTabIndex(PRInt32 aTabIndex);
|
||||||
|
|
||||||
|
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED_NO_UNLINK(nsGenericHTMLFrameElement,
|
||||||
|
nsGenericHTMLElement)
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// This doesn't really ensure a frame loade in all cases, only when
|
||||||
|
// it makes sense.
|
||||||
|
nsresult EnsureFrameLoader();
|
||||||
|
nsresult LoadSrc();
|
||||||
|
nsresult GetContentDocument(nsIDOMDocument** aContentDocument);
|
||||||
|
nsresult GetContentWindow(nsIDOMWindow** aContentWindow);
|
||||||
|
|
||||||
|
nsRefPtr<nsFrameLoader> mFrameLoader;
|
||||||
|
// True when the element is created by the parser
|
||||||
|
// using NS_FROM_PARSER_NETWORK flag.
|
||||||
|
// If the element is modified, it may lose the flag.
|
||||||
|
bool mNetworkCreated;
|
||||||
|
};
|
@ -38,7 +38,7 @@
|
|||||||
#include "mozilla/Util.h"
|
#include "mozilla/Util.h"
|
||||||
|
|
||||||
#include "nsIDOMHTMLFrameElement.h"
|
#include "nsIDOMHTMLFrameElement.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLFrameElement.h"
|
||||||
#include "nsGkAtoms.h"
|
#include "nsGkAtoms.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
#include "mozilla/Util.h"
|
#include "mozilla/Util.h"
|
||||||
|
|
||||||
#include "nsIDOMHTMLIFrameElement.h"
|
#include "nsIDOMHTMLIFrameElement.h"
|
||||||
#include "nsGenericHTMLElement.h"
|
#include "nsGenericHTMLFrameElement.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
#include "nsIDOMGetSVGDocument.h"
|
#include "nsIDOMGetSVGDocument.h"
|
||||||
#include "nsIDOMSVGDocument.h"
|
#include "nsIDOMSVGDocument.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user