From 35c26c6c19e66fabcb230fb074e76e243df04d2b Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Tue, 25 Feb 2020 19:45:39 -0500 Subject: [PATCH] Issue #1053 - Remove android support from toolkit Note: Does not remove support completely from toolkit/mozapps/installer or from telemetry or AppConstants.jsm --- .../aboutmemory/content/aboutMemory.css | 6 - toolkit/components/alerts/nsAlertsService.cpp | 8 - toolkit/components/alerts/nsXULAlerts.cpp | 3 - .../blocklist/nsBlocklistService.js | 3 - toolkit/components/build/nsToolkitCompsCID.h | 4 +- .../components/build/nsToolkitCompsModule.cpp | 15 +- .../downloads/nsDownloadManager.cpp | 45 +- .../jsdownloads/src/DownloadIntegration.jsm | 28 +- .../jsdownloads/src/DownloadPlatform.cpp | 16 +- toolkit/components/moz.build | 19 +- .../osfile/modules/osfile_async_front.jsm | 33 +- .../osfile/modules/osfile_unix_back.jsm | 8 +- .../osfile/modules/osfile_unix_front.jsm | 21 +- toolkit/components/parentalcontrols/moz.build | 20 +- .../nsParentalControlsServiceAndroid.cpp | 103 -- toolkit/components/passwordmgr/moz.build | 20 +- .../components/passwordmgr/nsLoginManager.js | 4 - .../passwordmgr/nsLoginManagerPrompter.js | 3 +- .../passwordmgr/passwordmgr.manifest | 5 - .../passwordmgr/storage-mozStorage.js | 1262 ----------------- toolkit/components/satchel/FormHistory.jsm | 4 - .../satchel/nsFormFillController.cpp | 2 - toolkit/components/satchel/nsFormHistory.js | 20 - toolkit/components/search/nsSearchService.js | 33 - .../url-classifier/nsUrlClassifierUtils.cpp | 4 +- toolkit/content/aboutSupport.js | 10 - toolkit/content/aboutSupport.xhtml | 5 - toolkit/content/aboutTelemetry.js | 8 - toolkit/content/buildconfig.html | 4 - toolkit/content/contentAreaUtils.js | 34 +- toolkit/content/jar.mn | 2 - toolkit/content/moz.build | 3 - toolkit/library/libxul.mk | 2 - toolkit/library/moz.build | 2 +- toolkit/modules/Services.jsm | 3 - toolkit/modules/moz.build | 16 +- toolkit/moz.build | 19 +- toolkit/moz.configure | 49 +- .../mozapps/extensions/extensions.manifest | 6 +- toolkit/mozapps/extensions/internal/moz.build | 7 +- toolkit/nss.configure | 2 +- toolkit/profile/nsToolkitProfileService.cpp | 4 +- toolkit/system/androidproxy/moz.build | 11 - .../nsAndroidSystemProxySettings.cpp | 89 -- toolkit/themes/mobile/global/empty.css | 7 - toolkit/themes/mobile/global/icons/Error.png | Bin 2148 -> 0 bytes .../global/media/TopLevelImageDocument.css | 17 - .../global/media/TopLevelVideoDocument.css | 12 - .../global/media/clicktoplay-bgtexture.png | Bin 1751 -> 0 bytes toolkit/themes/mobile/global/media/error.png | Bin 433 -> 0 bytes .../global/media/imagedoc-darknoise.png | Bin 3050 -> 0 bytes .../global/media/imagedoc-lightnoise.png | Bin 4025 -> 0 bytes .../themes/mobile/global/media/throbber.png | Bin 30718 -> 0 bytes .../global/media/videoClickToPlayButton.svg | 30 - toolkit/themes/mobile/jar.mn | 55 - toolkit/themes/mobile/moz.build | 7 - .../mozapps/plugins/contentPluginActivate.png | Bin 3043 -> 0 bytes .../mozapps/plugins/contentPluginBlocked.png | Bin 1514 -> 0 bytes .../mozapps/plugins/contentPluginClose.png | Bin 1370 -> 0 bytes .../mozapps/plugins/contentPluginCrashed.png | Bin 1470 -> 0 bytes .../mozapps/plugins/contentPluginDisabled.png | Bin 1620 -> 0 bytes .../mozapps/plugins/contentPluginStripe.png | Bin 460 -> 0 bytes .../mobile/mozapps/plugins/pluginProblem.css | 196 --- toolkit/themes/moz.build | 3 - toolkit/themes/shared/mozapps.inc.mn | 2 - toolkit/toolkit.mozbuild | 8 +- toolkit/xre/moz.build | 19 +- toolkit/xre/nsAndroidStartup.cpp | 45 - toolkit/xre/nsAppRunner.cpp | 25 +- toolkit/xre/nsEmbedFunctions.cpp | 8 - toolkit/xre/nsSigHandlers.cpp | 6 +- toolkit/xre/nsUpdateDriver.cpp | 2 +- toolkit/xre/nsXREDirProvider.cpp | 13 - 73 files changed, 105 insertions(+), 2315 deletions(-) delete mode 100644 toolkit/components/parentalcontrols/nsParentalControlsServiceAndroid.cpp delete mode 100644 toolkit/components/passwordmgr/storage-mozStorage.js delete mode 100644 toolkit/system/androidproxy/moz.build delete mode 100644 toolkit/system/androidproxy/nsAndroidSystemProxySettings.cpp delete mode 100644 toolkit/themes/mobile/global/empty.css delete mode 100644 toolkit/themes/mobile/global/icons/Error.png delete mode 100644 toolkit/themes/mobile/global/media/TopLevelImageDocument.css delete mode 100644 toolkit/themes/mobile/global/media/TopLevelVideoDocument.css delete mode 100644 toolkit/themes/mobile/global/media/clicktoplay-bgtexture.png delete mode 100644 toolkit/themes/mobile/global/media/error.png delete mode 100644 toolkit/themes/mobile/global/media/imagedoc-darknoise.png delete mode 100644 toolkit/themes/mobile/global/media/imagedoc-lightnoise.png delete mode 100644 toolkit/themes/mobile/global/media/throbber.png delete mode 100644 toolkit/themes/mobile/global/media/videoClickToPlayButton.svg delete mode 100644 toolkit/themes/mobile/jar.mn delete mode 100644 toolkit/themes/mobile/moz.build delete mode 100644 toolkit/themes/mobile/mozapps/plugins/contentPluginActivate.png delete mode 100644 toolkit/themes/mobile/mozapps/plugins/contentPluginBlocked.png delete mode 100644 toolkit/themes/mobile/mozapps/plugins/contentPluginClose.png delete mode 100644 toolkit/themes/mobile/mozapps/plugins/contentPluginCrashed.png delete mode 100644 toolkit/themes/mobile/mozapps/plugins/contentPluginDisabled.png delete mode 100644 toolkit/themes/mobile/mozapps/plugins/contentPluginStripe.png delete mode 100644 toolkit/themes/mobile/mozapps/plugins/pluginProblem.css delete mode 100644 toolkit/xre/nsAndroidStartup.cpp diff --git a/toolkit/components/aboutmemory/content/aboutMemory.css b/toolkit/components/aboutmemory/content/aboutMemory.css index b63bbac13..cf4d36de8 100644 --- a/toolkit/components/aboutmemory/content/aboutMemory.css +++ b/toolkit/components/aboutmemory/content/aboutMemory.css @@ -2,12 +2,6 @@ * 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/. */ -/* - * The version used for mobile is located at - * mobile/android/themes/core/aboutMemory.css. - * Desktop-specific stuff is at the bottom of this file. - */ - html { background: -moz-Dialog; font: message-box; diff --git a/toolkit/components/alerts/nsAlertsService.cpp b/toolkit/components/alerts/nsAlertsService.cpp index 73dbb265c..4f248c861 100644 --- a/toolkit/components/alerts/nsAlertsService.cpp +++ b/toolkit/components/alerts/nsAlertsService.cpp @@ -273,26 +273,18 @@ NS_IMETHODIMP nsAlertsService::CloseAlert(const nsAString& aAlertName, // nsIAlertsDoNotDisturb NS_IMETHODIMP nsAlertsService::GetManualDoNotDisturb(bool* aRetVal) { -#ifdef MOZ_WIDGET_ANDROID - return NS_ERROR_NOT_IMPLEMENTED; -#else nsCOMPtr alertsDND(GetDNDBackend()); NS_ENSURE_TRUE(alertsDND, NS_ERROR_NOT_IMPLEMENTED); return alertsDND->GetManualDoNotDisturb(aRetVal); -#endif } NS_IMETHODIMP nsAlertsService::SetManualDoNotDisturb(bool aDoNotDisturb) { -#ifdef MOZ_WIDGET_ANDROID - return NS_ERROR_NOT_IMPLEMENTED; -#else nsCOMPtr alertsDND(GetDNDBackend()); NS_ENSURE_TRUE(alertsDND, NS_ERROR_NOT_IMPLEMENTED); nsresult rv = alertsDND->SetManualDoNotDisturb(aDoNotDisturb); return rv; -#endif } already_AddRefed diff --git a/toolkit/components/alerts/nsXULAlerts.cpp b/toolkit/components/alerts/nsXULAlerts.cpp index d353d8714..47e72a27f 100644 --- a/toolkit/components/alerts/nsXULAlerts.cpp +++ b/toolkit/components/alerts/nsXULAlerts.cpp @@ -66,13 +66,10 @@ NS_IMPL_ISUPPORTS(nsXULAlerts, nsIAlertsService, nsIAlertsDoNotDisturb, nsIAlert /* static */ already_AddRefed nsXULAlerts::GetInstance() { - // Gecko on Android does not fully support XUL windows. -#ifndef MOZ_WIDGET_ANDROID if (!gXULAlerts) { gXULAlerts = new nsXULAlerts(); ClearOnShutdown(&gXULAlerts); } -#endif // MOZ_WIDGET_ANDROID RefPtr instance = gXULAlerts.get(); return instance.forget(); } diff --git a/toolkit/components/blocklist/nsBlocklistService.js b/toolkit/components/blocklist/nsBlocklistService.js index 788ce192f..67f283b26 100644 --- a/toolkit/components/blocklist/nsBlocklistService.js +++ b/toolkit/components/blocklist/nsBlocklistService.js @@ -1117,9 +1117,6 @@ Blocklist.prototype = { /* See nsIBlocklistService */ getPluginBlocklistState: function(plugin, appVersion, toolkitVersion) { -#ifdef MOZ_WIDGET_ANDROID - return Ci.nsIBlocklistService.STATE_NOT_BLOCKED; -#endif if (!this._isBlocklistLoaded()) this._loadBlocklist(); return this._getPluginBlocklistState(plugin, this._pluginEntries, diff --git a/toolkit/components/build/nsToolkitCompsCID.h b/toolkit/components/build/nsToolkitCompsCID.h index 064f1dbc4..9e61edb26 100644 --- a/toolkit/components/build/nsToolkitCompsCID.h +++ b/toolkit/components/build/nsToolkitCompsCID.h @@ -81,7 +81,7 @@ #define NS_APPSTARTUP_CONTRACTID \ "@mozilla.org/toolkit/app-startup;1" -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER #define NS_UPDATEPROCESSOR_CONTRACTID \ "@mozilla.org/updates/update-processor;1" #endif @@ -170,7 +170,7 @@ #define NS_FAVICONSERVICE_CID \ { 0x984e3259, 0x9266, 0x49cf, { 0xb6, 0x05, 0x60, 0xb0, 0x22, 0xa0, 0x07, 0x56 } } -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER #define NS_UPDATEPROCESSOR_CID \ { 0xf3dcf644, 0x79e8, 0x4f59, { 0xa1, 0xbb, 0x87, 0x84, 0x54, 0x48, 0x8e, 0xf9 } } #endif diff --git a/toolkit/components/build/nsToolkitCompsModule.cpp b/toolkit/components/build/nsToolkitCompsModule.cpp index a4293c6f9..420ff258a 100644 --- a/toolkit/components/build/nsToolkitCompsModule.cpp +++ b/toolkit/components/build/nsToolkitCompsModule.cpp @@ -10,7 +10,7 @@ #endif #include "nsToolkitCompsCID.h" #include "nsFindService.h" -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER #include "nsUpdateDriver.h" #endif @@ -47,13 +47,8 @@ #include "NativeFileWatcherNotSupported.h" #endif // (XP_WIN) -#if !defined(MOZ_WIDGET_ANDROID) #define MOZ_HAS_TERMINATOR -#endif - -#if defined(MOZ_HAS_TERMINATOR) #include "nsTerminator.h" -#endif #define MOZ_HAS_PERFSTATS @@ -122,7 +117,7 @@ nsUrlClassifierDBServiceConstructor(nsISupports *aOuter, REFNSIID aIID, #endif NS_GENERIC_FACTORY_CONSTRUCTOR(nsBrowserStatusFilter) -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER NS_GENERIC_FACTORY_CONSTRUCTOR(nsUpdateProcessor) #endif NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(FinalizationWitnessService, Init) @@ -160,7 +155,7 @@ NS_DEFINE_NAMED_CID(NS_URLCLASSIFIERSTREAMUPDATER_CID); NS_DEFINE_NAMED_CID(NS_URLCLASSIFIERUTILS_CID); #endif NS_DEFINE_NAMED_CID(NS_BROWSERSTATUSFILTER_CID); -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER NS_DEFINE_NAMED_CID(NS_UPDATEPROCESSOR_CID); #endif NS_DEFINE_NAMED_CID(FINALIZATIONWITNESSSERVICE_CID); @@ -197,7 +192,7 @@ static const Module::CIDEntry kToolkitCIDs[] = { { &kNS_URLCLASSIFIERUTILS_CID, false, nullptr, nsUrlClassifierUtilsConstructor }, #endif { &kNS_BROWSERSTATUSFILTER_CID, false, nullptr, nsBrowserStatusFilterConstructor }, -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER { &kNS_UPDATEPROCESSOR_CID, false, nullptr, nsUpdateProcessorConstructor }, #endif { &kFINALIZATIONWITNESSSERVICE_CID, false, nullptr, FinalizationWitnessServiceConstructor }, @@ -236,7 +231,7 @@ static const Module::ContractIDEntry kToolkitContracts[] = { { NS_URLCLASSIFIERUTILS_CONTRACTID, &kNS_URLCLASSIFIERUTILS_CID }, #endif { NS_BROWSERSTATUSFILTER_CONTRACTID, &kNS_BROWSERSTATUSFILTER_CID }, -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER { NS_UPDATEPROCESSOR_CONTRACTID, &kNS_UPDATEPROCESSOR_CID }, #endif { FINALIZATIONWITNESSSERVICE_CONTRACTID, &kFINALIZATIONWITNESSSERVICE_CID }, diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/components/downloads/nsDownloadManager.cpp index ab984c5f2..9f43ade2c 100644 --- a/toolkit/components/downloads/nsDownloadManager.cpp +++ b/toolkit/components/downloads/nsDownloadManager.cpp @@ -61,10 +61,6 @@ #include #endif -#ifdef MOZ_WIDGET_ANDROID -#include "FennecJNIWrappers.h" -#endif - #ifdef MOZ_WIDGET_GTK #include #endif @@ -1421,19 +1417,6 @@ nsDownloadManager::GetDefaultDownloadsDirectory(nsIFile **aResult) } } #elif defined(XP_UNIX) -#if defined(MOZ_WIDGET_ANDROID) - // Android doesn't have a $HOME directory, and by default we only have - // write access to /data/data/org.mozilla.{$APP} and /sdcard - char* downloadDirPath = getenv("DOWNLOADS_DIRECTORY"); - if (downloadDirPath) { - rv = NS_NewNativeLocalFile(nsDependentCString(downloadDirPath), - true, getter_AddRefs(downloadDir)); - NS_ENSURE_SUCCESS(rv, rv); - } - else { - rv = NS_ERROR_FAILURE; - } -#else rv = dirService->Get(NS_UNIX_DEFAULT_DOWNLOAD_DIR, NS_GET_IID(nsIFile), getter_AddRefs(downloadDir)); @@ -1446,7 +1429,6 @@ nsDownloadManager::GetDefaultDownloadsDirectory(nsIFile **aResult) rv = downloadDir->Append(folderName); NS_ENSURE_SUCCESS(rv, rv); } -#endif #else rv = dirService->Get(NS_OS_HOME_DIR, NS_GET_IID(nsIFile), @@ -2685,14 +2667,6 @@ nsDownload::SetState(DownloadState aState) case nsIDownloadManager::DOWNLOAD_DIRTY: case nsIDownloadManager::DOWNLOAD_CANCELED: case nsIDownloadManager::DOWNLOAD_FAILED: -#ifdef ANDROID - // If we still have a temp file, remove it - bool tempExists; - if (mTempFile && NS_SUCCEEDED(mTempFile->Exists(&tempExists)) && tempExists) { - nsresult rv = mTempFile->Remove(false); - NS_ENSURE_SUCCESS(rv, rv); - } -#endif // Transfers are finished, so break the reference cycle Finalize(); @@ -2770,7 +2744,7 @@ nsDownload::SetState(DownloadState aState) } } -#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GTK) +#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_GTK) nsCOMPtr fileURL = do_QueryInterface(mTarget); nsCOMPtr file; nsAutoString path; @@ -2780,27 +2754,13 @@ nsDownload::SetState(DownloadState aState) file && NS_SUCCEEDED(file->GetPath(path))) { -#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_ANDROID) +#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK) // On Windows and Gtk, add the download to the system's "recent documents" // list, with a pref to disable. { bool addToRecentDocs = true; if (pref) pref->GetBoolPref(PREF_BDM_ADDTORECENTDOCS, &addToRecentDocs); -#ifdef MOZ_WIDGET_ANDROID - if (addToRecentDocs) { - nsCOMPtr mimeInfo; - nsAutoCString contentType; - GetMIMEInfo(getter_AddRefs(mimeInfo)); - - if (mimeInfo) - mimeInfo->GetMIMEType(contentType); - - if (jni::IsFennec()) { - java::DownloadsIntegration::ScanMedia(path, NS_ConvertUTF8toUTF16(contentType)); - } - } -#else if (addToRecentDocs && !mPrivate) { #ifdef XP_WIN ::SHAddToRecentDocs(SHARD_PATHW, path.get()); @@ -2815,7 +2775,6 @@ nsDownload::SetState(DownloadState aState) } #endif } -#endif #ifdef MOZ_ENABLE_GIO // Use GIO to store the source URI for later display in the file manager. GFile* gio_file = g_file_new_for_path(NS_ConvertUTF16toUTF8(path).get()); diff --git a/toolkit/components/jsdownloads/src/DownloadIntegration.jsm b/toolkit/components/jsdownloads/src/DownloadIntegration.jsm index 995cc0669..7656128d2 100644 --- a/toolkit/components/jsdownloads/src/DownloadIntegration.jsm +++ b/toolkit/components/jsdownloads/src/DownloadIntegration.jsm @@ -70,10 +70,6 @@ XPCOMUtils.defineLazyServiceGetter(this, "gMIMEService", XPCOMUtils.defineLazyServiceGetter(this, "gExternalProtocolService", "@mozilla.org/uriloader/external-protocol-service;1", "nsIExternalProtocolService"); -#ifdef MOZ_WIDGET_ANDROID -XPCOMUtils.defineLazyModuleGetter(this, "RuntimePermissions", - "resource://gre/modules/RuntimePermissions.jsm"); -#endif XPCOMUtils.defineLazyGetter(this, "gParentalControlsService", function() { if ("@mozilla.org/parental-controls-service;1" in Cc) { @@ -299,14 +295,10 @@ this.DownloadIntegration = { aDownload.hasBlockedData) { return true; } -#if defined(MOZ_WIDGET_ANDROID) - // On Android we store all history. - return true; -#else + // On Desktop, stopped downloads for which we don't need to track the // presence of a ".part" file are only retained in the browser history. return false; -#endif }, /** @@ -332,16 +324,8 @@ this.DownloadIntegration = { } else { directoryPath = this._getDirectory("DfltDwnld"); } + #elifdef XP_UNIX -#ifdef MOZ_WIDGET_ANDROID - // Android doesn't have a $HOME directory, and by default we only have - // write access to /data/data/org.mozilla.{$APP} and /sdcard - directoryPath = gEnvironment.get("DOWNLOADS_DIRECTORY"); - if (!directoryPath) { - throw new Components.Exception("DOWNLOADS_DIRECTORY is not set.", - Cr.NS_ERROR_FILE_UNRECOGNIZED_PATH); - } -#else // For Linux, use XDG download dir, with a fallback to Home/Downloads // if the XDG user dirs are disabled. try { @@ -349,7 +333,6 @@ this.DownloadIntegration = { } catch(e) { directoryPath = yield this._createDownloadsDirectory("Home"); } -#endif #else directoryPath = yield this._createDownloadsDirectory("Home"); #endif @@ -403,8 +386,6 @@ this.DownloadIntegration = { let directoryPath = null; #ifdef XP_MACOSX directoryPath = yield this.getPreferredDownloadsDirectory(); -#elifdef MOZ_WIDGET_ANDROID - directoryPath = yield this.getSystemDownloadsDirectory(); #else directoryPath = this._getDirectory("TmpD"); #endif @@ -443,12 +424,7 @@ this.DownloadIntegration = { * @resolves The boolean indicates to block downloads or not. */ shouldBlockForRuntimePermissions() { -#ifdef MOZ_WIDGET_ANDROID - return RuntimePermissions.waitForPermissions(RuntimePermissions.WRITE_EXTERNAL_STORAGE) - .then(permissionGranted => !permissionGranted); -#else return Promise.resolve(false); -#endif }, /** diff --git a/toolkit/components/jsdownloads/src/DownloadPlatform.cpp b/toolkit/components/jsdownloads/src/DownloadPlatform.cpp index d91124ee6..66ad2b8fa 100644 --- a/toolkit/components/jsdownloads/src/DownloadPlatform.cpp +++ b/toolkit/components/jsdownloads/src/DownloadPlatform.cpp @@ -30,10 +30,6 @@ #include "../../../../xpcom/io/CocoaFileUtils.h" #endif -#ifdef MOZ_WIDGET_ANDROID -#include "FennecJNIWrappers.h" -#endif - #ifdef MOZ_WIDGET_GTK #include #endif @@ -101,21 +97,15 @@ CFURLRef CreateCFURLFromNSIURI(nsIURI *aURI) { nsresult DownloadPlatform::DownloadDone(nsIURI* aSource, nsIURI* aReferrer, nsIFile* aTarget, const nsACString& aContentType, bool aIsPrivate) { -#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_ANDROID) \ - || defined(MOZ_WIDGET_GTK) +#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_GTK) nsAutoString path; if (aTarget && NS_SUCCEEDED(aTarget->GetPath(path))) { -#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_ANDROID) +#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK) // On Windows and Gtk, add the download to the system's "recent documents" // list, with a pref to disable. { bool addToRecentDocs = Preferences::GetBool(PREF_BDM_ADDTORECENTDOCS); -#ifdef MOZ_WIDGET_ANDROID - if (jni::IsFennec() && addToRecentDocs) { - java::DownloadsIntegration::ScanMedia(path, aContentType); - } -#else if (addToRecentDocs && !aIsPrivate) { #ifdef XP_WIN ::SHAddToRecentDocs(SHARD_PATHW, path.get()); @@ -130,7 +120,7 @@ nsresult DownloadPlatform::DownloadDone(nsIURI* aSource, nsIURI* aReferrer, nsIF } #endif } -#endif + #ifdef MOZ_ENABLE_GIO // Use GIO to store the source URI for later display in the file manager. GFile* gio_file = g_file_new_for_path(NS_ConvertUTF16toUTF8(path).get()); diff --git a/toolkit/components/moz.build b/toolkit/components/moz.build index ab759366c..ff71d7c9d 100644 --- a/toolkit/components/moz.build +++ b/toolkit/components/moz.build @@ -66,11 +66,10 @@ DIRS += [ DIRS += ['mozintl'] -if not CONFIG['MOZ_FENNEC']: - DIRS += ['narrate', 'viewsource']; +DIRS += ['narrate', 'viewsource']; - if CONFIG['NS_PRINTING']: - DIRS += ['printing'] +if CONFIG['NS_PRINTING']: + DIRS += ['printing'] if CONFIG['BUILD_CTYPES']: DIRS += ['ctypes'] @@ -94,13 +93,11 @@ if CONFIG['MOZ_URL_CLASSIFIER']: DIRS += ['captivedetect'] -if CONFIG['OS_TARGET'] != 'Android': - DIRS += ['terminator'] +DIRS += ['terminator'] DIRS += ['build'] -if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'android': - EXTRA_COMPONENTS += [ - 'nsDefaultCLH.js', - 'nsDefaultCLH.manifest', - ] +EXTRA_COMPONENTS += [ + 'nsDefaultCLH.js', + 'nsDefaultCLH.manifest', +] diff --git a/toolkit/components/osfile/modules/osfile_async_front.jsm b/toolkit/components/osfile/modules/osfile_async_front.jsm index 9f3b7fb21..698ac8732 100644 --- a/toolkit/components/osfile/modules/osfile_async_front.jsm +++ b/toolkit/components/osfile/modules/osfile_async_front.jsm @@ -728,26 +728,19 @@ File.prototype = { } }; - -if (SharedAll.Constants.Sys.Name != "Android") { - /** - * Set the last access and modification date of the file. - * The time stamp resolution is 1 second at best, but might be worse - * depending on the platform. - * - * WARNING: This method is not implemented on Android. On Android, - * you should use File.setDates instead. - * - * @return {promise} - * @rejects {TypeError} - * @rejects {OS.File.Error} - */ - File.prototype.setDates = function(accessDate, modificationDate) { - return Scheduler.post("File_prototype_setDates", - [this._fdmsg, accessDate, modificationDate], this); - }; -} - + /** + * Set the last access and modification date of the file. + * The time stamp resolution is 1 second at best, but might be worse + * depending on the platform. + * + * @return {promise} + * @rejects {TypeError} + * @rejects {OS.File.Error} + */ +File.prototype.setDates = function(accessDate, modificationDate) { + return Scheduler.post("File_prototype_setDates", + [this._fdmsg, accessDate, modificationDate], this); +}; /** * Open a file asynchronously. diff --git a/toolkit/components/osfile/modules/osfile_unix_back.jsm b/toolkit/components/osfile/modules/osfile_unix_back.jsm index 7c2c6f28d..4cc444567 100644 --- a/toolkit/components/osfile/modules/osfile_unix_back.jsm +++ b/toolkit/components/osfile/modules/osfile_unix_back.jsm @@ -372,14 +372,14 @@ // Two variants of |getwd| which allocate the memory // dynamically. - // Linux/Android version + // Linux version libc.declareLazyFFI(SysFile, "get_current_dir_name", "get_current_dir_name", ctypes.default_abi, /*return*/ Type.out_path.releaseWithLazy(() => SysFile.free )); - // MacOS/BSD version (will return NULL on Linux/Android) + // MacOS/BSD version (will return NULL on Linux) libc.declareLazyFFI(SysFile, "getwd_auto", "getwd", ctypes.default_abi, /*return*/ Type.out_path.releaseWithLazy(() => @@ -520,13 +520,13 @@ /*fd_out*/ Type.fd, /*off_out*/Type.off_t.in_ptr, /*len*/ Type.size_t, - /*flags*/ Type.unsigned_int); // Linux/Android-specific + /*flags*/ Type.unsigned_int); // Linux-specific libc.declareLazyFFI(SysFile, "statfs", "statfs", ctypes.default_abi, /*return*/ Type.negativeone_or_nothing, /*path*/ Type.path, - /*buf*/ Type.statvfs.out_ptr); // Android,B2G + /*buf*/ Type.statvfs.out_ptr); // Other platforms libc.declareLazyFFI(SysFile, "statvfs", "statvfs", ctypes.default_abi, diff --git a/toolkit/components/osfile/modules/osfile_unix_front.jsm b/toolkit/components/osfile/modules/osfile_unix_front.jsm index bd60d4d84..4e41036df 100644 --- a/toolkit/components/osfile/modules/osfile_unix_front.jsm +++ b/toolkit/components/osfile/modules/osfile_unix_front.jsm @@ -204,10 +204,7 @@ * The time stamp resolution is 1 second at best, but might be worse * depending on the platform. * - * WARNING: This method is not implemented on Android/B2G. On Android/B2G, - * you should use File.setDates instead. - * - * @param {Date,number=} accessDate The last access date. If numeric, + * @param {Date,number=} accessDate The last access date. If numeric, * milliseconds since epoch. If omitted or null, then the current date * will be used. * @param {Date,number=} modificationDate The last modification date. If @@ -217,14 +214,12 @@ * @throws {TypeError} In case of invalid parameters. * @throws {OS.File.Error} In case of I/O error. */ - if (SharedAll.Constants.Sys.Name != "Android") { - File.prototype.setDates = function(accessDate, modificationDate) { - let {value, ptr} = datesToTimevals(accessDate, modificationDate); - throw_on_negative("setDates", - UnixFile.futimes(this.fd, ptr), - this._path); - }; - } + File.prototype.setDates = function(accessDate, modificationDate) { + let {value, ptr} = datesToTimevals(accessDate, modificationDate); + throw_on_negative("setDates", + UnixFile.futimes(this.fd, ptr), + this._path); + }; /** * Flushes the file's buffers and causes all buffered data @@ -576,7 +571,7 @@ if (UnixFile.splice) { const BUFSIZE = 1 << 17; - // An implementation of |pump| using |splice| (for Linux/Android) + // An implementation of |pump| using |splice| (for Linux) pump = function pump_splice(source, dest, options = {}) { let nbytes = options.nbytes > 0 ? options.nbytes : Infinity; let pipe = []; diff --git a/toolkit/components/parentalcontrols/moz.build b/toolkit/components/parentalcontrols/moz.build index 083312fef..17db8aaee 100644 --- a/toolkit/components/parentalcontrols/moz.build +++ b/toolkit/components/parentalcontrols/moz.build @@ -4,28 +4,16 @@ # 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/. -XPIDL_SOURCES += [ - 'nsIParentalControlsService.idl', -] +XPIDL_SOURCES += ['nsIParentalControlsService.idl'] XPIDL_MODULE = 'parentalcontrols' if not CONFIG['MOZ_DISABLE_PARENTAL_CONTROLS']: if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': - SOURCES += [ - 'nsParentalControlsServiceWin.cpp', - ] + SOURCES += ['nsParentalControlsServiceWin.cpp'] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': - UNIFIED_SOURCES += [ - 'nsParentalControlsServiceCocoa.mm', - ] - elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': - UNIFIED_SOURCES += [ - 'nsParentalControlsServiceAndroid.cpp', - ] + UNIFIED_SOURCES += ['nsParentalControlsServiceCocoa.mm'] else: - SOURCES += [ - 'nsParentalControlsServiceDefault.cpp', - ] + SOURCES += ['nsParentalControlsServiceDefault.cpp'] FINAL_LIBRARY = 'xul' diff --git a/toolkit/components/parentalcontrols/nsParentalControlsServiceAndroid.cpp b/toolkit/components/parentalcontrols/nsParentalControlsServiceAndroid.cpp deleted file mode 100644 index 364749000..000000000 --- a/toolkit/components/parentalcontrols/nsParentalControlsServiceAndroid.cpp +++ /dev/null @@ -1,103 +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 "nsParentalControlsService.h" -#include "nsString.h" -#include "nsIFile.h" -#include "FennecJNIWrappers.h" - -namespace java = mozilla::java; - -NS_IMPL_ISUPPORTS(nsParentalControlsService, nsIParentalControlsService) - -nsParentalControlsService::nsParentalControlsService() : - mEnabled(false) -{ - if (mozilla::jni::IsFennec()) { - mEnabled = java::Restrictions::IsUserRestricted(); - } -} - -nsParentalControlsService::~nsParentalControlsService() -{ -} - -NS_IMETHODIMP -nsParentalControlsService::GetParentalControlsEnabled(bool *aResult) -{ - *aResult = mEnabled; - return NS_OK; -} - -NS_IMETHODIMP -nsParentalControlsService::GetBlockFileDownloadsEnabled(bool *aResult) -{ - // NOTE: isAllowed returns the opposite intention, so we need to flip it - bool res; - IsAllowed(nsIParentalControlsService::DOWNLOAD, NULL, &res); - *aResult = !res; - - return NS_OK; -} - -NS_IMETHODIMP -nsParentalControlsService::GetLoggingEnabled(bool *aResult) -{ - // Android doesn't currently have any method of logging restricted actions. - *aResult = false; - return NS_OK; -} - -NS_IMETHODIMP -nsParentalControlsService::Log(int16_t aEntryType, - bool aBlocked, - nsIURI *aSource, - nsIFile *aTarget) -{ - return NS_ERROR_NOT_AVAILABLE; -} - -NS_IMETHODIMP -nsParentalControlsService::RequestURIOverride(nsIURI *aTarget, - nsIInterfaceRequestor *aWindowContext, - bool *_retval) -{ - return NS_ERROR_NOT_AVAILABLE; -} - -NS_IMETHODIMP -nsParentalControlsService::RequestURIOverrides(nsIArray *aTargets, - nsIInterfaceRequestor *aWindowContext, - bool *_retval) -{ - return NS_ERROR_NOT_AVAILABLE; -} - -NS_IMETHODIMP -nsParentalControlsService::IsAllowed(int16_t aAction, - nsIURI *aUri, - bool *_retval) -{ - nsresult rv = NS_OK; - *_retval = true; - - if (!mEnabled) { - return rv; - } - - if (mozilla::jni::IsFennec()) { - nsAutoCString url; - if (aUri) { - rv = aUri->GetSpec(url); - NS_ENSURE_SUCCESS(rv, rv); - } - - *_retval = java::Restrictions::IsAllowed(aAction, - NS_ConvertUTF8toUTF16(url)); - return rv; - } - - return NS_ERROR_NOT_AVAILABLE; -} diff --git a/toolkit/components/passwordmgr/moz.build b/toolkit/components/passwordmgr/moz.build index 189f4925b..145e2fca4 100644 --- a/toolkit/components/passwordmgr/moz.build +++ b/toolkit/components/passwordmgr/moz.build @@ -39,18 +39,14 @@ EXTRA_JS_MODULES += [ EXTRA_PP_JS_MODULES += ['OSCrypto.jsm'] -if CONFIG['OS_TARGET'] == 'Android': - EXTRA_COMPONENTS += [ - 'storage-mozStorage.js', - ] -else: - EXTRA_COMPONENTS += [ - 'storage-json.js', - ] - EXTRA_JS_MODULES += [ - 'LoginImport.jsm', - 'LoginStore.jsm', - ] +EXTRA_COMPONENTS += [ + 'storage-json.js', +] + +EXTRA_JS_MODULES += [ + 'LoginImport.jsm', + 'LoginStore.jsm', +] if CONFIG['OS_TARGET'] == 'WINNT': EXTRA_JS_MODULES += [ diff --git a/toolkit/components/passwordmgr/nsLoginManager.js b/toolkit/components/passwordmgr/nsLoginManager.js index 87466fe5c..84b0319cb 100644 --- a/toolkit/components/passwordmgr/nsLoginManager.js +++ b/toolkit/components/passwordmgr/nsLoginManager.js @@ -112,11 +112,7 @@ LoginManager.prototype = { _initStorage() { -#ifdef MOZ_WIDGET_ANDROID - let contractID = "@mozilla.org/login-manager/storage/mozStorage;1"; -#else let contractID = "@mozilla.org/login-manager/storage/json;1"; -#endif try { let catMan = Cc["@mozilla.org/categorymanager;1"]. diff --git a/toolkit/components/passwordmgr/nsLoginManagerPrompter.js b/toolkit/components/passwordmgr/nsLoginManagerPrompter.js index c4be39e31..5fb1ee83e 100644 --- a/toolkit/components/passwordmgr/nsLoginManagerPrompter.js +++ b/toolkit/components/passwordmgr/nsLoginManagerPrompter.js @@ -19,8 +19,7 @@ const LoginInfo = const BRAND_BUNDLE = "chrome://branding/locale/brand.properties"; /** - * Constants for password prompt telemetry. - * Mirrored in mobile/android/components/LoginManagerPrompter.js */ + * Constants for password prompt telemetry. */ const PROMPT_DISPLAYED = 0; const PROMPT_ADD_OR_UPDATE = 1; diff --git a/toolkit/components/passwordmgr/passwordmgr.manifest b/toolkit/components/passwordmgr/passwordmgr.manifest index 72e9ccffb..c2c37ebff 100644 --- a/toolkit/components/passwordmgr/passwordmgr.manifest +++ b/toolkit/components/passwordmgr/passwordmgr.manifest @@ -6,12 +6,7 @@ component {8aa66d77-1bbb-45a6-991e-b8f47751c291} nsLoginManagerPrompter.js contract @mozilla.org/login-manager/prompter;1 {8aa66d77-1bbb-45a6-991e-b8f47751c291} component {0f2f347c-1e4f-40cc-8efd-792dea70a85e} nsLoginInfo.js contract @mozilla.org/login-manager/loginInfo;1 {0f2f347c-1e4f-40cc-8efd-792dea70a85e} -#ifdef ANDROID -component {8c2023b9-175c-477e-9761-44ae7b549756} storage-mozStorage.js -contract @mozilla.org/login-manager/storage/mozStorage;1 {8c2023b9-175c-477e-9761-44ae7b549756} -#else component {c00c432d-a0c9-46d7-bef6-9c45b4d07341} storage-json.js contract @mozilla.org/login-manager/storage/json;1 {c00c432d-a0c9-46d7-bef6-9c45b4d07341} -#endif component {dc6c2976-0f73-4f1f-b9ff-3d72b4e28309} crypto-SDR.js contract @mozilla.org/login-manager/crypto/SDR;1 {dc6c2976-0f73-4f1f-b9ff-3d72b4e28309} \ No newline at end of file diff --git a/toolkit/components/passwordmgr/storage-mozStorage.js b/toolkit/components/passwordmgr/storage-mozStorage.js deleted file mode 100644 index 9da244f7a..000000000 --- a/toolkit/components/passwordmgr/storage-mozStorage.js +++ /dev/null @@ -1,1262 +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/. */ - -const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; -const DB_VERSION = 6; // The database schema version -const PERMISSION_SAVE_LOGINS = "login-saving"; - -Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); -Components.utils.import("resource://gre/modules/Services.jsm"); -Components.utils.import("resource://gre/modules/Promise.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "LoginHelper", - "resource://gre/modules/LoginHelper.jsm"); - -/** - * Object that manages a database transaction properly so consumers don't have - * to worry about it throwing. - * - * @param aDatabase - * The mozIStorageConnection to start a transaction on. - */ -function Transaction(aDatabase) { - this._db = aDatabase; - - this._hasTransaction = false; - try { - this._db.beginTransaction(); - this._hasTransaction = true; - } catch (e) { /* om nom nom exceptions */ } -} - -Transaction.prototype = { - commit : function() { - if (this._hasTransaction) - this._db.commitTransaction(); - }, - - rollback : function() { - if (this._hasTransaction) - this._db.rollbackTransaction(); - }, -}; - - -function LoginManagerStorage_mozStorage() { } - -LoginManagerStorage_mozStorage.prototype = { - - classID : Components.ID("{8c2023b9-175c-477e-9761-44ae7b549756}"), - QueryInterface : XPCOMUtils.generateQI([Ci.nsILoginManagerStorage, - Ci.nsIInterfaceRequestor]), - getInterface : function(aIID) { - if (aIID.equals(Ci.nsIVariant)) { - // Allows unwrapping the JavaScript object for regression tests. - return this; - } - - if (aIID.equals(Ci.mozIStorageConnection)) { - return this._dbConnection; - } - - throw new Components.Exception("Interface not available", Cr.NS_ERROR_NO_INTERFACE); - }, - - __crypto : null, // nsILoginManagerCrypto service - get _crypto() { - if (!this.__crypto) - this.__crypto = Cc["@mozilla.org/login-manager/crypto/SDR;1"]. - getService(Ci.nsILoginManagerCrypto); - return this.__crypto; - }, - - __profileDir: null, // nsIFile for the user's profile dir - get _profileDir() { - if (!this.__profileDir) - this.__profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile); - return this.__profileDir; - }, - - __storageService: null, // Storage service for using mozStorage - get _storageService() { - if (!this.__storageService) - this.__storageService = Cc["@mozilla.org/storage/service;1"]. - getService(Ci.mozIStorageService); - return this.__storageService; - }, - - __uuidService: null, - get _uuidService() { - if (!this.__uuidService) - this.__uuidService = Cc["@mozilla.org/uuid-generator;1"]. - getService(Ci.nsIUUIDGenerator); - return this.__uuidService; - }, - - - // The current database schema. - _dbSchema: { - tables: { - moz_logins: "id INTEGER PRIMARY KEY," + - "hostname TEXT NOT NULL," + - "httpRealm TEXT," + - "formSubmitURL TEXT," + - "usernameField TEXT NOT NULL," + - "passwordField TEXT NOT NULL," + - "encryptedUsername TEXT NOT NULL," + - "encryptedPassword TEXT NOT NULL," + - "guid TEXT," + - "encType INTEGER," + - "timeCreated INTEGER," + - "timeLastUsed INTEGER," + - "timePasswordChanged INTEGER," + - "timesUsed INTEGER", - // Changes must be reflected in this._dbAreExpectedColumnsPresent(), - // this._searchLogins(), and this.modifyLogin(). - - moz_disabledHosts: "id INTEGER PRIMARY KEY," + - "hostname TEXT UNIQUE ON CONFLICT REPLACE", - - moz_deleted_logins: "id INTEGER PRIMARY KEY," + - "guid TEXT," + - "timeDeleted INTEGER", - }, - indices: { - moz_logins_hostname_index: { - table: "moz_logins", - columns: ["hostname"] - }, - moz_logins_hostname_formSubmitURL_index: { - table: "moz_logins", - columns: ["hostname", "formSubmitURL"] - }, - moz_logins_hostname_httpRealm_index: { - table: "moz_logins", - columns: ["hostname", "httpRealm"] - }, - moz_logins_guid_index: { - table: "moz_logins", - columns: ["guid"] - }, - moz_logins_encType_index: { - table: "moz_logins", - columns: ["encType"] - } - } - }, - _dbConnection : null, // The database connection - _dbStmts : null, // Database statements for memoization - - _signonsFile : null, // nsIFile for "signons.sqlite" - - - /* - * Internal method used by regression tests only. It overrides the default - * database location. - */ - initWithFile : function(aDBFile) { - if (aDBFile) - this._signonsFile = aDBFile; - - this.initialize(); - }, - - - initialize : function () { - this._dbStmts = {}; - - let isFirstRun; - try { - // Force initialization of the crypto module. - // See bug 717490 comment 17. - this._crypto; - - // If initWithFile is calling us, _signonsFile may already be set. - if (!this._signonsFile) { - // Initialize signons.sqlite - this._signonsFile = this._profileDir.clone(); - this._signonsFile.append("signons.sqlite"); - } - this.log("Opening database at " + this._signonsFile.path); - - // Initialize the database (create, migrate as necessary) - isFirstRun = this._dbInit(); - - this._initialized = true; - - return Promise.resolve(); - } catch (e) { - this.log("Initialization failed: " + e); - // If the import fails on first run, we want to delete the db - if (isFirstRun && e == "Import failed") - this._dbCleanup(false); - throw new Error("Initialization failed"); - } - }, - - - /** - * Internal method used by regression tests only. It is called before - * replacing this storage module with a new instance. - */ - terminate : function () { - return Promise.resolve(); - }, - - - addLogin : function (login) { - // Throws if there are bogus values. - LoginHelper.checkLoginValues(login); - - let [encUsername, encPassword, encType] = this._encryptLogin(login); - - // Clone the login, so we don't modify the caller's object. - let loginClone = login.clone(); - - // Initialize the nsILoginMetaInfo fields, unless the caller gave us values - loginClone.QueryInterface(Ci.nsILoginMetaInfo); - if (loginClone.guid) { - if (!this._isGuidUnique(loginClone.guid)) - throw new Error("specified GUID already exists"); - } else { - loginClone.guid = this._uuidService.generateUUID().toString(); - } - - // Set timestamps - let currentTime = Date.now(); - if (!loginClone.timeCreated) - loginClone.timeCreated = currentTime; - if (!loginClone.timeLastUsed) - loginClone.timeLastUsed = currentTime; - if (!loginClone.timePasswordChanged) - loginClone.timePasswordChanged = currentTime; - if (!loginClone.timesUsed) - loginClone.timesUsed = 1; - - let query = - "INSERT INTO moz_logins " + - "(hostname, httpRealm, formSubmitURL, usernameField, " + - "passwordField, encryptedUsername, encryptedPassword, " + - "guid, encType, timeCreated, timeLastUsed, timePasswordChanged, " + - "timesUsed) " + - "VALUES (:hostname, :httpRealm, :formSubmitURL, :usernameField, " + - ":passwordField, :encryptedUsername, :encryptedPassword, " + - ":guid, :encType, :timeCreated, :timeLastUsed, " + - ":timePasswordChanged, :timesUsed)"; - - let params = { - hostname: loginClone.hostname, - httpRealm: loginClone.httpRealm, - formSubmitURL: loginClone.formSubmitURL, - usernameField: loginClone.usernameField, - passwordField: loginClone.passwordField, - encryptedUsername: encUsername, - encryptedPassword: encPassword, - guid: loginClone.guid, - encType: encType, - timeCreated: loginClone.timeCreated, - timeLastUsed: loginClone.timeLastUsed, - timePasswordChanged: loginClone.timePasswordChanged, - timesUsed: loginClone.timesUsed - }; - - let stmt; - try { - stmt = this._dbCreateStatement(query, params); - stmt.execute(); - } catch (e) { - this.log("addLogin failed: " + e.name + " : " + e.message); - throw new Error("Couldn't write to database, login not added."); - } finally { - if (stmt) { - stmt.reset(); - } - } - - // Send a notification that a login was added. - LoginHelper.notifyStorageChanged("addLogin", loginClone); - return loginClone; - }, - - - removeLogin : function (login) { - let [idToDelete, storedLogin] = this._getIdForLogin(login); - if (!idToDelete) - throw new Error("No matching logins"); - - // Execute the statement & remove from DB - let query = "DELETE FROM moz_logins WHERE id = :id"; - let params = { id: idToDelete }; - let stmt; - let transaction = new Transaction(this._dbConnection); - try { - stmt = this._dbCreateStatement(query, params); - stmt.execute(); - this.storeDeletedLogin(storedLogin); - transaction.commit(); - } catch (e) { - this.log("_removeLogin failed: " + e.name + " : " + e.message); - transaction.rollback(); - throw new Error("Couldn't write to database, login not removed."); - } finally { - if (stmt) { - stmt.reset(); - } - } - LoginHelper.notifyStorageChanged("removeLogin", storedLogin); - }, - - modifyLogin : function (oldLogin, newLoginData) { - let [idToModify, oldStoredLogin] = this._getIdForLogin(oldLogin); - if (!idToModify) - throw new Error("No matching logins"); - - let newLogin = LoginHelper.buildModifiedLogin(oldStoredLogin, newLoginData); - - // Check if the new GUID is duplicate. - if (newLogin.guid != oldStoredLogin.guid && - !this._isGuidUnique(newLogin.guid)) { - throw new Error("specified GUID already exists"); - } - - // Look for an existing entry in case key properties changed. - if (!newLogin.matches(oldLogin, true)) { - let logins = this.findLogins({}, newLogin.hostname, - newLogin.formSubmitURL, - newLogin.httpRealm); - - if (logins.some(login => newLogin.matches(login, true))) - throw new Error("This login already exists."); - } - - // Get the encrypted value of the username and password. - let [encUsername, encPassword, encType] = this._encryptLogin(newLogin); - - let query = - "UPDATE moz_logins " + - "SET hostname = :hostname, " + - "httpRealm = :httpRealm, " + - "formSubmitURL = :formSubmitURL, " + - "usernameField = :usernameField, " + - "passwordField = :passwordField, " + - "encryptedUsername = :encryptedUsername, " + - "encryptedPassword = :encryptedPassword, " + - "guid = :guid, " + - "encType = :encType, " + - "timeCreated = :timeCreated, " + - "timeLastUsed = :timeLastUsed, " + - "timePasswordChanged = :timePasswordChanged, " + - "timesUsed = :timesUsed " + - "WHERE id = :id"; - - let params = { - id: idToModify, - hostname: newLogin.hostname, - httpRealm: newLogin.httpRealm, - formSubmitURL: newLogin.formSubmitURL, - usernameField: newLogin.usernameField, - passwordField: newLogin.passwordField, - encryptedUsername: encUsername, - encryptedPassword: encPassword, - guid: newLogin.guid, - encType: encType, - timeCreated: newLogin.timeCreated, - timeLastUsed: newLogin.timeLastUsed, - timePasswordChanged: newLogin.timePasswordChanged, - timesUsed: newLogin.timesUsed - }; - - let stmt; - try { - stmt = this._dbCreateStatement(query, params); - stmt.execute(); - } catch (e) { - this.log("modifyLogin failed: " + e.name + " : " + e.message); - throw new Error("Couldn't write to database, login not modified."); - } finally { - if (stmt) { - stmt.reset(); - } - } - - LoginHelper.notifyStorageChanged("modifyLogin", [oldStoredLogin, newLogin]); - }, - - - /** - * Returns an array of nsILoginInfo. - */ - getAllLogins : function (count) { - let [logins, ids] = this._searchLogins({}); - - // decrypt entries for caller. - logins = this._decryptLogins(logins); - - this.log("_getAllLogins: returning " + logins.length + " logins."); - if (count) - count.value = logins.length; // needed for XPCOM - return logins; - }, - - - /** - * Public wrapper around _searchLogins to convert the nsIPropertyBag to a - * JavaScript object and decrypt the results. - * - * @return {nsILoginInfo[]} which are decrypted. - */ - searchLogins : function(count, matchData) { - let realMatchData = {}; - let options = {}; - // Convert nsIPropertyBag to normal JS object - let propEnum = matchData.enumerator; - while (propEnum.hasMoreElements()) { - let prop = propEnum.getNext().QueryInterface(Ci.nsIProperty); - switch (prop.name) { - // Some property names aren't field names but are special options to affect the search. - case "schemeUpgrades": { - options[prop.name] = prop.value; - break; - } - default: { - realMatchData[prop.name] = prop.value; - break; - } - } - } - - let [logins, ids] = this._searchLogins(realMatchData, options); - - // Decrypt entries found for the caller. - logins = this._decryptLogins(logins); - - count.value = logins.length; // needed for XPCOM - return logins; - }, - - - /** - * Private method to perform arbitrary searches on any field. Decryption is - * left to the caller. - * - * Returns [logins, ids] for logins that match the arguments, where logins - * is an array of encrypted nsLoginInfo and ids is an array of associated - * ids in the database. - */ - _searchLogins : function (matchData, aOptions = { - schemeUpgrades: false, - }) { - let conditions = [], params = {}; - - for (let field in matchData) { - let value = matchData[field]; - let condition = ""; - switch (field) { - case "formSubmitURL": - if (value != null) { - // Historical compatibility requires this special case - condition = "formSubmitURL = '' OR "; - } - // Fall through - case "hostname": - if (value != null) { - condition += `${field} = :${field}`; - params[field] = value; - let valueURI; - try { - if (aOptions.schemeUpgrades && (valueURI = Services.io.newURI(value, null, null)) && - valueURI.scheme == "https") { - condition += ` OR ${field} = :http${field}`; - params["http" + field] = "http://" + valueURI.hostPort; - } - } catch (ex) { - // newURI will throw for some values - // but those URLs wouldn't support upgrades anyways. - } - break; - } - // Fall through - // Normal cases. - case "httpRealm": - case "id": - case "usernameField": - case "passwordField": - case "encryptedUsername": - case "encryptedPassword": - case "guid": - case "encType": - case "timeCreated": - case "timeLastUsed": - case "timePasswordChanged": - case "timesUsed": - if (value == null) { - condition = field + " isnull"; - } else { - condition = field + " = :" + field; - params[field] = value; - } - break; - // Fail if caller requests an unknown property. - default: - throw new Error("Unexpected field: " + field); - } - if (condition) { - conditions.push(condition); - } - } - - // Build query - let query = "SELECT * FROM moz_logins"; - if (conditions.length) { - conditions = conditions.map(c => "(" + c + ")"); - query += " WHERE " + conditions.join(" AND "); - } - - let stmt; - let logins = [], ids = []; - try { - stmt = this._dbCreateStatement(query, params); - // We can't execute as usual here, since we're iterating over rows - while (stmt.executeStep()) { - // Create the new nsLoginInfo object, push to array - let login = Cc["@mozilla.org/login-manager/loginInfo;1"]. - createInstance(Ci.nsILoginInfo); - login.init(stmt.row.hostname, stmt.row.formSubmitURL, - stmt.row.httpRealm, stmt.row.encryptedUsername, - stmt.row.encryptedPassword, stmt.row.usernameField, - stmt.row.passwordField); - // set nsILoginMetaInfo values - login.QueryInterface(Ci.nsILoginMetaInfo); - login.guid = stmt.row.guid; - login.timeCreated = stmt.row.timeCreated; - login.timeLastUsed = stmt.row.timeLastUsed; - login.timePasswordChanged = stmt.row.timePasswordChanged; - login.timesUsed = stmt.row.timesUsed; - logins.push(login); - ids.push(stmt.row.id); - } - } catch (e) { - this.log("_searchLogins failed: " + e.name + " : " + e.message); - } finally { - if (stmt) { - stmt.reset(); - } - } - - this.log("_searchLogins: returning " + logins.length + " logins"); - return [logins, ids]; - }, - - /** - * Moves a login to the deleted logins table - */ - storeDeletedLogin : function(aLogin) { - let stmt = null; - try { - this.log("Storing " + aLogin.guid + " in deleted passwords\n"); - let query = "INSERT INTO moz_deleted_logins (guid, timeDeleted) VALUES (:guid, :timeDeleted)"; - let params = { guid: aLogin.guid, - timeDeleted: Date.now() }; - let stmt = this._dbCreateStatement(query, params); - stmt.execute(); - } catch (ex) { - throw ex; - } finally { - if (stmt) - stmt.reset(); - } - }, - - - /** - * Removes all logins from storage. - */ - removeAllLogins : function () { - this.log("Removing all logins"); - let query; - let stmt; - let transaction = new Transaction(this._dbConnection); - - // Disabled hosts kept, as one presumably doesn't want to erase those. - // TODO: Add these items to the deleted items table once we've sorted - // out the issues from bug 756701 - query = "DELETE FROM moz_logins"; - try { - stmt = this._dbCreateStatement(query); - stmt.execute(); - transaction.commit(); - } catch (e) { - this.log("_removeAllLogins failed: " + e.name + " : " + e.message); - transaction.rollback(); - throw new Error("Couldn't write to database"); - } finally { - if (stmt) { - stmt.reset(); - } - } - - LoginHelper.notifyStorageChanged("removeAllLogins", null); - }, - - - findLogins : function (count, hostname, formSubmitURL, httpRealm) { - let loginData = { - hostname: hostname, - formSubmitURL: formSubmitURL, - httpRealm: httpRealm - }; - let matchData = { }; - for (let field of ["hostname", "formSubmitURL", "httpRealm"]) - if (loginData[field] != '') - matchData[field] = loginData[field]; - let [logins, ids] = this._searchLogins(matchData); - - // Decrypt entries found for the caller. - logins = this._decryptLogins(logins); - - this.log("_findLogins: returning " + logins.length + " logins"); - count.value = logins.length; // needed for XPCOM - return logins; - }, - - - countLogins : function (hostname, formSubmitURL, httpRealm) { - - let _countLoginsHelper = (hostname, formSubmitURL, httpRealm) => { - // Do checks for null and empty strings, adjust conditions and params - let [conditions, params] = - this._buildConditionsAndParams(hostname, formSubmitURL, httpRealm); - - let query = "SELECT COUNT(1) AS numLogins FROM moz_logins"; - if (conditions.length) { - conditions = conditions.map(c => "(" + c + ")"); - query += " WHERE " + conditions.join(" AND "); - } - - let stmt, numLogins; - try { - stmt = this._dbCreateStatement(query, params); - stmt.executeStep(); - numLogins = stmt.row.numLogins; - } catch (e) { - this.log("_countLogins failed: " + e.name + " : " + e.message); - } finally { - if (stmt) { - stmt.reset(); - } - } - return numLogins; - }; - - let resultLogins = _countLoginsHelper(hostname, formSubmitURL, httpRealm); - this.log("_countLogins: counted logins: " + resultLogins); - return resultLogins; - }, - - - get uiBusy() { - return this._crypto.uiBusy; - }, - - - get isLoggedIn() { - return this._crypto.isLoggedIn; - }, - - - /** - * Returns an array with two items: [id, login]. If the login was not - * found, both items will be null. The returned login contains the actual - * stored login (useful for looking at the actual nsILoginMetaInfo values). - */ - _getIdForLogin : function (login) { - let matchData = { }; - for (let field of ["hostname", "formSubmitURL", "httpRealm"]) - if (login[field] != '') - matchData[field] = login[field]; - let [logins, ids] = this._searchLogins(matchData); - - let id = null; - let foundLogin = null; - - // The specified login isn't encrypted, so we need to ensure - // the logins we're comparing with are decrypted. We decrypt one entry - // at a time, lest _decryptLogins return fewer entries and screw up - // indices between the two. - for (let i = 0; i < logins.length; i++) { - let [decryptedLogin] = this._decryptLogins([logins[i]]); - - if (!decryptedLogin || !decryptedLogin.equals(login)) - continue; - - // We've found a match, set id and break - foundLogin = decryptedLogin; - id = ids[i]; - break; - } - - return [id, foundLogin]; - }, - - - /** - * Adjusts the WHERE conditions and parameters for statements prior to the - * statement being created. This fixes the cases where nulls are involved - * and the empty string is supposed to be a wildcard match - */ - _buildConditionsAndParams : function (hostname, formSubmitURL, httpRealm) { - let conditions = [], params = {}; - - if (hostname == null) { - conditions.push("hostname isnull"); - } else if (hostname != '') { - conditions.push("hostname = :hostname"); - params["hostname"] = hostname; - } - - if (formSubmitURL == null) { - conditions.push("formSubmitURL isnull"); - } else if (formSubmitURL != '') { - conditions.push("formSubmitURL = :formSubmitURL OR formSubmitURL = ''"); - params["formSubmitURL"] = formSubmitURL; - } - - if (httpRealm == null) { - conditions.push("httpRealm isnull"); - } else if (httpRealm != '') { - conditions.push("httpRealm = :httpRealm"); - params["httpRealm"] = httpRealm; - } - - return [conditions, params]; - }, - - - /** - * Checks to see if the specified GUID already exists. - */ - _isGuidUnique : function (guid) { - let query = "SELECT COUNT(1) AS numLogins FROM moz_logins WHERE guid = :guid"; - let params = { guid: guid }; - - let stmt, numLogins; - try { - stmt = this._dbCreateStatement(query, params); - stmt.executeStep(); - numLogins = stmt.row.numLogins; - } catch (e) { - this.log("_isGuidUnique failed: " + e.name + " : " + e.message); - } finally { - if (stmt) { - stmt.reset(); - } - } - - return (numLogins == 0); - }, - - - /** - * Returns the encrypted username, password, and encrypton type for the specified - * login. Can throw if the user cancels a master password entry. - */ - _encryptLogin : function (login) { - let encUsername = this._crypto.encrypt(login.username); - let encPassword = this._crypto.encrypt(login.password); - let encType = this._crypto.defaultEncType; - - return [encUsername, encPassword, encType]; - }, - - - /** - * Decrypts username and password fields in the provided array of - * logins. - * - * The entries specified by the array will be decrypted, if possible. - * An array of successfully decrypted logins will be returned. The return - * value should be given to external callers (since still-encrypted - * entries are useless), whereas internal callers generally don't want - * to lose unencrypted entries (eg, because the user clicked Cancel - * instead of entering their master password) - */ - _decryptLogins : function (logins) { - let result = []; - - for (let login of logins) { - try { - login.username = this._crypto.decrypt(login.username); - login.password = this._crypto.decrypt(login.password); - } catch (e) { - // If decryption failed (corrupt entry?), just skip it. - // Rethrow other errors (like canceling entry of a master pw) - if (e.result == Cr.NS_ERROR_FAILURE) - continue; - throw e; - } - result.push(login); - } - - return result; - }, - - - // Database Creation & Access - - /** - * Creates a statement, wraps it, and then does parameter replacement - * Returns the wrapped statement for execution. Will use memoization - * so that statements can be reused. - */ - _dbCreateStatement : function (query, params) { - let wrappedStmt = this._dbStmts[query]; - // Memoize the statements - if (!wrappedStmt) { - this.log("Creating new statement for query: " + query); - wrappedStmt = this._dbConnection.createStatement(query); - this._dbStmts[query] = wrappedStmt; - } - // Replace parameters, must be done 1 at a time - if (params) - for (let i in params) - wrappedStmt.params[i] = params[i]; - return wrappedStmt; - }, - - - /** - * Attempts to initialize the database. This creates the file if it doesn't - * exist, performs any migrations, etc. Return if this is the first run. - */ - _dbInit : function () { - this.log("Initializing Database"); - let isFirstRun = false; - try { - this._dbConnection = this._storageService.openDatabase(this._signonsFile); - // Get the version of the schema in the file. It will be 0 if the - // database has not been created yet. - let version = this._dbConnection.schemaVersion; - if (version == 0) { - this._dbCreate(); - isFirstRun = true; - } else if (version != DB_VERSION) { - this._dbMigrate(version); - } - } catch (e) { - if (e.result == Cr.NS_ERROR_FILE_CORRUPTED) { - // Database is corrupted, so we backup the database, then throw - // causing initialization to fail and a new db to be created next use - this._dbCleanup(true); - } - throw e; - } - - Services.obs.addObserver(this, "profile-before-change", false); - return isFirstRun; - }, - - observe: function (subject, topic, data) { - switch (topic) { - case "profile-before-change": - Services.obs.removeObserver(this, "profile-before-change"); - this._dbClose(); - break; - } - }, - - _dbCreate: function () { - this.log("Creating Database"); - this._dbCreateSchema(); - this._dbConnection.schemaVersion = DB_VERSION; - }, - - - _dbCreateSchema : function () { - this._dbCreateTables(); - this._dbCreateIndices(); - }, - - - _dbCreateTables : function () { - this.log("Creating Tables"); - for (let name in this._dbSchema.tables) - this._dbConnection.createTable(name, this._dbSchema.tables[name]); - }, - - - _dbCreateIndices : function () { - this.log("Creating Indices"); - for (let name in this._dbSchema.indices) { - let index = this._dbSchema.indices[name]; - let statement = "CREATE INDEX IF NOT EXISTS " + name + " ON " + index.table + - "(" + index.columns.join(", ") + ")"; - this._dbConnection.executeSimpleSQL(statement); - } - }, - - - _dbMigrate : function (oldVersion) { - this.log("Attempting to migrate from version " + oldVersion); - - if (oldVersion > DB_VERSION) { - this.log("Downgrading to version " + DB_VERSION); - // User's DB is newer. Sanity check that our expected columns are - // present, and if so mark the lower version and merrily continue - // on. If the columns are borked, something is wrong so blow away - // the DB and start from scratch. [Future incompatible upgrades - // should swtich to a different table or file.] - - if (!this._dbAreExpectedColumnsPresent()) - throw Components.Exception("DB is missing expected columns", - Cr.NS_ERROR_FILE_CORRUPTED); - - // Change the stored version to the current version. If the user - // runs the newer code again, it will see the lower version number - // and re-upgrade (to fixup any entries the old code added). - this._dbConnection.schemaVersion = DB_VERSION; - return; - } - - // Upgrade to newer version... - - let transaction = new Transaction(this._dbConnection); - - try { - for (let v = oldVersion + 1; v <= DB_VERSION; v++) { - this.log("Upgrading to version " + v + "..."); - let migrateFunction = "_dbMigrateToVersion" + v; - this[migrateFunction](); - } - } catch (e) { - this.log("Migration failed: " + e); - transaction.rollback(); - throw e; - } - - this._dbConnection.schemaVersion = DB_VERSION; - transaction.commit(); - this.log("DB migration completed."); - }, - - - /** - * Version 2 adds a GUID column. Existing logins are assigned a random GUID. - */ - _dbMigrateToVersion2 : function () { - // Check to see if GUID column already exists, add if needed - let query; - if (!this._dbColumnExists("guid")) { - query = "ALTER TABLE moz_logins ADD COLUMN guid TEXT"; - this._dbConnection.executeSimpleSQL(query); - - query = "CREATE INDEX IF NOT EXISTS moz_logins_guid_index ON moz_logins (guid)"; - this._dbConnection.executeSimpleSQL(query); - } - - // Get a list of IDs for existing logins - let ids = []; - query = "SELECT id FROM moz_logins WHERE guid isnull"; - let stmt; - try { - stmt = this._dbCreateStatement(query); - while (stmt.executeStep()) - ids.push(stmt.row.id); - } catch (e) { - this.log("Failed getting IDs: " + e); - throw e; - } finally { - if (stmt) { - stmt.reset(); - } - } - - // Generate a GUID for each login and update the DB. - query = "UPDATE moz_logins SET guid = :guid WHERE id = :id"; - for (let id of ids) { - let params = { - id: id, - guid: this._uuidService.generateUUID().toString() - }; - - try { - stmt = this._dbCreateStatement(query, params); - stmt.execute(); - } catch (e) { - this.log("Failed setting GUID: " + e); - throw e; - } finally { - if (stmt) { - stmt.reset(); - } - } - } - }, - - - /** - * Version 3 adds a encType column. - */ - _dbMigrateToVersion3 : function () { - // Check to see if encType column already exists, add if needed - let query; - if (!this._dbColumnExists("encType")) { - query = "ALTER TABLE moz_logins ADD COLUMN encType INTEGER"; - this._dbConnection.executeSimpleSQL(query); - - query = "CREATE INDEX IF NOT EXISTS " + - "moz_logins_encType_index ON moz_logins (encType)"; - this._dbConnection.executeSimpleSQL(query); - } - - // Get a list of existing logins - let logins = []; - let stmt; - query = "SELECT id, encryptedUsername, encryptedPassword " + - "FROM moz_logins WHERE encType isnull"; - try { - stmt = this._dbCreateStatement(query); - while (stmt.executeStep()) { - let params = { id: stmt.row.id }; - // We will tag base64 logins correctly, but no longer support their use. - if (stmt.row.encryptedUsername.charAt(0) == '~' || - stmt.row.encryptedPassword.charAt(0) == '~') - params.encType = Ci.nsILoginManagerCrypto.ENCTYPE_BASE64; - else - params.encType = Ci.nsILoginManagerCrypto.ENCTYPE_SDR; - logins.push(params); - } - } catch (e) { - this.log("Failed getting logins: " + e); - throw e; - } finally { - if (stmt) { - stmt.reset(); - } - } - - // Determine encryption type for each login and update the DB. - query = "UPDATE moz_logins SET encType = :encType WHERE id = :id"; - for (let params of logins) { - try { - stmt = this._dbCreateStatement(query, params); - stmt.execute(); - } catch (e) { - this.log("Failed setting encType: " + e); - throw e; - } finally { - if (stmt) { - stmt.reset(); - } - } - } - }, - - - /** - * Version 4 adds timeCreated, timeLastUsed, timePasswordChanged, - * and timesUsed columns - */ - _dbMigrateToVersion4 : function () { - let query; - // Add the new columns, if needed. - for (let column of ["timeCreated", "timeLastUsed", "timePasswordChanged", "timesUsed"]) { - if (!this._dbColumnExists(column)) { - query = "ALTER TABLE moz_logins ADD COLUMN " + column + " INTEGER"; - this._dbConnection.executeSimpleSQL(query); - } - } - - // Get a list of IDs for existing logins. - let ids = []; - let stmt; - query = "SELECT id FROM moz_logins WHERE timeCreated isnull OR " + - "timeLastUsed isnull OR timePasswordChanged isnull OR timesUsed isnull"; - try { - stmt = this._dbCreateStatement(query); - while (stmt.executeStep()) - ids.push(stmt.row.id); - } catch (e) { - this.log("Failed getting IDs: " + e); - throw e; - } finally { - if (stmt) { - stmt.reset(); - } - } - - // Initialize logins with current time. - query = "UPDATE moz_logins SET timeCreated = :initTime, timeLastUsed = :initTime, " + - "timePasswordChanged = :initTime, timesUsed = 1 WHERE id = :id"; - let params = { - id: null, - initTime: Date.now() - }; - for (let id of ids) { - params.id = id; - try { - stmt = this._dbCreateStatement(query, params); - stmt.execute(); - } catch (e) { - this.log("Failed setting timestamps: " + e); - throw e; - } finally { - if (stmt) { - stmt.reset(); - } - } - } - }, - - - /** - * Version 5 adds the moz_deleted_logins table - */ - _dbMigrateToVersion5 : function () { - if (!this._dbConnection.tableExists("moz_deleted_logins")) { - this._dbConnection.createTable("moz_deleted_logins", this._dbSchema.tables.moz_deleted_logins); - } - }, - - /** - * Version 6 migrates all the hosts from - * moz_disabledHosts to the permission manager. - */ - _dbMigrateToVersion6 : function () { - let disabledHosts = []; - let query = "SELECT hostname FROM moz_disabledHosts"; - let stmt; - - try { - stmt = this._dbCreateStatement(query); - - while (stmt.executeStep()) { - disabledHosts.push(stmt.row.hostname); - } - - for (let host of disabledHosts) { - try { - let uri = Services.io.newURI(host, null, null); - Services.perms.add(uri, PERMISSION_SAVE_LOGINS, Services.perms.DENY_ACTION); - } catch (e) { - Cu.reportError(e); - } - } - } catch (e) { - this.log(`_dbMigrateToVersion6 failed: ${e.name} : ${e.message}`); - } finally { - if (stmt) { - stmt.reset(); - } - } - - query = "DELETE FROM moz_disabledHosts"; - this._dbConnection.executeSimpleSQL(query); - }, - - /** - * Sanity check to ensure that the columns this version of the code expects - * are present in the DB we're using. - */ - _dbAreExpectedColumnsPresent : function () { - let query = "SELECT " + - "id, " + - "hostname, " + - "httpRealm, " + - "formSubmitURL, " + - "usernameField, " + - "passwordField, " + - "encryptedUsername, " + - "encryptedPassword, " + - "guid, " + - "encType, " + - "timeCreated, " + - "timeLastUsed, " + - "timePasswordChanged, " + - "timesUsed " + - "FROM moz_logins"; - try { - let stmt = this._dbConnection.createStatement(query); - // (no need to execute statement, if it compiled we're good) - stmt.finalize(); - } catch (e) { - return false; - } - - query = "SELECT " + - "id, " + - "hostname " + - "FROM moz_disabledHosts"; - try { - let stmt = this._dbConnection.createStatement(query); - // (no need to execute statement, if it compiled we're good) - stmt.finalize(); - } catch (e) { - return false; - } - - this.log("verified that expected columns are present in DB."); - return true; - }, - - - /** - * Checks to see if the named column already exists. - */ - _dbColumnExists : function (columnName) { - let query = "SELECT " + columnName + " FROM moz_logins"; - try { - let stmt = this._dbConnection.createStatement(query); - // (no need to execute statement, if it compiled we're good) - stmt.finalize(); - return true; - } catch (e) { - return false; - } - }, - - _dbClose : function () { - this.log("Closing the DB connection."); - // Finalize all statements to free memory, avoid errors later - for (let query in this._dbStmts) { - let stmt = this._dbStmts[query]; - stmt.finalize(); - } - this._dbStmts = {}; - - if (this._dbConnection !== null) { - try { - this._dbConnection.close(); - } catch (e) { - Components.utils.reportError(e); - } - } - this._dbConnection = null; - }, - - /** - * Called when database creation fails. Finalizes database statements, - * closes the database connection, deletes the database file. - */ - _dbCleanup : function (backup) { - this.log("Cleaning up DB file - close & remove & backup=" + backup); - - // Create backup file - if (backup) { - let backupFile = this._signonsFile.leafName + ".corrupt"; - this._storageService.backupDatabaseFile(this._signonsFile, backupFile); - } - - this._dbClose(); - this._signonsFile.remove(false); - } - -}; // end of nsLoginManagerStorage_mozStorage implementation - -XPCOMUtils.defineLazyGetter(this.LoginManagerStorage_mozStorage.prototype, "log", () => { - let logger = LoginHelper.createLogger("Login storage"); - return logger.log.bind(logger); -}); - -var component = [LoginManagerStorage_mozStorage]; -this.NSGetFactory = XPCOMUtils.generateNSGetFactory(component); diff --git a/toolkit/components/satchel/FormHistory.jsm b/toolkit/components/satchel/FormHistory.jsm index ca9a28f1f..2182fbfb7 100644 --- a/toolkit/components/satchel/FormHistory.jsm +++ b/toolkit/components/satchel/FormHistory.jsm @@ -101,11 +101,7 @@ const DAY_IN_MS = 86400000; // 1 day in milliseconds const MAX_SEARCH_TOKENS = 10; const NOOP = function noop() {}; -#ifdef MOZ_WIDGET_ANDROID -var supportsDeletedTable = true; -#else var supportsDeletedTable = false; -#endif var Prefs = { initialized: false, diff --git a/toolkit/components/satchel/nsFormFillController.cpp b/toolkit/components/satchel/nsFormFillController.cpp index d70036635..d8dae41ed 100644 --- a/toolkit/components/satchel/nsFormFillController.cpp +++ b/toolkit/components/satchel/nsFormFillController.cpp @@ -985,7 +985,6 @@ nsFormFillController::Focus(nsIDOMEvent* aEvent) return NS_OK; } -#ifndef ANDROID nsCOMPtr formControl = do_QueryInterface(mFocusedInputNode); MOZ_ASSERT(formControl); @@ -995,7 +994,6 @@ nsFormFillController::Focus(nsIDOMEvent* aEvent) && formControl->GetType() == NS_FORM_INPUT_PASSWORD) { ShowPopup(); } -#endif mContextMenuFiredBeforeFocus = false; return NS_OK; diff --git a/toolkit/components/satchel/nsFormHistory.js b/toolkit/components/satchel/nsFormHistory.js index 9d67f0729..f940e104d 100644 --- a/toolkit/components/satchel/nsFormHistory.js +++ b/toolkit/components/satchel/nsFormHistory.js @@ -349,26 +349,6 @@ FormHistory.prototype = { }, moveToDeletedTable : function moveToDeletedTable(values, params) { -#ifdef MOZ_WIDGET_ANDROID - this.log("Moving entries to deleted table."); - - let stmt; - - try { - // Move the entries to the deleted items table. - let query = "INSERT INTO moz_deleted_formhistory (guid, timeDeleted) "; - if (values) query += values; - stmt = this.dbCreateStatement(query, params); - stmt.execute(); - } catch (e) { - this.log("Moving deleted entries failed: " + e); - throw e; - } finally { - if (stmt) { - stmt.reset(); - } - } -#endif }, get dbConnection() { diff --git a/toolkit/components/search/nsSearchService.js b/toolkit/components/search/nsSearchService.js index f6303bca1..f3e8b94a7 100644 --- a/toolkit/components/search/nsSearchService.js +++ b/toolkit/components/search/nsSearchService.js @@ -2213,32 +2213,8 @@ Engine.prototype = { this.lazySerializeTask.arm(); }, -#ifdef ANDROID - get _defaultMobileResponseType() { - let type = URLTYPE_SEARCH_HTML; - - let sysInfo = Cc["@mozilla.org/system-info;1"].getService(Ci.nsIPropertyBag2); - let isTablet = sysInfo.get("tablet"); - if (isTablet && this.supportsResponseType("application/x-moz-tabletsearch")) { - // Check for a tablet-specific search URL override - type = "application/x-moz-tabletsearch"; - } else if (!isTablet && this.supportsResponseType("application/x-moz-phonesearch")) { - // Check for a phone-specific search URL override - type = "application/x-moz-phonesearch"; - } - - delete this._defaultMobileResponseType; - return this._defaultMobileResponseType = type; - }, -#endif - // from nsISearchEngine getSubmission: function SRCH_ENG_getSubmission(aData, aResponseType, aPurpose) { -#ifdef ANDROID - if (!aResponseType) { - aResponseType = this._defaultMobileResponseType; - } -#endif if (!aResponseType) { aResponseType = URLTYPE_SEARCH_HTML; } @@ -2272,11 +2248,6 @@ Engine.prototype = { // from nsISearchEngine getResultDomain: function SRCH_ENG_getResultDomain(aResponseType) { -#ifdef ANDROID - if (!aResponseType) { - aResponseType = this._defaultMobileResponseType; - } -#endif if (!aResponseType) { aResponseType = URLTYPE_SEARCH_HTML; } @@ -2293,11 +2264,7 @@ Engine.prototype = { * Returns URL parsing properties used by _buildParseSubmissionMap. */ getURLParsingInfo: function () { -#ifdef ANDROID - let responseType = this._defaultMobileResponseType; -#else let responseType = URLTYPE_SEARCH_HTML; -#endif LOG("getURLParsingInfo: responseType: \"" + responseType + "\""); diff --git a/toolkit/components/url-classifier/nsUrlClassifierUtils.cpp b/toolkit/components/url-classifier/nsUrlClassifierUtils.cpp index e4cf68c98..c4ee5f26d 100644 --- a/toolkit/components/url-classifier/nsUrlClassifierUtils.cpp +++ b/toolkit/components/url-classifier/nsUrlClassifierUtils.cpp @@ -83,9 +83,7 @@ namespace safebrowsing { static PlatformType GetPlatformType() { -#if defined(ANDROID) - return ANDROID_PLATFORM; -#elif defined(XP_MACOSX) +#if defined(XP_MACOSX) return OSX_PLATFORM; #elif defined(XP_LINUX) return LINUX_PLATFORM; diff --git a/toolkit/content/aboutSupport.js b/toolkit/content/aboutSupport.js index f49172230..f9a0abcb0 100644 --- a/toolkit/content/aboutSupport.js +++ b/toolkit/content/aboutSupport.js @@ -599,16 +599,6 @@ function copyContentsToClipboard() { let clipboard = Cc["@mozilla.org/widget/clipboard;1"] .getService(Ci.nsIClipboard); clipboard.setData(transferable, null, clipboard.kGlobalClipboard); - -#ifdef MOZ_WIDGET_ANDROID - // Present a toast notification. - let message = { - type: "Toast:Show", - message: stringBundle().GetStringFromName("textCopied"), - duration: "short" - }; - Services.androidBridge.handleGeckoMessage(message); -#endif } // Return the plain text representation of an element. Do a little bit diff --git a/toolkit/content/aboutSupport.xhtml b/toolkit/content/aboutSupport.xhtml index 0b7b52164..8afee1867 100644 --- a/toolkit/content/aboutSupport.xhtml +++ b/toolkit/content/aboutSupport.xhtml @@ -101,7 +101,6 @@ -#ifndef ANDROID #ifdef MOZ_UPDATER @@ -115,7 +114,6 @@ #endif -#endif #ifdef MOZ_UPDATER @@ -240,7 +238,6 @@ -#ifndef ANDROID &aboutSupport.appBasicsProfiles; @@ -250,8 +247,6 @@ about:profiles -#endif - diff --git a/toolkit/content/aboutTelemetry.js b/toolkit/content/aboutTelemetry.js index 0829fe7e2..97dcba9e2 100644 --- a/toolkit/content/aboutTelemetry.js +++ b/toolkit/content/aboutTelemetry.js @@ -233,17 +233,9 @@ var Settings = { let elements = document.getElementsByClassName("change-data-choices-link"); for (let el of elements) { el.addEventListener("click", function() { -#ifdef MOZ_WIDGET_ANDROID - Cu.import("resource://gre/modules/Messaging.jsm"); - Messaging.sendRequest({ - type: "Settings:Show", - resource: "preferences_privacy", - }); -#else // Show the data choices preferences on desktop. let mainWindow = getMainWindowWithPreferencesPane(); mainWindow.openAdvancedPreferences("dataChoicesTab"); -#endif }, false); } }, diff --git a/toolkit/content/buildconfig.html b/toolkit/content/buildconfig.html index d3373f54c..322208189 100644 --- a/toolkit/content/buildconfig.html +++ b/toolkit/content/buildconfig.html @@ -58,9 +58,5 @@

