diff --git a/extensions/inspector/base/public/inIFlasher.idl b/extensions/inspector/base/public/inIFlasher.idl index 5ccba502ca46..adbfcb39e662 100644 --- a/extensions/inspector/base/public/inIFlasher.idl +++ b/extensions/inspector/base/public/inIFlasher.idl @@ -46,7 +46,11 @@ interface nsIDOMWindowInternal; [scriptable, uuid(7B4A099F-6F6E-4565-977B-FB622ADBFF49)] interface inIFlasher : nsISupports { - void drawElementOutline(in nsIDOMElement aElement, in wstring aColor, in long aThickness, in boolean aInvert); + attribute DOMString color; + attribute boolean invert; + attribute unsigned short thickness; + + void drawElementOutline(in nsIDOMElement aElement); void repaintElement(in nsIDOMElement aElement); void scrollElementIntoView(in nsIDOMElement aElement); }; diff --git a/extensions/inspector/base/src/inFlasher.cpp b/extensions/inspector/base/src/inFlasher.cpp index 41000aa70ba4..e916ec95de07 100644 --- a/extensions/inspector/base/src/inFlasher.cpp +++ b/extensions/inspector/base/src/inFlasher.cpp @@ -47,11 +47,16 @@ #include "nsIPresShell.h" #include "nsIFrame.h" +#include "prprf.h" + static NS_DEFINE_CID(kInspectorCSSUtilsCID, NS_INSPECTORCSSUTILS_CID); /////////////////////////////////////////////////////////////////////////////// -inFlasher::inFlasher() +inFlasher::inFlasher() : + mColor(NS_RGB(0,0,0)), + mThickness(0), + mInvert(PR_FALSE) { NS_INIT_ISUPPORTS(); mCSSUtils = do_GetService(kInspectorCSSUtilsCID); @@ -66,7 +71,72 @@ NS_IMPL_ISUPPORTS1(inFlasher, inIFlasher); /////////////////////////////////////////////////////////////////////////////// // inIFlasher -NS_IMETHODIMP +NS_IMETHODIMP +inFlasher::GetColor(nsAString& aColor) +{ + // Copied from nsGenericHTMLElement::ColorToString() + char buf[10]; + PR_snprintf(buf, sizeof(buf), "#%02x%02x%02x", + NS_GET_R(mColor), NS_GET_G(mColor), NS_GET_B(mColor)); + aColor.Assign(NS_ConvertASCIItoUCS2(buf)); + + return NS_OK; +} + +NS_IMETHODIMP +inFlasher::SetColor(const nsAString& aColor) +{ + NS_ENSURE_FALSE(aColor.IsEmpty(), NS_ERROR_ILLEGAL_VALUE); + + nsAutoString colorStr; + colorStr.Assign(aColor); + + if (colorStr.CharAt(0) != '#') { + if (NS_ColorNameToRGB(colorStr, &mColor)) { + return NS_OK; + } + } + else { + colorStr.Cut(0, 1); + if (NS_HexToRGB(colorStr, &mColor)) { + return NS_OK; + } + } + + return NS_ERROR_ILLEGAL_VALUE; +} + +NS_IMETHODIMP +inFlasher::GetThickness(PRUint16 *aThickness) +{ + NS_PRECONDITION(aThickness, "Null pointer"); + *aThickness = mThickness; + return NS_OK; +} + +NS_IMETHODIMP +inFlasher::SetThickness(PRUint16 aThickness) +{ + mThickness = aThickness; + return NS_OK; +} + +NS_IMETHODIMP +inFlasher::GetInvert(PRBool *aInvert) +{ + NS_PRECONDITION(aInvert, "Null pointer"); + *aInvert = mInvert; + return NS_OK; +} + +NS_IMETHODIMP +inFlasher::SetInvert(PRBool aInvert) +{ + mInvert = aInvert; + return NS_OK; +} + +NS_IMETHODIMP inFlasher::RepaintElement(nsIDOMElement* aElement) { nsCOMPtr window = inLayoutUtils::GetWindowFor(aElement); @@ -100,7 +170,7 @@ inFlasher::RepaintElement(nsIDOMElement* aElement) } NS_IMETHODIMP -inFlasher::DrawElementOutline(nsIDOMElement* aElement, const PRUnichar* aColor, PRInt32 aThickness, PRBool aInvert) +inFlasher::DrawElementOutline(nsIDOMElement* aElement) { nsCOMPtr window = inLayoutUtils::GetWindowFor(aElement); if (!window) return NS_OK; @@ -121,18 +191,14 @@ inFlasher::DrawElementOutline(nsIDOMElement* aElement, const PRUnichar* aColor, rect.y = origin.y; mCSSUtils->AdjustRectForMargins(frame, rect); - nsAutoString colorStr; - colorStr.Assign(aColor); - nscolor color; - NS_HexToRGB(colorStr, &color); - float p2t; presContext->GetPixelsToTwips(&p2t); - if (aInvert) + if (mInvert) { rcontext->InvertRect(rect.x, rect.y, rect.width, rect.height); + } - DrawOutline(rect.x, rect.y, rect.width, rect.height, color, aThickness, p2t, rcontext); + DrawOutline(rect.x, rect.y, rect.width, rect.height, p2t, rcontext); return NS_OK; } @@ -164,31 +230,27 @@ inFlasher::ScrollElementIntoView(nsIDOMElement *aElement) /////////////////////////////////////////////////////////////////////////////// // inFlasher -nsresult +void inFlasher::DrawOutline(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight, - nscolor aColor, PRUint32 aThickness, float aP2T, - nsIRenderingContext* aRenderContext) + float aP2T, nsIRenderingContext* aRenderContext) { - aRenderContext->SetColor(aColor); - DrawLine(aX, aY, aWidth, aThickness, DIR_HORIZONTAL, BOUND_OUTER, aP2T, aRenderContext); - DrawLine(aX, aY, aHeight, aThickness, DIR_VERTICAL, BOUND_OUTER, aP2T, aRenderContext); - DrawLine(aX, aY+aHeight, aWidth, aThickness, DIR_HORIZONTAL, BOUND_INNER, aP2T, aRenderContext); - DrawLine(aX+aWidth, aY, aHeight, aThickness, DIR_VERTICAL, BOUND_INNER, aP2T, aRenderContext); + aRenderContext->SetColor(mColor); - return NS_OK; + DrawLine(aX, aY, aWidth, DIR_HORIZONTAL, BOUND_OUTER, aP2T, aRenderContext); + DrawLine(aX, aY, aHeight, DIR_VERTICAL, BOUND_OUTER, aP2T, aRenderContext); + DrawLine(aX, aY+aHeight, aWidth, DIR_HORIZONTAL, BOUND_INNER, aP2T, aRenderContext); + DrawLine(aX+aWidth, aY, aHeight, DIR_VERTICAL, BOUND_INNER, aP2T, aRenderContext); } -nsresult +void inFlasher::DrawLine(nscoord aX, nscoord aY, nscoord aLength, - PRUint32 aThickness, PRBool aDir, PRBool aBounds, - float aP2T, nsIRenderingContext* aRenderContext) + PRBool aDir, PRBool aBounds, float aP2T, + nsIRenderingContext* aRenderContext) { - nscoord thickTwips = NSIntPixelsToTwips(aThickness, aP2T); + nscoord thickTwips = NSIntPixelsToTwips(mThickness, aP2T); if (aDir) { // horizontal aRenderContext->FillRect(aX, aY+(aBounds?0:-thickTwips), aLength, thickTwips); } else { // vertical aRenderContext->FillRect(aX+(aBounds?0:-thickTwips), aY, thickTwips, aLength); } - - return NS_OK; } diff --git a/extensions/inspector/base/src/inFlasher.h b/extensions/inspector/base/src/inFlasher.h index c4d80dad6fec..47233e888ff8 100644 --- a/extensions/inspector/base/src/inFlasher.h +++ b/extensions/inspector/base/src/inFlasher.h @@ -63,14 +63,18 @@ public: virtual ~inFlasher(); protected: - nsresult DrawOutline(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight, - nscolor aColor, PRUint32 aThickness, float aP2T, - nsIRenderingContext* aRenderContext); - nsresult DrawLine(nscoord aX, nscoord aY, nscoord aLength, PRUint32 aThickness, - PRBool aDir, PRBool aBounds, float aP2T, - nsIRenderingContext* aRenderContext); + void DrawOutline(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight, + float aP2T, nsIRenderingContext* aRenderContext); + void DrawLine(nscoord aX, nscoord aY, nscoord aLength, + PRBool aDir, PRBool aBounds, float aP2T, + nsIRenderingContext* aRenderContext); nsCOMPtr mCSSUtils; + + nscolor mColor; + + PRUint16 mThickness; + PRPackedBool mInvert; }; #endif // __inFlasher_h__ diff --git a/extensions/inspector/resources/content/Flasher.js b/extensions/inspector/resources/content/Flasher.js index 14e50dcd28a6..1aeda4e4a0f2 100644 --- a/extensions/inspector/resources/content/Flasher.js +++ b/extensions/inspector/resources/content/Flasher.js @@ -55,12 +55,12 @@ var gFlasherRegistry = []; function Flasher(aColor, aThickness, aDuration, aSpeed, aInvert) { - this.mShell = XPCU.createInstance("@mozilla.org/inspector/flasher;1", "inIFlasher"); - this.color = aColor; - this.mThickness = aThickness; + this.mShell = XPCU.getService("@mozilla.org/inspector/flasher;1", "inIFlasher"); + this.mShell.color = aColor; + this.mShell.thickness = aThickness; + this.mShell.invert = aInvert; this.duration = aDuration; this.mSpeed = aSpeed; - this.mInvert = aInvert; this.register(); } @@ -75,11 +75,8 @@ Flasher.prototype = mRegistryId: null, mFlashes: 0, mStartTime: 0, - mColor: null, - mThickness: 0, mDuration: 0, mSpeed: 0, - mInvert: false, //////////////////////////////////////////////////////////////////////////// //// Properties @@ -96,11 +93,11 @@ Flasher.prototype = throw "Invalid node type."; }, - get color() { return this.mColor; }, - set color(aVal) { if (aVal.charAt(0) == '#') aVal = aVal.substr(1); this.mColor = aVal; }, + get color() { return this.mShell.color; }, + set color(aVal) { return this.mShell.color = aVal; }, - get thickness() { return this.mThickness; }, - set thickness(aVal) { this.mThickness = aVal; }, + get thickness() { return this.mShell.thickness; }, + set thickness(aVal) { this.mShell.thickness = aVal; }, get duration() { return this.mDuration; }, set duration(aVal) { this.mDuration = aVal; }, @@ -108,8 +105,8 @@ Flasher.prototype = get speed() { return this.mSpeed; }, set speed(aVal) { this.mSpeed = aVal; }, - get invert() { return this.mInvert; }, - set invert(aVal) { this.mInvert = aVal; }, + get invert() { return this.mShell.invert; }, + set invert(aVal) { this.mShell.invert = aVal; }, // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // :::::::::::::::::::: Methods :::::::::::::::::::::::::::: @@ -159,7 +156,7 @@ Flasher.prototype = paintOn: function() { - this.mShell.drawElementOutline(this.mElement, this.mColor, this.mThickness, this.mInvert); + this.mShell.drawElementOutline(this.mElement); }, paintOff: function()