summaryrefslogtreecommitdiffstats
path: root/browser/components/shell
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@gmail.com>2018-06-04 13:17:38 +0200
committerwolfbeast <mcwerewolf@gmail.com>2018-06-04 13:17:38 +0200
commita1be17c1cea81ebb1e8b131a662c698d78f3f7f2 (patch)
treea92f7de513be600cc07bac458183e9af40e00c06 /browser/components/shell
parentbf11fdd304898ac675e39b01b280d39550e419d0 (diff)
downloadUXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.tar
UXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.tar.gz
UXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.tar.lz
UXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.tar.xz
UXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.zip
Issue #303 Part 1: Move basilisk files from /browser to /application/basilisk
Diffstat (limited to 'browser/components/shell')
-rw-r--r--browser/components/shell/ShellService.jsm114
-rw-r--r--browser/components/shell/content/setDesktopBackground.js214
-rw-r--r--browser/components/shell/content/setDesktopBackground.xul84
-rw-r--r--browser/components/shell/jar.mn7
-rw-r--r--browser/components/shell/moz.build56
-rw-r--r--browser/components/shell/nsGNOMEShellService.cpp637
-rw-r--r--browser/components/shell/nsGNOMEShellService.h36
-rw-r--r--browser/components/shell/nsIGNOMEShellService.idl19
-rw-r--r--browser/components/shell/nsIMacShellService.idl15
-rw-r--r--browser/components/shell/nsIShellService.idl95
-rw-r--r--browser/components/shell/nsIWindowsShellService.idl17
-rw-r--r--browser/components/shell/nsMacShellService.cpp434
-rw-r--r--browser/components/shell/nsMacShellService.h32
-rw-r--r--browser/components/shell/nsSetDefaultBrowser.js30
-rw-r--r--browser/components/shell/nsSetDefaultBrowser.manifest3
-rw-r--r--browser/components/shell/nsShellService.h12
-rw-r--r--browser/components/shell/nsWindowsShellService.cpp1277
-rw-r--r--browser/components/shell/nsWindowsShellService.h37
18 files changed, 0 insertions, 3119 deletions
diff --git a/browser/components/shell/ShellService.jsm b/browser/components/shell/ShellService.jsm
deleted file mode 100644
index cc225eae0..000000000
--- a/browser/components/shell/ShellService.jsm
+++ /dev/null
@@ -1,114 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
-* License, v. 2.0. If a copy of the MPL was not distributed with this file,
-* You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-this.EXPORTED_SYMBOLS = ["ShellService"];
-
-const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/AppConstants.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "WindowsRegistry",
- "resource://gre/modules/WindowsRegistry.jsm");
-
-/**
- * Internal functionality to save and restore the docShell.allow* properties.
- */
-let ShellServiceInternal = {
- /**
- * Used to determine whether or not to offer "Set as desktop background"
- * functionality. Even if shell service is available it is not
- * guaranteed that it is able to set the background for every desktop
- * which is especially true for Linux with its many different desktop
- * environments.
- */
- get canSetDesktopBackground() {
- if (AppConstants.platform == "win" ||
- AppConstants.platform == "macosx") {
- return true;
- }
-
- if (AppConstants.platform == "linux") {
- if (this.shellService) {
- let linuxShellService = this.shellService
- .QueryInterface(Ci.nsIGNOMEShellService);
- return linuxShellService.canSetDesktopBackground;
- }
- }
-
- return false;
- },
-
- /**
- * Used to determine whether or not to show a "Set Default Browser"
- * query dialog. This attribute is true if the application is starting
- * up and "browser.shell.checkDefaultBrowser" is true, otherwise it
- * is false.
- */
- _checkedThisSession: false,
- get shouldCheckDefaultBrowser() {
- // If we've already checked, the browser has been started and this is a
- // new window open, and we don't want to check again.
- if (this._checkedThisSession) {
- return false;
- }
-
- if (!Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser")) {
- return false;
- }
-
- if (AppConstants.platform == "win") {
- let optOutValue = WindowsRegistry.readRegKey(Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
- "Software\\Mozilla\\Basilisk",
- "DefaultBrowserOptOut");
- WindowsRegistry.removeRegKey(Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
- "Software\\Mozilla\\Basilisk",
- "DefaultBrowserOptOut");
- if (optOutValue == "True") {
- Services.prefs.setBoolPref("browser.shell.checkDefaultBrowser", false);
- return false;
- }
- }
-
- return true;
- },
-
- set shouldCheckDefaultBrowser(shouldCheck) {
- Services.prefs.setBoolPref("browser.shell.checkDefaultBrowser", !!shouldCheck);
- },
-
- isDefaultBrowser(startupCheck, forAllTypes) {
- // If this is the first browser window, maintain internal state that we've
- // checked this session (so that subsequent window opens don't show the
- // default browser dialog).
- if (startupCheck) {
- this._checkedThisSession = true;
- }
- if (this.shellService) {
- return this.shellService.isDefaultBrowser(startupCheck, forAllTypes);
- }
- return false;
- }
-};
-
-XPCOMUtils.defineLazyServiceGetter(ShellServiceInternal, "shellService",
- "@mozilla.org/browser/shell-service;1", Ci.nsIShellService);
-
-/**
- * The external API exported by this module.
- */
-this.ShellService = new Proxy(ShellServiceInternal, {
- get(target, name) {
- if (name in target) {
- return target[name];
- }
- if (target.shellService) {
- return target.shellService[name];
- }
- Services.console.logStringMessage(`${name} not found in ShellService: ${target.shellService}`);
- return undefined;
- }
-});
diff --git a/browser/components/shell/content/setDesktopBackground.js b/browser/components/shell/content/setDesktopBackground.js
deleted file mode 100644
index 53cc70db0..000000000
--- a/browser/components/shell/content/setDesktopBackground.js
+++ /dev/null
@@ -1,214 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-Components.utils.import("resource://gre/modules/AppConstants.jsm");
-
-var Ci = Components.interfaces;
-
-var gSetBackground = {
- _position : AppConstants.platform == "macosx" ? "STRETCH" : "",
- _backgroundColor : AppConstants.platform != "macosx" ? 0 : undefined,
- _screenWidth : 0,
- _screenHeight : 0,
- _image : null,
- _canvas : null,
-
- get _shell()
- {
- return Components.classes["@mozilla.org/browser/shell-service;1"]
- .getService(Ci.nsIShellService);
- },
-
- load: function ()
- {
- this._canvas = document.getElementById("screen");
- this._screenWidth = screen.width;
- this._screenHeight = screen.height;
- if (AppConstants.platform == "macosx") {
- document.documentElement.getButton("accept").hidden = true;
- }
- if (this._screenWidth / this._screenHeight >= 1.6)
- document.getElementById("monitor").setAttribute("aspectratio", "16:10");
-
- if (AppConstants.platform == "win") {
- // Hide fill + fit options if < Win7 since they don't work.
- var version = Components.classes["@mozilla.org/system-info;1"]
- .getService(Ci.nsIPropertyBag2)
- .getProperty("version");
- var isWindows7OrHigher = (parseFloat(version) >= 6.1);
- if (!isWindows7OrHigher) {
- document.getElementById("fillPosition").hidden = true;
- document.getElementById("fitPosition").hidden = true;
- }
- }
-
- // make sure that the correct dimensions will be used
- setTimeout(function(self) {
- self.init(window.arguments[0]);
- }, 0, this);
- },
-
- init: function (aImage)
- {
- this._image = aImage;
-
- // set the size of the coordinate space
- this._canvas.width = this._canvas.clientWidth;
- this._canvas.height = this._canvas.clientHeight;
-
- var ctx = this._canvas.getContext("2d");
- ctx.scale(this._canvas.clientWidth / this._screenWidth, this._canvas.clientHeight / this._screenHeight);
-
- if (AppConstants.platform != "macosx") {
- this._initColor();
- } else {
- // Make sure to reset the button state in case the user has already
- // set an image as their desktop background.
- var setDesktopBackground = document.getElementById("setDesktopBackground");
- setDesktopBackground.hidden = false;
- var bundle = document.getElementById("backgroundBundle");
- setDesktopBackground.label = bundle.getString("DesktopBackgroundSet");
- setDesktopBackground.disabled = false;
-
- document.getElementById("showDesktopPreferences").hidden = true;
- }
- this.updatePosition();
- },
-
- setDesktopBackground: function ()
- {
- if (AppConstants.platform != "macosx") {
- document.persist("menuPosition", "value");
- this._shell.desktopBackgroundColor = this._hexStringToLong(this._backgroundColor);
- } else {
- Components.classes["@mozilla.org/observer-service;1"]
- .getService(Ci.nsIObserverService)
- .addObserver(this, "shell:desktop-background-changed", false);
-
- var bundle = document.getElementById("backgroundBundle");
- var setDesktopBackground = document.getElementById("setDesktopBackground");
- setDesktopBackground.disabled = true;
- setDesktopBackground.label = bundle.getString("DesktopBackgroundDownloading");
- }
- this._shell.setDesktopBackground(this._image,
- Ci.nsIShellService["BACKGROUND_" + this._position]);
- },
-
- updatePosition: function ()
- {
- var ctx = this._canvas.getContext("2d");
- ctx.clearRect(0, 0, this._screenWidth, this._screenHeight);
-
- if (AppConstants.platform != "macosx") {
- this._position = document.getElementById("menuPosition").value;
- }
-
- switch (this._position) {
- case "TILE":
- ctx.save();
- ctx.fillStyle = ctx.createPattern(this._image, "repeat");
- ctx.fillRect(0, 0, this._screenWidth, this._screenHeight);
- ctx.restore();
- break;
- case "STRETCH":
- ctx.drawImage(this._image, 0, 0, this._screenWidth, this._screenHeight);
- break;
- case "CENTER": {
- let x = (this._screenWidth - this._image.naturalWidth) / 2;
- let y = (this._screenHeight - this._image.naturalHeight) / 2;
- ctx.drawImage(this._image, x, y);
- break;
- }
- case "FILL": {
- // Try maxing width first, overflow height.
- let widthRatio = this._screenWidth / this._image.naturalWidth;
- let width = this._image.naturalWidth * widthRatio;
- let height = this._image.naturalHeight * widthRatio;
- if (height < this._screenHeight) {
- // Height less than screen, max height and overflow width.
- let heightRatio = this._screenHeight / this._image.naturalHeight;
- width = this._image.naturalWidth * heightRatio;
- height = this._image.naturalHeight * heightRatio;
- }
- let x = (this._screenWidth - width) / 2;
- let y = (this._screenHeight - height) / 2;
- ctx.drawImage(this._image, x, y, width, height);
- break;
- }
- case "FIT": {
- // Try maxing width first, top and bottom borders.
- let widthRatio = this._screenWidth / this._image.naturalWidth;
- let width = this._image.naturalWidth * widthRatio;
- let height = this._image.naturalHeight * widthRatio;
- let x = 0;
- let y = (this._screenHeight - height) / 2;
- if (height > this._screenHeight) {
- // Height overflow, maximise height, side borders.
- let heightRatio = this._screenHeight / this._image.naturalHeight;
- width = this._image.naturalWidth * heightRatio;
- height = this._image.naturalHeight * heightRatio;
- x = (this._screenWidth - width) / 2;
- y = 0;
- }
- ctx.drawImage(this._image, x, y, width, height);
- break;
- }
- }
- }
-};
-
-if (AppConstants.platform != "macosx") {
- gSetBackground["_initColor"] = function ()
- {
- var color = this._shell.desktopBackgroundColor;
-
- const rMask = 4294901760;
- const gMask = 65280;
- const bMask = 255;
- var r = (color & rMask) >> 16;
- var g = (color & gMask) >> 8;
- var b = (color & bMask);
- this.updateColor(this._rgbToHex(r, g, b));
-
- var colorpicker = document.getElementById("desktopColor");
- colorpicker.color = this._backgroundColor;
- };
-
- gSetBackground["updateColor"] = function (aColor)
- {
- this._backgroundColor = aColor;
- this._canvas.style.backgroundColor = aColor;
- };
-
- // Converts a color string in the format "#RRGGBB" to an integer.
- gSetBackground["_hexStringToLong"] = function (aString)
- {
- return parseInt(aString.substring(1, 3), 16) << 16 |
- parseInt(aString.substring(3, 5), 16) << 8 |
- parseInt(aString.substring(5, 7), 16);
- };
-
- gSetBackground["_rgbToHex"] = function (aR, aG, aB)
- {
- return "#" + [aR, aG, aB].map(aInt => aInt.toString(16).replace(/^(.)$/, "0$1"))
- .join("").toUpperCase();
- };
-} else {
- gSetBackground["observe"] = function (aSubject, aTopic, aData)
- {
- if (aTopic == "shell:desktop-background-changed") {
- document.getElementById("setDesktopBackground").hidden = true;
- document.getElementById("showDesktopPreferences").hidden = false;
-
- Components.classes["@mozilla.org/observer-service;1"]
- .getService(Ci.nsIObserverService)
- .removeObserver(this, "shell:desktop-background-changed");
- }
- };
-
- gSetBackground["showDesktopPrefs"] = function()
- {
- this._shell.openApplication(Ci.nsIMacShellService.APPLICATION_DESKTOP);
- };
-}
diff --git a/browser/components/shell/content/setDesktopBackground.xul b/browser/components/shell/content/setDesktopBackground.xul
deleted file mode 100644
index d7d4079e3..000000000
--- a/browser/components/shell/content/setDesktopBackground.xul
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0"?> <!-- -*- Mode: HTML -*- -->
-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/skin/setDesktopBackground.css" type="text/css"?>
-
-<!DOCTYPE dialog SYSTEM "chrome://browser/locale/setDesktopBackground.dtd">
-
-#ifdef XP_MACOSX
-<?xul-overlay href="chrome://browser/content/macBrowserOverlay.xul"?>
-#endif
-
-<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:html="http://www.w3.org/1999/xhtml"
- windowtype="Shell:SetDesktopBackground"
-#ifndef XP_MACOSX
- buttons="accept,cancel"
-#else
- buttons="accept"
-#endif
- buttonlabelaccept="&setDesktopBackground.title;"
- onload="gSetBackground.load();"
- ondialogaccept="gSetBackground.setDesktopBackground();"
- title="&setDesktopBackground.title;"
- style="width: 30em;">
-
- <stringbundle id="backgroundBundle"
- src="chrome://browser/locale/shellservice.properties"/>
- <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
- <script type="application/javascript" src="chrome://browser/content/setDesktopBackground.js"/>
- <script type="application/javascript" src="chrome://global/content/contentAreaUtils.js"/>
-
-#ifndef XP_MACOSX
- <hbox align="center">
- <label value="&position.label;"/>
- <menulist id="menuPosition"
- label="&position.label;"
- oncommand="gSetBackground.updatePosition();">
- <menupopup>
- <menuitem label="&center.label;" value="CENTER"/>
- <menuitem label="&tile.label;" value="TILE"/>
- <menuitem label="&stretch.label;" value="STRETCH"/>
- <menuitem label="&fill.label;" value="FILL" id="fillPosition"/>
- <menuitem label="&fit.label;" value="FIT" id="fitPosition"/>
- </menupopup>
- </menulist>
- <spacer flex="1"/>
- <label value="&color.label;"/>
- <colorpicker id="desktopColor"
- type="button"
- onchange="gSetBackground.updateColor(this.color);"/>
- </hbox>
-#endif
- <groupbox align="center">
- <caption label="&preview.label;"/>
- <stack>
- <!-- if width and height are not present, they default to 300x150 and stretch the stack -->
- <html:canvas id="screen" width="1" height="1"/>
- <image id="monitor"/>
- </stack>
- </groupbox>
-
-#ifdef XP_MACOSX
- <separator/>
-
- <hbox align="right">
- <button id="setDesktopBackground"
- label="&setDesktopBackground.title;"
- oncommand="gSetBackground.setDesktopBackground();"/>
- <button id="showDesktopPreferences"
- label="&openDesktopPrefs.label;"
- oncommand="gSetBackground.showDesktopPrefs();"
- hidden="true"/>
- </hbox>
-#endif
-
-#ifdef XP_MACOSX
-#include ../../../base/content/browserMountPoints.inc
-#endif
-
-</dialog>
diff --git a/browser/components/shell/jar.mn b/browser/components/shell/jar.mn
deleted file mode 100644
index 1f33b5d56..000000000
--- a/browser/components/shell/jar.mn
+++ /dev/null
@@ -1,7 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-browser.jar:
-* content/browser/setDesktopBackground.xul (content/setDesktopBackground.xul)
- content/browser/setDesktopBackground.js (content/setDesktopBackground.js)
diff --git a/browser/components/shell/moz.build b/browser/components/shell/moz.build
deleted file mode 100644
index 94ec88571..000000000
--- a/browser/components/shell/moz.build
+++ /dev/null
@@ -1,56 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-JAR_MANIFESTS += ['jar.mn']
-
-XPIDL_SOURCES += [
- 'nsIShellService.idl',
-]
-
-if CONFIG['OS_ARCH'] == 'WINNT':
- XPIDL_SOURCES += [
- 'nsIWindowsShellService.idl',
- ]
-elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
- XPIDL_SOURCES += [
- 'nsIMacShellService.idl',
- ]
-elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
- XPIDL_SOURCES += [
- 'nsIGNOMEShellService.idl',
- ]
-
-XPIDL_MODULE = 'shellservice'
-
-if CONFIG['OS_ARCH'] == 'WINNT':
- SOURCES += [
- 'nsWindowsShellService.cpp',
- ]
-elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
- SOURCES += [
- 'nsMacShellService.cpp',
- ]
-elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
- SOURCES += [
- 'nsGNOMEShellService.cpp',
- ]
-
-if SOURCES:
- FINAL_LIBRARY = 'browsercomps'
-
-EXTRA_COMPONENTS += [
- 'nsSetDefaultBrowser.js',
- 'nsSetDefaultBrowser.manifest',
-]
-
-EXTRA_JS_MODULES += [
- 'ShellService.jsm',
-]
-
-for var in ('MOZ_APP_NAME', 'MOZ_APP_VERSION'):
- DEFINES[var] = '"%s"' % CONFIG[var]
-
-CXXFLAGS += CONFIG['TK_CFLAGS']
diff --git a/browser/components/shell/nsGNOMEShellService.cpp b/browser/components/shell/nsGNOMEShellService.cpp
deleted file mode 100644
index 613b5bffc..000000000
--- a/browser/components/shell/nsGNOMEShellService.cpp
+++ /dev/null
@@ -1,637 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "mozilla/ArrayUtils.h"
-
-#include "nsCOMPtr.h"
-#include "nsGNOMEShellService.h"
-#include "nsShellService.h"
-#include "nsIServiceManager.h"
-#include "nsIFile.h"
-#include "nsIProperties.h"
-#include "nsDirectoryServiceDefs.h"
-#include "nsIPrefService.h"
-#include "prenv.h"
-#include "nsStringAPI.h"
-#include "nsIGConfService.h"
-#include "nsIGIOService.h"
-#include "nsIGSettingsService.h"
-#include "nsIStringBundle.h"
-#include "nsIOutputStream.h"
-#include "nsIProcess.h"
-#include "nsServiceManagerUtils.h"
-#include "nsComponentManagerUtils.h"
-#include "nsIDOMHTMLImageElement.h"
-#include "nsIImageLoadingContent.h"
-#include "imgIRequest.h"
-#include "imgIContainer.h"
-#include "mozilla/Sprintf.h"
-#if defined(MOZ_WIDGET_GTK)
-#include "nsIImageToPixbuf.h"
-#endif
-#include "nsXULAppAPI.h"
-
-#include <glib.h>
-#include <glib-object.h>
-#include <gtk/gtk.h>
-#include <gdk/gdk.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <limits.h>
-#include <stdlib.h>
-
-using namespace mozilla;
-
-struct ProtocolAssociation
-{
- const char *name;
- bool essential;
-};
-
-struct MimeTypeAssociation
-{
- const char *mimeType;
- const char *extensions;
-};
-
-static const ProtocolAssociation appProtocols[] = {
- { "http", true },
- { "https", true },
- { "ftp", false },
- { "chrome", false }
-};
-
-static const MimeTypeAssociation appTypes[] = {
- { "text/html", "htm html shtml" },
- { "application/xhtml+xml", "xhtml xht" }
-};
-
-// GConf registry key constants
-#define DG_BACKGROUND "/desktop/gnome/background"
-
-static const char kDesktopImageKey[] = DG_BACKGROUND "/picture_filename";
-static const char kDesktopOptionsKey[] = DG_BACKGROUND "/picture_options";
-static const char kDesktopDrawBGKey[] = DG_BACKGROUND "/draw_background";
-static const char kDesktopColorKey[] = DG_BACKGROUND "/primary_color";
-
-static const char kDesktopBGSchema[] = "org.gnome.desktop.background";
-static const char kDesktopImageGSKey[] = "picture-uri";
-static const char kDesktopOptionGSKey[] = "picture-options";
-static const char kDesktopDrawBGGSKey[] = "draw-background";
-static const char kDesktopColorGSKey[] = "primary-color";
-
-nsresult
-nsGNOMEShellService::Init()
-{
- nsresult rv;
-
- // GConf, GSettings or GIO _must_ be available, or we do not allow
- // CreateInstance to succeed.
-
- nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
- nsCOMPtr<nsIGIOService> giovfs =
- do_GetService(NS_GIOSERVICE_CONTRACTID);
- nsCOMPtr<nsIGSettingsService> gsettings =
- do_GetService(NS_GSETTINGSSERVICE_CONTRACTID);
-
- if (!gconf && !giovfs && !gsettings)
- return NS_ERROR_NOT_AVAILABLE;
-
- // Check G_BROKEN_FILENAMES. If it's set, then filenames in glib use
- // the locale encoding. If it's not set, they use UTF-8.
- mUseLocaleFilenames = PR_GetEnv("G_BROKEN_FILENAMES") != nullptr;
-
- if (GetAppPathFromLauncher())
- return NS_OK;
-
- nsCOMPtr<nsIProperties> dirSvc
- (do_GetService("@mozilla.org/file/directory_service;1"));
- NS_ENSURE_TRUE(dirSvc, NS_ERROR_NOT_AVAILABLE);
-
- nsCOMPtr<nsIFile> appPath;
- rv = dirSvc->Get(XRE_EXECUTABLE_FILE, NS_GET_IID(nsIFile),
- getter_AddRefs(appPath));
- NS_ENSURE_SUCCESS(rv, rv);
-
- return appPath->GetNativePath(mAppPath);
-}
-
-NS_IMPL_ISUPPORTS(nsGNOMEShellService, nsIGNOMEShellService, nsIShellService)
-
-bool
-nsGNOMEShellService::GetAppPathFromLauncher()
-{
- gchar *tmp;
-
- const char *launcher = PR_GetEnv("MOZ_APP_LAUNCHER");
- if (!launcher)
- return false;
-
- if (g_path_is_absolute(launcher)) {
- mAppPath = launcher;
- tmp = g_path_get_basename(launcher);
- gchar *fullpath = g_find_program_in_path(tmp);
- if (fullpath && mAppPath.Equals(fullpath))
- mAppIsInPath = true;
- g_free(fullpath);
- } else {
- tmp = g_find_program_in_path(launcher);
- if (!tmp)
- return false;
- mAppPath = tmp;
- mAppIsInPath = true;
- }
-
- g_free(tmp);
- return true;
-}
-
-bool
-nsGNOMEShellService::KeyMatchesAppName(const char *aKeyValue) const
-{
-
- gchar *commandPath;
- if (mUseLocaleFilenames) {
- gchar *nativePath = g_filename_from_utf8(aKeyValue, -1,
- nullptr, nullptr, nullptr);
- if (!nativePath) {
- NS_ERROR("Error converting path to filesystem encoding");
- return false;
- }
-
- commandPath = g_find_program_in_path(nativePath);
- g_free(nativePath);
- } else {
- commandPath = g_find_program_in_path(aKeyValue);
- }
-
- if (!commandPath)
- return false;
-
- bool matches = mAppPath.Equals(commandPath);
- g_free(commandPath);
- return matches;
-}
-
-bool
-nsGNOMEShellService::CheckHandlerMatchesAppName(const nsACString &handler) const
-{
- gint argc;
- gchar **argv;
- nsAutoCString command(handler);
-
- // The string will be something of the form: [/path/to/]browser "%s"
- // We want to remove all of the parameters and get just the binary name.
-
- if (g_shell_parse_argv(command.get(), &argc, &argv, nullptr) && argc > 0) {
- command.Assign(argv[0]);
- g_strfreev(argv);
- }
-
- if (!KeyMatchesAppName(command.get()))
- return false; // the handler is set to another app
-
- return true;
-}
-
-NS_IMETHODIMP
-nsGNOMEShellService::IsDefaultBrowser(bool aStartupCheck,
- bool aForAllTypes,
- bool* aIsDefaultBrowser)
-{
- *aIsDefaultBrowser = false;
-
- nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
- nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-
- bool enabled;
- nsAutoCString handler;
- nsCOMPtr<nsIGIOMimeApp> gioApp;
-
- for (unsigned int i = 0; i < ArrayLength(appProtocols); ++i) {
- if (!appProtocols[i].essential)
- continue;
-
- if (gconf) {
- handler.Truncate();
- gconf->GetAppForProtocol(nsDependentCString(appProtocols[i].name),
- &enabled, handler);
-
- if (!CheckHandlerMatchesAppName(handler) || !enabled)
- return NS_OK; // the handler is disabled or set to another app
- }
-
- if (giovfs) {
- handler.Truncate();
- giovfs->GetAppForURIScheme(nsDependentCString(appProtocols[i].name),
- getter_AddRefs(gioApp));
- if (!gioApp)
- return NS_OK;
-
- gioApp->GetCommand(handler);
-
- if (!CheckHandlerMatchesAppName(handler))
- return NS_OK; // the handler is set to another app
- }
- }
-
- *aIsDefaultBrowser = true;
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsGNOMEShellService::SetDefaultBrowser(bool aClaimAllTypes,
- bool aForAllUsers)
-{
-#ifdef DEBUG
- if (aForAllUsers)
- NS_WARNING("Setting the default browser for all users is not yet supported");
-#endif
-
- nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
- nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
- if (gconf) {
- nsAutoCString appKeyValue;
- if (mAppIsInPath) {
- // mAppPath is in the users path, so use only the basename as the launcher
- gchar *tmp = g_path_get_basename(mAppPath.get());
- appKeyValue = tmp;
- g_free(tmp);
- } else {
- appKeyValue = mAppPath;
- }
-
- appKeyValue.AppendLiteral(" %s");
-
- for (unsigned int i = 0; i < ArrayLength(appProtocols); ++i) {
- if (appProtocols[i].essential || aClaimAllTypes) {
- gconf->SetAppForProtocol(nsDependentCString(appProtocols[i].name),
- appKeyValue);
- }
- }
- }
-
- if (giovfs) {
- nsresult rv;
- nsCOMPtr<nsIStringBundleService> bundleService =
- do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- nsCOMPtr<nsIStringBundle> brandBundle;
- rv = bundleService->CreateBundle(BRAND_PROPERTIES, getter_AddRefs(brandBundle));
- NS_ENSURE_SUCCESS(rv, rv);
-
- nsString brandShortName;
- brandBundle->GetStringFromName(u"brandShortName",
- getter_Copies(brandShortName));
-
- // use brandShortName as the application id.
- NS_ConvertUTF16toUTF8 id(brandShortName);
- nsCOMPtr<nsIGIOMimeApp> appInfo;
- rv = giovfs->CreateAppFromCommand(mAppPath,
- id,
- getter_AddRefs(appInfo));
- NS_ENSURE_SUCCESS(rv, rv);
-
- // set handler for the protocols
- for (unsigned int i = 0; i < ArrayLength(appProtocols); ++i) {
- if (appProtocols[i].essential || aClaimAllTypes) {
- appInfo->SetAsDefaultForURIScheme(nsDependentCString(appProtocols[i].name));
- }
- }
-
- // set handler for .html and xhtml files and MIME types:
- if (aClaimAllTypes) {
- // Add mime types for html, xhtml extension and set app to just created appinfo.
- for (unsigned int i = 0; i < ArrayLength(appTypes); ++i) {
- appInfo->SetAsDefaultForMimeType(nsDependentCString(appTypes[i].mimeType));
- appInfo->SetAsDefaultForFileExtensions(nsDependentCString(appTypes[i].extensions));
- }
- }
- }
-
- nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID));
- if (prefs) {
- (void) prefs->SetBoolPref(PREF_CHECKDEFAULTBROWSER, true);
- // Reset the number of times the dialog should be shown
- // before it is silenced.
- (void) prefs->SetIntPref(PREF_DEFAULTBROWSERCHECKCOUNT, 0);
- }
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsGNOMEShellService::GetCanSetDesktopBackground(bool* aResult)
-{
- // setting desktop background is currently only supported
- // for Gnome or desktops using the same GSettings and GConf keys
- const char* gnomeSession = getenv("GNOME_DESKTOP_SESSION_ID");
- if (gnomeSession) {
- *aResult = true;
- } else {
- *aResult = false;
- }
-
- return NS_OK;
-}
-
-static nsresult
-WriteImage(const nsCString& aPath, imgIContainer* aImage)
-{
-#if !defined(MOZ_WIDGET_GTK)
- return NS_ERROR_NOT_AVAILABLE;
-#else
- nsCOMPtr<nsIImageToPixbuf> imgToPixbuf =
- do_GetService("@mozilla.org/widget/image-to-gdk-pixbuf;1");
- if (!imgToPixbuf)
- return NS_ERROR_NOT_AVAILABLE;
-
- GdkPixbuf* pixbuf = imgToPixbuf->ConvertImageToPixbuf(aImage);
- if (!pixbuf)
- return NS_ERROR_NOT_AVAILABLE;
-
- gboolean res = gdk_pixbuf_save(pixbuf, aPath.get(), "png", nullptr, nullptr);
-
- g_object_unref(pixbuf);
- return res ? NS_OK : NS_ERROR_FAILURE;
-#endif
-}
-
-NS_IMETHODIMP
-nsGNOMEShellService::SetDesktopBackground(nsIDOMElement* aElement,
- int32_t aPosition)
-{
- nsresult rv;
- nsCOMPtr<nsIImageLoadingContent> imageContent = do_QueryInterface(aElement, &rv);
- if (!imageContent) return rv;
-
- // get the image container
- nsCOMPtr<imgIRequest> request;
- rv = imageContent->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
- getter_AddRefs(request));
- if (!request) return rv;
- nsCOMPtr<imgIContainer> container;
- rv = request->GetImage(getter_AddRefs(container));
- if (!container) return rv;
-
- // Set desktop wallpaper filling style
- nsAutoCString options;
- if (aPosition == BACKGROUND_TILE)
- options.AssignLiteral("wallpaper");
- else if (aPosition == BACKGROUND_STRETCH)
- options.AssignLiteral("stretched");
- else if (aPosition == BACKGROUND_FILL)
- options.AssignLiteral("zoom");
- else if (aPosition == BACKGROUND_FIT)
- options.AssignLiteral("scaled");
- else
- options.AssignLiteral("centered");
-
- // Write the background file to the home directory.
- nsAutoCString filePath(PR_GetEnv("HOME"));
-
- // get the product brand name from localized strings
- nsString brandName;
- nsCID bundleCID = NS_STRINGBUNDLESERVICE_CID;
- nsCOMPtr<nsIStringBundleService> bundleService(do_GetService(bundleCID));
- if (bundleService) {
- nsCOMPtr<nsIStringBundle> brandBundle;
- rv = bundleService->CreateBundle(BRAND_PROPERTIES,
- getter_AddRefs(brandBundle));
- if (NS_SUCCEEDED(rv) && brandBundle) {
- rv = brandBundle->GetStringFromName(u"brandShortName",
- getter_Copies(brandName));
- NS_ENSURE_SUCCESS(rv, rv);
- }
- }
-
- // build the file name
- filePath.Append('/');
- filePath.Append(NS_ConvertUTF16toUTF8(brandName));
- filePath.AppendLiteral("_wallpaper.png");
-
- // write the image to a file in the home dir
- rv = WriteImage(filePath, container);
- NS_ENSURE_SUCCESS(rv, rv);
-
- // Try GSettings first. If we don't have GSettings or the right schema, fall back
- // to using GConf instead. Note that if GSettings works ok, the changes get
- // mirrored to GConf by the gsettings->gconf bridge in gnome-settings-daemon
- nsCOMPtr<nsIGSettingsService> gsettings =
- do_GetService(NS_GSETTINGSSERVICE_CONTRACTID);
- if (gsettings) {
- nsCOMPtr<nsIGSettingsCollection> background_settings;
- gsettings->GetCollectionForSchema(
- NS_LITERAL_CSTRING(kDesktopBGSchema), getter_AddRefs(background_settings));
- if (background_settings) {
- gchar *file_uri = g_filename_to_uri(filePath.get(), nullptr, nullptr);
- if (!file_uri)
- return NS_ERROR_FAILURE;
-
- background_settings->SetString(NS_LITERAL_CSTRING(kDesktopOptionGSKey),
- options);
-
- background_settings->SetString(NS_LITERAL_CSTRING(kDesktopImageGSKey),
- nsDependentCString(file_uri));
- g_free(file_uri);
- background_settings->SetBoolean(NS_LITERAL_CSTRING(kDesktopDrawBGGSKey),
- true);
- return rv;
- }
- }
-
- // if the file was written successfully, set it as the system wallpaper
- nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
-
- if (gconf) {
- gconf->SetString(NS_LITERAL_CSTRING(kDesktopOptionsKey), options);
-
- // Set the image to an empty string first to force a refresh
- // (since we could be writing a new image on top of an existing
- // Basilisk_wallpaper.png and nautilus doesn't monitor the file for changes)
- gconf->SetString(NS_LITERAL_CSTRING(kDesktopImageKey),
- EmptyCString());
-
- gconf->SetString(NS_LITERAL_CSTRING(kDesktopImageKey), filePath);
- gconf->SetBool(NS_LITERAL_CSTRING(kDesktopDrawBGKey), true);
- }
-
- return rv;
-}
-
-#define COLOR_16_TO_8_BIT(_c) ((_c) >> 8)
-#define COLOR_8_TO_16_BIT(_c) ((_c) << 8 | (_c))
-
-NS_IMETHODIMP
-nsGNOMEShellService::GetDesktopBackgroundColor(uint32_t *aColor)
-{
- nsCOMPtr<nsIGSettingsService> gsettings =
- do_GetService(NS_GSETTINGSSERVICE_CONTRACTID);
- nsCOMPtr<nsIGSettingsCollection> background_settings;
- nsAutoCString background;
-
- if (gsettings) {
- gsettings->GetCollectionForSchema(
- NS_LITERAL_CSTRING(kDesktopBGSchema), getter_AddRefs(background_settings));
- if (background_settings) {
- background_settings->GetString(NS_LITERAL_CSTRING(kDesktopColorGSKey),
- background);
- }
- }
-
- if (!background_settings) {
- nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
- if (gconf)
- gconf->GetString(NS_LITERAL_CSTRING(kDesktopColorKey), background);
- }
-
- if (background.IsEmpty()) {
- *aColor = 0;
- return NS_OK;
- }
-
- GdkColor color;
- gboolean success = gdk_color_parse(background.get(), &color);
-
- NS_ENSURE_TRUE(success, NS_ERROR_FAILURE);
-
- *aColor = COLOR_16_TO_8_BIT(color.red) << 16 |
- COLOR_16_TO_8_BIT(color.green) << 8 |
- COLOR_16_TO_8_BIT(color.blue);
- return NS_OK;
-}
-
-static void
-ColorToCString(uint32_t aColor, nsCString& aResult)
-{
- // The #rrrrggggbbbb format is used to match gdk_color_to_string()
- char *buf = aResult.BeginWriting(13);
- if (!buf)
- return;
-
- uint16_t red = COLOR_8_TO_16_BIT((aColor >> 16) & 0xff);
- uint16_t green = COLOR_8_TO_16_BIT((aColor >> 8) & 0xff);
- uint16_t blue = COLOR_8_TO_16_BIT(aColor & 0xff);
-
- snprintf(buf, 14, "#%04x%04x%04x", red, green, blue);
-}
-
-NS_IMETHODIMP
-nsGNOMEShellService::SetDesktopBackgroundColor(uint32_t aColor)
-{
- NS_ASSERTION(aColor <= 0xffffff, "aColor has extra bits");
- nsAutoCString colorString;
- ColorToCString(aColor, colorString);
-
- nsCOMPtr<nsIGSettingsService> gsettings =
- do_GetService(NS_GSETTINGSSERVICE_CONTRACTID);
- if (gsettings) {
- nsCOMPtr<nsIGSettingsCollection> background_settings;
- gsettings->GetCollectionForSchema(
- NS_LITERAL_CSTRING(kDesktopBGSchema), getter_AddRefs(background_settings));
- if (background_settings) {
- background_settings->SetString(NS_LITERAL_CSTRING(kDesktopColorGSKey),
- colorString);
- return NS_OK;
- }
- }
-
- nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
-
- if (gconf) {
- gconf->SetString(NS_LITERAL_CSTRING(kDesktopColorKey), colorString);
- }
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsGNOMEShellService::OpenApplication(int32_t aApplication)
-{
- nsAutoCString scheme;
- if (aApplication == APPLICATION_MAIL)
- scheme.AssignLiteral("mailto");
- else if (aApplication == APPLICATION_NEWS)
- scheme.AssignLiteral("news");
- else
- return NS_ERROR_NOT_AVAILABLE;
-
- nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
- if (giovfs) {
- nsCOMPtr<nsIGIOMimeApp> gioApp;
- giovfs->GetAppForURIScheme(scheme, getter_AddRefs(gioApp));
- if (gioApp)
- return gioApp->Launch(EmptyCString());
- }
-
- nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
- if (!gconf)
- return NS_ERROR_FAILURE;
-
- bool enabled;
- nsAutoCString appCommand;
- gconf->GetAppForProtocol(scheme, &enabled, appCommand);
-
- if (!enabled)
- return NS_ERROR_FAILURE;
-
- // XXX we don't currently handle launching a terminal window.
- // If the handler requires a terminal, bail.
- bool requiresTerminal;
- gconf->HandlerRequiresTerminal(scheme, &requiresTerminal);
- if (requiresTerminal)
- return NS_ERROR_FAILURE;
-
- // Perform shell argument expansion
- int argc;
- char **argv;
- if (!g_shell_parse_argv(appCommand.get(), &argc, &argv, nullptr))
- return NS_ERROR_FAILURE;
-
- char **newArgv = new char*[argc + 1];
- int newArgc = 0;
-
- // Run through the list of arguments. Copy all of them to the new
- // argv except for %s, which we skip.
- for (int i = 0; i < argc; ++i) {
- if (strcmp(argv[i], "%s") != 0)
- newArgv[newArgc++] = argv[i];
- }
-
- newArgv[newArgc] = nullptr;
-
- gboolean err = g_spawn_async(nullptr, newArgv, nullptr, G_SPAWN_SEARCH_PATH,
- nullptr, nullptr, nullptr, nullptr);
-
- g_strfreev(argv);
- delete[] newArgv;
-
- return err ? NS_OK : NS_ERROR_FAILURE;
-}
-
-NS_IMETHODIMP
-nsGNOMEShellService::OpenApplicationWithURI(nsIFile* aApplication, const nsACString& aURI)
-{
- nsresult rv;
- nsCOMPtr<nsIProcess> process =
- do_CreateInstance("@mozilla.org/process/util;1", &rv);
- if (NS_FAILED(rv))
- return rv;
-
- rv = process->Init(aApplication);
- if (NS_FAILED(rv))
- return rv;
-
- const nsCString spec(aURI);
- const char* specStr = spec.get();
- return process->Run(false, &specStr, 1);
-}
-
-NS_IMETHODIMP
-nsGNOMEShellService::GetDefaultFeedReader(nsIFile** _retval)
-{
- return NS_ERROR_NOT_IMPLEMENTED;
-}
diff --git a/browser/components/shell/nsGNOMEShellService.h b/browser/components/shell/nsGNOMEShellService.h
deleted file mode 100644
index a7b003802..000000000
--- a/browser/components/shell/nsGNOMEShellService.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef nsgnomeshellservice_h____
-#define nsgnomeshellservice_h____
-
-#include "nsIGNOMEShellService.h"
-#include "nsStringAPI.h"
-#include "mozilla/Attributes.h"
-
-class nsGNOMEShellService final : public nsIGNOMEShellService
-{
-public:
- nsGNOMEShellService() : mAppIsInPath(false) { }
-
- NS_DECL_ISUPPORTS
- NS_DECL_NSISHELLSERVICE
- NS_DECL_NSIGNOMESHELLSERVICE
-
- nsresult Init();
-
-private:
- ~nsGNOMEShellService() {}
-
- bool KeyMatchesAppName(const char *aKeyValue) const;
- bool CheckHandlerMatchesAppName(const nsACString& handler) const;
-
- bool GetAppPathFromLauncher();
- bool mUseLocaleFilenames;
- nsCString mAppPath;
- bool mAppIsInPath;
-};
-
-#endif // nsgnomeshellservice_h____
diff --git a/browser/components/shell/nsIGNOMEShellService.idl b/browser/components/shell/nsIGNOMEShellService.idl
deleted file mode 100644
index 842ce5e8a..000000000
--- a/browser/components/shell/nsIGNOMEShellService.idl
+++ /dev/null
@@ -1,19 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsIShellService.idl"
-
-[scriptable, uuid(2ce5c803-edcd-443d-98eb-ceba86d02d13)]
-interface nsIGNOMEShellService : nsIShellService
-{
- /**
- * Used to determine whether or not to offer "Set as desktop background"
- * functionality. Even if shell service is available it is not
- * guaranteed that it is able to set the background for every desktop
- * which is especially true for Linux with its many different desktop
- * environments.
- */
- readonly attribute boolean canSetDesktopBackground;
-};
-
diff --git a/browser/components/shell/nsIMacShellService.idl b/browser/components/shell/nsIMacShellService.idl
deleted file mode 100644
index 6a532bbd0..000000000
--- a/browser/components/shell/nsIMacShellService.idl
+++ /dev/null
@@ -1,15 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsIShellService.idl"
-
-[scriptable, uuid(387fdc80-0077-4b60-a0d9-d9e80a83ba64)]
-interface nsIMacShellService : nsIShellService
-{
- const long APPLICATION_KEYCHAIN_ACCESS = 2;
- const long APPLICATION_NETWORK = 3;
- const long APPLICATION_DESKTOP = 4;
-};
-
diff --git a/browser/components/shell/nsIShellService.idl b/browser/components/shell/nsIShellService.idl
deleted file mode 100644
index 3e7e94b00..000000000
--- a/browser/components/shell/nsIShellService.idl
+++ /dev/null
@@ -1,95 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsISupports.idl"
-
-interface nsIDOMElement;
-interface nsIFile;
-
-[scriptable, uuid(2d1a95e4-5bd8-4eeb-b0a8-c1455fd2a357)]
-interface nsIShellService : nsISupports
-{
- /**
- * Determines whether or not Firefox is the "Default Browser."
- * This is simply whether or not Firefox is registered to handle
- * http links.
- *
- * @param aStartupCheck true if this is the check being performed
- * by the first browser window at startup,
- * false otherwise.
- * @param aForAllTypes true if the check should be made for HTTP and HTML.
- * false if the check should be made for HTTP only.
- * This parameter may be ignored on some platforms.
- */
- boolean isDefaultBrowser(in boolean aStartupCheck,
- [optional] in boolean aForAllTypes);
-
- /**
- * Registers Firefox as the "Default Browser."
- *
- * @param aClaimAllTypes Register Firefox as the handler for
- * additional protocols (ftp, chrome etc)
- * and web documents (.html, .xhtml etc).
- * @param aForAllUsers Whether or not Firefox should attempt
- * to become the default browser for all
- * users on a multi-user system.
- */
- void setDefaultBrowser(in boolean aClaimAllTypes, in boolean aForAllUsers);
-
- /**
- * Flags for positioning/sizing of the Desktop Background image.
- */
- const long BACKGROUND_TILE = 1;
- const long BACKGROUND_STRETCH = 2;
- const long BACKGROUND_CENTER = 3;
- const long BACKGROUND_FILL = 4;
- const long BACKGROUND_FIT = 5;
-
- /**
- * Sets the desktop background image using either the HTML <IMG>
- * element supplied or the background image of the element supplied.
- *
- * @param aImageElement Either a HTML <IMG> element or an element with
- * a background image from which to source the
- * background image.
- * @param aPosition How to place the image on the desktop
- */
- void setDesktopBackground(in nsIDOMElement aElement, in long aPosition);
-
- /**
- * Constants identifying applications that can be opened with
- * openApplication.
- */
- const long APPLICATION_MAIL = 0;
- const long APPLICATION_NEWS = 1;
-
- /**
- * Opens the application specified. If more than one application of the
- * given type is available on the system, the default or "preferred"
- * application is used.
- */
- void openApplication(in long aApplication);
-
- /**
- * The desktop background color, visible when no background image is
- * used, or if the background image is centered and does not fill the
- * entire screen. A rgb value, where (r << 16 | g << 8 | b)
- */
- attribute unsigned long desktopBackgroundColor;
-
- /**
- * Opens an application with a specific URI to load.
- * @param application
- * The application file (or bundle directory, on OS X)
- * @param uri
- * The uri to be loaded by the application
- */
- void openApplicationWithURI(in nsIFile aApplication, in ACString aURI);
-
- /**
- * The default system handler for web feeds
- */
- readonly attribute nsIFile defaultFeedReader;
-};
diff --git a/browser/components/shell/nsIWindowsShellService.idl b/browser/components/shell/nsIWindowsShellService.idl
deleted file mode 100644
index 57ed37055..000000000
--- a/browser/components/shell/nsIWindowsShellService.idl
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsIShellService.idl"
-
-[scriptable, uuid(f8a26b94-49e5-4441-8fbc-315e0b4f22ef)]
-interface nsIWindowsShellService : nsIShellService
-{
- /**
- * Provides the shell service an opportunity to do some Win7+ shortcut
- * maintenance needed on initial startup of the browser.
- */
- void shortcutMaintenance();
-};
-
diff --git a/browser/components/shell/nsMacShellService.cpp b/browser/components/shell/nsMacShellService.cpp
deleted file mode 100644
index d8d64039d..000000000
--- a/browser/components/shell/nsMacShellService.cpp
+++ /dev/null
@@ -1,434 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsDirectoryServiceDefs.h"
-#include "nsIDOMElement.h"
-#include "nsIDOMHTMLImageElement.h"
-#include "nsIImageLoadingContent.h"
-#include "nsIDocument.h"
-#include "nsIContent.h"
-#include "nsILocalFileMac.h"
-#include "nsIObserverService.h"
-#include "nsIPrefService.h"
-#include "nsIServiceManager.h"
-#include "nsIStringBundle.h"
-#include "nsIURL.h"
-#include "nsIWebBrowserPersist.h"
-#include "nsMacShellService.h"
-#include "nsIProperties.h"
-#include "nsServiceManagerUtils.h"
-#include "nsShellService.h"
-#include "nsStringAPI.h"
-#include "nsIDocShell.h"
-#include "nsILoadContext.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <ApplicationServices/ApplicationServices.h>
-
-#define NETWORK_PREFPANE NS_LITERAL_CSTRING("/System/Library/PreferencePanes/Network.prefPane")
-#define DESKTOP_PREFPANE NS_LITERAL_CSTRING("/System/Library/PreferencePanes/DesktopScreenEffectsPref.prefPane")
-
-#define SAFARI_BUNDLE_IDENTIFIER "com.apple.Safari"
-
-NS_IMPL_ISUPPORTS(nsMacShellService, nsIMacShellService, nsIShellService, nsIWebProgressListener)
-
-NS_IMETHODIMP
-nsMacShellService::IsDefaultBrowser(bool aStartupCheck,
- bool aForAllTypes,
- bool* aIsDefaultBrowser)
-{
- *aIsDefaultBrowser = false;
-
- CFStringRef firefoxID = ::CFBundleGetIdentifier(::CFBundleGetMainBundle());
- if (!firefoxID) {
- // CFBundleGetIdentifier is expected to return nullptr only if the specified
- // bundle doesn't have a bundle identifier in its plist. In this case, that
- // means a failure, since our bundle does have an identifier.
- return NS_ERROR_FAILURE;
- }
-
- // Get the default http handler's bundle ID (or nullptr if it has not been
- // explicitly set)
- CFStringRef defaultBrowserID = ::LSCopyDefaultHandlerForURLScheme(CFSTR("http"));
- if (defaultBrowserID) {
- *aIsDefaultBrowser = ::CFStringCompare(firefoxID, defaultBrowserID, 0) == kCFCompareEqualTo;
- ::CFRelease(defaultBrowserID);
- }
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsMacShellService::SetDefaultBrowser(bool aClaimAllTypes, bool aForAllUsers)
-{
- // Note: We don't support aForAllUsers on Mac OS X.
-
- CFStringRef firefoxID = ::CFBundleGetIdentifier(::CFBundleGetMainBundle());
- if (!firefoxID) {
- return NS_ERROR_FAILURE;
- }
-
- if (::LSSetDefaultHandlerForURLScheme(CFSTR("http"), firefoxID) != noErr) {
- return NS_ERROR_FAILURE;
- }
- if (::LSSetDefaultHandlerForURLScheme(CFSTR("https"), firefoxID) != noErr) {
- return NS_ERROR_FAILURE;
- }
-
- if (aClaimAllTypes) {
- if (::LSSetDefaultHandlerForURLScheme(CFSTR("ftp"), firefoxID) != noErr) {
- return NS_ERROR_FAILURE;
- }
- if (::LSSetDefaultRoleHandlerForContentType(kUTTypeHTML, kLSRolesAll, firefoxID) != noErr) {
- return NS_ERROR_FAILURE;
- }
- }
-
- nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID));
- if (prefs) {
- (void) prefs->SetBoolPref(PREF_CHECKDEFAULTBROWSER, true);
- // Reset the number of times the dialog should be shown
- // before it is silenced.
- (void) prefs->SetIntPref(PREF_DEFAULTBROWSERCHECKCOUNT, 0);
- }
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsMacShellService::SetDesktopBackground(nsIDOMElement* aElement,
- int32_t aPosition)
-{
- // Note: We don't support aPosition on OS X.
-
- // Get the image URI:
- nsresult rv;
- nsCOMPtr<nsIImageLoadingContent> imageContent = do_QueryInterface(aElement,
- &rv);
- NS_ENSURE_SUCCESS(rv, rv);
- nsCOMPtr<nsIURI> imageURI;
- rv = imageContent->GetCurrentURI(getter_AddRefs(imageURI));
- NS_ENSURE_SUCCESS(rv, rv);
-
- // We need the referer URI for nsIWebBrowserPersist::saveURI
- nsCOMPtr<nsIContent> content = do_QueryInterface(aElement, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- nsIURI *docURI = content->OwnerDoc()->GetDocumentURI();
- if (!docURI)
- return NS_ERROR_FAILURE;
-
- // Get the desired image file name
- nsCOMPtr<nsIURL> imageURL(do_QueryInterface(imageURI));
- if (!imageURL) {
- // XXXmano (bug 300293): Non-URL images (e.g. the data: protocol) are not
- // yet supported. What filename should we take here?
- return NS_ERROR_NOT_IMPLEMENTED;
- }
-
- nsAutoCString fileName;
- imageURL->GetFileName(fileName);
- nsCOMPtr<nsIProperties> fileLocator
- (do_GetService("@mozilla.org/file/directory_service;1", &rv));
- NS_ENSURE_SUCCESS(rv, rv);
-
- // Get the current user's "Pictures" folder (That's ~/Pictures):
- fileLocator->Get(NS_OSX_PICTURE_DOCUMENTS_DIR, NS_GET_IID(nsIFile),
- getter_AddRefs(mBackgroundFile));
- if (!mBackgroundFile)
- return NS_ERROR_OUT_OF_MEMORY;
-
- nsAutoString fileNameUnicode;
- CopyUTF8toUTF16(fileName, fileNameUnicode);
-
- // and add the imgage file name itself:
- mBackgroundFile->Append(fileNameUnicode);
-
- // Download the image; the desktop background will be set in OnStateChange()
- nsCOMPtr<nsIWebBrowserPersist> wbp
- (do_CreateInstance("@mozilla.org/embedding/browser/nsWebBrowserPersist;1", &rv));
- NS_ENSURE_SUCCESS(rv, rv);
-
- uint32_t flags = nsIWebBrowserPersist::PERSIST_FLAGS_NO_CONVERSION |
- nsIWebBrowserPersist::PERSIST_FLAGS_REPLACE_EXISTING_FILES |
- nsIWebBrowserPersist::PERSIST_FLAGS_FROM_CACHE;
-
- wbp->SetPersistFlags(flags);
- wbp->SetProgressListener(this);
-
- nsCOMPtr<nsILoadContext> loadContext;
- nsCOMPtr<nsISupports> container = content->OwnerDoc()->GetContainer();
- nsCOMPtr<nsIDocShell> docShell = do_QueryInterface(container);
- if (docShell) {
- loadContext = do_QueryInterface(docShell);
- }
-
- return wbp->SaveURI(imageURI, nullptr,
- docURI, content->OwnerDoc()->GetReferrerPolicy(),
- nullptr, nullptr,
- mBackgroundFile, loadContext);
-}
-
-NS_IMETHODIMP
-nsMacShellService::OnProgressChange(nsIWebProgress* aWebProgress,
- nsIRequest* aRequest,
- int32_t aCurSelfProgress,
- int32_t aMaxSelfProgress,
- int32_t aCurTotalProgress,
- int32_t aMaxTotalProgress)
-{
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsMacShellService::OnLocationChange(nsIWebProgress* aWebProgress,
- nsIRequest* aRequest,
- nsIURI* aLocation,
- uint32_t aFlags)
-{
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsMacShellService::OnStatusChange(nsIWebProgress* aWebProgress,
- nsIRequest* aRequest,
- nsresult aStatus,
- const char16_t* aMessage)
-{
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsMacShellService::OnSecurityChange(nsIWebProgress* aWebProgress,
- nsIRequest* aRequest,
- uint32_t aState)
-{
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsMacShellService::OnStateChange(nsIWebProgress* aWebProgress,
- nsIRequest* aRequest,
- uint32_t aStateFlags,
- nsresult aStatus)
-{
- if (aStateFlags & STATE_STOP) {
- nsCOMPtr<nsIObserverService> os(do_GetService("@mozilla.org/observer-service;1"));
- if (os)
- os->NotifyObservers(nullptr, "shell:desktop-background-changed", nullptr);
-
- bool exists = false;
- mBackgroundFile->Exists(&exists);
- if (!exists)
- return NS_OK;
-
- nsAutoCString nativePath;
- mBackgroundFile->GetNativePath(nativePath);
-
- AEDesc tAEDesc = { typeNull, nil };
- OSErr err = noErr;
- AliasHandle aliasHandle = nil;
- FSRef pictureRef;
- OSStatus status;
-
- // Convert the path into a FSRef
- status = ::FSPathMakeRef((const UInt8*)nativePath.get(), &pictureRef,
- nullptr);
- if (status == noErr) {
- err = ::FSNewAlias(nil, &pictureRef, &aliasHandle);
- if (err == noErr && aliasHandle == nil)
- err = paramErr;
-
- if (err == noErr) {
- // We need the descriptor (based on the picture file reference)
- // for the 'Set Desktop Picture' apple event.
- char handleState = ::HGetState((Handle)aliasHandle);
- ::HLock((Handle)aliasHandle);
- err = ::AECreateDesc(typeAlias, *aliasHandle,
- GetHandleSize((Handle)aliasHandle), &tAEDesc);
- // unlock the alias handler
- ::HSetState((Handle)aliasHandle, handleState);
- ::DisposeHandle((Handle)aliasHandle);
- }
- if (err == noErr) {
- AppleEvent tAppleEvent;
- OSType sig = 'MACS';
- AEBuildError tAEBuildError;
- // Create a 'Set Desktop Pictue' Apple Event
- err = ::AEBuildAppleEvent(kAECoreSuite, kAESetData, typeApplSignature,
- &sig, sizeof(OSType), kAutoGenerateReturnID,
- kAnyTransactionID, &tAppleEvent, &tAEBuildError,
- "'----':'obj '{want:type (prop),form:prop" \
- ",seld:type('dpic'),from:'null'()},data:(@)",
- &tAEDesc);
- if (err == noErr) {
- AppleEvent reply = { typeNull, nil };
- // Sent the event we built, the reply event isn't necessary
- err = ::AESend(&tAppleEvent, &reply, kAENoReply, kAENormalPriority,
- kNoTimeOut, nil, nil);
- ::AEDisposeDesc(&tAppleEvent);
- }
- }
- }
- }
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsMacShellService::OpenApplication(int32_t aApplication)
-{
- nsresult rv = NS_OK;
- CFURLRef appURL = nil;
- OSStatus err = noErr;
-
- switch (aApplication) {
- case nsIShellService::APPLICATION_MAIL:
- {
- CFURLRef tempURL = ::CFURLCreateWithString(kCFAllocatorDefault,
- CFSTR("mailto:"), nullptr);
- err = ::LSGetApplicationForURL(tempURL, kLSRolesAll, nullptr, &appURL);
- ::CFRelease(tempURL);
- }
- break;
- case nsIShellService::APPLICATION_NEWS:
- {
- CFURLRef tempURL = ::CFURLCreateWithString(kCFAllocatorDefault,
- CFSTR("news:"), nullptr);
- err = ::LSGetApplicationForURL(tempURL, kLSRolesAll, nullptr, &appURL);
- ::CFRelease(tempURL);
- }
- break;
- case nsIMacShellService::APPLICATION_KEYCHAIN_ACCESS:
- err = ::LSGetApplicationForInfo('APPL', 'kcmr', nullptr, kLSRolesAll,
- nullptr, &appURL);
- break;
- case nsIMacShellService::APPLICATION_NETWORK:
- {
- nsCOMPtr<nsIFile> lf;
- rv = NS_NewNativeLocalFile(NETWORK_PREFPANE, true, getter_AddRefs(lf));
- NS_ENSURE_SUCCESS(rv, rv);
- bool exists;
- lf->Exists(&exists);
- if (!exists)
- return NS_ERROR_FILE_NOT_FOUND;
- return lf->Launch();
- }
- case nsIMacShellService::APPLICATION_DESKTOP:
- {
- nsCOMPtr<nsIFile> lf;
- rv = NS_NewNativeLocalFile(DESKTOP_PREFPANE, true, getter_AddRefs(lf));
- NS_ENSURE_SUCCESS(rv, rv);
- bool exists;
- lf->Exists(&exists);
- if (!exists)
- return NS_ERROR_FILE_NOT_FOUND;
- return lf->Launch();
- }
- }
-
- if (appURL && err == noErr) {
- err = ::LSOpenCFURLRef(appURL, nullptr);
- rv = err != noErr ? NS_ERROR_FAILURE : NS_OK;
-
- ::CFRelease(appURL);
- }
-
- return rv;
-}
-
-NS_IMETHODIMP
-nsMacShellService::GetDesktopBackgroundColor(uint32_t *aColor)
-{
- // This method and |SetDesktopBackgroundColor| has no meaning on Mac OS X.
- // The mac desktop preferences UI uses pictures for the few solid colors it
- // supports.
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-nsMacShellService::SetDesktopBackgroundColor(uint32_t aColor)
-{
- // This method and |GetDesktopBackgroundColor| has no meaning on Mac OS X.
- // The mac desktop preferences UI uses pictures for the few solid colors it
- // supports.
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-nsMacShellService::OpenApplicationWithURI(nsIFile* aApplication, const nsACString& aURI)
-{
- nsCOMPtr<nsILocalFileMac> lfm(do_QueryInterface(aApplication));
- CFURLRef appURL;
- nsresult rv = lfm->GetCFURL(&appURL);
- if (NS_FAILED(rv))
- return rv;
-
- const nsCString spec(aURI);
- const UInt8* uriString = (const UInt8*)spec.get();
- CFURLRef uri = ::CFURLCreateWithBytes(nullptr, uriString, aURI.Length(),
- kCFStringEncodingUTF8, nullptr);
- if (!uri)
- return NS_ERROR_OUT_OF_MEMORY;
-
- CFArrayRef uris = ::CFArrayCreate(nullptr, (const void**)&uri, 1, nullptr);
- if (!uris) {
- ::CFRelease(uri);
- return NS_ERROR_OUT_OF_MEMORY;
- }
-
- LSLaunchURLSpec launchSpec;
- launchSpec.appURL = appURL;
- launchSpec.itemURLs = uris;
- launchSpec.passThruParams = nullptr;
- launchSpec.launchFlags = kLSLaunchDefaults;
- launchSpec.asyncRefCon = nullptr;
-
- OSErr err = ::LSOpenFromURLSpec(&launchSpec, nullptr);
-
- ::CFRelease(uris);
- ::CFRelease(uri);
-
- return err != noErr ? NS_ERROR_FAILURE : NS_OK;
-}
-
-NS_IMETHODIMP
-nsMacShellService::GetDefaultFeedReader(nsIFile** _retval)
-{
- nsresult rv = NS_ERROR_FAILURE;
- *_retval = nullptr;
-
- CFStringRef defaultHandlerID = ::LSCopyDefaultHandlerForURLScheme(CFSTR("feed"));
- if (!defaultHandlerID) {
- defaultHandlerID = ::CFStringCreateWithCString(kCFAllocatorDefault,
- SAFARI_BUNDLE_IDENTIFIER,
- kCFStringEncodingASCII);
- }
-
- CFURLRef defaultHandlerURL = nullptr;
- OSStatus status = ::LSFindApplicationForInfo(kLSUnknownCreator,
- defaultHandlerID,
- nullptr, // inName
- nullptr, // outAppRef
- &defaultHandlerURL);
-
- if (status == noErr && defaultHandlerURL) {
- nsCOMPtr<nsILocalFileMac> defaultReader =
- do_CreateInstance("@mozilla.org/file/local;1", &rv);
- if (NS_SUCCEEDED(rv)) {
- rv = defaultReader->InitWithCFURL(defaultHandlerURL);
- if (NS_SUCCEEDED(rv)) {
- NS_ADDREF(*_retval = defaultReader);
- rv = NS_OK;
- }
- }
-
- ::CFRelease(defaultHandlerURL);
- }
-
- ::CFRelease(defaultHandlerID);
-
- return rv;
-}
diff --git a/browser/components/shell/nsMacShellService.h b/browser/components/shell/nsMacShellService.h
deleted file mode 100644
index db9527809..000000000
--- a/browser/components/shell/nsMacShellService.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef nsmacshellservice_h____
-#define nsmacshellservice_h____
-
-#include "nsIMacShellService.h"
-#include "nsIWebProgressListener.h"
-#include "nsIFile.h"
-#include "nsCOMPtr.h"
-
-class nsMacShellService : public nsIMacShellService,
- public nsIWebProgressListener
-{
-public:
- nsMacShellService() {};
-
- NS_DECL_ISUPPORTS
- NS_DECL_NSISHELLSERVICE
- NS_DECL_NSIMACSHELLSERVICE
- NS_DECL_NSIWEBPROGRESSLISTENER
-
-protected:
- virtual ~nsMacShellService() {};
-
-private:
- nsCOMPtr<nsIFile> mBackgroundFile;
-};
-
-#endif // nsmacshellservice_h____
diff --git a/browser/components/shell/nsSetDefaultBrowser.js b/browser/components/shell/nsSetDefaultBrowser.js
deleted file mode 100644
index c7a78c538..000000000
--- a/browser/components/shell/nsSetDefaultBrowser.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/*
- * --setDefaultBrowser commandline handler
- * Makes the current executable the "default browser".
- */
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-Components.utils.import("resource:///modules/ShellService.jsm");
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-function nsSetDefaultBrowser() {}
-
-nsSetDefaultBrowser.prototype = {
- handle: function nsSetDefault_handle(aCmdline) {
- if (aCmdline.handleFlag("setDefaultBrowser", false)) {
- ShellService.setDefaultBrowser(true, true);
- }
- },
-
- helpInfo: " --setDefaultBrowser Set this app as the default browser.\n",
-
- classID: Components.ID("{F57899D0-4E2C-4ac6-9E29-50C736103B0C}"),
- QueryInterface: XPCOMUtils.generateQI([Ci.nsICommandLineHandler]),
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([nsSetDefaultBrowser]);
diff --git a/browser/components/shell/nsSetDefaultBrowser.manifest b/browser/components/shell/nsSetDefaultBrowser.manifest
deleted file mode 100644
index bf3c0f04f..000000000
--- a/browser/components/shell/nsSetDefaultBrowser.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {F57899D0-4E2C-4ac6-9E29-50C736103B0C} nsSetDefaultBrowser.js
-contract @mozilla.org/browser/default-browser-clh;1 {F57899D0-4E2C-4ac6-9E29-50C736103B0C}
-category command-line-handler m-setdefaultbrowser @mozilla.org/browser/default-browser-clh;1
diff --git a/browser/components/shell/nsShellService.h b/browser/components/shell/nsShellService.h
deleted file mode 100644
index 516a8423a..000000000
--- a/browser/components/shell/nsShellService.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#define PREF_CHECKDEFAULTBROWSER "browser.shell.checkDefaultBrowser"
-#define PREF_SKIPDEFAULTBROWSERCHECK "browser.shell.skipDefaultBrowserCheck"
-#define PREF_DEFAULTBROWSERCHECKCOUNT "browser.shell.defaultBrowserCheckCount"
-
-#define SHELLSERVICE_PROPERTIES "chrome://browser/locale/shellservice.properties"
-#define BRAND_PROPERTIES "chrome://branding/locale/brand.properties"
-
diff --git a/browser/components/shell/nsWindowsShellService.cpp b/browser/components/shell/nsWindowsShellService.cpp
deleted file mode 100644
index 879b0c7f0..000000000
--- a/browser/components/shell/nsWindowsShellService.cpp
+++ /dev/null
@@ -1,1277 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsWindowsShellService.h"
-
-#include "imgIContainer.h"
-#include "imgIRequest.h"
-#include "mozilla/gfx/2D.h"
-#include "mozilla/RefPtr.h"
-#include "nsIDOMElement.h"
-#include "nsIDOMHTMLImageElement.h"
-#include "nsIImageLoadingContent.h"
-#include "nsIPrefService.h"
-#include "nsIPrefLocalizedString.h"
-#include "nsIServiceManager.h"
-#include "nsIStringBundle.h"
-#include "nsNetUtil.h"
-#include "nsServiceManagerUtils.h"
-#include "nsShellService.h"
-#include "nsIProcess.h"
-#include "nsICategoryManager.h"
-#include "nsBrowserCompsCID.h"
-#include "nsDirectoryServiceUtils.h"
-#include "nsAppDirectoryServiceDefs.h"
-#include "nsDirectoryServiceDefs.h"
-#include "nsIWindowsRegKey.h"
-#include "nsUnicharUtils.h"
-#include "nsIWinTaskbar.h"
-#include "nsISupportsPrimitives.h"
-#include "nsIURLFormatter.h"
-#include "nsThreadUtils.h"
-#include "nsXULAppAPI.h"
-#include "mozilla/WindowsVersion.h"
-
-#include "windows.h"
-#include "shellapi.h"
-
-#ifdef _WIN32_WINNT
-#undef _WIN32_WINNT
-#endif
-#define _WIN32_WINNT 0x0600
-#define INITGUID
-#undef NTDDI_VERSION
-#define NTDDI_VERSION NTDDI_WIN8
-// Needed for access to IApplicationActivationManager
-#include <shlobj.h>
-
-#include <mbstring.h>
-#include <shlwapi.h>
-
-#include <lm.h>
-#undef ACCESS_READ
-
-#ifndef MAX_BUF
-#define MAX_BUF 4096
-#endif
-
-#define REG_SUCCEEDED(val) \
- (val == ERROR_SUCCESS)
-
-#define REG_FAILED(val) \
- (val != ERROR_SUCCESS)
-
-#define NS_TASKBAR_CONTRACTID "@mozilla.org/windows-taskbar;1"
-
-using mozilla::IsWin8OrLater;
-using namespace mozilla;
-using namespace mozilla::gfx;
-
-NS_IMPL_ISUPPORTS(nsWindowsShellService, nsIWindowsShellService, nsIShellService)
-
-static nsresult
-OpenKeyForReading(HKEY aKeyRoot, const nsAString& aKeyName, HKEY* aKey)
-{
- const nsString &flatName = PromiseFlatString(aKeyName);
-
- DWORD res = ::RegOpenKeyExW(aKeyRoot, flatName.get(), 0, KEY_READ, aKey);
- switch (res) {
- case ERROR_SUCCESS:
- break;
- case ERROR_ACCESS_DENIED:
- return NS_ERROR_FILE_ACCESS_DENIED;
- case ERROR_FILE_NOT_FOUND:
- return NS_ERROR_NOT_AVAILABLE;
- }
-
- return NS_OK;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Default Browser Registry Settings
-//
-// The setting of these values are made by an external binary since writing
-// these values may require elevation.
-//
-// - File Extension Mappings
-// -----------------------
-// The following file extensions:
-// .htm .html .shtml .xht .xhtml
-// are mapped like so:
-//
-// HKCU\SOFTWARE\Classes\.<ext>\ (default) REG_SZ BasiliskHTML
-//
-// as aliases to the class:
-//
-// HKCU\SOFTWARE\Classes\BasiliskHTML\
-// DefaultIcon (default) REG_SZ <apppath>,1
-// shell\open\command (default) REG_SZ <apppath> -osint -url "%1"
-// shell\open\ddeexec (default) REG_SZ <empty string>
-//
-// - Windows Vista and above Protocol Handler
-//
-// HKCU\SOFTWARE\Classes\BasiliskURL\ (default) REG_SZ <appname> URL
-// EditFlags REG_DWORD 2
-// FriendlyTypeName REG_SZ <appname> URL
-// DefaultIcon (default) REG_SZ <apppath>,1
-// shell\open\command (default) REG_SZ <apppath> -osint -url "%1"
-// shell\open\ddeexec (default) REG_SZ <empty string>
-//
-// - Protocol Mappings
-// -----------------
-// The following protocols:
-// HTTP, HTTPS, FTP
-// are mapped like so:
-//
-// HKCU\SOFTWARE\Classes\<protocol>\
-// DefaultIcon (default) REG_SZ <apppath>,1
-// shell\open\command (default) REG_SZ <apppath> -osint -url "%1"
-// shell\open\ddeexec (default) REG_SZ <empty string>
-//
-// - Windows Start Menu (XP SP1 and newer)
-// -------------------------------------------------
-// The following keys are set to make Basilisk appear in the Start Menu as the
-// browser:
-//
-// HKCU\SOFTWARE\Clients\StartMenuInternet\BASILISK.EXE\
-// (default) REG_SZ <appname>
-// DefaultIcon (default) REG_SZ <apppath>,0
-// InstallInfo HideIconsCommand REG_SZ <uninstpath> /HideShortcuts
-// InstallInfo IconsVisible REG_DWORD 1
-// InstallInfo ReinstallCommand REG_SZ <uninstpath> /SetAsDefaultAppGlobal
-// InstallInfo ShowIconsCommand REG_SZ <uninstpath> /ShowShortcuts
-// shell\open\command (default) REG_SZ <apppath>
-// shell\properties (default) REG_SZ <appname> &Options
-// shell\properties\command (default) REG_SZ <apppath> -preferences
-// shell\safemode (default) REG_SZ <appname> &Safe Mode
-// shell\safemode\command (default) REG_SZ <apppath> -safe-mode
-//
-
-// The values checked are all default values so the value name is not needed.
-typedef struct {
- const char* keyName;
- const char* valueData;
- const char* oldValueData;
-} SETTING;
-
-#define APP_REG_NAME L"Basilisk"
-#define VAL_FILE_ICON "%APPPATH%,1"
-#define VAL_OPEN "\"%APPPATH%\" -osint -url \"%1\""
-#define OLD_VAL_OPEN "\"%APPPATH%\" -requestPending -osint -url \"%1\""
-#define DI "\\DefaultIcon"
-#define SOC "\\shell\\open\\command"
-#define SOD "\\shell\\open\\ddeexec"
-// Used for updating the FTP protocol handler's shell open command under HKCU.
-#define FTP_SOC L"Software\\Classes\\ftp\\shell\\open\\command"
-
-#define MAKE_KEY_NAME1(PREFIX, MID) \
- PREFIX MID
-
-// The DefaultIcon registry key value should never be used when checking if
-// Basilisk is the default browser for file handlers since other applications
-// (e.g. MS Office) may modify the DefaultIcon registry key value to add Icon
-// Handlers. see http://msdn2.microsoft.com/en-us/library/aa969357.aspx for
-// more info. The FTP protocol is not checked so advanced users can set the FTP
-// handler to another application and still have Basilisk check if it is the
-// default HTTP and HTTPS handler.
-// *** Do not add additional checks here unless you skip them when aForAllTypes
-// is false below***.
-static SETTING gSettings[] = {
- // File Handler Class
- // ***keep this as the first entry because when aForAllTypes is not set below
- // it will skip over this check.***
- { MAKE_KEY_NAME1("BasiliskHTML", SOC), VAL_OPEN, OLD_VAL_OPEN },
-
- // Protocol Handler Class - for Vista and above
- { MAKE_KEY_NAME1("BasiliskURL", SOC), VAL_OPEN, OLD_VAL_OPEN },
-
- // Protocol Handlers
- { MAKE_KEY_NAME1("HTTP", DI), VAL_FILE_ICON },
- { MAKE_KEY_NAME1("HTTP", SOC), VAL_OPEN, OLD_VAL_OPEN },
- { MAKE_KEY_NAME1("HTTPS", DI), VAL_FILE_ICON },
- { MAKE_KEY_NAME1("HTTPS", SOC), VAL_OPEN, OLD_VAL_OPEN }
-};
-
-// The settings to disable DDE are separate from the default browser settings
-// since they are only checked when Basilisk is the default browser and if they
-// are incorrect they are fixed without notifying the user.
-static SETTING gDDESettings[] = {
- // File Handler Class
- { MAKE_KEY_NAME1("Software\\Classes\\BasiliskHTML", SOD) },
-
- // Protocol Handler Class - for Vista and above
- { MAKE_KEY_NAME1("Software\\Classes\\BasiliskURL", SOD) },
-
- // Protocol Handlers
- { MAKE_KEY_NAME1("Software\\Classes\\FTP", SOD) },
- { MAKE_KEY_NAME1("Software\\Classes\\HTTP", SOD) },
- { MAKE_KEY_NAME1("Software\\Classes\\HTTPS", SOD) }
-};
-
-nsresult
-GetHelperPath(nsAutoString& aPath)
-{
- nsresult rv;
- nsCOMPtr<nsIProperties> directoryService =
- do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- nsCOMPtr<nsIFile> appHelper;
- rv = directoryService->Get(XRE_EXECUTABLE_FILE,
- NS_GET_IID(nsIFile),
- getter_AddRefs(appHelper));
- NS_ENSURE_SUCCESS(rv, rv);
-
- rv = appHelper->SetNativeLeafName(NS_LITERAL_CSTRING("uninstall"));
- NS_ENSURE_SUCCESS(rv, rv);
-
- rv = appHelper->AppendNative(NS_LITERAL_CSTRING("helper.exe"));
- NS_ENSURE_SUCCESS(rv, rv);
-
- rv = appHelper->GetPath(aPath);
-
- aPath.Insert(L'"', 0);
- aPath.Append(L'"');
- return rv;
-}
-
-nsresult
-LaunchHelper(nsAutoString& aPath)
-{
- STARTUPINFOW si = {sizeof(si), 0};
- PROCESS_INFORMATION pi = {0};
-
- if (!CreateProcessW(nullptr, (LPWSTR)aPath.get(), nullptr, nullptr, FALSE,
- 0, nullptr, nullptr, &si, &pi)) {
- return NS_ERROR_FAILURE;
- }
-
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::ShortcutMaintenance()
-{
- nsresult rv;
-
- // XXX App ids were updated to a constant install path hash,
- // XXX this code can be removed after a few upgrade cycles.
-
- // Launch helper.exe so it can update the application user model ids on
- // shortcuts in the user's taskbar and start menu. This keeps older pinned
- // shortcuts grouped correctly after major updates. Note, we also do this
- // through the upgrade installer script, however, this is the only place we
- // have a chance to trap links created by users who do control the install/
- // update process of the browser.
-
- nsCOMPtr<nsIWinTaskbar> taskbarInfo =
- do_GetService(NS_TASKBAR_CONTRACTID);
- if (!taskbarInfo) // If we haven't built with win7 sdk features, this fails.
- return NS_OK;
-
- // Avoid if this isn't Win7+
- bool isSupported = false;
- taskbarInfo->GetAvailable(&isSupported);
- if (!isSupported)
- return NS_OK;
-
- nsAutoString appId;
- if (NS_FAILED(taskbarInfo->GetDefaultGroupId(appId)))
- return NS_ERROR_UNEXPECTED;
-
- NS_NAMED_LITERAL_CSTRING(prefName, "browser.taskbar.lastgroupid");
- nsCOMPtr<nsIPrefBranch> prefs =
- do_GetService(NS_PREFSERVICE_CONTRACTID);
- if (!prefs)
- return NS_ERROR_UNEXPECTED;
-
- nsCOMPtr<nsISupportsString> prefString;
- rv = prefs->GetComplexValue(prefName.get(),
- NS_GET_IID(nsISupportsString),
- getter_AddRefs(prefString));
- if (NS_SUCCEEDED(rv)) {
- nsAutoString version;
- prefString->GetData(version);
- if (!version.IsEmpty() && version.Equals(appId)) {
- // We're all good, get out of here.
- return NS_OK;
- }
- }
- // Update the version in prefs
- prefString =
- do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID, &rv);
- if (NS_FAILED(rv))
- return rv;
-
- prefString->SetData(appId);
- rv = prefs->SetComplexValue(prefName.get(),
- NS_GET_IID(nsISupportsString),
- prefString);
- if (NS_FAILED(rv)) {
- NS_WARNING("Couldn't set last user model id!");
- return NS_ERROR_UNEXPECTED;
- }
-
- nsAutoString appHelperPath;
- if (NS_FAILED(GetHelperPath(appHelperPath)))
- return NS_ERROR_UNEXPECTED;
-
- appHelperPath.AppendLiteral(" /UpdateShortcutAppUserModelIds");
-
- return LaunchHelper(appHelperPath);
-}
-
-static bool
-IsAARDefault(const RefPtr<IApplicationAssociationRegistration>& pAAR,
- LPCWSTR aClassName)
-{
- // Make sure the Prog ID matches what we have
- LPWSTR registeredApp;
- bool isProtocol = *aClassName != L'.';
- ASSOCIATIONTYPE queryType = isProtocol ? AT_URLPROTOCOL : AT_FILEEXTENSION;
- HRESULT hr = pAAR->QueryCurrentDefault(aClassName, queryType, AL_EFFECTIVE,
- &registeredApp);
- if (FAILED(hr)) {
- return false;
- }
-
- LPCWSTR progID = isProtocol ? L"BasiliskURL" : L"BasiliskHTML";
- bool isDefault = !wcsicmp(registeredApp, progID);
- CoTaskMemFree(registeredApp);
-
- return isDefault;
-}
-
-static void
-IsDefaultBrowserWin8(bool aCheckAllTypes, bool* aIsDefaultBrowser)
-{
- RefPtr<IApplicationAssociationRegistration> pAAR;
- HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration,
- nullptr,
- CLSCTX_INPROC,
- IID_IApplicationAssociationRegistration,
- getter_AddRefs(pAAR));
- if (FAILED(hr)) {
- return;
- }
-
- bool res = IsAARDefault(pAAR, L"http");
- if (*aIsDefaultBrowser) {
- *aIsDefaultBrowser = res;
- }
- res = IsAARDefault(pAAR, L".html");
- if (*aIsDefaultBrowser && aCheckAllTypes) {
- *aIsDefaultBrowser = res;
- }
-}
-
-/*
- * Query's the AAR for the default status.
- * This only checks for BasiliskURL and if aCheckAllTypes is set, then
- * it also checks for BasiliskHTML. Note that those ProgIDs are shared
- * by all Basilisk browsers.
-*/
-bool
-nsWindowsShellService::IsDefaultBrowserVista(bool aCheckAllTypes,
- bool* aIsDefaultBrowser)
-{
- RefPtr<IApplicationAssociationRegistration> pAAR;
- HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration,
- nullptr,
- CLSCTX_INPROC,
- IID_IApplicationAssociationRegistration,
- getter_AddRefs(pAAR));
- if (FAILED(hr)) {
- return false;
- }
-
- if (aCheckAllTypes) {
- BOOL res;
- hr = pAAR->QueryAppIsDefaultAll(AL_EFFECTIVE,
- APP_REG_NAME,
- &res);
- *aIsDefaultBrowser = res;
- } else if (!IsWin8OrLater()) {
- *aIsDefaultBrowser = IsAARDefault(pAAR, L"http");
- }
-
- return true;
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::IsDefaultBrowser(bool aStartupCheck,
- bool aForAllTypes,
- bool* aIsDefaultBrowser)
-{
- // Assume we're the default unless one of the several checks below tell us
- // otherwise.
- *aIsDefaultBrowser = true;
-
- wchar_t exePath[MAX_BUF];
- if (!::GetModuleFileNameW(0, exePath, MAX_BUF))
- return NS_ERROR_FAILURE;
-
- // Convert the path to a long path since GetModuleFileNameW returns the path
- // that was used to launch Basilisk which is not necessarily a long path.
- if (!::GetLongPathNameW(exePath, exePath, MAX_BUF))
- return NS_ERROR_FAILURE;
-
- nsAutoString appLongPath(exePath);
-
- HKEY theKey;
- DWORD res;
- nsresult rv;
- wchar_t currValue[MAX_BUF];
-
- SETTING* settings = gSettings;
- if (!aForAllTypes && IsWin8OrLater()) {
- // Skip over the file handler check
- settings++;
- }
-
- SETTING* end = gSettings + sizeof(gSettings) / sizeof(SETTING);
-
- for (; settings < end; ++settings) {
- NS_ConvertUTF8toUTF16 keyName(settings->keyName);
- NS_ConvertUTF8toUTF16 valueData(settings->valueData);
- int32_t offset = valueData.Find("%APPPATH%");
- valueData.Replace(offset, 9, appLongPath);
-
- rv = OpenKeyForReading(HKEY_CLASSES_ROOT, keyName, &theKey);
- if (NS_FAILED(rv)) {
- *aIsDefaultBrowser = false;
- return NS_OK;
- }
-
- ::ZeroMemory(currValue, sizeof(currValue));
- DWORD len = sizeof currValue;
- res = ::RegQueryValueExW(theKey, L"", nullptr, nullptr,
- (LPBYTE)currValue, &len);
- // Close the key that was opened.
- ::RegCloseKey(theKey);
- if (REG_FAILED(res) ||
- _wcsicmp(valueData.get(), currValue)) {
- // Key wasn't set or was set to something other than our registry entry.
- NS_ConvertUTF8toUTF16 oldValueData(settings->oldValueData);
- offset = oldValueData.Find("%APPPATH%");
- oldValueData.Replace(offset, 9, appLongPath);
- // The current registry value doesn't match the current or the old format.
- if (_wcsicmp(oldValueData.get(), currValue)) {
- *aIsDefaultBrowser = false;
- return NS_OK;
- }
-
- res = ::RegOpenKeyExW(HKEY_CLASSES_ROOT, PromiseFlatString(keyName).get(),
- 0, KEY_SET_VALUE, &theKey);
- if (REG_FAILED(res)) {
- // If updating the open command fails try to update it using the helper
- // application when setting Basilisk as the default browser.
- *aIsDefaultBrowser = false;
- return NS_OK;
- }
-
- const nsString &flatValue = PromiseFlatString(valueData);
- res = ::RegSetValueExW(theKey, L"", 0, REG_SZ,
- (const BYTE *) flatValue.get(),
- (flatValue.Length() + 1) * sizeof(char16_t));
- // Close the key that was created.
- ::RegCloseKey(theKey);
- if (REG_FAILED(res)) {
- // If updating the open command fails try to update it using the helper
- // application when setting Basilisk as the default browser.
- *aIsDefaultBrowser = false;
- return NS_OK;
- }
- }
- }
-
- // Only check if Basilisk is the default browser on Vista and above if the
- // previous checks show that Basilisk is the default browser.
- if (*aIsDefaultBrowser) {
- IsDefaultBrowserVista(aForAllTypes, aIsDefaultBrowser);
- if (IsWin8OrLater()) {
- IsDefaultBrowserWin8(aForAllTypes, aIsDefaultBrowser);
- }
- }
-
- // To handle the case where DDE isn't disabled due for a user because there
- // account didn't perform a Basilisk update this will check if Basilisk is the
- // default browser and if dde is disabled for each handler
- // and if it isn't disable it. When Basilisk is not the default browser the
- // helper application will disable dde for each handler.
- if (*aIsDefaultBrowser && aForAllTypes) {
- // Check ftp settings
-
- end = gDDESettings + sizeof(gDDESettings) / sizeof(SETTING);
-
- for (settings = gDDESettings; settings < end; ++settings) {
- NS_ConvertUTF8toUTF16 keyName(settings->keyName);
-
- rv = OpenKeyForReading(HKEY_CURRENT_USER, keyName, &theKey);
- if (NS_FAILED(rv)) {
- ::RegCloseKey(theKey);
- // If disabling DDE fails try to disable it using the helper
- // application when setting Basilisk as the default browser.
- *aIsDefaultBrowser = false;
- return NS_OK;
- }
-
- ::ZeroMemory(currValue, sizeof(currValue));
- DWORD len = sizeof currValue;
- res = ::RegQueryValueExW(theKey, L"", nullptr, nullptr,
- (LPBYTE)currValue, &len);
- // Close the key that was opened.
- ::RegCloseKey(theKey);
- if (REG_FAILED(res) || char16_t('\0') != *currValue) {
- // Key wasn't set or was set to something other than our registry entry.
- // Delete the key along with all of its childrean and then recreate it.
- const nsString &flatName = PromiseFlatString(keyName);
- ::SHDeleteKeyW(HKEY_CURRENT_USER, flatName.get());
- res = ::RegCreateKeyExW(HKEY_CURRENT_USER, flatName.get(), 0, nullptr,
- REG_OPTION_NON_VOLATILE, KEY_SET_VALUE,
- nullptr, &theKey, nullptr);
- if (REG_FAILED(res)) {
- // If disabling DDE fails try to disable it using the helper
- // application when setting Basilisk as the default browser.
- *aIsDefaultBrowser = false;
- return NS_OK;
- }
-
- res = ::RegSetValueExW(theKey, L"", 0, REG_SZ, (const BYTE *) L"",
- sizeof(char16_t));
- // Close the key that was created.
- ::RegCloseKey(theKey);
- if (REG_FAILED(res)) {
- // If disabling DDE fails try to disable it using the helper
- // application when setting Basilisk as the default browser.
- *aIsDefaultBrowser = false;
- return NS_OK;
- }
- }
- }
-
- // Update the FTP protocol handler's shell open command if it is the old
- // format.
- res = ::RegOpenKeyExW(HKEY_CURRENT_USER, FTP_SOC, 0, KEY_ALL_ACCESS,
- &theKey);
- // Don't update the FTP protocol handler's shell open command when opening
- // its registry key fails under HKCU since it most likely doesn't exist.
- if (NS_FAILED(rv)) {
- return NS_OK;
- }
-
- NS_ConvertUTF8toUTF16 oldValueOpen(OLD_VAL_OPEN);
- int32_t offset = oldValueOpen.Find("%APPPATH%");
- oldValueOpen.Replace(offset, 9, appLongPath);
-
- ::ZeroMemory(currValue, sizeof(currValue));
- DWORD len = sizeof currValue;
- res = ::RegQueryValueExW(theKey, L"", nullptr, nullptr, (LPBYTE)currValue,
- &len);
-
- // Don't update the FTP protocol handler's shell open command when the
- // current registry value doesn't exist or matches the old format.
- if (REG_FAILED(res) ||
- _wcsicmp(oldValueOpen.get(), currValue)) {
- ::RegCloseKey(theKey);
- return NS_OK;
- }
-
- NS_ConvertUTF8toUTF16 valueData(VAL_OPEN);
- valueData.Replace(offset, 9, appLongPath);
- const nsString &flatValue = PromiseFlatString(valueData);
- res = ::RegSetValueExW(theKey, L"", 0, REG_SZ,
- (const BYTE *) flatValue.get(),
- (flatValue.Length() + 1) * sizeof(char16_t));
- // Close the key that was created.
- ::RegCloseKey(theKey);
- // If updating the FTP protocol handlers shell open command fails try to
- // update it using the helper application when setting Basilisk as the
- // default browser.
- if (REG_FAILED(res)) {
- *aIsDefaultBrowser = false;
- }
- }
-
- return NS_OK;
-}
-
-static nsresult
-DynSHOpenWithDialog(HWND hwndParent, const OPENASINFO *poainfo)
-{
- // shell32.dll is in the knownDLLs list so will always be loaded from the
- // system32 directory.
- static const wchar_t kSehllLibraryName[] = L"shell32.dll";
- HMODULE shellDLL = ::LoadLibraryW(kSehllLibraryName);
- if (!shellDLL) {
- return NS_ERROR_FAILURE;
- }
-
- decltype(SHOpenWithDialog)* SHOpenWithDialogFn =
- (decltype(SHOpenWithDialog)*) GetProcAddress(shellDLL, "SHOpenWithDialog");
-
- if (!SHOpenWithDialogFn) {
- return NS_ERROR_FAILURE;
- }
-
- nsresult rv;
- HRESULT hr = SHOpenWithDialogFn(hwndParent, poainfo);
- if (SUCCEEDED(hr) || (hr == HRESULT_FROM_WIN32(ERROR_CANCELLED))) {
- rv = NS_OK;
- } else {
- rv = NS_ERROR_FAILURE;
- }
- FreeLibrary(shellDLL);
- return rv;
-}
-
-nsresult
-nsWindowsShellService::LaunchControlPanelDefaultsSelectionUI()
-{
- IApplicationAssociationRegistrationUI* pAARUI;
- HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistrationUI,
- NULL,
- CLSCTX_INPROC,
- IID_IApplicationAssociationRegistrationUI,
- (void**)&pAARUI);
- if (SUCCEEDED(hr)) {
- hr = pAARUI->LaunchAdvancedAssociationUI(APP_REG_NAME);
- pAARUI->Release();
- }
- return SUCCEEDED(hr) ? NS_OK : NS_ERROR_FAILURE;
-}
-
-nsresult
-nsWindowsShellService::LaunchControlPanelDefaultPrograms()
-{
- // Build the path control.exe path safely
- WCHAR controlEXEPath[MAX_PATH + 1] = { '\0' };
- if (!GetSystemDirectoryW(controlEXEPath, MAX_PATH)) {
- return NS_ERROR_FAILURE;
- }
- LPCWSTR controlEXE = L"control.exe";
- if (wcslen(controlEXEPath) + wcslen(controlEXE) >= MAX_PATH) {
- return NS_ERROR_FAILURE;
- }
- if (!PathAppendW(controlEXEPath, controlEXE)) {
- return NS_ERROR_FAILURE;
- }
-
- WCHAR params[] = L"control.exe /name Microsoft.DefaultPrograms /page "
- "pageDefaultProgram\\pageAdvancedSettings?pszAppName=" APP_REG_NAME;
- STARTUPINFOW si = {sizeof(si), 0};
- si.dwFlags = STARTF_USESHOWWINDOW;
- si.wShowWindow = SW_SHOWDEFAULT;
- PROCESS_INFORMATION pi = {0};
- if (!CreateProcessW(controlEXEPath, params, nullptr, nullptr, FALSE,
- 0, nullptr, nullptr, &si, &pi)) {
- return NS_ERROR_FAILURE;
- }
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
-
- return NS_OK;
-}
-
-static bool
-IsWindowsLogonConnected()
-{
- WCHAR userName[UNLEN + 1];
- DWORD size = ArrayLength(userName);
- if (!GetUserNameW(userName, &size)) {
- return false;
- }
-
- LPUSER_INFO_24 info;
- if (NetUserGetInfo(nullptr, userName, 24, (LPBYTE *)&info)
- != NERR_Success) {
- return false;
- }
- bool connected = info->usri24_internet_identity;
- NetApiBufferFree(info);
-
- return connected;
-}
-
-static bool
-SettingsAppBelievesConnected()
-{
- nsresult rv;
- nsCOMPtr<nsIWindowsRegKey> regKey =
- do_CreateInstance("@mozilla.org/windows-registry-key;1", &rv);
- if (NS_FAILED(rv)) {
- return false;
- }
-
- rv = regKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
- NS_LITERAL_STRING("SOFTWARE\\Microsoft\\Windows\\Shell\\Associations"),
- nsIWindowsRegKey::ACCESS_READ);
- if (NS_FAILED(rv)) {
- return false;
- }
-
- uint32_t value;
- rv = regKey->ReadIntValue(NS_LITERAL_STRING("IsConnectedAtLogon"), &value);
- if (NS_FAILED(rv)) {
- return false;
- }
-
- return !!value;
-}
-
-nsresult
-nsWindowsShellService::LaunchModernSettingsDialogDefaultApps()
-{
- if (!IsWindowsBuildOrLater(14965) &&
- !IsWindowsLogonConnected() && SettingsAppBelievesConnected()) {
- // Use the classic Control Panel to work around a bug of older
- // builds of Windows 10.
- return LaunchControlPanelDefaultPrograms();
- }
-
- IApplicationActivationManager* pActivator;
- HRESULT hr = CoCreateInstance(CLSID_ApplicationActivationManager,
- nullptr,
- CLSCTX_INPROC,
- IID_IApplicationActivationManager,
- (void**)&pActivator);
-
- if (SUCCEEDED(hr)) {
- DWORD pid;
- hr = pActivator->ActivateApplication(
- L"windows.immersivecontrolpanel_cw5n1h2txyewy"
- L"!microsoft.windows.immersivecontrolpanel",
- L"page=SettingsPageAppsDefaults", AO_NONE, &pid);
- if (SUCCEEDED(hr)) {
- // Do not check error because we could at least open
- // the "Default apps" setting.
- pActivator->ActivateApplication(
- L"windows.immersivecontrolpanel_cw5n1h2txyewy"
- L"!microsoft.windows.immersivecontrolpanel",
- L"page=SettingsPageAppsDefaults"
- L"&target=SystemSettings_DefaultApps_Browser", AO_NONE, &pid);
- }
- pActivator->Release();
- return SUCCEEDED(hr) ? NS_OK : NS_ERROR_FAILURE;
- }
- return NS_OK;
-}
-
-nsresult
-nsWindowsShellService::InvokeHTTPOpenAsVerb()
-{
- nsCOMPtr<nsIURLFormatter> formatter(
- do_GetService("@mozilla.org/toolkit/URLFormatterService;1"));
- if (!formatter) {
- return NS_ERROR_UNEXPECTED;
- }
-
- nsString urlStr;
- nsresult rv = formatter->FormatURLPref(
- NS_LITERAL_STRING("app.support.baseURL"), urlStr);
- if (NS_FAILED(rv)) {
- return rv;
- }
- if (!StringBeginsWith(urlStr, NS_LITERAL_STRING("https://"))) {
- return NS_ERROR_FAILURE;
- }
- urlStr.AppendLiteral("win10-default-browser");
-
- SHELLEXECUTEINFOW seinfo = { sizeof(SHELLEXECUTEINFOW) };
- seinfo.lpVerb = L"openas";
- seinfo.lpFile = urlStr.get();
- seinfo.nShow = SW_SHOWNORMAL;
- if (!ShellExecuteExW(&seinfo)) {
- return NS_ERROR_FAILURE;
- }
- return NS_OK;
-}
-
-nsresult
-nsWindowsShellService::LaunchHTTPHandlerPane()
-{
- OPENASINFO info;
- info.pcszFile = L"http";
- info.pcszClass = nullptr;
- info.oaifInFlags = OAIF_FORCE_REGISTRATION |
- OAIF_URL_PROTOCOL |
- OAIF_REGISTER_EXT;
- return DynSHOpenWithDialog(nullptr, &info);
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::SetDefaultBrowser(bool aClaimAllTypes, bool aForAllUsers)
-{
- nsAutoString appHelperPath;
- if (NS_FAILED(GetHelperPath(appHelperPath)))
- return NS_ERROR_FAILURE;
-
- if (aForAllUsers) {
- appHelperPath.AppendLiteral(" /SetAsDefaultAppGlobal");
- } else {
- appHelperPath.AppendLiteral(" /SetAsDefaultAppUser");
- }
-
- nsresult rv = LaunchHelper(appHelperPath);
- if (NS_SUCCEEDED(rv) && IsWin8OrLater()) {
- if (aClaimAllTypes) {
- if (IsWin10OrLater()) {
- rv = LaunchModernSettingsDialogDefaultApps();
- } else {
- rv = LaunchControlPanelDefaultsSelectionUI();
- }
- // The above call should never really fail, but just in case
- // fall back to showing the HTTP association screen only.
- if (NS_FAILED(rv)) {
- if (IsWin10OrLater()) {
- rv = InvokeHTTPOpenAsVerb();
- } else {
- rv = LaunchHTTPHandlerPane();
- }
- }
- } else {
- // Windows 10 blocks attempts to load the
- // HTTP Handler association dialog.
- if (IsWin10OrLater()) {
- rv = LaunchModernSettingsDialogDefaultApps();
- } else {
- rv = LaunchHTTPHandlerPane();
- }
-
- // The above call should never really fail, but just in case
- // fall back to showing control panel for all defaults
- if (NS_FAILED(rv)) {
- rv = LaunchControlPanelDefaultsSelectionUI();
- }
- }
- }
-
- nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID));
- if (prefs) {
- (void) prefs->SetBoolPref(PREF_CHECKDEFAULTBROWSER, true);
- // Reset the number of times the dialog should be shown
- // before it is silenced.
- (void) prefs->SetIntPref(PREF_DEFAULTBROWSERCHECKCOUNT, 0);
- }
-
- return rv;
-}
-
-static nsresult
-WriteBitmap(nsIFile* aFile, imgIContainer* aImage)
-{
- nsresult rv;
-
- RefPtr<SourceSurface> surface =
- aImage->GetFrame(imgIContainer::FRAME_FIRST,
- imgIContainer::FLAG_SYNC_DECODE);
- NS_ENSURE_TRUE(surface, NS_ERROR_FAILURE);
-
- // For either of the following formats we want to set the biBitCount member
- // of the BITMAPINFOHEADER struct to 32, below. For that value the bitmap
- // format defines that the A8/X8 WORDs in the bitmap byte stream be ignored
- // for the BI_RGB value we use for the biCompression member.
- MOZ_ASSERT(surface->GetFormat() == SurfaceFormat::B8G8R8A8 ||
- surface->GetFormat() == SurfaceFormat::B8G8R8X8);
-
- RefPtr<DataSourceSurface> dataSurface = surface->GetDataSurface();
- NS_ENSURE_TRUE(dataSurface, NS_ERROR_FAILURE);
-
- int32_t width = dataSurface->GetSize().width;
- int32_t height = dataSurface->GetSize().height;
- int32_t bytesPerPixel = 4 * sizeof(uint8_t);
- uint32_t bytesPerRow = bytesPerPixel * width;
-
- // initialize these bitmap structs which we will later
- // serialize directly to the head of the bitmap file
- BITMAPINFOHEADER bmi;
- bmi.biSize = sizeof(BITMAPINFOHEADER);
- bmi.biWidth = width;
- bmi.biHeight = height;
- bmi.biPlanes = 1;
- bmi.biBitCount = (WORD)bytesPerPixel*8;
- bmi.biCompression = BI_RGB;
- bmi.biSizeImage = bytesPerRow * height;
- bmi.biXPelsPerMeter = 0;
- bmi.biYPelsPerMeter = 0;
- bmi.biClrUsed = 0;
- bmi.biClrImportant = 0;
-
- BITMAPFILEHEADER bf;
- bf.bfType = 0x4D42; // 'BM'
- bf.bfReserved1 = 0;
- bf.bfReserved2 = 0;
- bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
- bf.bfSize = bf.bfOffBits + bmi.biSizeImage;
-
- // get a file output stream
- nsCOMPtr<nsIOutputStream> stream;
- rv = NS_NewLocalFileOutputStream(getter_AddRefs(stream), aFile);
- NS_ENSURE_SUCCESS(rv, rv);
-
- DataSourceSurface::MappedSurface map;
- if (!dataSurface->Map(DataSourceSurface::MapType::READ, &map)) {
- return NS_ERROR_FAILURE;
- }
-
- // write the bitmap headers and rgb pixel data to the file
- rv = NS_ERROR_FAILURE;
- if (stream) {
- uint32_t written;
- stream->Write((const char*)&bf, sizeof(BITMAPFILEHEADER), &written);
- if (written == sizeof(BITMAPFILEHEADER)) {
- stream->Write((const char*)&bmi, sizeof(BITMAPINFOHEADER), &written);
- if (written == sizeof(BITMAPINFOHEADER)) {
- // write out the image data backwards because the desktop won't
- // show bitmaps with negative heights for top-to-bottom
- uint32_t i = map.mStride * height;
- do {
- i -= map.mStride;
- stream->Write(((const char*)map.mData) + i, bytesPerRow, &written);
- if (written == bytesPerRow) {
- rv = NS_OK;
- } else {
- rv = NS_ERROR_FAILURE;
- break;
- }
- } while (i != 0);
- }
- }
-
- stream->Close();
- }
-
- dataSurface->Unmap();
-
- return rv;
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::SetDesktopBackground(nsIDOMElement* aElement,
- int32_t aPosition)
-{
- nsresult rv;
-
- nsCOMPtr<imgIContainer> container;
- nsCOMPtr<nsIDOMHTMLImageElement> imgElement(do_QueryInterface(aElement));
- if (!imgElement) {
- // XXX write background loading stuff!
- return NS_ERROR_NOT_AVAILABLE;
- }
- else {
- nsCOMPtr<nsIImageLoadingContent> imageContent =
- do_QueryInterface(aElement, &rv);
- if (!imageContent)
- return rv;
-
- // get the image container
- nsCOMPtr<imgIRequest> request;
- rv = imageContent->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST,
- getter_AddRefs(request));
- if (!request)
- return rv;
- rv = request->GetImage(getter_AddRefs(container));
- if (!container)
- return NS_ERROR_FAILURE;
- }
-
- // get the file name from localized strings
- nsCOMPtr<nsIStringBundleService>
- bundleService(do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv));
- NS_ENSURE_SUCCESS(rv, rv);
-
- nsCOMPtr<nsIStringBundle> shellBundle;
- rv = bundleService->CreateBundle(SHELLSERVICE_PROPERTIES,
- getter_AddRefs(shellBundle));
- NS_ENSURE_SUCCESS(rv, rv);
-
- // e.g. "Desktop Background.bmp"
- nsString fileLeafName;
- rv = shellBundle->GetStringFromName
- (u"desktopBackgroundLeafNameWin",
- getter_Copies(fileLeafName));
- NS_ENSURE_SUCCESS(rv, rv);
-
- // get the profile root directory
- nsCOMPtr<nsIFile> file;
- rv = NS_GetSpecialDirectory(NS_APP_APPLICATION_REGISTRY_DIR,
- getter_AddRefs(file));
- NS_ENSURE_SUCCESS(rv, rv);
-
- // eventually, the path is "%APPDATA%\Mozilla\Basilisk\Desktop Background.bmp"
- rv = file->Append(fileLeafName);
- NS_ENSURE_SUCCESS(rv, rv);
-
- nsAutoString path;
- rv = file->GetPath(path);
- NS_ENSURE_SUCCESS(rv, rv);
-
- // write the bitmap to a file in the profile directory
- rv = WriteBitmap(file, container);
-
- // if the file was written successfully, set it as the system wallpaper
- if (NS_SUCCEEDED(rv)) {
- nsCOMPtr<nsIWindowsRegKey> regKey =
- do_CreateInstance("@mozilla.org/windows-registry-key;1", &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- rv = regKey->Create(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
- NS_LITERAL_STRING("Control Panel\\Desktop"),
- nsIWindowsRegKey::ACCESS_SET_VALUE);
- NS_ENSURE_SUCCESS(rv, rv);
-
- nsAutoString tile;
- nsAutoString style;
- switch (aPosition) {
- case BACKGROUND_TILE:
- style.Assign('0');
- tile.Assign('1');
- break;
- case BACKGROUND_CENTER:
- style.Assign('0');
- tile.Assign('0');
- break;
- case BACKGROUND_STRETCH:
- style.Assign('2');
- tile.Assign('0');
- break;
- case BACKGROUND_FILL:
- style.AssignLiteral("10");
- tile.Assign('0');
- break;
- case BACKGROUND_FIT:
- style.Assign('6');
- tile.Assign('0');
- break;
- }
-
- rv = regKey->WriteStringValue(NS_LITERAL_STRING("TileWallpaper"), tile);
- NS_ENSURE_SUCCESS(rv, rv);
- rv = regKey->WriteStringValue(NS_LITERAL_STRING("WallpaperStyle"), style);
- NS_ENSURE_SUCCESS(rv, rv);
- rv = regKey->Close();
- NS_ENSURE_SUCCESS(rv, rv);
-
- ::SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (PVOID)path.get(),
- SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
- }
- return rv;
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::OpenApplication(int32_t aApplication)
-{
- nsAutoString application;
- switch (aApplication) {
- case nsIShellService::APPLICATION_MAIL:
- application.AssignLiteral("Mail");
- break;
- case nsIShellService::APPLICATION_NEWS:
- application.AssignLiteral("News");
- break;
- }
-
- // The Default Client section of the Windows Registry looks like this:
- //
- // Clients\aClient\
- // e.g. aClient = "Mail"...
- // \Mail\(default) = Client Subkey Name
- // \Client Subkey Name
- // \Client Subkey Name\shell\open\command\
- // \Client Subkey Name\shell\open\command\(default) = path to exe
- //
-
- // Find the default application for this class.
- HKEY theKey;
- nsresult rv = OpenKeyForReading(HKEY_CLASSES_ROOT, application, &theKey);
- if (NS_FAILED(rv))
- return rv;
-
- wchar_t buf[MAX_BUF];
- DWORD type, len = sizeof buf;
- DWORD res = ::RegQueryValueExW(theKey, EmptyString().get(), 0,
- &type, (LPBYTE)&buf, &len);
-
- if (REG_FAILED(res) || !*buf)
- return NS_OK;
-
- // Close the key we opened.
- ::RegCloseKey(theKey);
-
- // Find the "open" command
- application.Append('\\');
- application.Append(buf);
- application.AppendLiteral("\\shell\\open\\command");
-
- rv = OpenKeyForReading(HKEY_CLASSES_ROOT, application, &theKey);
- if (NS_FAILED(rv))
- return rv;
-
- ::ZeroMemory(buf, sizeof(buf));
- len = sizeof buf;
- res = ::RegQueryValueExW(theKey, EmptyString().get(), 0,
- &type, (LPBYTE)&buf, &len);
- if (REG_FAILED(res) || !*buf)
- return NS_ERROR_FAILURE;
-
- // Close the key we opened.
- ::RegCloseKey(theKey);
-
- // Look for any embedded environment variables and substitute their
- // values, as |::CreateProcessW| is unable to do this.
- nsAutoString path(buf);
- int32_t end = path.Length();
- int32_t cursor = 0, temp = 0;
- ::ZeroMemory(buf, sizeof(buf));
- do {
- cursor = path.FindChar('%', cursor);
- if (cursor < 0)
- break;
-
- temp = path.FindChar('%', cursor + 1);
- ++cursor;
-
- ::ZeroMemory(&buf, sizeof(buf));
-
- ::GetEnvironmentVariableW(nsAutoString(Substring(path, cursor, temp - cursor)).get(),
- buf, sizeof(buf));
-
- // "+ 2" is to subtract the extra characters used to delimit the environment
- // variable ('%').
- path.Replace((cursor - 1), temp - cursor + 2, nsDependentString(buf));
-
- ++cursor;
- }
- while (cursor < end);
-
- STARTUPINFOW si;
- PROCESS_INFORMATION pi;
-
- ::ZeroMemory(&si, sizeof(STARTUPINFOW));
- ::ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
-
- BOOL success = ::CreateProcessW(nullptr, (LPWSTR)path.get(), nullptr,
- nullptr, FALSE, 0, nullptr, nullptr,
- &si, &pi);
- if (!success)
- return NS_ERROR_FAILURE;
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::GetDesktopBackgroundColor(uint32_t* aColor)
-{
- uint32_t color = ::GetSysColor(COLOR_DESKTOP);
- *aColor = (GetRValue(color) << 16) | (GetGValue(color) << 8) | GetBValue(color);
- return NS_OK;
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::SetDesktopBackgroundColor(uint32_t aColor)
-{
- int aParameters[2] = { COLOR_BACKGROUND, COLOR_DESKTOP };
- BYTE r = (aColor >> 16);
- BYTE g = (aColor << 16) >> 24;
- BYTE b = (aColor << 24) >> 24;
- COLORREF colors[2] = { RGB(r,g,b), RGB(r,g,b) };
-
- ::SetSysColors(sizeof(aParameters) / sizeof(int), aParameters, colors);
-
- nsresult rv;
- nsCOMPtr<nsIWindowsRegKey> regKey =
- do_CreateInstance("@mozilla.org/windows-registry-key;1", &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- rv = regKey->Create(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
- NS_LITERAL_STRING("Control Panel\\Colors"),
- nsIWindowsRegKey::ACCESS_SET_VALUE);
- NS_ENSURE_SUCCESS(rv, rv);
-
- wchar_t rgb[12];
- _snwprintf(rgb, 12, L"%u %u %u", r, g, b);
-
- rv = regKey->WriteStringValue(NS_LITERAL_STRING("Background"),
- nsDependentString(rgb));
- NS_ENSURE_SUCCESS(rv, rv);
-
- return regKey->Close();
-}
-
-nsWindowsShellService::nsWindowsShellService()
-{
-}
-
-nsWindowsShellService::~nsWindowsShellService()
-{
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::OpenApplicationWithURI(nsIFile* aApplication,
- const nsACString& aURI)
-{
- nsresult rv;
- nsCOMPtr<nsIProcess> process =
- do_CreateInstance("@mozilla.org/process/util;1", &rv);
- if (NS_FAILED(rv))
- return rv;
-
- rv = process->Init(aApplication);
- if (NS_FAILED(rv))
- return rv;
-
- const nsCString spec(aURI);
- const char* specStr = spec.get();
- return process->Run(false, &specStr, 1);
-}
-
-NS_IMETHODIMP
-nsWindowsShellService::GetDefaultFeedReader(nsIFile** _retval)
-{
- *_retval = nullptr;
-
- nsresult rv;
- nsCOMPtr<nsIWindowsRegKey> regKey =
- do_CreateInstance("@mozilla.org/windows-registry-key;1", &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- rv = regKey->Open(nsIWindowsRegKey::ROOT_KEY_CLASSES_ROOT,
- NS_LITERAL_STRING("feed\\shell\\open\\command"),
- nsIWindowsRegKey::ACCESS_READ);
- NS_ENSURE_SUCCESS(rv, rv);
-
- nsAutoString path;
- rv = regKey->ReadStringValue(EmptyString(), path);
- NS_ENSURE_SUCCESS(rv, rv);
- if (path.IsEmpty())
- return NS_ERROR_FAILURE;
-
- if (path.First() == '"') {
- // Everything inside the quotes
- path = Substring(path, 1, path.FindChar('"', 1) - 1);
- }
- else {
- // Everything up to the first space
- path = Substring(path, 0, path.FindChar(' '));
- }
-
- nsCOMPtr<nsIFile> defaultReader =
- do_CreateInstance("@mozilla.org/file/local;1", &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- rv = defaultReader->InitWithPath(path);
- NS_ENSURE_SUCCESS(rv, rv);
-
- bool exists;
- rv = defaultReader->Exists(&exists);
- NS_ENSURE_SUCCESS(rv, rv);
- if (!exists)
- return NS_ERROR_FAILURE;
-
- NS_ADDREF(*_retval = defaultReader);
- return NS_OK;
-}
diff --git a/browser/components/shell/nsWindowsShellService.h b/browser/components/shell/nsWindowsShellService.h
deleted file mode 100644
index 06c6c3c9b..000000000
--- a/browser/components/shell/nsWindowsShellService.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef nswindowsshellservice_h____
-#define nswindowsshellservice_h____
-
-#include "nscore.h"
-#include "nsStringAPI.h"
-#include "nsIWindowsShellService.h"
-#include "nsITimer.h"
-
-#include <windows.h>
-#include <ole2.h>
-
-class nsWindowsShellService : public nsIWindowsShellService
-{
- virtual ~nsWindowsShellService();
-
-public:
- nsWindowsShellService();
-
- NS_DECL_ISUPPORTS
- NS_DECL_NSISHELLSERVICE
- NS_DECL_NSIWINDOWSSHELLSERVICE
-
-protected:
- bool IsDefaultBrowserVista(bool aCheckAllTypes, bool* aIsDefaultBrowser);
- nsresult LaunchControlPanelDefaultsSelectionUI();
- nsresult LaunchControlPanelDefaultPrograms();
- nsresult LaunchModernSettingsDialogDefaultApps();
- nsresult InvokeHTTPOpenAsVerb();
- nsresult LaunchHTTPHandlerPane();
-};
-
-#endif // nswindowsshellservice_h____