Bug 1014332 error page fixes for share panel and about:providerdirectory support, r=jaws
--- a/browser/base/content/aboutSocialError.xhtml
+++ b/browser/base/content/aboutSocialError.xhtml
@@ -37,37 +37,36 @@
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource:///modules/Social.jsm");
let config = {
tryAgainCallback: reloadProvider
}
function parseQueryString() {
- let url = document.documentURI;
- let queryString = url.replace(/^about:socialerror\??/, "");
-
- let modeMatch = queryString.match(/mode=([^&]+)/);
- let mode = modeMatch && modeMatch[1] ? modeMatch[1] : "";
- let originMatch = queryString.match(/origin=([^&]+)/);
- config.origin = originMatch && originMatch[1] ? decodeURIComponent(originMatch[1]) : "";
+ let searchParams = new URLSearchParams(location.href.split("?")[1]);
+ let mode = searchParams.get("mode");
+ config.directory = searchParams.get("directory");
+ config.origin = searchParams.get("origin");
+ let encodedURL = searchParams.get("url");
+ let url = decodeURIComponent(encodedURL);
+ if (config.directory) {
+ let URI = Services.io.newURI(url, null, null);
+ config.origin = Services.scriptSecurityManager.getNoAppCodebasePrincipal(URI).origin;
+ }
switch (mode) {
case "compactInfo":
document.getElementById("btnTryAgain").style.display = 'none';
document.getElementById("btnCloseSidebar").style.display = 'none';
break;
case "tryAgainOnly":
document.getElementById("btnCloseSidebar").style.display = 'none';
//intentional fall-through
case "tryAgain":
- let urlMatch = queryString.match(/url=([^&]+)/);
- let encodedURL = urlMatch && urlMatch[1] ? urlMatch[1] : "";
- url = decodeURIComponent(encodedURL);
-
config.tryAgainCallback = loadQueryURL;
config.queryURL = url;
break;
case "workerFailure":
config.tryAgainCallback = reloadProvider;
break;
default:
break;
@@ -75,17 +74,17 @@
}
function setUpStrings() {
let brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
let browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
let productName = brandBundle.GetStringFromName("brandShortName");
let provider = Social._getProviderFromOrigin(config.origin);
- let providerName = provider && provider.name;
+ let providerName = provider ? provider.name : config.origin;
// Sets up the error message
let msg = browserBundle.formatStringFromName("social.error.message", [productName, providerName], 2);
document.getElementById("main-error-msg").textContent = msg;
// Sets up the buttons' labels and accesskeys
let btnTryAgain = document.getElementById("btnTryAgain");
btnTryAgain.textContent = browserBundle.GetStringFromName("social.error.tryAgain.label");
--- a/browser/base/content/browser-social.js
+++ b/browser/base/content/browser-social.js
@@ -599,20 +599,25 @@ SocialShare = {
}
},
setErrorMessage: function() {
let iframe = this.iframe;
if (!iframe)
return;
- iframe.removeAttribute("src");
- iframe.webNavigation.loadURI("about:socialerror?mode=compactInfo&origin=" +
- encodeURIComponent(iframe.getAttribute("origin")),
- null, null, null, null);
+ let url;
+ let origin = iframe.getAttribute("origin");
+ if (!origin) {
+ // directory site is down
+ url = "about:socialerror?mode=tryAgainOnly&directory=1&url=" + encodeURIComponent(iframe.getAttribute("src"));
+ } else {
+ url = "about:socialerror?mode=compactInfo&origin=" + encodeURIComponent(origin);
+ }
+ iframe.webNavigation.loadURI(url, null, null, null, null);
sizeSocialPanelToContent(this.panel, iframe);
},
sharePage: function(providerOrigin, graphData, target) {
// if providerOrigin is undefined, we use the last-used provider, or the
// current/default provider. The provider selection in the share panel
// will call sharePage with an origin for us to switch to.
this._createFrame();
--- a/browser/modules/Social.jsm
+++ b/browser/modules/Social.jsm
@@ -7,18 +7,19 @@
this.EXPORTED_SYMBOLS = ["Social", "CreateSocialStatusWidget",
"CreateSocialMarkWidget", "OpenGraphBuilder",
"DynamicResizeWatcher", "sizeSocialPanelToContent"];
const Ci = Components.interfaces;
const Cc = Components.classes;
const Cu = Components.utils;
-// The minimum sizes for the auto-resize panel code.
-const PANEL_MIN_HEIGHT = 100;
+// The minimum sizes for the auto-resize panel code, minimum size necessary to
+// properly show the error page in the panel.
+const PANEL_MIN_HEIGHT = 200;
const PANEL_MIN_WIDTH = 330;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
"resource:///modules/CustomizableUI.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "SocialService",
@@ -345,40 +346,48 @@ SocialErrorListener.prototype = {
},
onStateChange: function SPL_onStateChange(aWebProgress, aRequest, aState, aStatus) {
let failure = false;
if ((aState & Ci.nsIWebProgressListener.STATE_STOP)) {
if (aRequest instanceof Ci.nsIHttpChannel) {
try {
// Change the frame to an error page on 4xx (client errors)
- // and 5xx (server errors)
+ // and 5xx (server errors). responseStatus throws if it is not set.
failure = aRequest.responseStatus >= 400 &&
aRequest.responseStatus < 600;
- } catch (e) {}
+ } catch (e) {
+ failure = aStatus == Components.results.NS_ERROR_CONNECTION_REFUSED;
+ }
}
}
// Calling cancel() will raise some OnStateChange notifications by itself,
// so avoid doing that more than once
if (failure && aStatus != Components.results.NS_BINDING_ABORTED) {
aRequest.cancel(Components.results.NS_BINDING_ABORTED);
- let provider = Social._getProviderFromOrigin(this.iframe.getAttribute("origin"));
- provider.errorState = "content-error";
+ let origin = this.iframe.getAttribute("origin");
+ if (origin) {
+ let provider = Social._getProviderFromOrigin(origin);
+ provider.errorState = "content-error";
+ }
this.setErrorMessage(aWebProgress.QueryInterface(Ci.nsIDocShell)
.chromeEventHandler);
}
},
onLocationChange: function SPL_onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
if (aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) {
aRequest.cancel(Components.results.NS_BINDING_ABORTED);
- let provider = Social._getProviderFromOrigin(this.iframe.getAttribute("origin"));
- if (!provider.errorState)
- provider.errorState = "content-error";
+ let origin = this.iframe.getAttribute("origin");
+ if (origin) {
+ let provider = Social._getProviderFromOrigin(origin);
+ if (!provider.errorState)
+ provider.errorState = "content-error";
+ }
schedule(function() {
this.setErrorMessage(aWebProgress.QueryInterface(Ci.nsIDocShell)
.chromeEventHandler);
}.bind(this));
}
},
onProgressChange: function SPL_onProgressChange() {},