Configure options

@MOZ_CONFIGURE_OPTIONS@

-#ifdef ANDROID -

Package name

-

@ANDROID_PACKAGE_NAME@

-#endif diff --git a/toolkit/content/contentAreaUtils.js b/toolkit/content/contentAreaUtils.js index 2512804fa..17e463325 100644 --- a/toolkit/content/contentAreaUtils.js +++ b/toolkit/content/contentAreaUtils.js @@ -1115,40 +1115,8 @@ function validateFileName(aFileName) aFileName = aFileName.replace(/[\<]+/g, "("); aFileName = aFileName.replace(/[\>]+/g, ")"); } - else if (navigator.appVersion.indexOf("Macintosh") != -1) + else if (navigator.appVersion.indexOf("Macintosh") != -1) { re = /[\:\/]+/g; - else if (navigator.appVersion.indexOf("Android") != -1) { - // On mobile devices, the filesystem may be very limited in what - // it considers valid characters. To avoid errors, we sanitize - // conservatively. - const dangerousChars = "*?<>|\":/\\[];,+="; - var processed = ""; - for (var i = 0; i < aFileName.length; i++) - processed += aFileName.charCodeAt(i) >= 32 && - !(dangerousChars.indexOf(aFileName[i]) >= 0) ? aFileName[i] - : "_"; - - // Last character should not be a space - processed = processed.trim(); - - // If a large part of the filename has been sanitized, then we - // will use a default filename instead - if (processed.replace(/_/g, "").length <= processed.length/2) { - // We purposefully do not use a localized default filename, - // which we could have done using - // ContentAreaUtils.stringBundle.GetStringFromName("DefaultSaveFileName") - // since it may contain invalid characters. - var original = processed; - processed = "download"; - - // Preserve a suffix, if there is one - if (original.indexOf(".") >= 0) { - var suffix = original.split(".").slice(-1)[0]; - if (suffix && suffix.indexOf("_") < 0) - processed += "." + suffix; - } - } - return processed; } return aFileName.replace(re, "_"); diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn index 96c559bb2..c73427a31 100644 --- a/toolkit/content/jar.mn +++ b/toolkit/content/jar.mn @@ -19,10 +19,8 @@ toolkit.jar: #endif content/global/aboutNetworking.js content/global/aboutNetworking.xhtml -#ifndef ANDROID * content/global/aboutProfiles.js content/global/aboutProfiles.xhtml -#endif content/global/aboutServiceWorkers.js content/global/aboutServiceWorkers.xhtml #ifdef MOZ_WEBRTC diff --git a/toolkit/content/moz.build b/toolkit/content/moz.build index b1f6b6419..0a08483b4 100644 --- a/toolkit/content/moz.build +++ b/toolkit/content/moz.build @@ -14,9 +14,6 @@ for var in ('target', DEFINES['CFLAGS'] = CONFIG['OS_CFLAGS'] DEFINES['TOPOBJDIR'] = TOPOBJDIR -if CONFIG['OS_TARGET'] == 'Android': - DEFINES['ANDROID_PACKAGE_NAME'] = CONFIG['ANDROID_PACKAGE_NAME'] - if CONFIG['MOZ_ANDROID_CXX_STL'] == 'libc++': DEFINES['MOZ_USE_LIBCXX'] = True diff --git a/toolkit/library/libxul.mk b/toolkit/library/libxul.mk index 80f934e60..d09a3962f 100644 --- a/toolkit/library/libxul.mk +++ b/toolkit/library/libxul.mk @@ -5,7 +5,6 @@ EXTRA_DEPS += $(topsrcdir)/toolkit/library/libxul.mk ifeq (Linux,$(OS_ARCH)) -ifneq (Android,$(OS_TARGET)) OS_LDFLAGS += -Wl,-version-script,symverscript symverscript: $(topsrcdir)/toolkit/library/symverscript.in @@ -14,7 +13,6 @@ symverscript: $(topsrcdir)/toolkit/library/symverscript.in EXTRA_DEPS += symverscript endif -endif # Generate GDB pretty printer-autoload files on Linux and Solaris. OSX's GDB is # too old to support Python pretty-printers; if this changes, we could make diff --git a/toolkit/library/moz.build b/toolkit/library/moz.build index 3056799f0..d9b167547 100644 --- a/toolkit/library/moz.build +++ b/toolkit/library/moz.build @@ -178,7 +178,7 @@ if CONFIG['OS_ARCH'] == 'WINNT': 'winspool', ] -if CONFIG['OS_ARCH'] == 'Linux' and CONFIG['OS_TARGET'] != 'Android': +if CONFIG['OS_ARCH'] == 'Linux': OS_LIBS += [ 'rt', ] diff --git a/toolkit/modules/Services.jsm b/toolkit/modules/Services.jsm index 9b5082efd..09e5df077 100644 --- a/toolkit/modules/Services.jsm +++ b/toolkit/modules/Services.jsm @@ -51,9 +51,6 @@ XPCOMUtils.defineLazyGetter(Services, "ppmm", () => { }); var initTable = [ -#ifdef MOZ_WIDGET_ANDROID - ["androidBridge", "@mozilla.org/android/bridge;1", "nsIAndroidBridge"], -#endif ["appShell", "@mozilla.org/appshell/appShellService;1", "nsIAppShellService"], ["cache", "@mozilla.org/network/cache-service;1", "nsICacheService"], ["cache2", "@mozilla.org/netwerk/cache-storage-service;1", "nsICacheStorageService"], diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build index c386759e7..062388d24 100644 --- a/toolkit/modules/moz.build +++ b/toolkit/modules/moz.build @@ -105,16 +105,14 @@ EXTRA_PP_JS_MODULES += [ 'Services.jsm', ] -if 'Android' != CONFIG['OS_TARGET']: - EXTRA_PP_JS_MODULES += [ - 'LightweightThemeConsumer.jsm', - ] - DIRS += [ - 'subprocess', - ] -else: - DEFINES['ANDROID'] = True +EXTRA_PP_JS_MODULES += [ + 'LightweightThemeConsumer.jsm', +] + +DIRS += [ + 'subprocess', +] if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': diff --git a/toolkit/moz.build b/toolkit/moz.build index c0f7dc214..9c5102a01 100644 --- a/toolkit/moz.build +++ b/toolkit/moz.build @@ -27,16 +27,15 @@ if CONFIG['MOZ_JETPACK']: DIRS += ['mozapps/extensions'] -if CONFIG['MOZ_UPDATER'] and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'android': +if CONFIG['MOZ_UPDATER']: DIRS += ['mozapps/update'] - -if CONFIG['MOZ_UPDATER'] and CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': -# Including mozapps/update/common-standalone allows the maintenance service -# to be built so the maintenance service can be used for things other than -# updating applications. - DIRS += [ - 'mozapps/update/common-standalone', - ] + if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': + # Including mozapps/update/common-standalone allows the maintenance service + # to be built so the maintenance service can be used for things other than + # updating applications. + DIRS += [ + 'mozapps/update/common-standalone', + ] DIRS += ['xre'] @@ -46,5 +45,3 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': DIRS += ['system/osxproxy'] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': DIRS += ['system/windowsproxy'] -elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': - DIRS += ['system/androidproxy'] diff --git a/toolkit/moz.configure b/toolkit/moz.configure index 792fb113d..ca7f91e6e 100644 --- a/toolkit/moz.configure +++ b/toolkit/moz.configure @@ -14,9 +14,6 @@ option('--enable-systrace', env='MOZ_USE_SYSTRACE', @depends('--enable-systrace', target) def systrace(value, target): - if value and target.os != 'Android': - die('--enable-systrace cannot be used when targeting %s', - target.os) if value: return True @@ -66,7 +63,7 @@ set_config('L10NBASEDIR', l10n_base) # reason. option('--enable-default-toolkit', nargs=1, choices=('cairo-windows', 'cairo-gtk2', 'cairo-gtk2-x11', 'cairo-gtk3', - 'cairo-cocoa', 'cairo-uikit', 'cairo-android'), + 'cairo-cocoa', 'cairo-uikit'), help='Select default toolkit') @depends('--enable-default-toolkit', target) @@ -80,13 +77,6 @@ def toolkit(value, target): platform_choices = ('cairo-cocoa',) elif target.os == 'iOS': platform_choices = ('cairo-uikit',) - elif target.os == 'Android': - if value.origin == 'implied': - # Trust values coming from imply_option() (used in - # b2g/moz.configure). - platform_choices = tuple(value) - else: - platform_choices = ('cairo-android',) else: platform_choices = ('cairo-gtk3', 'cairo-gtk2', 'cairo-gtk2-x11') @@ -185,7 +175,7 @@ set_define(gl_provider_define, True) # ============================================================== @depends(toolkit) def pdf_printing(toolkit): - if toolkit in ('windows', 'gtk2', 'gtk3', 'android'): + if toolkit in ('windows', 'gtk2', 'gtk3'): return True @depends(pdf_printing) @@ -207,8 +197,7 @@ option(env='MOZ_INSTRUMENT_EVENT_LOOP', @depends('MOZ_INSTRUMENT_EVENT_LOOP', toolkit) def instrument_event_loop(value, toolkit): - if value or (toolkit in ('windows', 'gtk2', 'gtk3', 'cocoa', - 'android') and value.origin == 'default'): + if value or (toolkit in ('windows', 'gtk2', 'gtk3', 'cocoa') and value.origin == 'default'): return True set_config('MOZ_INSTRUMENT_EVENT_LOOP', instrument_event_loop) @@ -266,8 +255,7 @@ add_old_configure_assignment('_HAVE_FREETYPE2', # ============================================================== @depends(target) def tree_freetype(target): - if target.os == 'Android': - return True + return None set_define('MOZ_TREE_FREETYPE', tree_freetype) set_config('MOZ_TREE_FREETYPE', tree_freetype) @@ -332,7 +320,7 @@ option('--disable-ffmpeg', def ffmpeg(value, target): enabled = bool(value) if value.origin == 'default': - enabled = target.os not in ('Android', 'WINNT') + enabled = target.os not in ('WINNT') if enabled: return True @@ -349,8 +337,7 @@ option('--disable-fmp4', env='MOZ_FMP4', def fmp4(value, target, wmf, applemedia): enabled = bool(value) if value.origin == 'default': - # target.os == 'Android' includes all B2G versions - enabled = wmf or applemedia or target.os == 'Android' + enabled = wmf or applemedia if enabled: return True @@ -390,7 +377,7 @@ set_config('MOZ_PACKAGER_FORMAT', packager_format) def jar_maker_format(host, build_project): # Multilocales for mobile/android use the same mergedirs for all locales, # so we can't use symlinks for those builds. - if host.os == 'WINNT' or build_project == 'mobile/android': + if host.os == 'WINNT': return 'flat' return 'symlink' @@ -398,23 +385,10 @@ set_config('MOZ_JAR_MAKER_FILE_FORMAT', jar_maker_format) @depends(toolkit) def omnijar_name(toolkit): - # Fennec's static resources live in the assets/ folder of the - # APK. Adding a path to the name here works because we only - # have one omnijar file in the final package (which is not the - # case on desktop), and necessitates some contortions during - # packaging so that the resources in the omnijar are considered - # as rooted at / and not as rooted at assets/ (which again is - # not the case on desktop: there are omnijars rooted at webrtc/, - # etc). packager.mk handles changing the rooting of the single - # omnijar. - return 'assets/omni.ja' if toolkit == 'android' else 'omni.ja' + return 'omni.ja' set_config('OMNIJAR_NAME', omnijar_name) -project_flag('MOZ_ANDROID_HISTORY', - help='Enable Android History instead of Places', - set_as_define=True) - # Permissions system # ============================================================== option(name='--disable-permissions', @@ -667,13 +641,6 @@ set_config('MOZ_ENABLE_SKIA', skia) set_define('MOZ_ENABLE_SKIA', skia) set_define('USE_SKIA', skia) -@depends(skia, target) -def skia_android(skia, target): - if skia and target.os == 'Android': - return True - -set_define('SK_BUILD_FOR_ANDROID_NDK', skia_android) - option('--disable-skia-gpu', help='Disable use of Skia-GPU') @depends('--disable-skia-gpu', skia, target) diff --git a/toolkit/mozapps/extensions/extensions.manifest b/toolkit/mozapps/extensions/extensions.manifest index 7efb74a9d..b56152e10 100644 --- a/toolkit/mozapps/extensions/extensions.manifest +++ b/toolkit/mozapps/extensions/extensions.manifest @@ -1,14 +1,16 @@ component {4399533d-08d1-458c-a87a-235f74451cfa} addonManager.js contract @mozilla.org/addons/integration;1 {4399533d-08d1-458c-a87a-235f74451cfa} category update-timer addonManager @mozilla.org/addons/integration;1,getService,addon-background-update-timer,extensions.update.interval,86400 + component {7beb3ba8-6ec3-41b4-b67c-da89b8518922} amContentHandler.js contract @mozilla.org/uriloader/content-handler;1?type=application/x-xpinstall {7beb3ba8-6ec3-41b4-b67c-da89b8518922} + component {0f38e086-89a3-40a5-8ffc-9b694de1d04a} amWebInstallListener.js contract @mozilla.org/addons/web-install-listener;1 {0f38e086-89a3-40a5-8ffc-9b694de1d04a} + component {9df8ef2b-94da-45c9-ab9f-132eb55fddf1} amInstallTrigger.js contract @mozilla.org/addons/installtrigger;1 {9df8ef2b-94da-45c9-ab9f-132eb55fddf1} category JavaScript-global-property InstallTrigger @mozilla.org/addons/installtrigger;1 -#ifndef MOZ_WIDGET_ANDROID + category addon-provider-module PluginProvider resource://gre/modules/addons/PluginProvider.jsm -#endif category addon-provider-module GMPProvider resource://gre/modules/addons/GMPProvider.jsm diff --git a/toolkit/mozapps/extensions/internal/moz.build b/toolkit/mozapps/extensions/internal/moz.build index 337df3104..12e95fb5a 100644 --- a/toolkit/mozapps/extensions/internal/moz.build +++ b/toolkit/mozapps/extensions/internal/moz.build @@ -10,16 +10,11 @@ EXTRA_JS_MODULES.addons += [ 'Content.js', 'GMPProvider.jsm', 'LightweightThemeImageOptimizer.jsm', + 'PluginProvider.jsm', 'ProductAddonChecker.jsm', 'SpellCheckDictionaryBootstrap.js', ] -# Don't ship unused providers on Android -if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'android': - EXTRA_JS_MODULES.addons += [ - 'PluginProvider.jsm', - ] - EXTRA_PP_JS_MODULES.addons += [ 'AddonRepository.jsm', 'AddonUpdateChecker.jsm', diff --git a/toolkit/nss.configure b/toolkit/nss.configure index 734f4f029..0febafb34 100644 --- a/toolkit/nss.configure +++ b/toolkit/nss.configure @@ -9,7 +9,7 @@ # ============================================================== @depends(build_project, '--help') def dbm_default(build_project, _): - return build_project not in ('mobile/android', 'b2g', 'b2g/graphene') + return True option('--enable-dbm', default=dbm_default, help='Enable building DBM') diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp index e818d27e6..2fe51b285 100644 --- a/toolkit/profile/nsToolkitProfileService.cpp +++ b/toolkit/profile/nsToolkitProfileService.cpp @@ -811,10 +811,10 @@ nsToolkitProfileService::CreateProfileInternal(nsIFile* aRootDir, rv = rootDir->Create(nsIFile::DIRECTORY_TYPE, 0700); NS_ENSURE_SUCCESS(rv, rv); rv = rootDir->SetPermissions(0700); -#ifndef ANDROID + // If the profile is on the sdcard, this will fail but its non-fatal NS_ENSURE_SUCCESS(rv, rv); -#endif + } rv = localDir->Exists(&exists); diff --git a/toolkit/system/androidproxy/moz.build b/toolkit/system/androidproxy/moz.build deleted file mode 100644 index 5c6b0c105..000000000 --- a/toolkit/system/androidproxy/moz.build +++ /dev/null @@ -1,11 +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/. - -SOURCES += [ - 'nsAndroidSystemProxySettings.cpp', -] - -FINAL_LIBRARY = 'xul' diff --git a/toolkit/system/androidproxy/nsAndroidSystemProxySettings.cpp b/toolkit/system/androidproxy/nsAndroidSystemProxySettings.cpp deleted file mode 100644 index 71e12bb77..000000000 --- a/toolkit/system/androidproxy/nsAndroidSystemProxySettings.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* 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 "nsIURI.h" - -#include "nsISystemProxySettings.h" -#include "nsIServiceManager.h" -#include "mozilla/ModuleUtils.h" -#include "nsPrintfCString.h" -#include "nsNetCID.h" -#include "nsISupportsPrimitives.h" -#include "nsIURI.h" - -#include "AndroidBridge.h" - -class nsAndroidSystemProxySettings : public nsISystemProxySettings -{ -public: - NS_DECL_THREADSAFE_ISUPPORTS - NS_DECL_NSISYSTEMPROXYSETTINGS - - nsAndroidSystemProxySettings() {}; - nsresult Init(); - -private: - virtual ~nsAndroidSystemProxySettings() {} -}; - -NS_IMPL_ISUPPORTS(nsAndroidSystemProxySettings, nsISystemProxySettings) - -NS_IMETHODIMP -nsAndroidSystemProxySettings::GetMainThreadOnly(bool *aMainThreadOnly) -{ - *aMainThreadOnly = true; - return NS_OK; -} - - -nsresult -nsAndroidSystemProxySettings::Init() -{ - return NS_OK; -} - -nsresult -nsAndroidSystemProxySettings::GetPACURI(nsACString& aResult) -{ - return NS_OK; -} - -nsresult -nsAndroidSystemProxySettings::GetProxyForURI(const nsACString & aSpec, - const nsACString & aScheme, - const nsACString & aHost, - const int32_t aPort, - nsACString & aResult) -{ - return mozilla::AndroidBridge::Bridge()->GetProxyForURI(aSpec, aScheme, aHost, aPort, aResult); -} - -NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsAndroidSystemProxySettings, Init) - -#define NS_ANDROIDSYSTEMPROXYSERVICE_CID \ - {0xf01f0060, 0x3708, 0x478e, \ - {0xb9, 0x35, 0x3e, 0xce, 0x8b, 0xe2, 0x94, 0xb8}} - -NS_DEFINE_NAMED_CID(NS_ANDROIDSYSTEMPROXYSERVICE_CID); - -void test() {}; - -static const mozilla::Module::CIDEntry kSysProxyCIDs[] = { - { &kNS_ANDROIDSYSTEMPROXYSERVICE_CID, false, nullptr, nsAndroidSystemProxySettingsConstructor }, - { nullptr } -}; - -static const mozilla::Module::ContractIDEntry kSysProxyContracts[] = { - { NS_SYSTEMPROXYSETTINGS_CONTRACTID, &kNS_ANDROIDSYSTEMPROXYSERVICE_CID }, - { nullptr } -}; - -static const mozilla::Module kSysProxyModule = { - mozilla::Module::kVersion, - kSysProxyCIDs, - kSysProxyContracts -}; - -NSMODULE_DEFN(nsAndroidProxyModule) = &kSysProxyModule; diff --git a/toolkit/themes/mobile/global/empty.css b/toolkit/themes/mobile/global/empty.css deleted file mode 100644 index d615bf886..000000000 --- a/toolkit/themes/mobile/global/empty.css +++ /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/. */ - -/* - * Empty stub for theme CSS - */ diff --git a/toolkit/themes/mobile/global/icons/Error.png b/toolkit/themes/mobile/global/icons/Error.png deleted file mode 100644 index bd4064f49a32da610169a4e19e26a60e8a176250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2148 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 diff --git a/toolkit/themes/mobile/global/media/error.png b/toolkit/themes/mobile/global/media/error.png deleted file mode 100644 index 58e37283a73eff086420d0969544fa8bc5dd7924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433 zcmV;i0Z#sjP)qE!pQJ z2}%Jv!-RC}gG1$^1SJHuVAc#RE0mxFpjOPbLT7uZx~D4PV75K9=Hc@Kqd1rs8B9EY zm7;_jIL6rgJ)}YjH}DQq0*O$<4ZOn~fut*CwU|HX50*VWAoTA4CIRVIC1>(H)s^2~>NQz-MPgK(re~`H#6sEa( zqM9BXbqE5Ms}51}5Ev``AQw?;OrfBuP>|XQ>Qe~_iBX}#F=zr~B&aDIgL*{M12xay z(3Oa~>4BQ(v*jq=)bv2jvwD7=(i`$?wu`Rx bigWz{uoo^%o)rPO00000NkvXXu0mjfb>P7_ diff --git a/toolkit/themes/mobile/global/media/imagedoc-darknoise.png b/toolkit/themes/mobile/global/media/imagedoc-darknoise.png deleted file mode 100644 index 5c33e24d4c1b123c46d6e89e0adec137bfd4da0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3050 zcmVC0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy4^T{0MIs_1At50nBO@OlA0QwgNI}S} z000YdNklDreTuBF>k$o%dun-(6rNo)J9 zrVf5|+=bQP#JCu*#WwB2u=x@x?yt4hM0K%7#S>k0IImJ62zF=z{?Mik1J@ljP;fg@ zSL(T%qXnhPh4mkOvyGaGP4;OL3de=l;!2eol@vOGEtWde;%isf4Cd2}b?lKYT^TBX z5skV=mBpHBSPb9g-b$?aL5&PIi4hXfqHEe_L!wl=L1dA*kUSiH?m}pFaL`|AlTp>X3^NHU zMqBCDf$^>Ok`$BCeo}&}6=eM@i>o!(!lP`WZh=BVAdoKfx3=EuG6ae5sM8+6snUQ( z#nMk0q!FKpK6NUEa1>Svh&CUva6SaxDLDj`iCWElQVDn!+KscTaSJkN<*jUyvh@0^ z3H%!1vWDzJfXWFw>SGXPq6Cn5x+LgaXG(=JxARyEF{bSWrdIa?(n=Rn=W%M_30XP@ zq>2o2x6PU&;?%$kw&EIKTmYjZO@TA*j{`zmtk4k{iCarkxi(LtCytL-g}g4vXX0Xu49?vP-QV{(9VeS#g;&bW!%9Zdu$W6)>Hp37>qIU;mG^A>YuIrWJ_d6x^i|bg55#Cn*n+alky_2^_g}5j2BzPc(T@3n=Gi ztami}PNu&oFqW7^33@TOJ(~_aU_Pp35b|9T5nC9 zh=Kq?lsaP@=scGA%Doi9E5!`zWh-DTRclFSUVLnGGqqtyI5o>H_DT8WR%n$* zswX_VU~4|8by7WoPCRKiut_-2_p~|=wEDu~`N84&jl*T!G($eGwsS{5UE~w9AIPuo z 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 diff --git a/toolkit/themes/mobile/global/media/throbber.png b/toolkit/themes/mobile/global/media/throbber.png deleted file mode 100644 index 8e49fe5b2acbb16b54acae902cc89c4050896517..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30718 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 diff --git a/toolkit/themes/mobile/global/media/videoClickToPlayButton.svg b/toolkit/themes/mobile/global/media/videoClickToPlayButton.svg deleted file mode 100644 index f7ca6b653..000000000 --- a/toolkit/themes/mobile/global/media/videoClickToPlayButton.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/toolkit/themes/mobile/jar.mn b/toolkit/themes/mobile/jar.mn deleted file mode 100644 index 62f889349..000000000 --- a/toolkit/themes/mobile/jar.mn +++ /dev/null @@ -1,55 +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/. - -toolkit.jar: -% skin global classic/1.0 %skin/classic/global/ -# These are the CSS files that must exist - skin/classic/global/autocomplete.css (global/empty.css) - skin/classic/global/button.css (global/empty.css) - skin/classic/global/checkbox.css (global/empty.css) - skin/classic/global/dialog.css (global/empty.css) - skin/classic/global/dropmarker.css (global/empty.css) - skin/classic/global/global.css (global/empty.css) - skin/classic/global/groupbox.css (global/empty.css) - skin/classic/global/listbox.css (global/empty.css) - skin/classic/global/menu.css (global/empty.css) - skin/classic/global/menulist.css (global/empty.css) - skin/classic/global/numberbox.css (global/empty.css) - skin/classic/global/popup.css (global/empty.css) - skin/classic/global/preferences.css (global/empty.css) - skin/classic/global/progressmeter.css (global/empty.css) - skin/classic/global/radio.css (global/empty.css) - skin/classic/global/resizer.css (global/empty.css) - skin/classic/global/richlistbox.css (global/empty.css) - skin/classic/global/scale.css (global/empty.css) - skin/classic/global/scrollbox.css (global/empty.css) - skin/classic/global/spinbuttons.css (global/empty.css) - skin/classic/global/splitter.css (global/empty.css) - skin/classic/global/tabbox.css (global/empty.css) - skin/classic/global/textbox.css (global/empty.css) - skin/classic/global/toolbar.css (global/empty.css) - skin/classic/global/toolbarbutton.css (global/empty.css) - skin/classic/global/tree.css (global/empty.css) - skin/classic/global/wizard.css (global/empty.css) - skin/classic/global/scrollbars.css (global/empty.css) - - skin/classic/global/media/clicktoplay-bgtexture.png (global/media/clicktoplay-bgtexture.png) - skin/classic/global/media/error.png (global/media/error.png) - skin/classic/global/media/throbber.png (global/media/throbber.png) - skin/classic/global/media/videoClickToPlayButton.svg (global/media/videoClickToPlayButton.svg) - skin/classic/global/media/TopLevelImageDocument.css (global/media/TopLevelImageDocument.css) - skin/classic/global/media/TopLevelVideoDocument.css (global/media/TopLevelVideoDocument.css) - skin/classic/global/media/imagedoc-lightnoise.png (global/media/imagedoc-lightnoise.png) - skin/classic/global/media/imagedoc-darknoise.png (global/media/imagedoc-darknoise.png) - - skin/classic/global/icons/Error.png (global/icons/Error.png) - -% skin mozapps classic/1.0 %skin/classic/mozapps/ - skin/classic/mozapps/plugins/pluginProblem.css (mozapps/plugins/pluginProblem.css) - - skin/classic/mozapps/plugins/contentPluginActivate.png (mozapps/plugins/contentPluginActivate.png) - skin/classic/mozapps/plugins/contentPluginBlocked.png (mozapps/plugins/contentPluginBlocked.png) - skin/classic/mozapps/plugins/contentPluginClose.png (mozapps/plugins/contentPluginClose.png) - skin/classic/mozapps/plugins/contentPluginCrashed.png (mozapps/plugins/contentPluginCrashed.png) - skin/classic/mozapps/plugins/contentPluginStripe.png (mozapps/plugins/contentPluginStripe.png) diff --git a/toolkit/themes/mobile/moz.build b/toolkit/themes/mobile/moz.build deleted file mode 100644 index aac3a838c..000000000 --- a/toolkit/themes/mobile/moz.build +++ /dev/null @@ -1,7 +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'] diff --git a/toolkit/themes/mobile/mozapps/plugins/contentPluginActivate.png b/toolkit/themes/mobile/mozapps/plugins/contentPluginActivate.png deleted file mode 100644 index 31351dc3b7ef57cee15989759c9556e8a2f6dd79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3043 zcmV<93mo)`P)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RY2MZ4x9H=E9=>Px$6-h)v zRA}Dq+PzA|KorICUyNG$h4?gLW8s7Na6W~iU~6k@Wg%NwD1N)i*vx{6U=}pVxc9;| zVYoB@oO31&q)I6%xt0`O0T2KI5C8!X00A&$Eq9o6ggw-G{%ow|XYhLZLupV9_nqlnl^zxkyBa|2P9p00h7SpF*khD`g4=LV-Ai%Kj3c lU~Q!Pz4-c|ioaC`t`8f-ab10-#Ww%|002ovPDHLkV1k>Tu+{(o diff --git a/toolkit/themes/mobile/mozapps/plugins/contentPluginBlocked.png b/toolkit/themes/mobile/mozapps/plugins/contentPluginBlocked.png deleted file mode 100644 index 1e092bf189c77dbc943c31707d00bdae283d1495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1514 zcmV0pxf>%cIR&OR60>&7P@dAw(r~@6u#1N6e#$XQC z)4CH|ncE6mJIB@ou)$!%vAGp61X0F8yus&Z`s$OV3T5rraq&yO^nKp{;cNSK{W|N$ zjT?6~{~TPq{^v}YC#(=Y6>5cUVMrJUj(Lo=^vp}_nW5*53(OH-6KaGB;Y^mWXAc@^ z*;(K&VYQGTNRCLNiFUpVEE9T!)HEih&i&Fg*&GZEe)vwH?}a6y=o5}e_X4XAIOZ|d zm|>PZ8FYH^$VUN(uwlC4m8r`|Myo6Q(dQoS?3!yOdfZn0kkIe8VzFuP7;DTh%O3Wk zk)a4)j$9R3Ahc+Mt5>fLjeJw)>w3WI?@b4eX9;`Qiw0U~qOAzwJ<|dUg{T(3FnF~2 z;8V`-AH}?nvpYl3KnqRLZo)%>_hYwP;31(`iH)E9dZVAG-<9r5U<%X)4iruN6DUStu}MAPbpPiItfOR0}`DaMgBSyEJF>Y=A6e zGWp0ly}&%-bb4`Y|FcEm4mVHV?0_s}A{!aWN@iVPg=zQuxpU!WdG~k9rr89U$Yyeq zSr_Ch%zrV#T?|#{2XcP8{K*L-Ml6fY97oIu;nMNA|J~F2HL>Jg;7WzL}>u;6I z*AMdAGc>!b#BZs|4%Y1eFFbVyGLcQqRp|m@v(UD5aY%+^`xSL^Mp&~GJaq;#kxk8n zb%8-)3>p?WBMgTW0k@T8%}(&t8OTI7HFH=O7&G|qxBBI`Heo0{p=1uBG5h`hhXA8=andZ!gLc;u4yYihEMbvw9tCe?9Zl zXW9`7(0Ud@ri*9KcBlf&r~ffGEc_&lc%CT=d$@c$X9r{<6WPd^&U%k706STPqm|{} z8hOgRvT-&*7BZ17O;x7v1Fx8Y%a^A5s_wJ;_izaMNXb>EtS4GkD@X8IJ{3`0&kctHATZh@of0dLKf&5w!`t@Dy*a&O)|Zy|q|sHpxB8 zq5W%00z2fBa2Miv1`oXO#9M{mnC;EoMpa^i-S z8NwR*bnK07-&$MobWwPV%SvpO>o%dv(*but`k2R9V}@Dwuon%Zr&yoMANe#(h4u`F zCoZH?ZG!=iC-mNGUrq6n(6&e1kuCGB7;wyEtTDqZdot*tU2Mk>-6cX4(;N{+6K%Wy z)!=2JQaCQ0%o6rgqG9j98f0dk@S^aMP%g9z{lYQen8#RShS^;Gv&S9HU#%qSZj(K{ QY5)KL07*qoM6N<$f)-2HA^-pY diff --git a/toolkit/themes/mobile/mozapps/plugins/contentPluginClose.png b/toolkit/themes/mobile/mozapps/plugins/contentPluginClose.png deleted file mode 100644 index 61eb5582881dc34346107611c7921be6fcfe899a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1370 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 Y0E!xJo>h86SO5S307*qoM6N<$g3G$7cK`qY diff --git a/toolkit/themes/mobile/mozapps/plugins/contentPluginDisabled.png b/toolkit/themes/mobile/mozapps/plugins/contentPluginDisabled.png deleted file mode 100644 index b8b6a10205bb8aa9a97364bb8cf2dbeeacee53f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1620 zcmV-a2CMmrP)wi!aSgDq)Xmn}0XNJoRFw9Kn zPN9gUNds!^Edn##FXE+zx@aiSy21A`->0vWb7tn8IZV>UFHFw&zR&wS=bOu!Gd!`q zz5Q78?}M#Jf2B$`QB0gCoWwOEN-PVa;+Rv^yoH_=XQmt=gLs$dCRT{wHG-ZVp^=f! z09nKb#7!76h+9H4Yo`Mg5o5$}F|6EOyLWYPXt?*Y%4+-3(&NtO_80mrd!7jcJjOAs zp$4_+QP6>Q(M|-&B)*6pxW2J@+v)N+4!-iL$CQ(M$z;y$&oSqQ1tE?+jvCaW2fffx z2!dIeMg@3^xWor+Y(0!LwYE9(@(cQz>5vv=7-&EXnlT{;F+0@&dx%jk9G#vC>@R%L zXZp`{FhxSpf+lJE`7ALzUvGfj#1Bktxv{y`PTSuvjT=k|+L(b^Y%VJCsunxDS(~$1vuRvI|d~%u!vg5Vr7C5 zSgTU$g=V~&@Wkrvu>rD~=+c2hhxDTj;c50R>Q4m`md>n-L1&JoLC;PMb&OaU}$2(f@(#sWfMC{U|O);xeGx)gV? z{!e*;cDX>;>>Z-Xn+y=HsjKf$3!!EnJ?Mo-lK9|_X>{-aBXXhSSXs9WU_=Om%mW|1 zF`W?}V1ifz`<{QnO~n_rLWcZwwy~4*&{1I?HK^4y1Kya{Z607rl9#_%mpCxxun;Qd zQKMHM-k9Dj53neqB0POOdLVN?dOt^iIibgy!y0Pz>cbn;o8bY*dcF%26JP$3uSgRIL$X$>%s=erje5dxmbo1OJn@Bl~T!kyK%AsPx% zS3Dp{?NSfu}pG_l8*Sk=Tp58DbuyFCRSIi`4PV)7i7h9>z?i zFt4Qt#}kBb!xOy89^y$J0JKX{r^}5`N{@wy7T~=^w^c@D@kC?_X0Z!SjyyATO9ZbK7mn!xy`<63cG}6o?4KtlUCjJQqT4Fq z4PsVup|RN}1~}6RW`5JqWaD1oE!kU(^|FcXQAW>v{E1cHnbyBEn2FiU{Fhp9?gm+i z@efa(mLYm~63jUDQMnB>nfajBo4deFTxBBBhNc#)DM##t@#dY-#th72bK$|P_XiFO z@f|TE8IMF=bjuO@W`&R?~WD{=^S2Z0`Yi2td*nIsDJi&toa){EtPez SMPx#24YJ`L;(K){{a7>y{D4^00DGKL_t(&-sRg(O9L?w#_|7_-USu(;6dV11;76{ z(3YM(&6f}q(V`bueCf8k*}Tk5a-YDDXA($AIwD61;Rv{+{Md-dQ*3b;i9G>sDqvS4 z@;qmPt|jbbuyyPtum|jDuovtouqW(6a0uZPxb}kG3-*W|1bfBq1bfE*16RU+0P7Oi zU*Hz7-{4lT0E-a9aiul8DUAhK0=F$B+jsJ^A?yWkwrB`@1+ZudTMDcO+izOAu`3aI z(SXgJusUo`uu5z$uv%;muxe~-uzGAtunBA`uo-L$uqo_ZusQ4;ut{tz*eo^%Y#KWi zY#uuW>;gL$>;^jq><+sR>=HW!c8lEwc8&cDc8~oDZUWnbo5A+rbtUY1X)Hv( zwX~Ql@D4n5En!9Et!oKew52s*i-EOZi-0v@r`~v2!ET4JSre{^y&uA618c=*0c*x4 z2W!VB1zW%-16#o+0b9b(27i6WyR2~FdK8h@n8HsCfL7Btes|*l0000 - -#include - -#include -#include -#include - -#include "mozilla/jni/Utils.h" -#include "nsTArray.h" -#include "nsString.h" -#include "nsIFile.h" -#include "nsAppRunner.h" -#include "APKOpen.h" - -#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, MOZ_APP_NAME, args) - -extern "C" NS_EXPORT void -GeckoStart(JNIEnv* env, char* data, const nsXREAppData* appData) -{ - mozilla::jni::SetGeckoThreadEnv(env); - - if (!data) { - LOG("Failed to get arguments for GeckoStart\n"); - return; - } - - nsTArray targs; - char *arg = strtok(data, " "); - while (arg) { - targs.AppendElement(arg); - arg = strtok(nullptr, " "); - } - targs.AppendElement(static_cast(nullptr)); - - int result = XRE_main(targs.Length() - 1, targs.Elements(), appData, 0); - - if (result) - LOG("XRE_main returned %d", result); -} diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index d8f95c2a8..e3705a5c2 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -23,7 +23,7 @@ #include "nsAppRunner.h" #include "mozilla/AppData.h" -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER #include "nsUpdateDriver.h" #endif #include "ProfileReset.h" @@ -186,10 +186,6 @@ #include "base/command_line.h" #include "GTestRunner.h" -#ifdef MOZ_WIDGET_ANDROID -#include "GeneratedJNIWrappers.h" -#endif - extern uint32_t gRestartMode; extern void InstallSignalHandlers(const char *ProgramName); @@ -1517,9 +1513,6 @@ static nsresult LaunchChild(nsINativeAppSupport* aNative, SaveToEnv("MOZ_LAUNCHED_CHILD=1"); -#if defined(MOZ_WIDGET_ANDROID) - java::GeckoAppShell::ScheduleRestart(); -#else #if defined(XP_MACOSX) CommandLineServiceMac::SetupMacCommandLine(gRestartArgc, gRestartArgv, true); LaunchChildMac(gRestartArgc, gRestartArgv); @@ -1559,7 +1552,6 @@ static nsresult LaunchChild(nsINativeAppSupport* aNative, #endif // XP_UNIX #endif // WP_WIN #endif // WP_MACOSX -#endif // MOZ_WIDGET_ANDROID return NS_ERROR_LAUNCHED_CHILD_PROCESS; } @@ -1653,10 +1645,7 @@ ProfileLockedDialog(nsIFile* aProfileDir, nsIFile* aProfileLocalDir, if (aUnlocker) { int32_t button; -#ifdef MOZ_WIDGET_ANDROID - java::GeckoAppShell::KillAnyZombies(); - button = 0; -#else + const uint32_t flags = (nsIPromptService::BUTTON_TITLE_IS_STRING * nsIPromptService::BUTTON_POS_0) + @@ -1668,7 +1657,6 @@ ProfileLockedDialog(nsIFile* aProfileDir, nsIFile* aProfileLocalDir, killTitle, nullptr, nullptr, nullptr, &checkState, &button); NS_ENSURE_SUCCESS_LOG(rv, rv); -#endif if (button == 0) { rv = aUnlocker->Unlock(nsIProfileUnlocker::FORCE_QUIT); @@ -1682,15 +1670,8 @@ ProfileLockedDialog(nsIFile* aProfileDir, nsIFile* aProfileLocalDir, return LaunchChild(aNative); } } else { -#ifdef MOZ_WIDGET_ANDROID - if (java::GeckoAppShell::UnlockProfile()) { - return NS_LockProfilePath(aProfileDir, aProfileLocalDir, - nullptr, aResult); - } -#else rv = ps->Alert(nullptr, killTitle, killMessage); NS_ENSURE_SUCCESS_LOG(rv, rv); -#endif } return NS_ERROR_ABORT; @@ -3409,7 +3390,7 @@ XREMain::XRE_mainStartup(bool* aExitFlag) } #endif -#if defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID) +#ifdef MOZ_UPDATER // Check for and process any available updates nsCOMPtr updRoot; bool persistent; diff --git a/toolkit/xre/nsEmbedFunctions.cpp b/toolkit/xre/nsEmbedFunctions.cpp index 52b443770..f0a8d9cab 100644 --- a/toolkit/xre/nsEmbedFunctions.cpp +++ b/toolkit/xre/nsEmbedFunctions.cpp @@ -246,17 +246,9 @@ XRE_InitChildProcess(int aArgc, NS_ENSURE_ARG_POINTER(aArgv[0]); MOZ_ASSERT(aChildData); -#if !defined(MOZ_WIDGET_ANDROID) // On non-Fennec Gecko, the GMPLoader code resides in plugin-container, // and we must forward it through to the GMP code here. GMPProcessChild::SetGMPLoader(aChildData->gmpLoader.get()); -#else - // On Fennec, the GMPLoader's code resides inside XUL (because for the time - // being GMPLoader relies upon NSPR, which we can't use in plugin-container - // on Android), so we create it here inside XUL and pass it to the GMP code. - UniquePtr loader = CreateGMPLoader(nullptr); - GMPProcessChild::SetGMPLoader(loader.get()); -#endif #if defined(XP_WIN) // From the --attach-console support in nsNativeAppSupportWin.cpp, but diff --git a/toolkit/xre/nsSigHandlers.cpp b/toolkit/xre/nsSigHandlers.cpp index 660af4522..11648e45a 100644 --- a/toolkit/xre/nsSigHandlers.cpp +++ b/toolkit/xre/nsSigHandlers.cpp @@ -27,9 +27,7 @@ #include #include // atoi #include -#ifndef ANDROID // no Android impl -# include -#endif +#include #endif #ifdef XP_SOLARIS @@ -172,7 +170,7 @@ static void fpehandler(int signum, siginfo_t *si, void *context) *mxcsr &= ~SSE_STATUS_FLAGS; /* clear all pending SSE exceptions */ #endif #endif -#if defined(LINUX) && !defined(ANDROID) +#if defined(LINUX) ucontext_t *uc = (ucontext_t *)context; #if defined(__i386__) diff --git a/toolkit/xre/nsUpdateDriver.cpp b/toolkit/xre/nsUpdateDriver.cpp index be11fb158..499445885 100644 --- a/toolkit/xre/nsUpdateDriver.cpp +++ b/toolkit/xre/nsUpdateDriver.cpp @@ -333,7 +333,7 @@ CopyUpdaterIntoUpdateDir(nsIFile *greDir, nsIFile *appDir, nsIFile *updateDir, return false; CopyFileIntoUpdateDir(appDir, NS_LITERAL_CSTRING(UPDATER_INI), updateDir); #endif -#if defined(XP_UNIX) && !defined(XP_MACOSX) && !defined(ANDROID) +#if defined(XP_UNIX) && !defined(XP_MACOSX) nsCOMPtr iconDir; appDir->Clone(getter_AddRefs(iconDir)); iconDir->AppendNative(NS_LITERAL_CSTRING("icons")); diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp index 265652477..151eb34e5 100644 --- a/toolkit/xre/nsXREDirProvider.cpp +++ b/toolkit/xre/nsXREDirProvider.cpp @@ -1340,10 +1340,6 @@ nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile, bool aLocal) if (!homeDir || !*homeDir) return NS_ERROR_FAILURE; -#ifdef ANDROID /* We want (ProfD == ProfLD) on Android. */ - aLocal = false; -#endif - if (aLocal) { // If $XDG_CACHE_HOME is defined use it, otherwise use $HOME/.cache. const char* cacheHome = getenv("XDG_CACHE_HOME"); @@ -1550,15 +1546,6 @@ nsXREDirProvider::AppendProfilePath(nsIFile* aFile, } NS_ENSURE_SUCCESS(rv, rv); -#elif defined(ANDROID) - // The directory used for storing profiles - // The parent of this directory is set in GetUserDataDirectoryHome - // XXX: handle gAppData->profile properly - // XXXsmaug ...and the rest of the profile creation! - MOZ_ASSERT(!aAppName, - "Profile creation for external applications is not implemented!"); - rv = aFile->AppendNative(nsDependentCString("mozilla")); - NS_ENSURE_SUCCESS(rv, rv); #elif defined(XP_UNIX) nsAutoCString folder; // Make it hidden (by starting with "."), except when local (the