2006-05-17 02:33:34 +00:00
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
2006-05-17 02:38:30 +00:00
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
2006-05-17 02:21:53 +00:00
|
|
|
*
|
2006-05-17 02:38:30 +00:00
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
2006-05-17 02:33:34 +00:00
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
2006-05-17 02:21:53 +00:00
|
|
|
*
|
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
2006-05-17 02:38:30 +00:00
|
|
|
* The Initial Developer of the Original Code is
|
2006-05-17 02:33:34 +00:00
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 2001
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
2006-05-17 02:21:53 +00:00
|
|
|
*
|
|
|
|
* Contributor(s):
|
|
|
|
* Joe Hewitt <hewitt@netscape.com> (original author)
|
2006-05-17 02:37:41 +00:00
|
|
|
* Christopher A. Aillon <christopher@aillon.com>
|
2006-05-17 02:33:34 +00:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
2006-05-17 02:38:30 +00:00
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
2006-05-17 02:33:34 +00:00
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
2006-05-17 02:38:30 +00:00
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
2006-05-17 02:33:34 +00:00
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
2006-05-17 02:21:53 +00:00
|
|
|
|
|
|
|
#include "inDOMUtils.h"
|
|
|
|
#include "inLayoutUtils.h"
|
|
|
|
|
2006-05-17 02:33:55 +00:00
|
|
|
#include "nsIServiceManager.h"
|
2006-05-17 02:21:53 +00:00
|
|
|
#include "nsString.h"
|
|
|
|
#include "nsIDOMElement.h"
|
|
|
|
#include "nsIDocument.h"
|
|
|
|
#include "nsIDOMDocument.h"
|
2006-05-17 02:37:41 +00:00
|
|
|
#include "nsIDOMCharacterData.h"
|
2006-05-17 02:33:36 +00:00
|
|
|
#include "nsRuleNode.h"
|
2006-05-17 02:21:53 +00:00
|
|
|
#include "nsIStyleRule.h"
|
|
|
|
#include "nsICSSStyleRule.h"
|
2006-05-17 02:38:08 +00:00
|
|
|
#include "nsICSSStyleRuleDOMWrapper.h"
|
2006-05-17 02:21:53 +00:00
|
|
|
#include "nsIDOMWindowInternal.h"
|
|
|
|
|
2006-05-17 02:33:55 +00:00
|
|
|
static NS_DEFINE_CID(kInspectorCSSUtilsCID, NS_INSPECTORCSSUTILS_CID);
|
|
|
|
|
2006-05-17 02:21:53 +00:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
inDOMUtils::inDOMUtils()
|
|
|
|
{
|
2006-05-17 02:33:55 +00:00
|
|
|
mCSSUtils = do_GetService(kInspectorCSSUtilsCID);
|
2006-05-17 02:21:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inDOMUtils::~inDOMUtils()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2006-05-17 02:38:09 +00:00
|
|
|
NS_IMPL_ISUPPORTS1(inDOMUtils, inIDOMUtils)
|
2006-05-17 02:21:53 +00:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// inIDOMUtils
|
|
|
|
|
2006-05-17 02:37:41 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
inDOMUtils::IsIgnorableWhitespace(nsIDOMCharacterData *aDataNode,
|
|
|
|
PRBool *aReturn)
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(aDataNode, "Must have a character data node");
|
|
|
|
NS_PRECONDITION(aReturn, "Must have an out parameter");
|
|
|
|
|
|
|
|
*aReturn = PR_FALSE;
|
|
|
|
|
2006-07-19 04:36:36 +00:00
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aDataNode);
|
|
|
|
NS_ASSERTION(content, "Does not implement nsIContent!");
|
2006-05-17 02:37:41 +00:00
|
|
|
|
2006-07-19 04:36:36 +00:00
|
|
|
if (!content->TextIsOnlyWhitespace()) {
|
2006-05-17 02:37:41 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Okay. We have only white space. Let's check the white-space
|
|
|
|
// property now and make sure that this isn't preformatted text...
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMWindowInternal> win = inLayoutUtils::GetWindowFor(aDataNode);
|
|
|
|
if (!win) {
|
|
|
|
// Hmm. Things are screwy if we have no window...
|
|
|
|
NS_ERROR("No window!");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPresShell> presShell = inLayoutUtils::GetPresShellFor(win);
|
2006-05-17 02:38:43 +00:00
|
|
|
if (!presShell) {
|
|
|
|
// Display:none iframe or something... Bail out
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2006-05-17 02:38:50 +00:00
|
|
|
nsIFrame* frame = presShell->GetPrimaryFrameFor(content);
|
2006-05-17 02:37:51 +00:00
|
|
|
if (frame) {
|
2006-05-17 02:37:54 +00:00
|
|
|
const nsStyleText* text = frame->GetStyleText();
|
|
|
|
*aReturn = text->mWhiteSpace != NS_STYLE_WHITESPACE_PRE &&
|
|
|
|
text->mWhiteSpace != NS_STYLE_WHITESPACE_MOZ_PRE_WRAP;
|
2006-05-17 02:37:41 +00:00
|
|
|
}
|
2006-05-17 02:37:52 +00:00
|
|
|
else {
|
|
|
|
// empty inter-tag text node without frame, e.g., in between <table>\n<tr>
|
|
|
|
*aReturn = PR_TRUE;
|
|
|
|
}
|
2006-05-17 02:37:41 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
2006-05-17 02:37:38 +00:00
|
|
|
}
|
|
|
|
|
2006-05-17 02:38:00 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
inDOMUtils::GetParentForNode(nsIDOMNode* aNode,
|
|
|
|
PRBool aShowingAnonymousContent,
|
|
|
|
nsIDOMNode** aParent)
|
|
|
|
{
|
|
|
|
// First do the special cases -- document nodes and anonymous content
|
|
|
|
nsCOMPtr<nsIDOMDocument> doc(do_QueryInterface(aNode));
|
|
|
|
nsCOMPtr<nsIDOMNode> parent;
|
|
|
|
|
|
|
|
if (doc) {
|
|
|
|
parent = inLayoutUtils::GetContainerFor(doc);
|
|
|
|
} else if (aShowingAnonymousContent) {
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aNode);
|
2006-07-14 12:08:59 +00:00
|
|
|
if (content) {
|
|
|
|
nsCOMPtr<nsIContent> bparent;
|
|
|
|
nsCOMPtr<nsIBindingManager> bindingManager = inLayoutUtils::GetBindingManagerFor(aNode);
|
|
|
|
if (bindingManager) {
|
|
|
|
bindingManager->GetInsertionParent(content, getter_AddRefs(bparent));
|
|
|
|
}
|
2006-05-17 02:38:00 +00:00
|
|
|
|
2006-07-14 12:08:59 +00:00
|
|
|
parent = do_QueryInterface(bparent);
|
|
|
|
}
|
2006-05-17 02:38:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!parent) {
|
|
|
|
// Ok, just get the normal DOM parent node
|
|
|
|
aNode->GetParentNode(getter_AddRefs(parent));
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IF_ADDREF(*aParent = parent);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2006-05-17 02:21:53 +00:00
|
|
|
NS_IMETHODIMP
|
2006-05-17 02:38:08 +00:00
|
|
|
inDOMUtils::GetCSSStyleRules(nsIDOMElement *aElement,
|
|
|
|
nsISupportsArray **_retval)
|
2006-05-17 02:21:53 +00:00
|
|
|
{
|
2006-05-17 02:37:51 +00:00
|
|
|
if (!aElement) return NS_ERROR_NULL_POINTER;
|
|
|
|
|
2006-05-17 02:34:03 +00:00
|
|
|
*_retval = nsnull;
|
2006-05-17 02:37:39 +00:00
|
|
|
|
2006-05-17 02:33:42 +00:00
|
|
|
nsRuleNode* ruleNode = nsnull;
|
2006-05-17 02:37:51 +00:00
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement);
|
|
|
|
mCSSUtils->GetRuleNodeForContent(content, &ruleNode);
|
2006-05-17 02:38:34 +00:00
|
|
|
if (!ruleNode) {
|
|
|
|
// This can fail for content nodes that are not in the document or
|
|
|
|
// if the document they're in doesn't have a presshell. Bail out.
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsISupportsArray> rules;
|
|
|
|
NS_NewISupportsArray(getter_AddRefs(rules));
|
|
|
|
if (!rules) return NS_ERROR_OUT_OF_MEMORY;
|
2006-05-17 02:37:39 +00:00
|
|
|
|
2006-05-17 02:21:53 +00:00
|
|
|
nsCOMPtr<nsIStyleRule> srule;
|
2006-05-17 02:38:08 +00:00
|
|
|
nsCOMPtr<nsICSSStyleRule> cssRule;
|
|
|
|
nsCOMPtr<nsIDOMCSSRule> domRule;
|
2006-05-17 02:37:39 +00:00
|
|
|
for (PRBool isRoot;
|
|
|
|
mCSSUtils->IsRuleNodeRoot(ruleNode, &isRoot), !isRoot;
|
|
|
|
mCSSUtils->GetRuleNodeParent(ruleNode, &ruleNode))
|
|
|
|
{
|
2006-05-17 02:33:55 +00:00
|
|
|
mCSSUtils->GetRuleNodeRule(ruleNode, getter_AddRefs(srule));
|
2006-05-17 02:38:08 +00:00
|
|
|
cssRule = do_QueryInterface(srule);
|
|
|
|
if (cssRule) {
|
|
|
|
cssRule->GetDOMRule(getter_AddRefs(domRule));
|
2006-05-17 02:38:13 +00:00
|
|
|
if (domRule)
|
|
|
|
rules->InsertElementAt(domRule, 0);
|
2006-05-17 02:38:08 +00:00
|
|
|
}
|
2006-05-17 02:34:02 +00:00
|
|
|
}
|
2006-05-17 02:21:53 +00:00
|
|
|
|
|
|
|
*_retval = rules;
|
2006-05-17 02:37:39 +00:00
|
|
|
NS_ADDREF(*_retval);
|
|
|
|
|
2006-05-17 02:21:53 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
inDOMUtils::GetRuleLine(nsIDOMCSSStyleRule *aRule, PRUint32 *_retval)
|
|
|
|
{
|
2006-05-17 02:38:08 +00:00
|
|
|
*_retval = 0;
|
|
|
|
if (!aRule)
|
|
|
|
return NS_OK;
|
|
|
|
nsCOMPtr<nsICSSStyleRuleDOMWrapper> rule = do_QueryInterface(aRule);
|
|
|
|
nsCOMPtr<nsICSSStyleRule> cssrule;
|
|
|
|
rule->GetCSSStyleRule(getter_AddRefs(cssrule));
|
|
|
|
if (cssrule)
|
|
|
|
*_retval = cssrule->GetLineNumber();
|
2006-05-17 02:21:53 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2006-05-17 02:38:48 +00:00
|
|
|
inDOMUtils::GetBindingURLs(nsIDOMElement *aElement, nsIArray **_retval)
|
2006-05-17 02:21:53 +00:00
|
|
|
{
|
2006-05-17 02:38:48 +00:00
|
|
|
return mCSSUtils->GetBindingURLs(aElement, _retval);
|
2006-05-17 02:21:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
inDOMUtils::SetContentState(nsIDOMElement *aElement, PRInt32 aState)
|
|
|
|
{
|
2006-05-17 02:33:42 +00:00
|
|
|
if (!aElement)
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
|
2006-05-17 02:21:53 +00:00
|
|
|
nsCOMPtr<nsIEventStateManager> esm = inLayoutUtils::GetEventStateManagerFor(aElement);
|
|
|
|
if (esm) {
|
|
|
|
nsCOMPtr<nsIContent> content;
|
|
|
|
content = do_QueryInterface(aElement);
|
2006-05-17 02:33:42 +00:00
|
|
|
|
|
|
|
return esm->SetContentState(content, aState);
|
2006-05-17 02:21:53 +00:00
|
|
|
}
|
|
|
|
|
2006-05-17 02:33:42 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
2006-05-17 02:21:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
inDOMUtils::GetContentState(nsIDOMElement *aElement, PRInt32* aState)
|
|
|
|
{
|
2006-05-17 02:38:49 +00:00
|
|
|
*aState = 0;
|
2006-05-17 02:33:42 +00:00
|
|
|
|
|
|
|
if (!aElement)
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
|
2006-05-17 02:21:53 +00:00
|
|
|
nsCOMPtr<nsIEventStateManager> esm = inLayoutUtils::GetEventStateManagerFor(aElement);
|
|
|
|
if (esm) {
|
|
|
|
nsCOMPtr<nsIContent> content;
|
|
|
|
content = do_QueryInterface(aElement);
|
2006-05-17 02:33:42 +00:00
|
|
|
|
|
|
|
return esm->GetContentState(content, *aState);
|
2006-05-17 02:21:53 +00:00
|
|
|
}
|
|
|
|
|
2006-05-17 02:33:42 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
2006-05-17 02:21:53 +00:00
|
|
|
}
|
|
|
|
|