diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul
index e9fcaa3c4730..a32bd183a1dc 100644
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -197,6 +197,7 @@
@@ -461,7 +463,7 @@
#ifdef MENUBAR_CAN_AUTOHIDE
toolbarname="&menubarCmd.label;"
accesskey="&menubarCmd.accesskey;"
-#ifdef XP_LINUX
+#if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
autohide="true"
#endif
#endif
diff --git a/browser/metro/base/content/helperui/MenuUI.js b/browser/metro/base/content/helperui/MenuUI.js
index 38458dcb17c8..532c56bdaab9 100644
--- a/browser/metro/base/content/helperui/MenuUI.js
+++ b/browser/metro/base/content/helperui/MenuUI.js
@@ -522,7 +522,6 @@ MenuPopup.prototype = {
aEvent.charCode); // in unsigned long charCodeArg);
ev.mine = true;
- this.commands.dispatchEvent(ev);
switch (aEvent.keyCode) {
case aEvent.DOM_VK_ESCAPE:
@@ -537,6 +536,7 @@ MenuPopup.prototype = {
if (Util.isNavigationKey(aEvent.keyCode)) {
aEvent.stopPropagation();
aEvent.preventDefault();
+ this.commands.dispatchEvent(ev);
} else if (!this._wantTypeBehind) {
// Hide the context menu so you can't type behind it.
aEvent.stopPropagation();
diff --git a/browser/metro/profile/metro.js b/browser/metro/profile/metro.js
index 8ed308bbfe7e..5ff66deb9f3f 100644
--- a/browser/metro/profile/metro.js
+++ b/browser/metro/profile/metro.js
@@ -220,6 +220,7 @@ pref("extensions.blocklist.enabled", true);
pref("extensions.blocklist.interval", 86400);
pref("extensions.blocklist.url", "https://addons.mozilla.org/blocklist/3/%APP_ID%/%APP_VERSION%/%PRODUCT%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/%PING_COUNT%/%TOTAL_PING_COUNT%/%DAYS_SINCE_LAST_PING%/");
pref("extensions.blocklist.detailsURL", "https://www.mozilla.org/%LOCALE%/blocklist/");
+pref("extensions.showMismatchUI", false);
/* block popups by default, and notify the user about blocked popups */
pref("dom.disable_open_during_load", true);
diff --git a/browser/modules/UITour.jsm b/browser/modules/UITour.jsm
index 7d4b11cfe0c4..d6fc4d0c9c40 100644
--- a/browser/modules/UITour.jsm
+++ b/browser/modules/UITour.jsm
@@ -464,6 +464,7 @@ this.UITour = {
effect = this.highlightEffects[randomEffect];
}
highlighter.setAttribute("active", effect);
+ highlighter.parentElement.hidden = false;
let targetRect = aTargetEl.getBoundingClientRect();
@@ -514,16 +515,15 @@ this.UITour = {
let tooltipTitle = document.getElementById("UITourTooltipTitle");
let tooltipDesc = document.getElementById("UITourTooltipDescription");
- tooltip.hidePopup();
+ if (tooltip.state == "open") {
+ tooltip.hidePopup();
+ }
tooltipTitle.textContent = aTitle;
tooltipDesc.textContent = aDescription;
+ tooltip.hidden = false;
let alignment = "bottomcenter topright";
-
- if (tooltip.state == "open") {
- tooltip.hidePopup();
- }
tooltip.openPopup(aAnchorEl, alignment);
}
diff --git a/browser/themes/shared/devtools/common.css b/browser/themes/shared/devtools/common.css
index a8208dc9fe1e..df70486fbb63 100644
--- a/browser/themes/shared/devtools/common.css
+++ b/browser/themes/shared/devtools/common.css
@@ -11,13 +11,13 @@
.devtools-monospace {
%ifdef XP_MACOSX
font-family: Menlo, monospace;
-%endif
-%ifdef XP_LINUX
- font-family: monospace;
- font-size: 80%;
-%endif
-%ifdef XP_WIN
+%elifdef XP_WIN
font-family: Consolas, monospace;
+%else
+ font-family: monospace;
+%endif
+%if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
+ font-size: 80%;
%endif
}
@@ -62,7 +62,7 @@
background-image: linear-gradient(to bottom, hsla(209,18%,18%,0.9), hsl(210,11%,16%));
border-radius: 3px;
overflow-x: hidden;
-%ifdef XP_LINUX
+%if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
max-height: 32rem;
%else
max-height: 40rem;
diff --git a/browser/themes/shared/devtools/highlighter.inc.css b/browser/themes/shared/devtools/highlighter.inc.css
index 5b881b5c12fc..050f78bf5bf2 100644
--- a/browser/themes/shared/devtools/highlighter.inc.css
+++ b/browser/themes/shared/devtools/highlighter.inc.css
@@ -54,7 +54,7 @@ html|*.highlighter-nodeinfobar-pseudo-classes {
padding: 0;
width: 26px;
min-height: 26px;
-%ifndef XP_LINUX
+%if !defined(MOZ_WIDGET_GTK) && !defined(MOZ_WIDGET_QT)
background-color: transparent;
%endif
}
diff --git a/browser/themes/shared/tab-selected.svg b/browser/themes/shared/tab-selected.svg
index 4132c4a42460..9577d14078f8 100644
--- a/browser/themes/shared/tab-selected.svg
+++ b/browser/themes/shared/tab-selected.svg
@@ -20,7 +20,7 @@
%ifdef XP_MACOSX
%include ../osx/shared.inc
-%elifdef XP_LINUX
+%elif defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
%include ../linux/linuxShared.inc
%else
%include ../windows/windowsShared.inc
diff --git a/mobile/android/base/GlobalHistory.java b/mobile/android/base/GlobalHistory.java
index 230c10b6ede2..153e04a861d4 100644
--- a/mobile/android/base/GlobalHistory.java
+++ b/mobile/android/base/GlobalHistory.java
@@ -94,49 +94,12 @@ class GlobalHistory {
GeckoAppShell.notifyUriVisited(uri);
}
- // Logic ported from nsNavHistory::CanAddURI.
- // http://mxr.mozilla.org/mozilla-central/source/toolkit/components/places/nsNavHistory.cpp#1272
- private boolean canAddURI(String uri) {
- if (uri == null || uri.length() == 0)
- return false;
-
- // First, heck the most common cases (HTTP, HTTPS) to avoid most of the work.
- if (uri.startsWith("http:") || uri.startsWith("https:"))
- return true;
-
- String scheme = Uri.parse(uri).getScheme();
- if (scheme == null)
- return false;
-
- // Now check for all bad things.
- if (scheme.equals("about") ||
- scheme.equals("imap") ||
- scheme.equals("news") ||
- scheme.equals("mailbox") ||
- scheme.equals("moz-anno") ||
- scheme.equals("view-source") ||
- scheme.equals("chrome") ||
- scheme.equals("resource") ||
- scheme.equals("data") ||
- scheme.equals("wyciwyg") ||
- scheme.equals("javascript"))
- return false;
-
- return true;
- }
-
public void add(String uri) {
- if (!canAddURI(uri))
- return;
-
BrowserDB.updateVisitedHistory(GeckoAppShell.getContext().getContentResolver(), uri);
addToGeckoOnly(uri);
}
public void update(String uri, String title) {
- if (!canAddURI(uri))
- return;
-
BrowserDB.updateHistoryTitle(GeckoAppShell.getContext().getContentResolver(), uri, title);
}
diff --git a/mobile/android/components/build/nsAndroidHistory.cpp b/mobile/android/components/build/nsAndroidHistory.cpp
index d5909c5f6c12..0b21518e7dbf 100644
--- a/mobile/android/components/build/nsAndroidHistory.cpp
+++ b/mobile/android/components/build/nsAndroidHistory.cpp
@@ -84,6 +84,14 @@ nsAndroidHistory::VisitURI(nsIURI *aURI, nsIURI *aLastVisitedURI, uint32_t aFlag
if (!aURI)
return NS_OK;
+ // Silently return if URI is something we shouldn't add to DB.
+ bool canAdd;
+ nsresult rv = CanAddURI(aURI, &canAdd);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!canAdd) {
+ return NS_OK;
+ }
+
if (!(aFlags & VisitFlags::TOP_LEVEL))
return NS_OK;
@@ -94,7 +102,7 @@ nsAndroidHistory::VisitURI(nsIURI *aURI, nsIURI *aLastVisitedURI, uint32_t aFlag
return NS_OK;
nsAutoCString uri;
- nsresult rv = aURI->GetSpec(uri);
+ rv = aURI->GetSpec(uri);
if (NS_FAILED(rv)) return rv;
NS_ConvertUTF8toUTF16 uriString(uri);
GeckoAppShell::MarkURIVisited(uriString);
@@ -104,6 +112,14 @@ nsAndroidHistory::VisitURI(nsIURI *aURI, nsIURI *aLastVisitedURI, uint32_t aFlag
NS_IMETHODIMP
nsAndroidHistory::SetURITitle(nsIURI *aURI, const nsAString& aTitle)
{
+ // Silently return if URI is something we shouldn't add to DB.
+ bool canAdd;
+ nsresult rv = CanAddURI(aURI, &canAdd);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!canAdd) {
+ return NS_OK;
+ }
+
if (AndroidBridge::Bridge()) {
nsAutoCString uri;
nsresult rv = aURI->GetSpec(uri);
@@ -144,3 +160,53 @@ nsAndroidHistory::Run()
}
return NS_OK;
}
+
+// Filter out unwanted URIs such as "chrome:", "mailbox:", etc.
+//
+// The model is if we don't know differently then add which basically means
+// we are suppose to try all the things we know not to allow in and then if
+// we don't bail go on and allow it in.
+//
+// Logic ported from nsNavHistory::CanAddURI.
+
+NS_IMETHODIMP
+nsAndroidHistory::CanAddURI(nsIURI* aURI, bool* canAdd)
+{
+ NS_ASSERTION(NS_IsMainThread(), "This can only be called on the main thread");
+ NS_ENSURE_ARG(aURI);
+ NS_ENSURE_ARG_POINTER(canAdd);
+
+ nsAutoCString scheme;
+ nsresult rv = aURI->GetScheme(scheme);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // first check the most common cases (HTTP, HTTPS) to allow in to avoid most
+ // of the work
+ if (scheme.EqualsLiteral("http")) {
+ *canAdd = true;
+ return NS_OK;
+ }
+ if (scheme.EqualsLiteral("https")) {
+ *canAdd = true;
+ return NS_OK;
+ }
+
+ // now check for all bad things
+ if (scheme.EqualsLiteral("about") ||
+ scheme.EqualsLiteral("imap") ||
+ scheme.EqualsLiteral("news") ||
+ scheme.EqualsLiteral("mailbox") ||
+ scheme.EqualsLiteral("moz-anno") ||
+ scheme.EqualsLiteral("view-source") ||
+ scheme.EqualsLiteral("chrome") ||
+ scheme.EqualsLiteral("resource") ||
+ scheme.EqualsLiteral("data") ||
+ scheme.EqualsLiteral("wyciwyg") ||
+ scheme.EqualsLiteral("javascript") ||
+ scheme.EqualsLiteral("blob")) {
+ *canAdd = false;
+ return NS_OK;
+ }
+ *canAdd = true;
+ return NS_OK;
+}
diff --git a/mobile/android/components/build/nsAndroidHistory.h b/mobile/android/components/build/nsAndroidHistory.h
index 7e8c03286ed2..51064838b0b9 100644
--- a/mobile/android/components/build/nsAndroidHistory.h
+++ b/mobile/android/components/build/nsAndroidHistory.h
@@ -34,6 +34,8 @@ private:
nsDataHashtable *> mListeners;
nsTPriorityQueue mPendingURIs;
+
+ nsresult CanAddURI(nsIURI* aURI, bool* canAdd);
};
#endif
diff --git a/services/common/tests/unit/test_tokenserverclient.js b/services/common/tests/unit/test_tokenserverclient.js
index d1d24501b395..61022f794630 100644
--- a/services/common/tests/unit/test_tokenserverclient.js
+++ b/services/common/tests/unit/test_tokenserverclient.js
@@ -14,6 +14,7 @@ add_test(function test_working_bid_exchange() {
_("Ensure that working BrowserID token exchange works as expected.");
let service = "http://example.com/foo";
+ let duration = 300;
let server = httpd_setup({
"/1.0/foo/1.0": function(request, response) {
@@ -29,6 +30,7 @@ add_test(function test_working_bid_exchange() {
key: "key",
api_endpoint: service,
uid: "uid",
+ duration: duration,
});
response.bodyOutputStream.write(body, body.length);
}
@@ -40,12 +42,12 @@ add_test(function test_working_bid_exchange() {
client.getTokenFromBrowserIDAssertion(url, "assertion", cb);
let result = cb.wait();
do_check_eq("object", typeof(result));
- do_check_attribute_count(result, 4);
+ do_check_attribute_count(result, 5);
do_check_eq(service, result.endpoint);
do_check_eq("id", result.id);
do_check_eq("key", result.key);
do_check_eq("uid", result.uid);
-
+ do_check_eq(duration, result.duration);
server.stop(run_next_test);
});
@@ -200,6 +202,7 @@ add_test(function test_403_no_urls() {
add_test(function test_send_conditions_accepted() {
_("Ensures that the condition acceptance header is sent when asked.");
+ let duration = 300;
let server = httpd_setup({
"/1.0/foo/1.0": function(request, response) {
do_check_true(request.hasHeader("x-conditions-accepted"));
@@ -213,6 +216,7 @@ add_test(function test_send_conditions_accepted() {
key: "key",
api_endpoint: "http://example.com/",
uid: "uid",
+ duration: duration,
});
response.bodyOutputStream.write(body, body.length);
}
@@ -384,6 +388,7 @@ add_test(function test_unhandled_media_type() {
add_test(function test_rich_media_types() {
_("Ensure that extra tokens in the media type aren't rejected.");
+ let duration = 300;
let server = httpd_setup({
"/foo": function(request, response) {
response.setStatusLine(request.httpVersion, 200, "OK");
@@ -394,6 +399,7 @@ add_test(function test_rich_media_types() {
key: "key",
api_endpoint: "foo",
uid: "uid",
+ duration: duration,
});
response.bodyOutputStream.write(body, body.length);
}
@@ -411,6 +417,7 @@ add_test(function test_rich_media_types() {
add_test(function test_exception_during_callback() {
_("Ensure that exceptions thrown during callback handling are handled.");
+ let duration = 300;
let server = httpd_setup({
"/foo": function(request, response) {
response.setStatusLine(request.httpVersion, 200, "OK");
@@ -421,6 +428,7 @@ add_test(function test_exception_during_callback() {
key: "key",
api_endpoint: "foo",
uid: "uid",
+ duration: duration,
});
response.bodyOutputStream.write(body, body.length);
}
diff --git a/services/common/tokenserverclient.js b/services/common/tokenserverclient.js
index c8eb47ec14e8..eb41d97859ab 100644
--- a/services/common/tokenserverclient.js
+++ b/services/common/tokenserverclient.js
@@ -359,7 +359,7 @@ TokenServerClient.prototype = {
return;
}
- for (let k of ["id", "key", "api_endpoint", "uid"]) {
+ for (let k of ["id", "key", "api_endpoint", "uid", "duration"]) {
if (!(k in result)) {
let error = new TokenServerClientServerError("Expected key not " +
" present in result: " +
@@ -377,6 +377,7 @@ TokenServerClient.prototype = {
key: result.key,
endpoint: result.api_endpoint,
uid: result.uid,
+ duration: result.duration,
});
}
};
diff --git a/services/crypto/tests/unit/test_utils_hawk.js b/services/crypto/tests/unit/test_utils_hawk.js
index 7791c2a356c8..0a2cf6c31716 100644
--- a/services/crypto/tests/unit/test_utils_hawk.js
+++ b/services/crypto/tests/unit/test_utils_hawk.js
@@ -228,6 +228,16 @@ add_test(function test_hawk() {
do_check_eq(result.artifacts.hash, "66DiyapJ0oGgj09IXWdMv8VCg9xk0PL5RqX7bNnQW2k=");
do_check_eq(result.artifacts.mac, "2B++3x5xfHEZbPZGDiK3IwfPZctkV4DUr2ORg1vIHvk=");
+ // the payload "hash" is also non-urlsafe base64 (+/)
+ result = compute(makeURI("http://example.net/path"), method,
+ { credentials: credentials_sha256,
+ ts: 1353809207,
+ nonce: "Ygvqdz",
+ payload: "something else",
+ });
+ do_check_eq(result.artifacts.hash, "lERFXr/IKOaAoYw+eBseDUSwmqZTX0uKZpcWLxsdzt8=");
+ do_check_eq(result.artifacts.mac, "jiZuhsac35oD7IdcblhFncBr8tJFHcwWLr8NIYWr9PQ=");
+
/* Test non-ascii hostname. HAWK (via the node.js "url" module) punycodes
* "ëxample.net" into "xn--xample-ova.net" before hashing. I still think
* punycode was a bad joke that got out of the lab and into a spec.
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index 4692e9b968cb..834505b1a36a 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -574,6 +574,22 @@ ProcessDDE(nsINativeAppSupport* aNative, bool aWait)
}
#endif
+/**
+ * Determines if there is support for showing the profile manager
+ *
+ * @return true in all environments except for Windows Metro
+*/
+static bool
+CanShowProfileManager()
+{
+#if defined(XP_WIN)
+ return XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Desktop;
+#else
+ return true;
+#endif
+}
+
+
bool gSafeMode = false;
/**
@@ -1893,6 +1909,10 @@ static nsresult
ShowProfileManager(nsIToolkitProfileService* aProfileSvc,
nsINativeAppSupport* aNative)
{
+ if (!CanShowProfileManager()) {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
nsresult rv;
nsCOMPtr profD, profLD;
@@ -2243,7 +2263,10 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
PR_fprintf(PR_STDERR, "Error: argument -p is invalid when argument -osint is specified\n");
return NS_ERROR_FAILURE;
}
- return ShowProfileManager(aProfileSvc, aNative);
+
+ if (CanShowProfileManager()) {
+ return ShowProfileManager(aProfileSvc, aNative);
+ }
}
if (ar) {
ar = CheckArg("osint");
@@ -2271,14 +2294,16 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
return ProfileLockedDialog(profile, unlocker, aNative, aResult);
}
- return ShowProfileManager(aProfileSvc, aNative);
+ if (CanShowProfileManager()) {
+ return ShowProfileManager(aProfileSvc, aNative);
+ }
}
ar = CheckArg("profilemanager", true);
if (ar == ARG_BAD) {
PR_fprintf(PR_STDERR, "Error: argument -profilemanager is invalid when argument -osint is specified\n");
return NS_ERROR_FAILURE;
- } else if (ar == ARG_FOUND) {
+ } else if (ar == ARG_FOUND && CanShowProfileManager()) {
return ShowProfileManager(aProfileSvc, aNative);
}
@@ -2303,8 +2328,9 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
}
bool useDefault = true;
- if (count > 1)
+ if (count > 1 && CanShowProfileManager()) {
aProfileSvc->GetStartWithLastProfile(&useDefault);
+ }
if (useDefault) {
nsCOMPtr profile;
@@ -2359,6 +2385,10 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
}
}
+ if (!CanShowProfileManager()) {
+ return NS_ERROR_FAILURE;
+ }
+
return ShowProfileManager(aProfileSvc, aNative);
}
@@ -4072,12 +4102,6 @@ XREMain::XRE_main(int argc, char* argv[], const nsXREAppData* aAppData)
// We have an application restart don't do any shutdown checks here
// In particular we don't want to poison IO for checking late-writes.
gShutdownChecks = SCM_NOTHING;
-
- #if defined(MOZ_METRO) && defined(XP_WIN)
- if (rv == NS_SUCCESS_RESTART_METRO_APP) {
- LaunchDefaultMetroBrowser();
- }
- #endif
}
if (!mShuttingDown) {
@@ -4114,7 +4138,15 @@ XREMain::XRE_main(int argc, char* argv[], const nsXREAppData* aAppData)
MOZ_gdk_display_close(mGdkDisplay);
#endif
- rv = LaunchChild(mNativeApp, true);
+#if defined(MOZ_METRO) && defined(XP_WIN)
+ if (rv == NS_SUCCESS_RESTART_METRO_APP) {
+ LaunchDefaultMetroBrowser();
+ rv = NS_OK;
+ } else
+#endif
+ {
+ rv = LaunchChild(mNativeApp, true);
+ }
#ifdef MOZ_CRASHREPORTER
if (mAppData->flags & NS_XRE_ENABLE_CRASH_REPORTER)
diff --git a/widget/windows/winrt/MetroAppShell.cpp b/widget/windows/winrt/MetroAppShell.cpp
index 7ca6537f9c49..61af8d14561b 100644
--- a/widget/windows/winrt/MetroAppShell.cpp
+++ b/widget/windows/winrt/MetroAppShell.cpp
@@ -113,8 +113,8 @@ HRESULT SHCreateShellItemArrayFromShellItemDynamic(IShellItem *psi, REFIID riid,
return hr;
}
-BOOL
-WinLaunchDeferredMetroFirefox(bool aInMetro)
+HRESULT
+WinLaunchDeferredMetroFirefox()
{
// Create an instance of the Firefox Metro DEH which is used to launch the browser
const CLSID CLSID_FirefoxMetroDEH = {0x5100FEC1,0x212B, 0x4BF5 ,{0x9B,0xF8, 0x3E,0x65, 0x0F,0xD7,0x94,0xA3}};
@@ -126,51 +126,46 @@ WinLaunchDeferredMetroFirefox(bool aInMetro)
IID_IExecuteCommand,
getter_AddRefs(executeCommand));
if (FAILED(hr))
- return FALSE;
+ return hr;
// Get the currently running exe path
WCHAR exePath[MAX_PATH + 1] = { L'\0' };
if (!::GetModuleFileNameW(0, exePath, MAX_PATH))
- return FALSE;
+ return hr;
// Convert the path to a long path since GetModuleFileNameW returns the path
// that was used to launch Firefox which is not necessarily a long path.
if (!::GetLongPathNameW(exePath, exePath, MAX_PATH))
- return FALSE;
+ return hr;
// Create an IShellItem for the current browser path
nsRefPtr shellItem;
hr = WinUtils::SHCreateItemFromParsingName(exePath, nullptr, IID_IShellItem,
getter_AddRefs(shellItem));
if (FAILED(hr))
- return FALSE;
+ return hr;
// Convert to an IShellItemArray which is used for the path to launch
nsRefPtr shellItemArray;
hr = SHCreateShellItemArrayFromShellItemDynamic(shellItem, IID_IShellItemArray, getter_AddRefs(shellItemArray));
if (FAILED(hr))
- return FALSE;
+ return hr;
// Set the path to launch and parameters needed
nsRefPtr selection;
hr = executeCommand->QueryInterface(IID_IObjectWithSelection, getter_AddRefs(selection));
if (FAILED(hr))
- return FALSE;
+ return hr;
hr = selection->SetSelection(shellItemArray);
if (FAILED(hr))
- return FALSE;
+ return hr;
- if (aInMetro) {
- hr = executeCommand->SetParameters(L"--metro-restart");
- } else {
- hr = executeCommand->SetParameters(L"--desktop-restart");
- }
+ hr = executeCommand->SetParameters(L"--metro-restart");
if (FAILED(hr))
- return FALSE;
+ return hr;
// Run the default browser through the DEH
- hr = executeCommand->Execute();
- return SUCCEEDED(hr);
+ return executeCommand->Execute();
}
// Called by appstartup->run in xre, which is initiated by a call to
@@ -200,22 +195,24 @@ MetroAppShell::Run(void)
mozilla::widget::StopAudioSession();
nsCOMPtr appStartup (do_GetService(NS_APPSTARTUP_CONTRACTID));
- bool restartingInMetro = false, restarting = false;
+ bool restartingInMetro = false, restartingInDesktop = false;
- if (appStartup && NS_SUCCEEDED(appStartup->GetRestartingTouchEnvironment(&restartingInMetro)) &&
- restartingInMetro) {
- WinLaunchDeferredMetroFirefox(true);
- }
-
- if (!appStartup || NS_FAILED(appStartup->GetRestarting(&restarting))) {
+ if (!appStartup || NS_FAILED(appStartup->GetRestarting(&restartingInDesktop))) {
WinUtils::Log("appStartup->GetRestarting() unsuccessful");
}
- // This calls XRE_metroShutdown() in xre. This will also destroy
- // MessagePump.
+ if (appStartup && NS_SUCCEEDED(appStartup->GetRestartingTouchEnvironment(&restartingInMetro)) &&
+ restartingInMetro) {
+ restartingInDesktop = false;
+ }
+
+ // This calls XRE_metroShutdown() in xre. Shuts down gecko, including
+ // releasing the profile, and destroys MessagePump.
sMetroApp->ShutdownXPCOM();
- if (restarting) {
+ // Handle update restart or browser switch requests
+ if (restartingInDesktop) {
+ WinUtils::Log("Relaunching desktop browser");
SHELLEXECUTEINFOW sinfo;
memset(&sinfo, 0, sizeof(SHELLEXECUTEINFOW));
sinfo.cbSize = sizeof(SHELLEXECUTEINFOW);
@@ -228,6 +225,9 @@ MetroAppShell::Run(void)
sinfo.lpParameters = L"--desktop-restart";
sinfo.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sinfo);
+ } else if (restartingInMetro) {
+ HRESULT hresult = WinLaunchDeferredMetroFirefox();
+ WinUtils::Log("Relaunching metro browser (hr=%X)", hresult);
}
// This will free the real main thread in CoreApplication::Run()