diff --git a/mozilla/content/html/style/src/nsIInspectorCSSUtils.h b/mozilla/content/html/style/src/nsIInspectorCSSUtils.h index e10894a93ca..8f59b1f3ab2 100644 --- a/mozilla/content/html/style/src/nsIInspectorCSSUtils.h +++ b/mozilla/content/html/style/src/nsIInspectorCSSUtils.h @@ -46,6 +46,9 @@ class nsRuleNode; class nsIStyleRule; class nsIFrame; struct nsRect; +class nsIPresShell; +class nsIContent; +class nsIStyleContext; // 0252892b-419a-49f4-981d-4c6716099451 #define NS_IINSPECTORCSSUTILS_IID \ @@ -74,6 +77,11 @@ public: // Hooks to avoid having to use nsStyleCoord. NS_IMETHOD AdjustRectForMargins(nsIFrame* aFrame, nsRect& aRect) = 0; + + // Hooks to methods that need layout atoms (static vars in layout) + NS_IMETHOD GetStyleContextForContent(nsIPresShell* aPresShell, + nsIContent* aContent, + nsIStyleContext** aStyleContext) = 0; }; #endif /* nsIInspectorCSSUtils_h___ */ diff --git a/mozilla/content/html/style/src/nsInspectorCSSUtils.cpp b/mozilla/content/html/style/src/nsInspectorCSSUtils.cpp index d03b8c749ea..d0e1b85ad61 100644 --- a/mozilla/content/html/style/src/nsInspectorCSSUtils.cpp +++ b/mozilla/content/html/style/src/nsInspectorCSSUtils.cpp @@ -40,6 +40,7 @@ #include "nsInspectorCSSUtils.h" #include "nsRuleNode.h" #include "nsString.h" +#include "nsLayoutAtoms.h" nsInspectorCSSUtils::nsInspectorCSSUtils() { @@ -111,3 +112,32 @@ nsInspectorCSSUtils::AdjustRectForMargins(nsIFrame* aFrame, nsRect& aRect) return NS_OK; } +NS_IMETHODIMP +nsInspectorCSSUtils::GetStyleContextForContent(nsIPresShell* aPresShell, + nsIContent* aContent, + nsIStyleContext** aStyleContext) +{ + NS_PRECONDITION(aPresShell, "Null pres shell"); + + nsIFrame* frame = nsnull; + nsresult rv = aPresShell->GetPrimaryFrameFor(aContent, &frame); + if (NS_FAILED(rv) || !frame) return rv; + + /* For tables the primary frame is the "outer frame" but the style + * rules are applied to the "inner frame". Luckily, the "outer + * frame" actually inherits style from the "inner frame" so we can + * just move one level up in the style hierarchy.... + */ + nsCOMPtr frameType; + frame->GetFrameType(getter_AddRefs(frameType)); + if (frameType == nsLayoutAtoms::tableOuterFrame) { + nsCOMPtr presContext; + rv = aPresShell->GetPresContext(getter_AddRefs(presContext)); + if (! presContext) + return rv; + PRBool isChild; + rv = frame->GetParentStyleContextFrame(presContext, &frame, &isChild); + if (NS_FAILED(rv) || !frame) return rv; + } + return aPresShell->GetStyleContextFor(frame, aStyleContext); +} diff --git a/mozilla/content/html/style/src/nsInspectorCSSUtils.h b/mozilla/content/html/style/src/nsInspectorCSSUtils.h index 0ff484174a1..5daed8a8e66 100644 --- a/mozilla/content/html/style/src/nsInspectorCSSUtils.h +++ b/mozilla/content/html/style/src/nsInspectorCSSUtils.h @@ -57,7 +57,9 @@ public: NS_IMETHOD GetRuleNodeRule(nsRuleNode *aNode, nsIStyleRule **aRule); NS_IMETHOD IsRuleNodeRoot(nsRuleNode *aNode, PRBool *aIsRoot); NS_IMETHOD AdjustRectForMargins(nsIFrame* aFrame, nsRect& aRect); - + NS_IMETHOD GetStyleContextForContent(nsIPresShell* aPresShell, + nsIContent* aContent, + nsIStyleContext** aStyleContext); }; #endif /* nsInspectorCSSUtils_h___ */ diff --git a/mozilla/extensions/inspector/base/src/inDOMUtils.cpp b/mozilla/extensions/inspector/base/src/inDOMUtils.cpp index 002d1df8d46..f6ced0b3d30 100644 --- a/mozilla/extensions/inspector/base/src/inDOMUtils.cpp +++ b/mozilla/extensions/inspector/base/src/inDOMUtils.cpp @@ -86,12 +86,11 @@ inDOMUtils::GetStyleRules(nsIDOMElement *aElement, nsISupportsArray **_retval) // query to a content node nsCOMPtr content; content = do_QueryInterface(aElement); - - nsIFrame* frame = nsnull; nsCOMPtr styleContext; - nsresult rv = shell->GetPrimaryFrameFor(content, &frame); - if (NS_FAILED(rv) || !frame) return rv; - shell->GetStyleContextFor(frame, getter_AddRefs(styleContext)); + + nsresult rv = mCSSUtils->GetStyleContextForContent(shell, content, + getter_AddRefs(styleContext)); + if (NS_FAILED(rv) || !styleContext) return rv; // create a resource for all the style rules from the diff --git a/mozilla/layout/style/nsIInspectorCSSUtils.h b/mozilla/layout/style/nsIInspectorCSSUtils.h index e10894a93ca..8f59b1f3ab2 100644 --- a/mozilla/layout/style/nsIInspectorCSSUtils.h +++ b/mozilla/layout/style/nsIInspectorCSSUtils.h @@ -46,6 +46,9 @@ class nsRuleNode; class nsIStyleRule; class nsIFrame; struct nsRect; +class nsIPresShell; +class nsIContent; +class nsIStyleContext; // 0252892b-419a-49f4-981d-4c6716099451 #define NS_IINSPECTORCSSUTILS_IID \ @@ -74,6 +77,11 @@ public: // Hooks to avoid having to use nsStyleCoord. NS_IMETHOD AdjustRectForMargins(nsIFrame* aFrame, nsRect& aRect) = 0; + + // Hooks to methods that need layout atoms (static vars in layout) + NS_IMETHOD GetStyleContextForContent(nsIPresShell* aPresShell, + nsIContent* aContent, + nsIStyleContext** aStyleContext) = 0; }; #endif /* nsIInspectorCSSUtils_h___ */ diff --git a/mozilla/layout/style/nsInspectorCSSUtils.cpp b/mozilla/layout/style/nsInspectorCSSUtils.cpp index d03b8c749ea..d0e1b85ad61 100644 --- a/mozilla/layout/style/nsInspectorCSSUtils.cpp +++ b/mozilla/layout/style/nsInspectorCSSUtils.cpp @@ -40,6 +40,7 @@ #include "nsInspectorCSSUtils.h" #include "nsRuleNode.h" #include "nsString.h" +#include "nsLayoutAtoms.h" nsInspectorCSSUtils::nsInspectorCSSUtils() { @@ -111,3 +112,32 @@ nsInspectorCSSUtils::AdjustRectForMargins(nsIFrame* aFrame, nsRect& aRect) return NS_OK; } +NS_IMETHODIMP +nsInspectorCSSUtils::GetStyleContextForContent(nsIPresShell* aPresShell, + nsIContent* aContent, + nsIStyleContext** aStyleContext) +{ + NS_PRECONDITION(aPresShell, "Null pres shell"); + + nsIFrame* frame = nsnull; + nsresult rv = aPresShell->GetPrimaryFrameFor(aContent, &frame); + if (NS_FAILED(rv) || !frame) return rv; + + /* For tables the primary frame is the "outer frame" but the style + * rules are applied to the "inner frame". Luckily, the "outer + * frame" actually inherits style from the "inner frame" so we can + * just move one level up in the style hierarchy.... + */ + nsCOMPtr frameType; + frame->GetFrameType(getter_AddRefs(frameType)); + if (frameType == nsLayoutAtoms::tableOuterFrame) { + nsCOMPtr presContext; + rv = aPresShell->GetPresContext(getter_AddRefs(presContext)); + if (! presContext) + return rv; + PRBool isChild; + rv = frame->GetParentStyleContextFrame(presContext, &frame, &isChild); + if (NS_FAILED(rv) || !frame) return rv; + } + return aPresShell->GetStyleContextFor(frame, aStyleContext); +} diff --git a/mozilla/layout/style/nsInspectorCSSUtils.h b/mozilla/layout/style/nsInspectorCSSUtils.h index 0ff484174a1..5daed8a8e66 100644 --- a/mozilla/layout/style/nsInspectorCSSUtils.h +++ b/mozilla/layout/style/nsInspectorCSSUtils.h @@ -57,7 +57,9 @@ public: NS_IMETHOD GetRuleNodeRule(nsRuleNode *aNode, nsIStyleRule **aRule); NS_IMETHOD IsRuleNodeRoot(nsRuleNode *aNode, PRBool *aIsRoot); NS_IMETHOD AdjustRectForMargins(nsIFrame* aFrame, nsRect& aRect); - + NS_IMETHOD GetStyleContextForContent(nsIPresShell* aPresShell, + nsIContent* aContent, + nsIStyleContext** aStyleContext); }; #endif /* nsInspectorCSSUtils_h___ */