gecko-dev/content/html/content/src/HTMLTableElement.cpp

1022 lines
33 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2012-05-21 11:12:37 +00:00
/* 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 "mozilla/Util.h"
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
#include "mozilla/dom/HTMLTableElement.h"
Bug 760331: Coalesce data for inline style across nodes. r=bz This patch enables sharing of an nsAttrValue's MiscContainer between nodes for style rules. MiscContainers of type eCSSStyleRule are now refcounted (with some clever struct packing to ensure that the amount of memory allocated for MiscContainer remains unchanged on 32 and 64 bit). This infrastructure can be used to share most MiscContainer types in the future if we find advantages to sharing other types than just eCSSStyleRuley. A cache mapping strings to MiscContainers has been added to nsHTMLCSSStyleSheet. MiscContainers can be shared between nsAttrValues when one nsAttrValue is SetTo another nsAttrValue or when there is a cache hit in this cache. This patch also adds the ability to tell a style rule that it belongs to an nsHTMLCSSStyleSheet, with appropriate accessor functions to separate that from the existing case of belonging to an nsCSSStyleSheet. The primary use case is to reduce memory use for pages that have lots of inline style attributes with the same value. This can happen easily with large pages that are automatically generated. An (admittedly pathological) testcase in Bug 686975 sees over 250 MB of memory savings with this change. Reusing the same MiscContainer for multiple nodes saves the overhead of maintaining separate copies of the string containing the serialized value of the style attribute and of creating separate style rules for each node. Eliminating duplicate style rules enables further savings in layout through style context sharing. The testcase sees the amount of memory used by style contexts go from over 250 MB to 10 KB. Because the cache is based on the text value of the style attribute, it will not handle attributes that have different text values but are parsed into identical style rules. We also do not attempt to share MiscContainers when the node's base URI differs from the document URI. The effect of these limitations is expected to be low.
2012-09-30 16:40:24 +00:00
#include "nsAttrValueInlines.h"
#include "nsRuleData.h"
#include "nsHTMLStyleSheet.h"
#include "nsMappedAttributes.h"
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/HTMLCollectionBinding.h"
#include "mozilla/dom/HTMLTableElementBinding.h"
#include "nsContentUtils.h"
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
NS_IMPL_NS_NEW_HTML_ELEMENT(Table)
namespace mozilla {
namespace dom {
/* ------------------------------ TableRowsCollection -------------------------------- */
/**
* This class provides a late-bound collection of rows in a table.
* mParent is NOT ref-counted to avoid circular references
*/
class TableRowsCollection : public nsIHTMLCollection,
public nsWrapperCache
{
public:
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
TableRowsCollection(HTMLTableElement *aParent);
virtual ~TableRowsCollection();
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_NSIDOMHTMLCOLLECTION
virtual Element* GetElementAt(uint32_t aIndex);
virtual nsINode* GetParentObject()
{
return mParent;
}
virtual JSObject* NamedItem(JSContext* cx, const nsAString& name,
ErrorResult& error);
virtual void GetSupportedNames(nsTArray<nsString>& aNames);
NS_IMETHOD ParentDestroyed();
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TableRowsCollection)
// nsWrapperCache
virtual JSObject* WrapObject(JSContext *cx,
JS::Handle<JSObject*> scope) MOZ_OVERRIDE
{
return mozilla::dom::HTMLCollectionBinding::Wrap(cx, scope, this);
}
protected:
// Those rows that are not in table sections
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement* mParent;
nsRefPtr<nsContentList> mOrphanRows;
};
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
TableRowsCollection::TableRowsCollection(HTMLTableElement *aParent)
: mParent(aParent)
, mOrphanRows(new nsContentList(mParent,
kNameSpaceID_XHTML,
nsGkAtoms::tr,
nsGkAtoms::tr,
false))
{
SetIsDOMBinding();
}
TableRowsCollection::~TableRowsCollection()
{
// we do NOT have a ref-counted reference to mParent, so do NOT
// release it! this is to avoid circular references. The
// instantiator who provided mParent is responsible for managing our
// reference for us.
}
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(TableRowsCollection, mOrphanRows)
NS_IMPL_CYCLE_COLLECTING_ADDREF(TableRowsCollection)
NS_IMPL_CYCLE_COLLECTING_RELEASE(TableRowsCollection)
NS_INTERFACE_TABLE_HEAD(TableRowsCollection)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_TABLE2(TableRowsCollection, nsIHTMLCollection,
nsIDOMHTMLCollection)
NS_INTERFACE_TABLE_TO_MAP_SEGUE_CYCLE_COLLECTION(TableRowsCollection)
NS_INTERFACE_MAP_END
// Macro that can be used to avoid copy/pasting code to iterate over the
// rowgroups. _code should be the code to execute for each rowgroup. The
// rowgroup's rows will be in the nsIDOMHTMLCollection* named "rows". Note
// that this may be null at any time. This macro assumes an nsresult named
// |rv| is in scope.
#define DO_FOR_EACH_ROWGROUP(_code) \
do { \
if (mParent) { \
/* THead */ \
HTMLTableSectionElement* rowGroup = mParent->GetTHead(); \
nsIHTMLCollection* rows; \
if (rowGroup) { \
rows = rowGroup->Rows(); \
do { /* gives scoping */ \
_code \
} while (0); \
} \
/* TBodies */ \
for (nsIContent* _node = mParent->nsINode::GetFirstChild(); \
_node; _node = _node->GetNextSibling()) { \
if (_node->IsHTML(nsGkAtoms::tbody)) { \
rowGroup = static_cast<HTMLTableSectionElement*>(_node); \
rows = rowGroup->Rows(); \
do { /* gives scoping */ \
_code \
} while (0); \
} \
} \
/* orphan rows */ \
rows = mOrphanRows; \
do { /* gives scoping */ \
_code \
} while (0); \
/* TFoot */ \
rowGroup = mParent->GetTFoot(); \
rows = nullptr; \
if (rowGroup) { \
rows = rowGroup->Rows(); \
do { /* gives scoping */ \
_code \
} while (0); \
} \
} \
} while (0)
static uint32_t
CountRowsInRowGroup(nsIDOMHTMLCollection* rows)
{
uint32_t length = 0;
if (rows) {
rows->GetLength(&length);
}
return length;
}
// we re-count every call. A better implementation would be to set
// ourselves up as an observer of contentAppended, contentInserted,
// and contentDeleted
NS_IMETHODIMP
TableRowsCollection::GetLength(uint32_t* aLength)
{
*aLength=0;
DO_FOR_EACH_ROWGROUP(
*aLength += CountRowsInRowGroup(rows);
);
return NS_OK;
}
// Returns the item at index aIndex if available. If null is returned,
// then aCount will be set to the number of rows in this row collection.
// Otherwise, the value of aCount is undefined.
static Element*
GetItemOrCountInRowGroup(nsIDOMHTMLCollection* rows,
uint32_t aIndex, uint32_t* aCount)
{
*aCount = 0;
if (rows) {
rows->GetLength(aCount);
if (aIndex < *aCount) {
nsIHTMLCollection* list = static_cast<nsIHTMLCollection*>(rows);
return list->GetElementAt(aIndex);
}
}
return nullptr;
}
Element*
TableRowsCollection::GetElementAt(uint32_t aIndex)
{
DO_FOR_EACH_ROWGROUP(
uint32_t count;
Element* node = GetItemOrCountInRowGroup(rows, aIndex, &count);
if (node) {
return node;
}
NS_ASSERTION(count <= aIndex, "GetItemOrCountInRowGroup screwed up");
aIndex -= count;
);
return nullptr;
}
NS_IMETHODIMP
TableRowsCollection::Item(uint32_t aIndex, nsIDOMNode** aReturn)
{
nsISupports* node = GetElementAt(aIndex);
if (!node) {
*aReturn = nullptr;
return NS_OK;
}
return CallQueryInterface(node, aReturn);
}
JSObject*
TableRowsCollection::NamedItem(JSContext* cx, const nsAString& name,
ErrorResult& error)
{
DO_FOR_EACH_ROWGROUP(
nsCOMPtr<nsIHTMLCollection> collection = do_QueryInterface(rows);
if (collection) {
// We'd like to call the nsIHTMLCollection::NamedItem that returns a
// JSObject*, but that relies on collection having a cached wrapper, which
// we can't guarantee here.
nsCOMPtr<nsIDOMNode> item;
error = collection->NamedItem(name, getter_AddRefs(item));
if (error.Failed()) {
return nullptr;
}
if (item) {
JS::Rooted<JSObject*> wrapper(cx, nsWrapperCache::GetWrapper());
JSAutoCompartment ac(cx, wrapper);
JS::Rooted<JS::Value> v(cx);
if (!mozilla::dom::WrapObject(cx, wrapper, item, &v)) {
error.Throw(NS_ERROR_FAILURE);
return nullptr;
}
return &v.toObject();
}
}
);
return nullptr;
}
void
TableRowsCollection::GetSupportedNames(nsTArray<nsString>& aNames)
{
DO_FOR_EACH_ROWGROUP(
nsTArray<nsString> names;
nsCOMPtr<nsIHTMLCollection> coll = do_QueryInterface(rows);
if (coll) {
coll->GetSupportedNames(names);
for (uint32_t i = 0; i < names.Length(); ++i) {
if (!aNames.Contains(names[i])) {
aNames.AppendElement(names[i]);
}
}
}
);
}
NS_IMETHODIMP
TableRowsCollection::NamedItem(const nsAString& aName,
nsIDOMNode** aReturn)
{
DO_FOR_EACH_ROWGROUP(
nsCOMPtr<nsIHTMLCollection> collection = do_QueryInterface(rows);
if (collection) {
nsresult rv = collection->NamedItem(aName, aReturn);
if (NS_FAILED(rv) || *aReturn) {
return rv;
}
}
);
*aReturn = nullptr;
return NS_OK;
}
NS_IMETHODIMP
TableRowsCollection::ParentDestroyed()
{
// see comment in destructor, do NOT release mParent!
mParent = nullptr;
return NS_OK;
}
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
/* --------------------------- HTMLTableElement ---------------------------- */
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::HTMLTableElement(already_AddRefed<nsINodeInfo> aNodeInfo)
: nsGenericHTMLElement(aNodeInfo),
mTableInheritedAttributes(TABLE_ATTRS_DIRTY)
1998-09-02 00:56:01 +00:00
{
}
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::~HTMLTableElement()
1998-09-02 00:56:01 +00:00
{
if (mRows) {
mRows->ParentDestroyed();
}
ReleaseInheritedAttributes();
1998-09-02 00:56:01 +00:00
}
JSObject*
HTMLTableElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aScope)
{
return HTMLTableElementBinding::Wrap(aCx, aScope, this);
}
1998-09-02 00:56:01 +00:00
NS_IMPL_CYCLE_COLLECTION_CLASS(HTMLTableElement)
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(HTMLTableElement, nsGenericHTMLElement)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mTBodies)
if (tmp->mRows) {
tmp->mRows->ParentDestroyed();
}
NS_IMPL_CYCLE_COLLECTION_UNLINK(mRows)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(HTMLTableElement,
nsGenericHTMLElement)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTBodies)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRows)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
NS_IMPL_ADDREF_INHERITED(HTMLTableElement, Element)
NS_IMPL_RELEASE_INHERITED(HTMLTableElement, Element)
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
// QueryInterface implementation for HTMLTableElement
NS_INTERFACE_TABLE_HEAD_CYCLE_COLLECTION_INHERITED(HTMLTableElement)
NS_HTML_CONTENT_INTERFACES(nsGenericHTMLElement)
NS_INTERFACE_TABLE_INHERITED1(HTMLTableElement, nsIDOMHTMLTableElement)
NS_INTERFACE_TABLE_TO_MAP_SEGUE
NS_ELEMENT_INTERFACE_MAP_END
1998-09-02 00:56:01 +00:00
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
NS_IMPL_ELEMENT_CLONE(HTMLTableElement)
1998-09-02 00:56:01 +00:00
// the DOM spec says border, cellpadding, cellSpacing are all "wstring"
// in fact, they are integers or they are meaningless. so we store them
// here as ints.
nsIHTMLCollection*
HTMLTableElement::Rows()
1998-09-02 00:56:01 +00:00
{
if (!mRows) {
mRows = new TableRowsCollection(this);
}
return mRows;
1998-09-02 00:56:01 +00:00
}
nsIHTMLCollection*
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::TBodies()
1998-09-02 00:56:01 +00:00
{
if (!mTBodies) {
// Not using NS_GetContentList because this should not be cached
mTBodies = new nsContentList(this,
kNameSpaceID_XHTML,
nsGkAtoms::tbody,
nsGkAtoms::tbody,
false);
}
return mTBodies;
1998-09-02 00:56:01 +00:00
}
already_AddRefed<nsGenericHTMLElement>
HTMLTableElement::CreateTHead()
1998-09-02 00:56:01 +00:00
{
nsRefPtr<nsGenericHTMLElement> head = GetTHead();
if (!head) {
// Create a new head rowgroup.
nsCOMPtr<nsINodeInfo> nodeInfo;
nsContentUtils::NameChanged(mNodeInfo, nsGkAtoms::thead,
getter_AddRefs(nodeInfo));
head = NS_NewHTMLTableSectionElement(nodeInfo.forget());
if (!head) {
return nullptr;
}
ErrorResult rv;
nsINode::InsertBefore(*head, nsINode::GetFirstChild(), rv);
}
return head.forget();
}
void
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::DeleteTHead()
1998-09-02 00:56:01 +00:00
{
HTMLTableSectionElement* tHead = GetTHead();
if (tHead) {
mozilla::ErrorResult rv;
nsINode::RemoveChild(*tHead, rv);
MOZ_ASSERT(!rv.Failed());
1998-11-18 06:06:37 +00:00
}
1998-09-02 00:56:01 +00:00
}
already_AddRefed<nsGenericHTMLElement>
HTMLTableElement::CreateTFoot()
1998-09-02 00:56:01 +00:00
{
nsRefPtr<nsGenericHTMLElement> foot = GetTFoot();
if (!foot) {
// create a new foot rowgroup
nsCOMPtr<nsINodeInfo> nodeInfo;
nsContentUtils::NameChanged(mNodeInfo, nsGkAtoms::tfoot,
getter_AddRefs(nodeInfo));
foot = NS_NewHTMLTableSectionElement(nodeInfo.forget());
if (!foot) {
return nullptr;
}
AppendChildTo(foot, true);
}
return foot.forget();
}
void
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::DeleteTFoot()
1998-11-18 06:06:37 +00:00
{
HTMLTableSectionElement* tFoot = GetTFoot();
if (tFoot) {
mozilla::ErrorResult rv;
nsINode::RemoveChild(*tFoot, rv);
MOZ_ASSERT(!rv.Failed());
1998-11-18 06:06:37 +00:00
}
}
already_AddRefed<nsGenericHTMLElement>
HTMLTableElement::CreateCaption()
1998-09-02 00:56:01 +00:00
{
nsRefPtr<nsGenericHTMLElement> caption = GetCaption();
if (!caption) {
// Create a new caption.
nsCOMPtr<nsINodeInfo> nodeInfo;
nsContentUtils::NameChanged(mNodeInfo, nsGkAtoms::caption,
getter_AddRefs(nodeInfo));
caption = NS_NewHTMLTableCaptionElement(nodeInfo.forget());
if (!caption) {
return nullptr;
}
AppendChildTo(caption, true);
}
return caption.forget();
}
void
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::DeleteCaption()
1998-09-02 00:56:01 +00:00
{
HTMLTableCaptionElement* caption = GetCaption();
if (caption) {
mozilla::ErrorResult rv;
nsINode::RemoveChild(*caption, rv);
MOZ_ASSERT(!rv.Failed());
}
1998-09-02 00:56:01 +00:00
}
already_AddRefed<nsGenericHTMLElement>
HTMLTableElement::CreateTBody()
{
nsCOMPtr<nsINodeInfo> nodeInfo =
OwnerDoc()->NodeInfoManager()->GetNodeInfo(nsGkAtoms::tbody, nullptr,
kNameSpaceID_XHTML,
nsIDOMNode::ELEMENT_NODE);
MOZ_ASSERT(nodeInfo);
nsCOMPtr<nsGenericHTMLElement> newBody =
NS_NewHTMLTableSectionElement(nodeInfo.forget());
MOZ_ASSERT(newBody);
nsIContent* referenceNode = nullptr;
for (nsIContent* child = nsINode::GetLastChild();
child;
child = child->GetPreviousSibling()) {
if (child->IsHTML(nsGkAtoms::tbody)) {
referenceNode = child->GetNextSibling();
break;
}
}
ErrorResult rv;
nsINode::InsertBefore(*newBody, referenceNode, rv);
return newBody.forget();
}
already_AddRefed<nsGenericHTMLElement>
HTMLTableElement::InsertRow(int32_t aIndex, ErrorResult& aError)
1998-09-02 00:56:01 +00:00
{
/* get the ref row at aIndex
if there is one,
get its parent
insert the new row just before the ref row
1998-11-18 06:06:37 +00:00
else
get the first row group
insert the new row as its first child
*/
if (aIndex < -1) {
aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return nullptr;
}
nsIHTMLCollection* rows = Rows();
uint32_t rowCount = rows->Length();
if ((uint32_t)aIndex > rowCount && aIndex != -1) {
aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return nullptr;
}
// use local variable refIndex so we can remember original aIndex
uint32_t refIndex = (uint32_t)aIndex;
nsRefPtr<nsGenericHTMLElement> newRow;
if (rowCount > 0) {
if (refIndex == rowCount || aIndex == -1) {
// we set refIndex to the last row so we can get the last row's
// parent we then do an AppendChild below if (rowCount<aIndex)
refIndex = rowCount - 1;
}
Element* refRow = rows->Item(refIndex);
nsINode* parent = refRow->GetParentNode();
1998-11-18 06:06:37 +00:00
// create the row
nsCOMPtr<nsINodeInfo> nodeInfo;
nsContentUtils::NameChanged(mNodeInfo, nsGkAtoms::tr,
getter_AddRefs(nodeInfo));
newRow = NS_NewHTMLTableRowElement(nodeInfo.forget());
if (newRow) {
// If aIndex is -1 or equal to the number of rows, the new row
// is appended.
if (aIndex == -1 || uint32_t(aIndex) == rowCount) {
parent->AppendChild(*newRow, aError);
} else {
// insert the new row before the reference row we found above
parent->InsertBefore(*newRow, refRow, aError);
}
if (aError.Failed()) {
return nullptr;
}
1998-11-18 06:06:37 +00:00
}
} else {
// the row count was 0, so
1998-12-09 23:19:12 +00:00
// find the first row group and insert there as first child
nsCOMPtr<nsIContent> rowGroup;
for (nsIContent* child = nsINode::GetFirstChild();
child;
child = child->GetNextSibling()) {
nsINodeInfo *childInfo = child->NodeInfo();
nsIAtom *localName = childInfo->NameAtom();
if (childInfo->NamespaceID() == kNameSpaceID_XHTML &&
(localName == nsGkAtoms::thead ||
localName == nsGkAtoms::tbody ||
localName == nsGkAtoms::tfoot)) {
rowGroup = child;
break;
1998-11-18 06:06:37 +00:00
}
}
if (!rowGroup) { // need to create a TBODY
nsCOMPtr<nsINodeInfo> nodeInfo;
nsContentUtils::NameChanged(mNodeInfo, nsGkAtoms::tbody,
getter_AddRefs(nodeInfo));
rowGroup = NS_NewHTMLTableSectionElement(nodeInfo.forget());
if (rowGroup) {
aError = AppendChildTo(rowGroup, true);
if (aError.Failed()) {
return nullptr;
}
1998-11-18 06:06:37 +00:00
}
}
if (rowGroup) {
nsCOMPtr<nsINodeInfo> nodeInfo;
nsContentUtils::NameChanged(mNodeInfo, nsGkAtoms::tr,
getter_AddRefs(nodeInfo));
newRow = NS_NewHTMLTableRowElement(nodeInfo.forget());
if (newRow) {
HTMLTableSectionElement* section =
static_cast<HTMLTableSectionElement*>(rowGroup.get());
nsIHTMLCollection* rows = section->Rows();
rowGroup->InsertBefore(*newRow, rows->Item(0), aError);
1998-11-18 06:06:37 +00:00
}
}
}
return newRow.forget();
1998-09-02 00:56:01 +00:00
}
void
HTMLTableElement::DeleteRow(int32_t aIndex, ErrorResult& aError)
{
if (aIndex < -1) {
aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return;
}
nsIHTMLCollection* rows = Rows();
uint32_t refIndex;
if (aIndex == -1) {
refIndex = rows->Length();
if (refIndex == 0) {
return;
}
--refIndex;
} else {
refIndex = (uint32_t)aIndex;
}
nsCOMPtr<nsIContent> row = rows->Item(refIndex);
if (!row) {
aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return;
}
row->RemoveFromParent();
}
static const nsAttrValue::EnumTable kFrameTable[] = {
{ "void", NS_STYLE_TABLE_FRAME_NONE },
{ "above", NS_STYLE_TABLE_FRAME_ABOVE },
{ "below", NS_STYLE_TABLE_FRAME_BELOW },
{ "hsides", NS_STYLE_TABLE_FRAME_HSIDES },
{ "lhs", NS_STYLE_TABLE_FRAME_LEFT },
{ "rhs", NS_STYLE_TABLE_FRAME_RIGHT },
{ "vsides", NS_STYLE_TABLE_FRAME_VSIDES },
{ "box", NS_STYLE_TABLE_FRAME_BOX },
{ "border", NS_STYLE_TABLE_FRAME_BORDER },
{ 0 }
};
static const nsAttrValue::EnumTable kRulesTable[] = {
{ "none", NS_STYLE_TABLE_RULES_NONE },
{ "groups", NS_STYLE_TABLE_RULES_GROUPS },
{ "rows", NS_STYLE_TABLE_RULES_ROWS },
{ "cols", NS_STYLE_TABLE_RULES_COLS },
{ "all", NS_STYLE_TABLE_RULES_ALL },
{ 0 }
};
bool
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::ParseAttribute(int32_t aNamespaceID,
nsIAtom* aAttribute,
const nsAString& aValue,
nsAttrValue& aResult)
1998-09-02 00:56:01 +00:00
{
/* ignore summary, just a string */
if (aNamespaceID == kNameSpaceID_None) {
if (aAttribute == nsGkAtoms::cellspacing ||
aAttribute == nsGkAtoms::cellpadding ||
aAttribute == nsGkAtoms::border) {
return aResult.ParseNonNegativeIntValue(aValue);
}
if (aAttribute == nsGkAtoms::height) {
return aResult.ParseSpecialIntValue(aValue);
}
if (aAttribute == nsGkAtoms::width) {
if (aResult.ParseSpecialIntValue(aValue)) {
// treat 0 width as auto
nsAttrValue::ValueType type = aResult.Type();
return !((type == nsAttrValue::eInteger &&
aResult.GetIntegerValue() == 0) ||
(type == nsAttrValue::ePercent &&
aResult.GetPercentValue() == 0.0f));
}
return false;
}
if (aAttribute == nsGkAtoms::align) {
return ParseTableHAlignValue(aValue, aResult);
}
if (aAttribute == nsGkAtoms::bgcolor ||
aAttribute == nsGkAtoms::bordercolor) {
return aResult.ParseColor(aValue);
}
if (aAttribute == nsGkAtoms::frame) {
return aResult.ParseEnumValue(aValue, kFrameTable, false);
}
if (aAttribute == nsGkAtoms::rules) {
return aResult.ParseEnumValue(aValue, kRulesTable, false);
}
if (aAttribute == nsGkAtoms::hspace ||
aAttribute == nsGkAtoms::vspace) {
return aResult.ParseIntWithBounds(aValue, 0);
}
}
Bug 783162: Make mapped attributes hold the image alive. r=bz The nsCSSValue in nsGenericHTMLElement::MapBackgroundInto is a temporary. This causes a problem after Bug 697230 landed, because the nsCSSValue::Image we put into that value is destroyed once we're done doing style stuff. Previously the nsImageLoader would grab the request off the nsCSSValue::Image and hold it alive. Bug 697230 changed the behavior here; now when the nsCSSValue::Image is destroyed it tells the image loader to drop the request. The result is that all the references to the request are dropped and the frame is never told it has a background. The solution is to keep the nsCSSValue::Image alive longer. This patch adds two new types of nsAttrValue. The first is an nsCSSValue::URL. A ParseBackgroundAttribute method is added on nsGenericHTMLElement that the relevant elements (body/td/th/table/tr/tbody/thead/tfoot) call that parses background into an nsCSSValue::URL. The second is an nsCSSValue::Image. nsGenericHTMLElement::MapBackgroundInto attempts to convert the nsCSSValue::URL into an nsCSSValue::Image by kicking off the image load. The result is that image loads are only started when the element is actually visible. This also mirrors the way background-image works. This also allows us to fix two longstanding bugs in this code. Since MapBackgroundInto doesn't have a pointer to the actual element, it relied on grabbing the principal of the document. Now we can grab the principal of the node in ParseBackgroundAttribute. MapBackgroundInto also has no way to get at the element's base URI (to honor xml:base), which is now possible in ParseBackgroundAttribute. nsCSSValue::[Image|URL] have also been moved to be mozilla::css::[Image|URL]Value. nsAttrValue.h is included in external linkage code, so it can't include nsCSSValue.h to get the declarations of nsCSSValue::[Image|URL], and nested classes can't be forward declared. Moving the classes to a namespace solves the problem. Finally some old inoperative quirks mode code was removed. This code has done nothing since Bug 273078 was landed in 2004.
2012-08-24 17:50:49 +00:00
return nsGenericHTMLElement::ParseBackgroundAttribute(aNamespaceID,
aAttribute, aValue,
aResult) ||
nsGenericHTMLElement::ParseAttribute(aNamespaceID, aAttribute, aValue,
aResult);
1998-09-02 00:56:01 +00:00
}
static void
MapAttributesIntoRule(const nsMappedAttributes* aAttributes,
nsRuleData* aData)
1998-09-02 00:56:01 +00:00
{
// XXX Bug 211636: This function is used by a single style rule
// that's used to match two different type of elements -- tables, and
// table cells. (nsHTMLTableCellElement overrides
// WalkContentStyleRules so that this happens.) This violates the
// nsIStyleRule contract, since it's the same style rule object doing
// the mapping in two different ways. It's also incorrect since it's
// testing the display type of the style context rather than checking
// which *element* it's matching (style rules should not stop matching
// when the display type is changed).
nsPresContext* presContext = aData->mPresContext;
nsCompatibility mode = presContext->CompatibilityMode();
if (aData->mSIDs & NS_STYLE_INHERIT_BIT(TableBorder)) {
// cellspacing
const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::cellspacing);
nsCSSValue* borderSpacing = aData->ValueForBorderSpacing();
if (value && value->Type() == nsAttrValue::eInteger &&
borderSpacing->GetUnit() == eCSSUnit_Null) {
borderSpacing->
SetFloatValue(float(value->GetIntegerValue()), eCSSUnit_Pixel);
}
}
if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Margin)) {
// align; Check for enumerated type (it may be another type if
// illegal)
const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::align);
if (value && value->Type() == nsAttrValue::eEnum) {
if (value->GetEnumValue() == NS_STYLE_TEXT_ALIGN_CENTER ||
value->GetEnumValue() == NS_STYLE_TEXT_ALIGN_MOZ_CENTER) {
nsCSSValue* marginLeft = aData->ValueForMarginLeftValue();
if (marginLeft->GetUnit() == eCSSUnit_Null)
marginLeft->SetAutoValue();
nsCSSValue* marginRight = aData->ValueForMarginRightValue();
if (marginRight->GetUnit() == eCSSUnit_Null)
marginRight->SetAutoValue();
}
}
// hspace is mapped into left and right margin,
// vspace is mapped into top and bottom margins
// - *** Quirks Mode only ***
if (eCompatibility_NavQuirks == mode) {
value = aAttributes->GetAttr(nsGkAtoms::hspace);
if (value && value->Type() == nsAttrValue::eInteger) {
nsCSSValue* marginLeft = aData->ValueForMarginLeftValue();
if (marginLeft->GetUnit() == eCSSUnit_Null)
marginLeft->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel);
nsCSSValue* marginRight = aData->ValueForMarginRightValue();
if (marginRight->GetUnit() == eCSSUnit_Null)
marginRight->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel);
}
value = aAttributes->GetAttr(nsGkAtoms::vspace);
if (value && value->Type() == nsAttrValue::eInteger) {
nsCSSValue* marginTop = aData->ValueForMarginTop();
if (marginTop->GetUnit() == eCSSUnit_Null)
marginTop->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel);
nsCSSValue* marginBottom = aData->ValueForMarginBottom();
if (marginBottom->GetUnit() == eCSSUnit_Null)
marginBottom->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel);
}
}
}
if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) {
// width: value
nsCSSValue* width = aData->ValueForWidth();
if (width->GetUnit() == eCSSUnit_Null) {
const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width);
if (value && value->Type() == nsAttrValue::eInteger)
width->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel);
else if (value && value->Type() == nsAttrValue::ePercent)
width->SetPercentValue(value->GetPercentValue());
}
// height: value
nsCSSValue* height = aData->ValueForHeight();
if (height->GetUnit() == eCSSUnit_Null) {
const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height);
if (value && value->Type() == nsAttrValue::eInteger)
height->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel);
else if (value && value->Type() == nsAttrValue::ePercent)
height->SetPercentValue(value->GetPercentValue());
}
}
if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Border)) {
// bordercolor
const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::bordercolor);
nscolor color;
if (value && presContext->UseDocumentColors() &&
value->GetColorValue(color)) {
nsCSSValue* borderLeftColor = aData->ValueForBorderLeftColorValue();
if (borderLeftColor->GetUnit() == eCSSUnit_Null)
borderLeftColor->SetColorValue(color);
nsCSSValue* borderRightColor = aData->ValueForBorderRightColorValue();
if (borderRightColor->GetUnit() == eCSSUnit_Null)
borderRightColor->SetColorValue(color);
nsCSSValue* borderTopColor = aData->ValueForBorderTopColor();
if (borderTopColor->GetUnit() == eCSSUnit_Null)
borderTopColor->SetColorValue(color);
nsCSSValue* borderBottomColor = aData->ValueForBorderBottomColor();
if (borderBottomColor->GetUnit() == eCSSUnit_Null)
borderBottomColor->SetColorValue(color);
}
// border
const nsAttrValue* borderValue = aAttributes->GetAttr(nsGkAtoms::border);
if (borderValue) {
// border = 1 pixel default
int32_t borderThickness = 1;
if (borderValue->Type() == nsAttrValue::eInteger)
borderThickness = borderValue->GetIntegerValue();
// by default, set all border sides to the specified width
nsCSSValue* borderLeftWidth = aData->ValueForBorderLeftWidthValue();
if (borderLeftWidth->GetUnit() == eCSSUnit_Null)
borderLeftWidth->SetFloatValue((float)borderThickness, eCSSUnit_Pixel);
nsCSSValue* borderRightWidth = aData->ValueForBorderRightWidthValue();
if (borderRightWidth->GetUnit() == eCSSUnit_Null)
borderRightWidth->SetFloatValue((float)borderThickness, eCSSUnit_Pixel);
nsCSSValue* borderTopWidth = aData->ValueForBorderTopWidth();
if (borderTopWidth->GetUnit() == eCSSUnit_Null)
borderTopWidth->SetFloatValue((float)borderThickness, eCSSUnit_Pixel);
nsCSSValue* borderBottomWidth = aData->ValueForBorderBottomWidth();
if (borderBottomWidth->GetUnit() == eCSSUnit_Null)
borderBottomWidth->SetFloatValue((float)borderThickness, eCSSUnit_Pixel);
}
}
nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aData);
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
}
1998-11-11 19:56:02 +00:00
NS_IMETHODIMP_(bool)
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::IsAttributeMapped(const nsIAtom* aAttribute) const
{
static const MappedAttributeEntry attributes[] = {
{ &nsGkAtoms::cellpadding },
{ &nsGkAtoms::cellspacing },
{ &nsGkAtoms::border },
{ &nsGkAtoms::width },
{ &nsGkAtoms::height },
{ &nsGkAtoms::hspace },
{ &nsGkAtoms::vspace },
{ &nsGkAtoms::bordercolor },
{ &nsGkAtoms::align },
{ nullptr }
};
static const MappedAttributeEntry* const map[] = {
attributes,
sCommonAttributeMap,
sBackgroundAttributeMap,
};
return FindAttributeDependence(aAttribute, map);
}
nsMapRuleToAttributesFunc
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::GetAttributeMappingFunction() const
{
return &MapAttributesIntoRule;
1998-09-02 00:56:01 +00:00
}
static void
MapInheritedTableAttributesIntoRule(const nsMappedAttributes* aAttributes,
nsRuleData* aData)
{
if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Padding)) {
const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::cellpadding);
if (value && value->Type() == nsAttrValue::eInteger) {
// We have cellpadding. This will override our padding values if we
// don't have any set.
nsCSSValue padVal(float(value->GetIntegerValue()), eCSSUnit_Pixel);
nsCSSValue* paddingLeft = aData->ValueForPaddingLeftValue();
if (paddingLeft->GetUnit() == eCSSUnit_Null) {
*paddingLeft = padVal;
}
nsCSSValue* paddingRight = aData->ValueForPaddingRightValue();
if (paddingRight->GetUnit() == eCSSUnit_Null) {
*paddingRight = padVal;
}
nsCSSValue* paddingTop = aData->ValueForPaddingTop();
if (paddingTop->GetUnit() == eCSSUnit_Null) {
*paddingTop = padVal;
}
nsCSSValue* paddingBottom = aData->ValueForPaddingBottom();
if (paddingBottom->GetUnit() == eCSSUnit_Null) {
*paddingBottom = padVal;
}
}
}
}
nsMappedAttributes*
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::GetAttributesMappedForCell()
{
if (mTableInheritedAttributes) {
if (mTableInheritedAttributes == TABLE_ATTRS_DIRTY)
BuildInheritedAttributes();
if (mTableInheritedAttributes != TABLE_ATTRS_DIRTY)
return mTableInheritedAttributes;
}
return nullptr;
}
void
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::BuildInheritedAttributes()
{
NS_ASSERTION(mTableInheritedAttributes == TABLE_ATTRS_DIRTY,
"potential leak, plus waste of work");
nsIDocument *document = GetCurrentDoc();
nsHTMLStyleSheet* sheet = document ?
document->GetAttributeStyleSheet() : nullptr;
nsRefPtr<nsMappedAttributes> newAttrs;
if (sheet) {
const nsAttrValue* value = mAttrsAndChildren.GetAttr(nsGkAtoms::cellpadding);
if (value) {
nsRefPtr<nsMappedAttributes> modifiableMapped = new
nsMappedAttributes(sheet, MapInheritedTableAttributesIntoRule);
if (modifiableMapped) {
nsAttrValue val(*value);
modifiableMapped->SetAndTakeAttr(nsGkAtoms::cellpadding, val);
}
newAttrs = sheet->UniqueMappedAttributes(modifiableMapped);
NS_ASSERTION(newAttrs, "out of memory, but handling gracefully");
if (newAttrs != modifiableMapped) {
// Reset the stylesheet of modifiableMapped so that it doesn't
// spend time trying to remove itself from the hash. There is no
// risk that modifiableMapped is in the hash since we created
// it ourselves and it didn't come from the stylesheet (in which
// case it would not have been modifiable).
modifiableMapped->DropStyleSheetReference();
}
}
mTableInheritedAttributes = newAttrs;
NS_IF_ADDREF(mTableInheritedAttributes);
}
}
void
HTMLTableElement::ReleaseInheritedAttributes()
{
if (mTableInheritedAttributes &&
mTableInheritedAttributes != TABLE_ATTRS_DIRTY)
NS_RELEASE(mTableInheritedAttributes);
mTableInheritedAttributes = TABLE_ATTRS_DIRTY;
}
nsresult
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
bool aCompileEventHandlers)
{
ReleaseInheritedAttributes();
return nsGenericHTMLElement::BindToTree(aDocument, aParent,
aBindingParent,
aCompileEventHandlers);
}
void
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::UnbindFromTree(bool aDeep, bool aNullParent)
{
ReleaseInheritedAttributes();
nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent);
}
nsresult
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::BeforeSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
const nsAttrValueOrString* aValue,
bool aNotify)
{
if (aName == nsGkAtoms::cellpadding && aNameSpaceID == kNameSpaceID_None) {
ReleaseInheritedAttributes();
}
return nsGenericHTMLElement::BeforeSetAttr(aNameSpaceID, aName, aValue,
aNotify);
}
nsresult
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
HTMLTableElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
const nsAttrValue* aValue,
bool aNotify)
{
if (aName == nsGkAtoms::cellpadding && aNameSpaceID == kNameSpaceID_None) {
BuildInheritedAttributes();
}
return nsGenericHTMLElement::AfterSetAttr(aNameSpaceID, aName, aValue,
aNotify);
}
Fix for bug 824907 (Convert HTML table elements to WebIDL) - rename classes. r=bz. --HG-- rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.cpp rename : content/html/content/src/nsHTMLTableCaptionElement.cpp => content/html/content/src/HTMLTableCaptionElement.h rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.cpp rename : content/html/content/src/nsHTMLTableCellElement.cpp => content/html/content/src/HTMLTableCellElement.h rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.cpp rename : content/html/content/src/nsHTMLTableColElement.cpp => content/html/content/src/HTMLTableColElement.h rename : content/html/content/src/nsHTMLTableElement.cpp => content/html/content/src/HTMLTableElement.cpp rename : content/html/content/src/nsHTMLTableElement.h => content/html/content/src/HTMLTableElement.h rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.cpp rename : content/html/content/src/nsHTMLTableRowElement.cpp => content/html/content/src/HTMLTableRowElement.h rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.cpp rename : content/html/content/src/nsHTMLTableSectionElement.cpp => content/html/content/src/HTMLTableSectionElement.h extra : rebase_source : ebb7a81fd1091f5c5905431e79390fd271328a67
2012-12-28 02:45:57 +00:00
} // namespace dom
} // namespace mozilla