From 95e71c41d8db457d1b51e79d2377e9ccc62aa300 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Wed, 26 Mar 2008 01:19:43 +0000 Subject: [PATCH] Fixes #778, Overzealous PNAS (HighWire) blocking This was due to a bug in WebPageDump/ScrapBook that would make invalid requests when various source attributes included relative paths to files in different directories. PNAS was blocking after 20 or so 404s for image files. --- chrome/content/zotero/webpagedump/domsaver.js | 50 +++++++++++++++---- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/chrome/content/zotero/webpagedump/domsaver.js b/chrome/content/zotero/webpagedump/domsaver.js index cf9704b9c..b31be0797 100644 --- a/chrome/content/zotero/webpagedump/domsaver.js +++ b/chrome/content/zotero/webpagedump/domsaver.js @@ -343,8 +343,9 @@ var wpdDOMSaver = { aDownload=aNode.complete; } catch(ex) {} } - var aFileName = this.download(aNode.src,aDownload); - if (aFileName) aNode.setAttribute("src", aFileName); + var aFileName = this.download(aNode.src,aDownload); + // Changed by Dan S. for Zotero -- see this.repairRelativeLinks() + if (aFileName) aNode.setAttribute("src", this.relativeLinkFix(aFileName)); } else { return wpdCommon.removeNodeFromParent(aNode); } @@ -352,7 +353,8 @@ var wpdDOMSaver = { case "object" : // for embedding different data sources in the html page if ( this.option["format"] ) { var aFileName = this.download(aNode.data,true); - if (aFileName) aNode.setAttribute("data", aFileName); + // Changed by Dan S. for Zotero -- see this.repairRelativeLinks() + if (aFileName) aNode.setAttribute("data", this.relativeLinkFix(aFileName)); } else { return wpdCommon.removeNodeFromParent(aNode); } @@ -360,7 +362,8 @@ var wpdDOMSaver = { case "body" : if ( this.option["format"] ) { var aFileName = this.download(aNode.background,true); - if (aFileName) aNode.setAttribute("background", aFileName); + // Changed by Dan S. for Zotero -- see this.repairRelativeLinks() + if (aFileName) aNode.setAttribute("background", this.relativeLinkFix(aFileName)); } else { aNode.removeAttribute("background"); aNode.removeAttribute("bgcolor"); @@ -373,7 +376,8 @@ var wpdDOMSaver = { case "td" : if ( this.option["format"] ) { var aFileName = this.download(aNode.getAttribute("background"),true); - if (aFileName) aNode.setAttribute("background", aFileName); + // Changed by Dan S. for Zotero -- see this.repairRelativeLinks() + if (aFileName) aNode.setAttribute("background", this.relativeLinkFix(aFileName)); } else { aNode.removeAttribute("background"); aNode.removeAttribute("bgcolor"); @@ -383,7 +387,8 @@ var wpdDOMSaver = { if ( aNode.type.toLowerCase() == "image" ) { if ( this.option["format"] ) { var aFileName = this.download(aNode.src,true); - if (aFileName) aNode.setAttribute("src", aFileName); + // Changed by Dan S. for Zotero -- see this.repairRelativeLinks() + if (aFileName) aNode.setAttribute("src", this.relativeLinkFix(aFileName)); } else { aNode.setAttribute("type", "button"); aNode.removeAttribute("src"); @@ -399,10 +404,12 @@ var wpdDOMSaver = { return wpdCommon.removeNodeFromParent(aNode); } else if ( (aNode.getAttribute("rel").toLowerCase() == "shortcut icon") || (aNode.getAttribute("rel").toLowerCase() == "icon") ) { var aFileName = this.download(aNode.href,true); - if (aFileName) aNode.setAttribute("href", aFileName); + // Changed by Dan S. for Zotero -- see this.repairRelativeLinks() + if (aFileName) aNode.setAttribute("href", this.relativeLinkFix(aFileName)); } else if (aNode.getAttribute("rel").toLowerCase() == "fontdef") { var aFileName = this.download(aNode.src,true); - if (aFileName) aNode.setAttribute("src", aFileName); + // Changed by Dan S. for Zotero -- see this.repairRelativeLinks() + if (aFileName) aNode.setAttribute("src", this.relativeLinkFix(aFileName)); } else { aNode.setAttribute("href", aNode.href); } @@ -419,7 +426,8 @@ var wpdDOMSaver = { if ( this.option["script"] ) { if ( aNode.hasAttribute("src") ) { var aFileName = this.download(aNode.src,true); - if (aFileName) aNode.setAttribute("src", aFileName); + // Changed by Dan S. for Zotero -- see this.repairRelativeLinks() + if (aFileName) aNode.setAttribute("src", this.relativeLinkFix(aFileName)); } } else { if ( WPD_JAVASCRIPTSRCBUG && aNode.hasAttribute("src") ) { @@ -566,7 +574,23 @@ var wpdDOMSaver = { } return aHTMLText; }, - + + + relativeLinkFix : function(aFileName) + { + return "about:blank?" + aFileName; + }, + + // Added by Dan S. for Zotero to restore relative links, + // which are prepended with "about:blank?" to fix a bug in Scrapbook/WPD + // that sending an invalid request to the server when the img src + // is a relative link to a file in a different directory + repairRelativeLinks : function(aHTMLText) + { + return aHTMLText.replace(/(src)="about:blank\?([^"]*)"/g, '$1="$2"'); + }, + + // process the CSS text of one stylesheet element processCSSText : function(aCSStext, aCSShref, inline) { @@ -760,7 +784,11 @@ var wpdDOMSaver = { HTMLText = HTMLText.replace(/\x00/g, " "); // replace the & added by the innerHTML method // because we have already generated all entities - if (WPD_ENTITYBUG) HTMLText = HTMLText.replace(/&/g,"&"); + if (WPD_ENTITYBUG) HTMLText = HTMLText.replace(/&/g,"&"); + + // Added by Dan S. for Zotero + HTMLText = this.repairRelativeLinks(HTMLText); + return this.repairInlineCSS(HTMLText); },