bug 329711: sidebar breaks phishing alert

r=mmchew
This commit is contained in:
tony%ponderer.org 2006-06-18 05:57:45 +00:00
parent 8376d7aecb
commit 36e47e656b
5 changed files with 91 additions and 100 deletions

View File

@ -91,7 +91,7 @@ function PROT_PhishMsgDisplayer(msgDesc, browser, doc, url) {
* @constructor
*/
function PROT_PhishMsgDisplayerBase(msgDesc, browser, doc, url) {
this.debugZone = "phisdisplayer";
this.debugZone = "phishdisplayer";
this.msgDesc_ = msgDesc; // currently unused
this.browser_ = browser;
this.doc_ = doc;
@ -184,13 +184,9 @@ PROT_PhishMsgDisplayerBase.prototype.getMeOutOfHereUrl_ = function() {
PROT_PhishMsgDisplayerBase.prototype.onBrowserResized_ = function(event) {
G_Debug(this, "Got resize for " + event.target);
if (event.target == this.doc_.defaultView) {
G_Debug(this, "User resized browser.");
if (this.messageShowing_) {
this.hideMessage_();
this.showMessage_();
}
if (this.messageShowing_) {
this.hideMessage_();
this.showMessage_();
}
}
@ -257,19 +253,13 @@ PROT_PhishMsgDisplayerBase.prototype.start = function() {
this.commandController_ = new PROT_CommandController(this.commandHandlers_);
this.doc_.defaultView.controllers.appendController(this.commandController_);
// Load the overlay if we haven't already.
var stack = this.doc_.getElementById('safebrowsing-content-stack');
if (!stack) {
this.doc_.loadOverlay(
"chrome://browser/content/safebrowsing/warning-overlay.xul",
null);
}
// Add an event listener for when the browser resizes (e.g., user
// shows/hides the sidebar).
this.resizeHandler_ = BindToObject(this.onBrowserResized_, this);
this.doc_.defaultView.addEventListener("resize",
this.resizeHandler_,
true);
this.browser_.addEventListener("resize",
this.resizeHandler_,
false);
}
/**
@ -303,9 +293,9 @@ PROT_PhishMsgDisplayerBase.prototype.done = function() {
this.hideMessage_();
if (this.resizeHandler_) {
this.doc_.defaultView.removeEventListener("resize",
this.resizeHandler_,
true);
this.browser_.removeEventListener("resize",
this.resizeHandler_,
false);
this.resizeHandler_ = null;
}
@ -520,7 +510,6 @@ function PROT_PhishMsgDisplayerCanvas(msgDesc, browser, doc, url) {
PROT_PhishMsgDisplayerBase.call(this, msgDesc, browser, doc, url);
this.dimAreaId_ = "safebrowsing-dim-area-canvas";
this.contentStackId_ = "safebrowsing-content-stack";
this.pageCanvasId_ = "safebrowsing-page-canvas";
this.xhtmlNS_ = "http://www.w3.org/1999/xhtml"; // we create html:canvas
}
@ -528,55 +517,82 @@ function PROT_PhishMsgDisplayerCanvas(msgDesc, browser, doc, url) {
PROT_PhishMsgDisplayerCanvas.inherits(PROT_PhishMsgDisplayerBase);
/**
* Displays the warning message.
* Displays the warning message. First we make sure the overlay is loaded
* then call showMessageAfterOverlay_.
*/
PROT_PhishMsgDisplayerCanvas.prototype.showMessage_ = function() {
G_Debug(this, "Showing message.");
// Load the overlay if we haven't already.
var dimmer = this.doc_.getElementById('safebrowsing-dim-area-canvas');
if (!dimmer) {
var onOverlayMerged = BindToObject(this.showMessageAfterOverlay_,
this);
var observer = new G_ObserverWrapper("xul-overlay-merged",
onOverlayMerged);
this.doc_.loadOverlay(
"chrome://browser/content/safebrowsing/warning-overlay.xul",
observer);
} else {
// The overlay is already loaded so we go ahead and call
// showMessageAfterOverlay_.
this.showMessageAfterOverlay_();
}
}
/**
* This does the actual work of showing the warning message.
*/
PROT_PhishMsgDisplayerCanvas.prototype.showMessageAfterOverlay_ = function() {
this.messageShowing_ = true;
// Unhide our stack. Order here is significant, but don't ask me why
// for some of these. You need to:
// 1. add canvas to the stack in a hidden state
// 2. unhide the stack
// 3. get browser dimensions
// 4. unhide stack contents
// 5. display to the canvas
// 6. unhide the warning message
// 7. update link targets in warning message
// 8. focus the warning message
// Position the canvas overlay. Order here is significant, but don't ask me
// why for some of these. You need to:
// 1. get browser dimensions
// 2. add canvas to the document
// 3. unhide the dimmer (gray out overlay)
// 4. display to the canvas
// 5. unhide the warning message
// 6. update link targets in warning message
// 7. focus the warning message
// (1)
// We add the canvas dynamically and remove it when we're done because
// leaving it hanging around consumes a lot of memory.
var pageCanvas = this.doc_.createElementNS(this.xhtmlNS_, "html:canvas");
pageCanvas.id = this.pageCanvasId_;
pageCanvas.hidden = "true";
var contentStack = this.doc_.getElementById(this.contentStackId_);
contentStack.insertBefore(pageCanvas, contentStack.firstChild);
// (2)
contentStack.hidden = false;
// (3)
var w = this.browser_.boxObject.width;
var w = this.browser_.boxObject.width;
G_Debug(this, "browser w=" + w);
var h = this.browser_.boxObject.height;
G_Debug(this, "browser h=" + h);
var x = this.browser_.boxObject.x;
G_Debug(this, "browser x=" + w);
var y = this.browser_.boxObject.y;
G_Debug(this, "browser y=" + h);
var win = this.browser_.contentWindow;
var scrollX = win.scrollX;
G_Debug(this, "win scrollx=" + scrollX);
var scrollY = win.scrollY;
G_Debug(this, "win scrolly=" + scrollY);
// (4)
// (2)
// We add the canvas dynamically and remove it when we're done because
// leaving it hanging around consumes a lot of memory.
var pageCanvas = this.doc_.createElementNS(this.xhtmlNS_, "html:canvas");
pageCanvas.id = this.pageCanvasId_;
pageCanvas.style.left = x + 'px';
pageCanvas.style.top = y + 'px';
var dimarea = this.doc_.getElementById(this.dimAreaId_);
this.doc_.getElementById('main-window').insertBefore(pageCanvas,
dimarea);
// (3)
dimarea.style.left = x + 'px';
dimarea.style.top = y + 'px';
dimarea.style.width = w + 'px';
dimarea.style.height = h + 'px';
dimarea.hidden = false;
this.browser_.parentNode.collapsed = true; // And now hide the browser
// (5)
// (4)
pageCanvas.setAttribute("width", w);
pageCanvas.setAttribute("height", h);
@ -585,7 +601,7 @@ PROT_PhishMsgDisplayerCanvas.prototype.showMessage_ = function() {
var cx = pageCanvas.getContext("2d");
cx.drawWindow(win, scrollX, scrollY, w, h, bgcolor);
// Now repaint the window every so often in case the content hasn't fully
// Now repaint the window every so often in case the content hasn't fully
// loaded at this point.
var debZone = this.debugZone;
function repaint() {
@ -594,7 +610,7 @@ PROT_PhishMsgDisplayerCanvas.prototype.showMessage_ = function() {
};
this.repainter_ = new PROT_PhishMsgCanvasRepainter(repaint);
// (6)
// (5)
var refElement = this.doc_.getElementById(this.refElementId_);
var message = this.doc_.getElementById(this.messageId_);
var tail = this.doc_.getElementById(this.messageTailId_);
@ -604,13 +620,13 @@ PROT_PhishMsgDisplayerCanvas.prototype.showMessage_ = function() {
tail.style.display = "block";
this.adjustLocation_(message, tail, refElement);
// (7)
// (6)
var link = this.doc_.getElementById('safebrowsing-palm-falsepositive-link');
link.href = this.getReportErrorURL_();
link = this.doc_.getElementById('safebrowsing-palm-report-link');
link.href = this.getReportGenericURL_();
// (8)
// (7)
this.doc_.getElementById(this.messageContentId_).focus();
}
@ -625,6 +641,7 @@ PROT_PhishMsgDisplayerCanvas.prototype.hideMessage_ = function() {
this.repainter_.cancel();
this.repainter_ = null;
// Hide the warning popup.
var message = this.doc_.getElementById(this.messageId_);
message.hidden = true;
message.style.display = "none";
@ -632,16 +649,14 @@ PROT_PhishMsgDisplayerCanvas.prototype.hideMessage_ = function() {
var tail = this.doc_.getElementById(this.messageTailId_);
tail.hidden = true;
tail.style.display = "none";
this.browser_.parentNode.collapsed = false;
var contentStack = this.doc_.getElementById(this.contentStackId_);
contentStack.hidden = true;
// Remove the canvas element from the chrome document.
var pageCanvas = this.doc_.getElementById(this.pageCanvasId_);
pageCanvas.parentNode.removeChild(pageCanvas);
// Hide the dimmer.
var dimarea = this.doc_.getElementById(this.dimAreaId_);
dimarea.hidden = true;
var pageCanvas = this.doc_.getElementById(this.pageCanvasId_);
contentStack.removeChild(pageCanvas);
}

View File

@ -12,12 +12,6 @@
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<window id="main-window">
<!-- This dims out the browser content -->
<vbox id="safebrowsing-dim-area-transp" hidden="true">
<spacer flex="1" />
</vbox>
<!-- This is the spike aka tail on top of the warning -->
<hbox id="safebrowsing-palm-message-tail-container" hidden="true"
@ -145,20 +139,11 @@
</vbox>
</vbox>
<!-- We position things over a canvas; to do so, we need a stack -->
<!-- The canvas goes here, but since it takes up so much memory and is
rarely used, we add and remove it dynamically -->
<stack id="safebrowsing-content-stack" insertbefore="status-bar"
hidden="true">
<!-- The canvas goes here as the first child, but since it takes
up so much memory and is rarely used, we add and remove it
dynamically -->
<!-- This dims out the browser content -->
<vbox id="safebrowsing-dim-area-canvas" hidden="true" flex="1">
</vbox>
</stack>
<!-- This dims out the browser content -->
<vbox id="safebrowsing-dim-area-canvas" hidden="true">
</vbox>
</window>
</overlay>

View File

@ -34,6 +34,7 @@ function Init() {
modScope.G_Assert = jslib.G_Assert;
modScope.G_Alarm = jslib.G_Alarm;
modScope.G_ConditionalAlarm = jslib.G_ConditionalAlarm;
modScope.G_ObserverWrapper = jslib.G_ObserverWrapper;
modScope.G_Preferences = jslib.G_Preferences;
modScope.PROT_XMLFetcher = jslib.PROT_XMLFetcher;
modScope.BindToObject = jslib.BindToObject;

View File

@ -94,18 +94,13 @@
width: 78px;
}
#safebrowsing-dim-area-canvas {
background-image: url("chrome://browser/skin/safebrowsing/dim.png");
height: 0px;
#safebrowsing-page-canvas {
position: fixed;
}
#safebrowsing-dim-area-transp {
#safebrowsing-dim-area-canvas {
background-image: url("chrome://browser/skin/safebrowsing/dim.png");
height: 0px;
left: 0px;
top: 0px;
position: fixed;
display: none;
}
#safebrowsing-pref-caption {

View File

@ -94,18 +94,13 @@
width: 78px;
}
#safebrowsing-dim-area-canvas {
background-image: url("chrome://browser/skin/safebrowsing/dim.png");
height: 0px;
#safebrowsing-page-canvas {
position: fixed;
}
#safebrowsing-dim-area-transp {
#safebrowsing-dim-area-canvas {
background-image: url("chrome://browser/skin/safebrowsing/dim.png");
height: 0px;
left: 0px;
top: 0px;
position: fixed;
display: none;
}
#safebrowsing-pref-caption {