diff options
author | Moonchild <moonchild@palemoon.org> | 2020-08-13 12:10:54 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2020-08-13 12:10:54 +0000 |
commit | 11285cd0d6ef7de80d22187b99376602ed547214 (patch) | |
tree | 034c72eea2e7838b08abd00f37acf8e3c9e97949 | |
parent | e1e535c1c6372f95b4a14b6a00b6d6e7be400c3b (diff) | |
parent | d3383327a749ddb5c0626146c6f83bdfa3ea9936 (diff) | |
download | UXP-11285cd0d6ef7de80d22187b99376602ed547214.tar UXP-11285cd0d6ef7de80d22187b99376602ed547214.tar.gz UXP-11285cd0d6ef7de80d22187b99376602ed547214.tar.lz UXP-11285cd0d6ef7de80d22187b99376602ed547214.tar.xz UXP-11285cd0d6ef7de80d22187b99376602ed547214.zip |
Merge branch 'master' into es-modules-work
149 files changed, 4289 insertions, 2981 deletions
@@ -22,5 +22,5 @@ # changes to stick? As of bug 928195, this shouldn't be necessary! Please # don't change CLOBBER for WebIDL changes any more. -Clobber for incremental customElements v1 landing +Clobber for NSS update diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp index a544f23c1..53ce2b30f 100644 --- a/dom/base/Navigator.cpp +++ b/dom/base/Navigator.cpp @@ -30,7 +30,6 @@ #include "nsUnicharUtils.h" #include "mozilla/Preferences.h" #include "mozilla/Telemetry.h" -#include "BatteryManager.h" #ifdef MOZ_GAMEPAD #include "mozilla/dom/GamepadServiceTest.h" #endif @@ -197,8 +196,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Navigator) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPermissions) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGeolocation) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNotification) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBatteryManager) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBatteryPromise) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPowerManager) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConnection) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mStorageManager) @@ -249,13 +246,6 @@ Navigator::Invalidate() mNotification = nullptr; } - if (mBatteryManager) { - mBatteryManager->Shutdown(); - mBatteryManager = nullptr; - } - - mBatteryPromise = nullptr; - if (mPowerManager) { mPowerManager->Shutdown(); mPowerManager = nullptr; @@ -1321,39 +1311,6 @@ Navigator::GetMozNotification(ErrorResult& aRv) return mNotification; } -//***************************************************************************** -// Navigator::nsINavigatorBattery -//***************************************************************************** - -Promise* -Navigator::GetBattery(ErrorResult& aRv) -{ - if (mBatteryPromise) { - return mBatteryPromise; - } - - if (!mWindow || !mWindow->GetDocShell()) { - aRv.Throw(NS_ERROR_UNEXPECTED); - return nullptr; - } - - nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mWindow); - RefPtr<Promise> batteryPromise = Promise::Create(go, aRv); - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - mBatteryPromise = batteryPromise; - - if (!mBatteryManager) { - mBatteryManager = new battery::BatteryManager(mWindow); - mBatteryManager->Init(); - } - - mBatteryPromise->MaybeResolve(mBatteryManager); - - return mBatteryPromise; -} - PowerManager* Navigator::GetMozPower(ErrorResult& aRv) { diff --git a/dom/base/Navigator.h b/dom/base/Navigator.h index 4ddaaabab..bcc67589e 100644 --- a/dom/base/Navigator.h +++ b/dom/base/Navigator.h @@ -51,10 +51,6 @@ namespace dom { class Permissions; -namespace battery { -class BatteryManager; -} // namespace battery - class Promise; class DesktopNotificationCenter; @@ -136,7 +132,6 @@ public: Permissions* GetPermissions(ErrorResult& aRv); // The XPCOM GetDoNotTrack is ok Geolocation* GetGeolocation(ErrorResult& aRv); - Promise* GetBattery(ErrorResult& aRv); static void AppName(nsAString& aAppName, bool aUsePrefOverriddenValue); @@ -269,8 +264,6 @@ private: RefPtr<Permissions> mPermissions; RefPtr<Geolocation> mGeolocation; RefPtr<DesktopNotificationCenter> mNotification; - RefPtr<battery::BatteryManager> mBatteryManager; - RefPtr<Promise> mBatteryPromise; RefPtr<PowerManager> mPowerManager; RefPtr<network::Connection> mConnection; #ifdef MOZ_AUDIO_CHANNEL_MANAGER diff --git a/dom/base/moz.build b/dom/base/moz.build index ded203c50..fe65453fe 100755 --- a/dom/base/moz.build +++ b/dom/base/moz.build @@ -419,7 +419,6 @@ EXTRA_JS_MODULES += [ ] LOCAL_INCLUDES += [ - '../battery', '../events', '../media', '../network', diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index 61d10e022..3568ced90 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -5123,6 +5123,14 @@ nsContentUtils::TriggerLink(nsIContent *aContent, nsPresContext *aPresContext, fileName.SetIsVoid(true); // No actionable download attribute was found. } + // Sanitize fileNames containing control characters by replacing them with + // underscores. + if (!fileName.IsVoid()) { + for (int i = 0; i < 32; i++) { + fileName.ReplaceChar(char16_t(i), '_'); + } + } + handler->OnLinkClick(aContent, aLinkURI, fileName.IsVoid() ? aTargetSpec.get() : EmptyString().get(), fileName, nullptr, nullptr, aIsTrusted, aContent->NodePrincipal()); diff --git a/dom/battery/BatteryManager.cpp b/dom/battery/BatteryManager.cpp deleted file mode 100644 index 271fa373d..000000000 --- a/dom/battery/BatteryManager.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* 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 <cmath> -#include <limits> -#include "BatteryManager.h" -#include "Constants.h" -#include "mozilla/DOMEventTargetHelper.h" -#include "mozilla/Hal.h" -#include "mozilla/dom/BatteryManagerBinding.h" -#include "mozilla/Preferences.h" -#include "nsContentUtils.h" -#include "nsIDOMClassInfo.h" -#include "nsIDocument.h" - -/** - * We have to use macros here because our leak analysis tool things we are - * leaking strings when we have |static const nsString|. Sad :( - */ -#define LEVELCHANGE_EVENT_NAME NS_LITERAL_STRING("levelchange") -#define CHARGINGCHANGE_EVENT_NAME NS_LITERAL_STRING("chargingchange") -#define DISCHARGINGTIMECHANGE_EVENT_NAME NS_LITERAL_STRING("dischargingtimechange") -#define CHARGINGTIMECHANGE_EVENT_NAME NS_LITERAL_STRING("chargingtimechange") - -namespace mozilla { -namespace dom { -namespace battery { - -BatteryManager::BatteryManager(nsPIDOMWindowInner* aWindow) - : DOMEventTargetHelper(aWindow) - , mLevel(kDefaultLevel) - , mCharging(kDefaultCharging) - , mRemainingTime(kDefaultRemainingTime) -{ -} - -void -BatteryManager::Init() -{ - hal::RegisterBatteryObserver(this); - - hal::BatteryInformation batteryInfo; - hal::GetCurrentBatteryInformation(&batteryInfo); - - UpdateFromBatteryInfo(batteryInfo); -} - -void -BatteryManager::Shutdown() -{ - hal::UnregisterBatteryObserver(this); -} - -JSObject* -BatteryManager::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) -{ - return BatteryManagerBinding::Wrap(aCx, this, aGivenProto); -} - -bool -BatteryManager::Charging() const -{ - MOZ_ASSERT(NS_IsMainThread()); - // For testing, unable to report the battery status information - if (Preferences::GetBool("dom.battery.test.default", false)) { - return true; - } - if (Preferences::GetBool("dom.battery.test.charging", false)) { - return true; - } - if (Preferences::GetBool("dom.battery.test.discharging", false)) { - return false; - } - - return mCharging; -} - -double -BatteryManager::DischargingTime() const -{ - MOZ_ASSERT(NS_IsMainThread()); - // For testing, unable to report the battery status information - if (Preferences::GetBool("dom.battery.test.default", false)) { - return std::numeric_limits<double>::infinity(); - } - if (Preferences::GetBool("dom.battery.test.discharging", false)) { - return 42.0; - } - - if (Charging() || mRemainingTime == kUnknownRemainingTime) { - return std::numeric_limits<double>::infinity(); - } - - return mRemainingTime; -} - -double -BatteryManager::ChargingTime() const -{ - MOZ_ASSERT(NS_IsMainThread()); - // For testing, unable to report the battery status information - if (Preferences::GetBool("dom.battery.test.default", false)) { - return 0.0; - } - if (Preferences::GetBool("dom.battery.test.charging", false)) { - return 42.0; - } - - if (!Charging() || mRemainingTime == kUnknownRemainingTime) { - return std::numeric_limits<double>::infinity(); - } - - return mRemainingTime; -} - -double -BatteryManager::Level() const -{ - MOZ_ASSERT(NS_IsMainThread()); - // For testing, unable to report the battery status information - if (Preferences::GetBool("dom.battery.test.default")) { - return 1.0; - } - - return mLevel; -} - -void -BatteryManager::UpdateFromBatteryInfo(const hal::BatteryInformation& aBatteryInfo) -{ - mLevel = aBatteryInfo.level(); - - // Round to the nearest ten percent for non-chrome and non-certified apps - nsIDocument* doc = GetOwner() ? GetOwner()->GetDoc() : nullptr; - uint16_t status = nsIPrincipal::APP_STATUS_NOT_INSTALLED; - if (doc) { - status = doc->NodePrincipal()->GetAppStatus(); - } - - mCharging = aBatteryInfo.charging(); - mRemainingTime = aBatteryInfo.remainingTime(); - - if (!nsContentUtils::IsChromeDoc(doc) && - status != nsIPrincipal::APP_STATUS_CERTIFIED) - { - mLevel = lround(mLevel * 10.0) / 10.0; - if (mLevel == 1.0) { - mRemainingTime = mCharging ? kDefaultRemainingTime : kUnknownRemainingTime; - } else if (mRemainingTime != kUnknownRemainingTime) { - // Round the remaining time to a multiple of 15 minutes and never zero - const double MINUTES_15 = 15.0 * 60.0; - mRemainingTime = fmax(lround(mRemainingTime / MINUTES_15) * MINUTES_15, - MINUTES_15); - } - } - - // Add some guards to make sure the values are coherent. - if (mLevel == 1.0 && mCharging == true && - mRemainingTime != kDefaultRemainingTime) { - mRemainingTime = kDefaultRemainingTime; - NS_ERROR("Battery API: When charging and level at 1.0, remaining time " - "should be 0. Please fix your backend!"); - } -} - -void -BatteryManager::Notify(const hal::BatteryInformation& aBatteryInfo) -{ - double previousLevel = mLevel; - bool previousCharging = mCharging; - double previousRemainingTime = mRemainingTime; - - UpdateFromBatteryInfo(aBatteryInfo); - - if (previousCharging != mCharging) { - DispatchTrustedEvent(CHARGINGCHANGE_EVENT_NAME); - } - - if (previousLevel != mLevel) { - DispatchTrustedEvent(LEVELCHANGE_EVENT_NAME); - } - - /* - * There are a few situations that could happen here: - * 1. Charging state changed: - * a. Previous remaining time wasn't unkwonw, we have to fire an event for - * the change. - * b. New remaining time isn't unkwonw, we have to fire an event for it. - * 2. Charging state didn't change but remainingTime did, we have to fire - * the event that correspond to the current charging state. - */ - if (mCharging != previousCharging) { - if (previousRemainingTime != kUnknownRemainingTime) { - DispatchTrustedEvent(previousCharging ? CHARGINGTIMECHANGE_EVENT_NAME - : DISCHARGINGTIMECHANGE_EVENT_NAME); - } - if (mRemainingTime != kUnknownRemainingTime) { - DispatchTrustedEvent(mCharging ? CHARGINGTIMECHANGE_EVENT_NAME - : DISCHARGINGTIMECHANGE_EVENT_NAME); - } - } else if (previousRemainingTime != mRemainingTime) { - DispatchTrustedEvent(mCharging ? CHARGINGTIMECHANGE_EVENT_NAME - : DISCHARGINGTIMECHANGE_EVENT_NAME); - } -} - -} // namespace battery -} // namespace dom -} // namespace mozilla diff --git a/dom/battery/BatteryManager.h b/dom/battery/BatteryManager.h deleted file mode 100644 index 4094c40d4..000000000 --- a/dom/battery/BatteryManager.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_dom_battery_BatteryManager_h -#define mozilla_dom_battery_BatteryManager_h - -#include "Types.h" -#include "mozilla/DOMEventTargetHelper.h" -#include "mozilla/Observer.h" -#include "nsCycleCollectionParticipant.h" - -namespace mozilla { - -namespace hal { -class BatteryInformation; -} // namespace hal - -namespace dom { -namespace battery { - -class BatteryManager : public DOMEventTargetHelper - , public BatteryObserver -{ -public: - explicit BatteryManager(nsPIDOMWindowInner* aWindow); - - void Init(); - void Shutdown(); - - // For IObserver. - void Notify(const hal::BatteryInformation& aBatteryInfo) override; - - /** - * WebIDL Interface - */ - - nsPIDOMWindowInner* GetParentObject() const - { - return GetOwner(); - } - - virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; - - bool Charging() const; - - double ChargingTime() const; - - double DischargingTime() const; - - double Level() const; - - IMPL_EVENT_HANDLER(chargingchange) - IMPL_EVENT_HANDLER(chargingtimechange) - IMPL_EVENT_HANDLER(dischargingtimechange) - IMPL_EVENT_HANDLER(levelchange) - -private: - /** - * Update the battery information stored in the battery manager object using - * a battery information object. - */ - void UpdateFromBatteryInfo(const hal::BatteryInformation& aBatteryInfo); - - /** - * Represents the battery level, ranging from 0.0 (dead or removed?) - * to 1.0 (fully charged) - */ - double mLevel; - bool mCharging; - /** - * Represents the discharging time or the charging time, depending on the - * current battery status (charging or not). - */ - double mRemainingTime; -}; - -} // namespace battery -} // namespace dom -} // namespace mozilla - -#endif // mozilla_dom_battery_BatteryManager_h diff --git a/dom/battery/Constants.h b/dom/battery/Constants.h deleted file mode 100644 index f642e2a46..000000000 --- a/dom/battery/Constants.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_dom_battery_Constants_h__ -#define mozilla_dom_battery_Constants_h__ - -/** - * A set of constants that might need to be used by battery backends. - * It's not part of BatteryManager.h to prevent those backends to include it. - */ -namespace mozilla { -namespace dom { -namespace battery { - - static const double kDefaultLevel = 1.0; - static const bool kDefaultCharging = true; - static const double kDefaultRemainingTime = 0; - static const double kUnknownRemainingTime = -1; - -} // namespace battery -} // namespace dom -} // namespace mozilla - -#endif // mozilla_dom_battery_Constants_h__ diff --git a/dom/battery/Types.h b/dom/battery/Types.h deleted file mode 100644 index ee55a26d3..000000000 --- a/dom/battery/Types.h +++ /dev/null @@ -1,23 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_dom_battery_Types_h -#define mozilla_dom_battery_Types_h - -namespace mozilla { -namespace hal { -class BatteryInformation; -} // namespace hal - -template <class T> -class Observer; - -typedef Observer<hal::BatteryInformation> BatteryObserver; - -} // namespace mozilla - -#endif // mozilla_dom_battery_Types_h - diff --git a/dom/battery/moz.build b/dom/battery/moz.build deleted file mode 100644 index e3743c40b..000000000 --- a/dom/battery/moz.build +++ /dev/null @@ -1,21 +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/. - -EXPORTS.mozilla.dom.battery += [ - 'Constants.h', - 'Types.h', -] - -SOURCES += [ - 'BatteryManager.cpp', -] - -include('/ipc/chromium/chromium-config.mozbuild') - -FINAL_LIBRARY = 'xul' - -MOCHITEST_CHROME_MANIFESTS += ['test/chrome.ini'] -MOCHITEST_MANIFESTS += ['test/mochitest.ini'] diff --git a/dom/battery/test/chrome.ini b/dom/battery/test/chrome.ini deleted file mode 100644 index ced199bff..000000000 --- a/dom/battery/test/chrome.ini +++ /dev/null @@ -1,3 +0,0 @@ -[test_battery_basics.html] -[test_battery_charging.html] -[test_battery_discharging.html] diff --git a/dom/battery/test/mochitest.ini b/dom/battery/test/mochitest.ini deleted file mode 100644 index 4d8307930..000000000 --- a/dom/battery/test/mochitest.ini +++ /dev/null @@ -1 +0,0 @@ -[test_battery_unprivileged.html] diff --git a/dom/battery/test/test_battery_basics.html b/dom/battery/test/test_battery_basics.html deleted file mode 100644 index 96f7f3368..000000000 --- a/dom/battery/test/test_battery_basics.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> - <title>Test for Battery API</title> - <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> - <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/> -</head> -<body> -<p id="display"></p> -<div id="content" style="display: none"> -</div> -<pre id="test"> -<script type="application/javascript"> - -"use strict"; - -SimpleTest.waitForExplicitFinish(); - -/** Test for Battery API **/ -ok("getBattery" in navigator, "navigator.getBattery should exist"); -ok(!("battery" in navigator), "navigator.battery should not exist"); - -navigator.getBattery().then(function (battery) { - ok(battery.level >= 0.0 && battery.level <= 1.0, "Battery level " + battery.level + " should be in the range [0.0, 1.0]"); - - SpecialPowers.pushPrefEnv({"set": [["dom.battery.test.default", true]]}, function () { - ok(battery.charging, "Battery should be charging by default"); - is(battery.chargingTime, 0, "Battery chargingTime " + battery.chargingTime + " should be zero by default"); - is(battery.dischargingTime, Infinity, "Battery dischargingTime should be Infinity by default"); - is(battery.level, 1.0, "Battery level " + battery.level + " should be 1.0 by default"); - - SimpleTest.finish(); - }); -}); - -</script> -</pre> -</body> -</html> diff --git a/dom/battery/test/test_battery_charging.html b/dom/battery/test/test_battery_charging.html deleted file mode 100644 index 5d1e83284..000000000 --- a/dom/battery/test/test_battery_charging.html +++ /dev/null @@ -1,35 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> - <title>Test for Battery API</title> - <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> - <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/> -</head> -<body> -<p id="display"></p> -<div id="content" style="display: none"> -</div> -<pre id="test"> -<script type="application/javascript"> - -"use strict"; - -SimpleTest.waitForExplicitFinish(); - -/** Test for Battery API **/ -navigator.getBattery().then(function (battery) { - ok(battery.level >= 0.0 && battery.level <= 1.0, "Battery level " + battery.level + " should be in the range [0.0, 1.0]"); - - SpecialPowers.pushPrefEnv({"set": [["dom.battery.test.charging", true]]}, function () { - is(battery.charging, true, "Battery should be charging"); - ok(battery.chargingTime >= 0, "Battery chargingTime " + battery.chargingTime + " should be nonnegative when charging"); - is(battery.dischargingTime, Infinity, "Battery dischargingTime should be Infinity when charging"); - - SimpleTest.finish(); - }); -}); - -</script> -</pre> -</body> -</html> diff --git a/dom/battery/test/test_battery_discharging.html b/dom/battery/test/test_battery_discharging.html deleted file mode 100644 index 26a0359d3..000000000 --- a/dom/battery/test/test_battery_discharging.html +++ /dev/null @@ -1,35 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> - <title>Test for Battery API</title> - <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> - <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/> -</head> -<body> -<p id="display"></p> -<div id="content" style="display: none"> -</div> -<pre id="test"> -<script type="application/javascript"> - -"use strict"; - -SimpleTest.waitForExplicitFinish(); - -/** Test for Battery API **/ -navigator.getBattery().then(function (battery) { - ok(battery.level >= 0.0 && battery.level <= 1.0, "Battery level " + battery.level + " should be in the range [0.0, 1.0]"); - - SpecialPowers.pushPrefEnv({"set": [["dom.battery.test.discharging", true]]}, function () { - is(battery.charging, false, "Battery should be discharging"); - is(battery.chargingTime, Infinity, "Battery chargingTime should be Infinity when discharging"); - ok(battery.dischargingTime > 0, "Battery dischargingTime " + battery.dischargingTime + " should be positive when discharging"); - - SimpleTest.finish(); - }); -}); - -</script> -</pre> -</body> -</html> diff --git a/dom/battery/test/test_battery_unprivileged.html b/dom/battery/test/test_battery_unprivileged.html deleted file mode 100644 index e56db8ac7..000000000 --- a/dom/battery/test/test_battery_unprivileged.html +++ /dev/null @@ -1,24 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> - <title>Test for Battery API</title> - <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> - <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> -</head> -<body> -<p id="display"></p> -<div id="content" style="display: none"> -</div> -<pre id="test"> -<script type="application/javascript"> - -"use strict"; - -/** Test for Battery API **/ -ok(!("getBattery" in navigator), "navigator.getBattery should not exist for unprivileged web content"); -ok(!("battery" in navigator), "navigator.battery should not exist"); - -</script> -</pre> -</body> -</html> diff --git a/dom/bindings/moz.build b/dom/bindings/moz.build index fae0fd15a..14abc6d88 100644 --- a/dom/bindings/moz.build +++ b/dom/bindings/moz.build @@ -62,7 +62,6 @@ LOCAL_INCLUDES += [ LOCAL_INCLUDES += [ '/dom/base', - '/dom/battery', '/dom/canvas', '/dom/geolocation', '/dom/html', diff --git a/dom/cache/TypeUtils.cpp b/dom/cache/TypeUtils.cpp index f8c5cd7be..5c3661d66 100644 --- a/dom/cache/TypeUtils.cpp +++ b/dom/cache/TypeUtils.cpp @@ -253,7 +253,7 @@ TypeUtils::ToResponse(const CacheResponse& aIn) { if (aIn.type() == ResponseType::Error) { RefPtr<InternalResponse> error = InternalResponse::NetworkError(); - RefPtr<Response> r = new Response(GetGlobalObject(), error); + RefPtr<Response> r = new Response(GetGlobalObject(), error, nullptr); return r.forget(); } @@ -302,7 +302,7 @@ TypeUtils::ToResponse(const CacheResponse& aIn) } MOZ_DIAGNOSTIC_ASSERT(ir); - RefPtr<Response> ref = new Response(GetGlobalObject(), ir); + RefPtr<Response> ref = new Response(GetGlobalObject(), ir, nullptr); return ref.forget(); } already_AddRefed<InternalRequest> @@ -345,7 +345,7 @@ already_AddRefed<Request> TypeUtils::ToRequest(const CacheRequest& aIn) { RefPtr<InternalRequest> internalRequest = ToInternalRequest(aIn); - RefPtr<Request> request = new Request(GetGlobalObject(), internalRequest); + RefPtr<Request> request = new Request(GetGlobalObject(), internalRequest, nullptr); return request.forget(); } diff --git a/dom/fetch/Fetch.cpp b/dom/fetch/Fetch.cpp index 191f4cfc3..f0350fbce 100644 --- a/dom/fetch/Fetch.cpp +++ b/dom/fetch/Fetch.cpp @@ -111,6 +111,12 @@ public: return mSignalMainThread; } + AbortSignal* + GetSignalForTargetThread() + { + return mFollowingSignal; + } + void Shutdown() { @@ -161,7 +167,7 @@ public: } AbortSignal* - GetAbortSignal() + GetAbortSignalForMainThread() { MOZ_ASSERT(NS_IsMainThread()); @@ -172,6 +178,18 @@ public: return mSignalProxy->GetOrCreateSignalForMainThread(); } + AbortSignal* + GetAbortSignalForTargetThread() + { + mPromiseProxy->GetWorkerPrivate()->AssertIsOnWorkerThread(); + + if (!mSignalProxy) { + return nullptr; + } + + return mSignalProxy->GetSignalForTargetThread(); + } + void OnResponseAvailableInternal(InternalResponse* aResponse) override; @@ -205,14 +223,16 @@ class MainThreadFetchResolver final : public FetchDriverObserver RefPtr<Promise> mPromise; RefPtr<Response> mResponse; RefPtr<FetchObserver> mFetchObserver; + RefPtr<AbortSignal> mSignal; nsCOMPtr<nsIDocument> mDocument; NS_DECL_OWNINGTHREAD public: - MainThreadFetchResolver(Promise* aPromise, FetchObserver* aObserver) + MainThreadFetchResolver(Promise* aPromise, FetchObserver* aObserver, AbortSignal* aSignal) : mPromise(aPromise) , mFetchObserver(aObserver) + , mSignal(aSignal) {} void @@ -287,7 +307,7 @@ public: fetch->SetWorkerScript(spec); } - RefPtr<AbortSignal> signal = mResolver->GetAbortSignal(); + RefPtr<AbortSignal> signal = mResolver->GetAbortSignalForMainThread(); // ...but release it before calling Fetch, because mResolver's callback can // be called synchronously and they want the mutex, too. @@ -329,10 +349,7 @@ FetchRequest(nsIGlobalObject* aGlobal, const RequestOrUSVString& aInput, RefPtr<InternalRequest> r = request->GetInternalRequest(); - RefPtr<AbortSignal> signal; - if (aInit.mSignal.WasPassed()) { - signal = &aInit.mSignal.Value(); - } + RefPtr<AbortSignal> signal = request->GetSignal(); if (signal && signal->Aborted()) { // An already aborted signal should reject immediately. @@ -373,7 +390,7 @@ FetchRequest(nsIGlobalObject* aGlobal, const RequestOrUSVString& aInput, } RefPtr<MainThreadFetchResolver> resolver = - new MainThreadFetchResolver(p, observer); + new MainThreadFetchResolver(p, observer, signal); RefPtr<FetchDriver> fetch = new FetchDriver(r, principal, loadGroup); fetch->SetDocument(doc); resolver->SetDocument(doc); @@ -416,7 +433,7 @@ MainThreadFetchResolver::OnResponseAvailableInternal(InternalResponse* aResponse } nsCOMPtr<nsIGlobalObject> go = mPromise->GetParentObject(); - mResponse = new Response(go, aResponse); + mResponse = new Response(go, aResponse, mSignal); mPromise->MaybeResolve(mResponse); } else { if (mFetchObserver) { @@ -479,7 +496,7 @@ public: } RefPtr<nsIGlobalObject> global = aWorkerPrivate->GlobalScope(); - RefPtr<Response> response = new Response(global, mInternalResponse); + RefPtr<Response> response = new Response(global, mInternalResponse, mResolver->GetAbortSignalForTargetThread()); promise->MaybeResolve(response); } else { if (mResolver->mFetchObserver) { @@ -926,6 +943,12 @@ template <class Derived> already_AddRefed<Promise> FetchBody<Derived>::ConsumeBody(FetchConsumeType aType, ErrorResult& aRv) { + RefPtr<AbortSignal> signal = DerivedClass()->GetSignal(); + if (signal && signal->Aborted()) { + aRv.Throw(NS_ERROR_DOM_ABORT_ERR); + return nullptr; + } + if (BodyUsed()) { aRv.ThrowTypeError<MSG_FETCH_BODY_CONSUMED_ERROR>(); return nullptr; @@ -935,7 +958,7 @@ FetchBody<Derived>::ConsumeBody(FetchConsumeType aType, ErrorResult& aRv) RefPtr<Promise> promise = FetchBodyConsumer<Derived>::Create(DerivedClass()->GetParentObject(), - this, aType, aRv); + this, signal, aType, aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; } diff --git a/dom/fetch/Fetch.h b/dom/fetch/Fetch.h index fc50d3fda..842066152 100644 --- a/dom/fetch/Fetch.h +++ b/dom/fetch/Fetch.h @@ -162,6 +162,9 @@ public: return mMimeType; } + virtual AbortSignal* + GetSignal() const = 0; + protected: FetchBody(); diff --git a/dom/fetch/FetchConsumer.cpp b/dom/fetch/FetchConsumer.cpp index e82e5ec51..d2d07eaa2 100644 --- a/dom/fetch/FetchConsumer.cpp +++ b/dom/fetch/FetchConsumer.cpp @@ -284,6 +284,7 @@ template <class Derived> /* static */ already_AddRefed<Promise> FetchBodyConsumer<Derived>::Create(nsIGlobalObject* aGlobal, FetchBody<Derived>* aBody, + AbortSignal* aSignal, FetchConsumeType aType, ErrorResult& aRv) { @@ -345,6 +346,10 @@ FetchBodyConsumer<Derived>::Create(nsIGlobalObject* aGlobal, return nullptr; } + if (aSignal) { + consumer->Follow(aSignal); + } + return promise.forget(); } @@ -368,6 +373,8 @@ FetchBodyConsumer<Derived>::ReleaseObject() #ifdef DEBUG mBody = nullptr; #endif + + Unfollow(); } template <class Derived> @@ -684,6 +691,14 @@ FetchBodyConsumer<Derived>::Observe(nsISupports* aSubject, return NS_OK; } +template <class Derived> +void +FetchBodyConsumer<Derived>::Aborted() +{ + AssertIsOnTargetThread(); + ContinueConsumeBody(NS_ERROR_DOM_ABORT_ERR, 0, nullptr); +} + template <class Derived> NS_IMPL_ADDREF(FetchBodyConsumer<Derived>) diff --git a/dom/fetch/FetchConsumer.h b/dom/fetch/FetchConsumer.h index 2b5725342..77af09d9b 100644 --- a/dom/fetch/FetchConsumer.h +++ b/dom/fetch/FetchConsumer.h @@ -11,6 +11,7 @@ #include "nsIInputStream.h" #include "nsIObserver.h" #include "nsWeakReference.h" +#include "mozilla/dom/AbortSignal.h" #include "mozilla/dom/MutableBlobStorage.h" class nsIThread; @@ -34,6 +35,7 @@ template <class Derived> class FetchBody; template <class Derived> class FetchBodyConsumer final : public nsIObserver , public nsSupportsWeakReference + , public AbortSignal::Follower { public: NS_DECL_THREADSAFE_ISUPPORTS @@ -42,6 +44,7 @@ public: static already_AddRefed<Promise> Create(nsIGlobalObject* aGlobal, FetchBody<Derived>* aBody, + AbortSignal* aSignal, FetchConsumeType aType, ErrorResult& aRv); @@ -73,6 +76,9 @@ public: mConsumeBodyPump = nullptr; } + // Override AbortSignal::Follower::Aborted + void Aborted() override; + private: FetchBodyConsumer(nsIGlobalObject* aGlobalObject, workers::WorkerPrivate* aWorkerPrivate, diff --git a/dom/fetch/FetchDriver.cpp b/dom/fetch/FetchDriver.cpp index 067e32db4..fd1e99a2b 100644 --- a/dom/fetch/FetchDriver.cpp +++ b/dom/fetch/FetchDriver.cpp @@ -499,6 +499,11 @@ FetchDriver::OnStartRequest(nsIRequest* aRequest, return rv; } + if (!mChannel) { + MOZ_ASSERT(!mObserver); + return NS_BINDING_ABORTED; + } + // We should only get to the following code once. MOZ_ASSERT(!mPipeOutputStream); MOZ_ASSERT(mObserver); diff --git a/dom/fetch/Request.cpp b/dom/fetch/Request.cpp index 6a7885b1a..76f3ce5c5 100644 --- a/dom/fetch/Request.cpp +++ b/dom/fetch/Request.cpp @@ -37,15 +37,18 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Request) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END -Request::Request(nsIGlobalObject* aOwner, InternalRequest* aRequest) +Request::Request(nsIGlobalObject* aOwner, InternalRequest* aRequest, AbortSignal* aSignal) : FetchBody<Request>() , mOwner(aOwner) , mRequest(aRequest) + , mSignal(aSignal) { MOZ_ASSERT(aRequest->Headers()->Guard() == HeadersGuardEnum::Immutable || aRequest->Headers()->Guard() == HeadersGuardEnum::Request || aRequest->Headers()->Guard() == HeadersGuardEnum::Request_no_cors); SetMimeType(); + + // aSignal can be null. } Request::~Request() @@ -286,6 +289,8 @@ Request::Constructor(const GlobalObject& aGlobal, RefPtr<InternalRequest> request; nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports()); + + RefPtr<AbortSignal> signal; if (aInput.IsRequest()) { RefPtr<Request> inputReq = &aInput.GetAsRequest(); @@ -300,6 +305,7 @@ Request::Constructor(const GlobalObject& aGlobal, } request = inputReq->GetInternalRequest(); + signal = inputReq->GetOrCreateSignal(); } else { // aInput is USVString. // We need to get url before we create a InternalRequest. @@ -418,6 +424,10 @@ Request::Constructor(const GlobalObject& aGlobal, request->SetReferrerPolicy(aInit.mReferrerPolicy.Value()); } + if (aInit.mSignal.WasPassed()) { + signal = aInit.mSignal.Value(); + } + if (NS_IsMainThread()) { nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(global); if (window) { @@ -579,7 +589,7 @@ Request::Constructor(const GlobalObject& aGlobal, } } - RefPtr<Request> domRequest = new Request(global, request); + RefPtr<Request> domRequest = new Request(global, request, signal); domRequest->SetMimeType(); if (aInput.IsRequest()) { @@ -595,7 +605,7 @@ Request::Constructor(const GlobalObject& aGlobal, } already_AddRefed<Request> -Request::Clone(ErrorResult& aRv) const +Request::Clone(ErrorResult& aRv) { if (BodyUsed()) { aRv.ThrowTypeError<MSG_FETCH_BODY_CONSUMED_ERROR>(); @@ -608,7 +618,7 @@ Request::Clone(ErrorResult& aRv) const return nullptr; } - RefPtr<Request> request = new Request(mOwner, ir); + RefPtr<Request> request = new Request(mOwner, ir, GetOrCreateSignal()); return request.forget(); } @@ -622,5 +632,21 @@ Request::Headers_() return mHeaders; } +AbortSignal* +Request::GetOrCreateSignal() +{ + if (!mSignal) { + mSignal = new AbortSignal(false); + } + + return mSignal; +} + +AbortSignal* +Request::GetSignal() const +{ + return mSignal; +} + } // namespace dom } // namespace mozilla diff --git a/dom/fetch/Request.h b/dom/fetch/Request.h index f6fe9be7b..34cbc52cf 100644 --- a/dom/fetch/Request.h +++ b/dom/fetch/Request.h @@ -33,7 +33,7 @@ class Request final : public nsISupports NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Request) public: - Request(nsIGlobalObject* aOwner, InternalRequest* aRequest); + Request(nsIGlobalObject* aOwner, InternalRequest* aRequest, AbortSignal* aSignal); static bool RequestContextEnabled(JSContext* aCx, JSObject* aObj); @@ -142,7 +142,7 @@ public: } already_AddRefed<Request> - Clone(ErrorResult& aRv) const; + Clone(ErrorResult& aRv); already_AddRefed<InternalRequest> GetInternalRequest(); @@ -153,13 +153,22 @@ public: return mRequest->GetPrincipalInfo(); } + AbortSignal*
+ GetOrCreateSignal();
+
+ // This can return a null AbortSignal.
+ AbortSignal*
+ GetSignal() const override;
+ private: ~Request(); nsCOMPtr<nsIGlobalObject> mOwner; RefPtr<InternalRequest> mRequest; + // Lazily created. RefPtr<Headers> mHeaders; + RefPtr<AbortSignal> mSignal; }; } // namespace dom diff --git a/dom/fetch/Response.cpp b/dom/fetch/Response.cpp index e35de0e12..241614286 100644 --- a/dom/fetch/Response.cpp +++ b/dom/fetch/Response.cpp @@ -34,10 +34,11 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Response) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END -Response::Response(nsIGlobalObject* aGlobal, InternalResponse* aInternalResponse) +Response::Response(nsIGlobalObject* aGlobal, InternalResponse* aInternalResponse, AbortSignal* aSignal) : FetchBody<Response>() , mOwner(aGlobal) , mInternalResponse(aInternalResponse) + , mSignal(aSignal) { MOZ_ASSERT(aInternalResponse->Headers()->Guard() == HeadersGuardEnum::Immutable || aInternalResponse->Headers()->Guard() == HeadersGuardEnum::Response); @@ -53,7 +54,7 @@ Response::Error(const GlobalObject& aGlobal) { nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports()); RefPtr<InternalResponse> error = InternalResponse::NetworkError(); - RefPtr<Response> r = new Response(global, error); + RefPtr<Response> r = new Response(global, error, nullptr); return r.forget(); } @@ -173,7 +174,7 @@ Response::Constructor(const GlobalObject& aGlobal, internalResponse->InitChannelInfo(worker->GetChannelInfo()); } - RefPtr<Response> r = new Response(global, internalResponse); + RefPtr<Response> r = new Response(global, internalResponse, nullptr); if (aInit.mHeaders.WasPassed()) { internalResponse->Headers()->Clear(); @@ -236,7 +237,7 @@ Response::Clone(ErrorResult& aRv) const } RefPtr<InternalResponse> ir = mInternalResponse->Clone(); - RefPtr<Response> response = new Response(mOwner, ir); + RefPtr<Response> response = new Response(mOwner, ir, mSignal); return response.forget(); } @@ -250,7 +251,7 @@ Response::CloneUnfiltered(ErrorResult& aRv) const RefPtr<InternalResponse> clone = mInternalResponse->Clone(); RefPtr<InternalResponse> ir = clone->Unfiltered(); - RefPtr<Response> ref = new Response(mOwner, ir); + RefPtr<Response> ref = new Response(mOwner, ir, mSignal); return ref.forget(); } diff --git a/dom/fetch/Response.h b/dom/fetch/Response.h index de367bef6..ca86c3458 100644 --- a/dom/fetch/Response.h +++ b/dom/fetch/Response.h @@ -33,7 +33,7 @@ class Response final : public nsISupports NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Response) public: - Response(nsIGlobalObject* aGlobal, InternalResponse* aInternalResponse); + Response(nsIGlobalObject* aGlobal, InternalResponse* aInternalResponse, AbortSignal* aSignal); Response(const Response& aOther) = delete; @@ -134,13 +134,21 @@ public: already_AddRefed<InternalResponse> GetInternalResponse() const; + AbortSignal* + GetSignal() const override + { + return mSignal; + } + private: ~Response(); nsCOMPtr<nsIGlobalObject> mOwner; RefPtr<InternalResponse> mInternalResponse; + // Lazily created RefPtr<Headers> mHeaders; + RefPtr<AbortSignal> mSignal; }; } // namespace dom diff --git a/dom/html/HTMLImageElement.cpp b/dom/html/HTMLImageElement.cpp index 444c352e2..d042a9fe6 100644 --- a/dom/html/HTMLImageElement.cpp +++ b/dom/html/HTMLImageElement.cpp @@ -325,7 +325,7 @@ HTMLImageElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsGenericHTMLElement::MapImageAlignAttributeInto(aAttributes, aData); nsGenericHTMLElement::MapImageBorderAttributeInto(aAttributes, aData); nsGenericHTMLElement::MapImageMarginAttributeInto(aAttributes, aData); - nsGenericHTMLElement::MapImageSizeAttributesInto(aAttributes, aData); + nsGenericHTMLElement::MapImageSizeAttributesInto(aAttributes, aData, true); nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); } diff --git a/dom/html/HTMLImageElement.h b/dom/html/HTMLImageElement.h index bb4a09882..23cac4afb 100644 --- a/dom/html/HTMLImageElement.h +++ b/dom/html/HTMLImageElement.h @@ -196,6 +196,11 @@ public: return GetReferrerPolicyAsEnum(); } + bool IsAwaitingLoad() const + { + return !!mPendingImageLoadTask; + } + int32_t X(); int32_t Y(); // Uses XPCOM GetLowsrc. diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp index b52e61ce6..35ce8533b 100644 --- a/dom/html/nsGenericHTMLElement.cpp +++ b/dom/html/nsGenericHTMLElement.cpp @@ -1449,29 +1449,57 @@ nsGenericHTMLElement::MapImageMarginAttributeInto(const nsMappedAttributes* aAtt void nsGenericHTMLElement::MapImageSizeAttributesInto(const nsMappedAttributes* aAttributes, - nsRuleData* aData) + nsRuleData* aData, + bool aMapAspectRatio) { if (!(aData->mSIDs & NS_STYLE_INHERIT_BIT(Position))) return; + auto* aWidth = aAttributes->GetAttr(nsGkAtoms::width); + auto* aHeight = aAttributes->GetAttr(nsGkAtoms::height); + // width: value - nsCSSValue* width = aData->ValueForWidth(); - if (width->GetUnit() == eCSSUnit_Null) { - const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); - if (value && value->Type() == nsAttrValue::eInteger) - width->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); - else if (value && value->Type() == nsAttrValue::ePercent) - width->SetPercentValue(value->GetPercentValue()); + if (aWidth) { + nsCSSValue* cWidth = aData->ValueForWidth(); + if (cWidth->GetUnit() == eCSSUnit_Null) { + if (aWidth->Type() == nsAttrValue::eInteger) + cWidth->SetFloatValue((float)aWidth->GetIntegerValue(), eCSSUnit_Pixel); + else if (aWidth->Type() == nsAttrValue::ePercent) + cWidth->SetPercentValue(aWidth->GetPercentValue()); + } } // height: value - nsCSSValue* height = aData->ValueForHeight(); - if (height->GetUnit() == eCSSUnit_Null) { - const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height); - if (value && value->Type() == nsAttrValue::eInteger) - height->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); - else if (value && value->Type() == nsAttrValue::ePercent) - height->SetPercentValue(value->GetPercentValue()); + if (aHeight) { + nsCSSValue* cHeight = aData->ValueForHeight(); + if (cHeight->GetUnit() == eCSSUnit_Null) { + if (aHeight->Type() == nsAttrValue::eInteger) + cHeight->SetFloatValue((float)aHeight->GetIntegerValue(), eCSSUnit_Pixel); + else if (aHeight->Type() == nsAttrValue::ePercent) + cHeight->SetPercentValue(aHeight->GetPercentValue()); + } + } + + if (Preferences::GetBool("layout.css.intrinsic-aspect-ratio.enabled") && + aMapAspectRatio && aWidth && aHeight) { + Maybe<double> w; + if (aWidth->Type() == nsAttrValue::eInteger) { + w.emplace(aWidth->GetIntegerValue()); + } else if (aWidth->Type() == nsAttrValue::eDoubleValue) { + w.emplace(aWidth->GetDoubleValue()); + } + + Maybe<double> h; + if (aHeight->Type() == nsAttrValue::eInteger) { + h.emplace(aHeight->GetIntegerValue()); + } else if (aHeight->Type() == nsAttrValue::eDoubleValue) { + h.emplace(aHeight->GetDoubleValue()); + } + + if (w && h && *w != 0 && *h != 0) { + nsCSSValue* aspect_ratio = aData->ValueForAspectRatio(); + aspect_ratio->SetFloatValue((float(*w) / float(*h)), eCSSUnit_Number); + } } } diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h index c9169df11..8412ea0dc 100644 --- a/dom/html/nsGenericHTMLElement.h +++ b/dom/html/nsGenericHTMLElement.h @@ -702,10 +702,12 @@ public: * * @param aAttributes the list of attributes to map * @param aData the returned rule data [INOUT] + * @param aMapAspectRatio map width and height attributes on aspect-ratio * @see GetAttributeMappingFunction */ static void MapImageSizeAttributesInto(const nsMappedAttributes* aAttributes, - nsRuleData* aData); + nsRuleData* aData, + bool = false); /** * Helper to map the background attribute * into a style struct. diff --git a/dom/moz.build b/dom/moz.build index 7888ccd69..e232f3443 100644 --- a/dom/moz.build +++ b/dom/moz.build @@ -43,7 +43,6 @@ DIRS += [ 'base', 'archivereader', 'bindings', - 'battery', 'browser-element', 'cache', 'canvas', diff --git a/dom/quota/QuotaManagerService.cpp b/dom/quota/QuotaManagerService.cpp index bd811dc9b..22b5d17b1 100644 --- a/dom/quota/QuotaManagerService.cpp +++ b/dom/quota/QuotaManagerService.cpp @@ -432,30 +432,6 @@ QuotaManagerService::PerformIdleMaintenance() MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(NS_IsMainThread()); - // If we're running on battery power then skip all idle maintenance since we - // would otherwise be doing lots of disk I/O. - BatteryInformation batteryInfo; - -#ifdef MOZ_WIDGET_ANDROID - // Android XPCShell doesn't load the AndroidBridge that is needed to make - // GetCurrentBatteryInformation work... - if (!QuotaManager::IsRunningXPCShellTests()) -#endif - { - GetCurrentBatteryInformation(&batteryInfo); - } - - // If we're running XPCShell because we always want to be able to test this - // code so pretend that we're always charging. - if (QuotaManager::IsRunningXPCShellTests()) { - batteryInfo.level() = 100; - batteryInfo.charging() = true; - } - - if (NS_WARN_IF(!batteryInfo.charging())) { - return; - } - if (QuotaManager::IsRunningXPCShellTests()) { // We don't want user activity to impact this code if we're running tests. Unused << Observe(nullptr, OBSERVER_TOPIC_IDLE, nullptr); diff --git a/dom/webidl/BatteryManager.webidl b/dom/webidl/BatteryManager.webidl deleted file mode 100644 index a964f3b0b..000000000 --- a/dom/webidl/BatteryManager.webidl +++ /dev/null @@ -1,23 +0,0 @@ -/* -*- Mode: IDL; 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/. - * - * The origin of this IDL file is - * http://www.w3.org/TR/battery-status/ - * - * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C - * liability, trademark and document use rules apply. - */ - -interface BatteryManager : EventTarget { - readonly attribute boolean charging; - readonly attribute unrestricted double chargingTime; - readonly attribute unrestricted double dischargingTime; - readonly attribute double level; - - attribute EventHandler onchargingchange; - attribute EventHandler onchargingtimechange; - attribute EventHandler ondischargingtimechange; - attribute EventHandler onlevelchange; -}; diff --git a/dom/webidl/Navigator.webidl b/dom/webidl/Navigator.webidl index 4536d7d25..f34429de7 100644 --- a/dom/webidl/Navigator.webidl +++ b/dom/webidl/Navigator.webidl @@ -7,7 +7,6 @@ * http://www.whatwg.org/specs/web-apps/current-work/#the-navigator-object * http://www.w3.org/TR/tracking-dnt/ * http://www.w3.org/TR/geolocation-API/#geolocation_interface - * http://www.w3.org/TR/battery-status/#navigatorbattery-interface * http://www.w3.org/TR/vibration/#vibration-interface * http://www.w3.org/2012/sysapps/runtime/#extension-to-the-navigator-interface-1 * https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#navigator-interface-extension @@ -125,13 +124,6 @@ interface NavigatorGeolocation { }; Navigator implements NavigatorGeolocation; -// http://www.w3.org/TR/battery-status/#navigatorbattery-interface -partial interface Navigator { - // ChromeOnly to prevent web content from fingerprinting users' batteries. - [Throws, ChromeOnly, Pref="dom.battery.enabled"] - Promise<BatteryManager> getBattery(); -}; - // http://www.w3.org/TR/vibration/#vibration-interface partial interface Navigator { // We don't support sequences in unions yet diff --git a/dom/webidl/Node.webidl b/dom/webidl/Node.webidl index c9fb7e77e..bf2c1c4de 100644 --- a/dom/webidl/Node.webidl +++ b/dom/webidl/Node.webidl @@ -38,7 +38,7 @@ interface Node : EventTarget { readonly attribute boolean isConnected; [Pure] readonly attribute Document? ownerDocument; - [Pure] + [Pure, Pref="dom.getRootNode.enabled"] Node getRootNode(optional GetRootNodeOptions options); [Pure] readonly attribute Node? parentNode; diff --git a/dom/webidl/Request.webidl b/dom/webidl/Request.webidl index fe6a63ec0..9140543e7 100644 --- a/dom/webidl/Request.webidl +++ b/dom/webidl/Request.webidl @@ -27,6 +27,10 @@ interface Request { readonly attribute RequestRedirect redirect; readonly attribute DOMString integrity; + [Func="AbortController::IsEnabled", + BinaryName="getOrCreateSignal"] + readonly attribute AbortSignal signal; + [Throws, NewObject] Request clone(); @@ -49,7 +53,7 @@ dictionary RequestInit { DOMString integrity; [Func="AbortController::IsEnabled"] - AbortSignal signal; + AbortSignal? signal; [Func="FetchObserver::IsEnabled"] ObserverCallback observe; diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build index acdc392be..c56a9b984 100644 --- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -50,7 +50,6 @@ WEBIDL_FILES = [ 'AutocompleteInfo.webidl', 'BarProp.webidl', 'BaseKeyframeTypes.webidl', - 'BatteryManager.webidl', 'BeforeAfterKeyboardEvent.webidl', 'BeforeUnloadEvent.webidl', 'BiquadFilterNode.webidl', diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp index bcec94dcb..8f2023609 100644 --- a/dom/workers/ScriptLoader.cpp +++ b/dom/workers/ScriptLoader.cpp @@ -694,7 +694,7 @@ private: ir->SetPrincipalInfo(Move(principalInfo)); RefPtr<mozilla::dom::Response> response = - new mozilla::dom::Response(mCacheCreator->Global(), ir); + new mozilla::dom::Response(mCacheCreator->Global(), ir, nullptr); mozilla::dom::RequestOrUSVString request; @@ -1101,14 +1101,16 @@ private: rv = NS_GetFinalChannelURI(channel, getter_AddRefs(finalURI)); NS_ENSURE_SUCCESS(rv, rv); - nsCString filename; - rv = finalURI->GetSpec(filename); - NS_ENSURE_SUCCESS(rv, rv); + if (principal->Subsumes(channelPrincipal)) { + nsCString filename; + rv = finalURI->GetSpec(filename); + NS_ENSURE_SUCCESS(rv, rv); - if (!filename.IsEmpty()) { - // This will help callers figure out what their script url resolved to in - // case of errors. - aLoadInfo.mURL.Assign(NS_ConvertUTF8toUTF16(filename)); + if (!filename.IsEmpty()) { + // This will help callers figure out what their script url resolved to in + // case of errors. + aLoadInfo.mURL.Assign(NS_ConvertUTF8toUTF16(filename)); + } } nsCOMPtr<nsILoadInfo> chanLoadInfo = channel->GetLoadInfo(); diff --git a/dom/workers/ServiceWorkerPrivate.cpp b/dom/workers/ServiceWorkerPrivate.cpp index 23ae3b366..571ceca37 100644 --- a/dom/workers/ServiceWorkerPrivate.cpp +++ b/dom/workers/ServiceWorkerPrivate.cpp @@ -1510,7 +1510,7 @@ private: if (NS_WARN_IF(!global)) { return false; } - RefPtr<Request> request = new Request(global, internalReq); + RefPtr<Request> request = new Request(global, internalReq, nullptr); MOZ_ASSERT_IF(internalReq->IsNavigationRequest(), request->Redirect() == RequestRedirect::Manual); diff --git a/dom/workers/ServiceWorkerScriptCache.cpp b/dom/workers/ServiceWorkerScriptCache.cpp index 707b689e8..3db58e694 100644 --- a/dom/workers/ServiceWorkerScriptCache.cpp +++ b/dom/workers/ServiceWorkerScriptCache.cpp @@ -554,7 +554,7 @@ private: ir->SetPrincipalInfo(Move(mPrincipalInfo)); } - RefPtr<Response> response = new Response(aCache->GetGlobalObject(), ir); + RefPtr<Response> response = new Response(aCache->GetGlobalObject(), ir, nullptr); RequestOrUSVString request; request.SetAsUSVString().Rebind(URL().Data(), URL().Length()); diff --git a/editor/libeditor/CSSEditUtils.cpp b/editor/libeditor/CSSEditUtils.cpp index dd15a8730..e15bc278f 100644 --- a/editor/libeditor/CSSEditUtils.cpp +++ b/editor/libeditor/CSSEditUtils.cpp @@ -323,6 +323,15 @@ CSSEditUtils::IsCSSEditableProperty(nsINode* aNode, nsIAtom* aProperty, const nsAString* aAttribute) { + nsCOMPtr<nsIAtom> attribute = aAttribute ? NS_Atomize(*aAttribute) : nullptr; + return IsCSSEditableProperty(aNode, aProperty, attribute); +} + +bool +CSSEditUtils::IsCSSEditableProperty(nsINode* aNode, + nsIAtom* aProperty, + nsIAtom* aAttribute) +{ MOZ_ASSERT(aNode); nsINode* node = aNode; @@ -339,13 +348,12 @@ CSSEditUtils::IsCSSEditableProperty(nsINode* aNode, nsGkAtoms::u == aProperty || nsGkAtoms::strike == aProperty || (nsGkAtoms::font == aProperty && aAttribute && - (aAttribute->EqualsLiteral("color") || - aAttribute->EqualsLiteral("face")))) { + (aAttribute == nsGkAtoms::color || aAttribute == nsGkAtoms::face))) { return true; } // ALIGN attribute on elements supporting it - if (aAttribute && (aAttribute->EqualsLiteral("align")) && + if (aAttribute == nsGkAtoms::align && node->IsAnyOfHTMLElements(nsGkAtoms::div, nsGkAtoms::p, nsGkAtoms::h1, @@ -368,7 +376,7 @@ CSSEditUtils::IsCSSEditableProperty(nsINode* aNode, return true; } - if (aAttribute && (aAttribute->EqualsLiteral("valign")) && + if (aAttribute == nsGkAtoms::valign && node->IsAnyOfHTMLElements(nsGkAtoms::col, nsGkAtoms::colgroup, nsGkAtoms::tbody, @@ -381,59 +389,52 @@ CSSEditUtils::IsCSSEditableProperty(nsINode* aNode, } // attributes TEXT, BACKGROUND and BGCOLOR on BODY - if (aAttribute && node->IsHTMLElement(nsGkAtoms::body) && - (aAttribute->EqualsLiteral("text") - || aAttribute->EqualsLiteral("background") - || aAttribute->EqualsLiteral("bgcolor"))) { + if (node->IsHTMLElement(nsGkAtoms::body) && + (aAttribute == nsGkAtoms::text || aAttribute == nsGkAtoms::background || + aAttribute == nsGkAtoms::bgcolor)) { return true; } // attribute BGCOLOR on other elements - if (aAttribute && aAttribute->EqualsLiteral("bgcolor")) { + if (aAttribute == nsGkAtoms::bgcolor) { return true; } // attributes HEIGHT, WIDTH and NOWRAP on TD and TH - if (aAttribute && - node->IsAnyOfHTMLElements(nsGkAtoms::td, nsGkAtoms::th) && - (aAttribute->EqualsLiteral("height") - || aAttribute->EqualsLiteral("width") - || aAttribute->EqualsLiteral("nowrap"))) { + if (node->IsAnyOfHTMLElements(nsGkAtoms::td, nsGkAtoms::th) && + (aAttribute == nsGkAtoms::height || aAttribute == nsGkAtoms::width || + aAttribute == nsGkAtoms::nowrap)) { return true; } // attributes HEIGHT and WIDTH on TABLE - if (aAttribute && node->IsHTMLElement(nsGkAtoms::table) && - (aAttribute->EqualsLiteral("height") - || aAttribute->EqualsLiteral("width"))) { + if (node->IsHTMLElement(nsGkAtoms::table) && + (aAttribute == nsGkAtoms::height || aAttribute == nsGkAtoms::width)) { return true; } // attributes SIZE and WIDTH on HR - if (aAttribute && node->IsHTMLElement(nsGkAtoms::hr) && - (aAttribute->EqualsLiteral("size") - || aAttribute->EqualsLiteral("width"))) { + if (node->IsHTMLElement(nsGkAtoms::hr) && + (aAttribute == nsGkAtoms::size || aAttribute == nsGkAtoms::width)) { return true; } // attribute TYPE on OL UL LI - if (aAttribute && - node->IsAnyOfHTMLElements(nsGkAtoms::ol, nsGkAtoms::ul, + if (node->IsAnyOfHTMLElements(nsGkAtoms::ol, nsGkAtoms::ul, nsGkAtoms::li) && - aAttribute->EqualsLiteral("type")) { + aAttribute == nsGkAtoms::type) { return true; } - if (aAttribute && node->IsHTMLElement(nsGkAtoms::img) && - (aAttribute->EqualsLiteral("border") - || aAttribute->EqualsLiteral("width") - || aAttribute->EqualsLiteral("height"))) { + if (node->IsHTMLElement(nsGkAtoms::img) && + (aAttribute == nsGkAtoms::border || aAttribute == nsGkAtoms::width || + aAttribute == nsGkAtoms::height)) { return true; } // other elements that we can align using CSS even if they // can't carry the html ALIGN attribute - if (aAttribute && aAttribute->EqualsLiteral("align") && + if (aAttribute == nsGkAtoms::align && node->IsAnyOfHTMLElements(nsGkAtoms::ul, nsGkAtoms::ol, nsGkAtoms::dl, @@ -818,7 +819,7 @@ void CSSEditUtils::GenerateCSSDeclarationsFromHTMLStyle( Element* aElement, nsIAtom* aHTMLProperty, - const nsAString* aAttribute, + nsIAtom* aAttribute, const nsAString* aValue, nsTArray<nsIAtom*>& cssPropertyArray, nsTArray<nsString>& cssValueArray, @@ -838,21 +839,20 @@ CSSEditUtils::GenerateCSSDeclarationsFromHTMLStyle( } else if (nsGkAtoms::tt == aHTMLProperty) { equivTable = ttEquivTable; } else if (aAttribute) { - if (nsGkAtoms::font == aHTMLProperty && - aAttribute->EqualsLiteral("color")) { + if (nsGkAtoms::font == aHTMLProperty && aAttribute == nsGkAtoms::color) { equivTable = fontColorEquivTable; } else if (nsGkAtoms::font == aHTMLProperty && - aAttribute->EqualsLiteral("face")) { + aAttribute == nsGkAtoms::face) { equivTable = fontFaceEquivTable; - } else if (aAttribute->EqualsLiteral("bgcolor")) { + } else if (aAttribute == nsGkAtoms::bgcolor) { equivTable = bgcolorEquivTable; - } else if (aAttribute->EqualsLiteral("background")) { + } else if (aAttribute == nsGkAtoms::background) { equivTable = backgroundImageEquivTable; - } else if (aAttribute->EqualsLiteral("text")) { + } else if (aAttribute == nsGkAtoms::text) { equivTable = textColorEquivTable; - } else if (aAttribute->EqualsLiteral("border")) { + } else if (aAttribute == nsGkAtoms::border) { equivTable = borderEquivTable; - } else if (aAttribute->EqualsLiteral("align")) { + } else if (aAttribute == nsGkAtoms::align) { if (aElement->IsHTMLElement(nsGkAtoms::table)) { equivTable = tableAlignEquivTable; } else if (aElement->IsHTMLElement(nsGkAtoms::hr)) { @@ -863,17 +863,17 @@ CSSEditUtils::GenerateCSSDeclarationsFromHTMLStyle( } else { equivTable = textAlignEquivTable; } - } else if (aAttribute->EqualsLiteral("valign")) { + } else if (aAttribute == nsGkAtoms::valign) { equivTable = verticalAlignEquivTable; - } else if (aAttribute->EqualsLiteral("nowrap")) { + } else if (aAttribute == nsGkAtoms::nowrap) { equivTable = nowrapEquivTable; - } else if (aAttribute->EqualsLiteral("width")) { + } else if (aAttribute == nsGkAtoms::width) { equivTable = widthEquivTable; - } else if (aAttribute->EqualsLiteral("height") || + } else if (aAttribute == nsGkAtoms::height || (aElement->IsHTMLElement(nsGkAtoms::hr) && - aAttribute->EqualsLiteral("size"))) { + aAttribute == nsGkAtoms::size)) { equivTable = heightEquivTable; - } else if (aAttribute->EqualsLiteral("type") && + } else if (aAttribute == nsGkAtoms::type && aElement->IsAnyOfHTMLElements(nsGkAtoms::ol, nsGkAtoms::ul, nsGkAtoms::li)) { @@ -890,40 +890,46 @@ CSSEditUtils::GenerateCSSDeclarationsFromHTMLStyle( // aValue for the node, and return in aCount the number of CSS properties set // by the call. The Element version returns aCount instead. int32_t -CSSEditUtils::SetCSSEquivalentToHTMLStyle(Element* aElement, +CSSEditUtils::SetCSSEquivalentToHTMLStyle(nsIDOMNode* aNode, nsIAtom* aProperty, const nsAString* aAttribute, const nsAString* aValue, bool aSuppressTransaction) { - MOZ_ASSERT(aElement && aProperty); MOZ_ASSERT_IF(aAttribute, aValue); - int32_t count; // This can only fail if SetCSSProperty fails, which should only happen if // something is pretty badly wrong. In this case we assert so that hopefully // someone will notice, but there's nothing more sensible to do than just // return the count and carry on. - nsresult rv = SetCSSEquivalentToHTMLStyle(aElement->AsDOMNode(), - aProperty, aAttribute, - aValue, &count, - aSuppressTransaction); - NS_ASSERTION(NS_SUCCEEDED(rv), "SetCSSEquivalentToHTMLStyle failed"); - NS_ENSURE_SUCCESS(rv, count); - return count; + nsCOMPtr<Element> element = do_QueryInterface(aNode); + return SetCSSEquivalentToHTMLStyle(element, + aProperty, aAttribute, + aValue, aSuppressTransaction); } -nsresult -CSSEditUtils::SetCSSEquivalentToHTMLStyle(nsIDOMNode* aNode, +int32_t +CSSEditUtils::SetCSSEquivalentToHTMLStyle(Element* aElement, nsIAtom* aHTMLProperty, const nsAString* aAttribute, const nsAString* aValue, - int32_t* aCount, bool aSuppressTransaction) { - nsCOMPtr<Element> element = do_QueryInterface(aNode); - *aCount = 0; - if (!element || !IsCSSEditableProperty(element, aHTMLProperty, aAttribute)) { - return NS_OK; + nsCOMPtr<nsIAtom> attribute = aAttribute ? NS_Atomize(*aAttribute) : nullptr; + return SetCSSEquivalentToHTMLStyle(aElement, aHTMLProperty, attribute, + aValue, aSuppressTransaction); +} + +int32_t +CSSEditUtils::SetCSSEquivalentToHTMLStyle(Element* aElement, + nsIAtom* aHTMLProperty, + nsIAtom* aAttribute, + const nsAString* aValue, + bool aSuppressTransaction) +{ + MOZ_ASSERT(aElement); + + if (!IsCSSEditableProperty(aElement, aHTMLProperty, aAttribute)) { + return 0; } // we can apply the styles only if the node is an element and if we have @@ -932,18 +938,20 @@ CSSEditUtils::SetCSSEquivalentToHTMLStyle(nsIDOMNode* aNode, // Find the CSS equivalence to the HTML style nsTArray<nsIAtom*> cssPropertyArray; nsTArray<nsString> cssValueArray; - GenerateCSSDeclarationsFromHTMLStyle(element, aHTMLProperty, aAttribute, + GenerateCSSDeclarationsFromHTMLStyle(aElement, aHTMLProperty, aAttribute, aValue, cssPropertyArray, cssValueArray, false); // set the individual CSS inline styles - *aCount = cssPropertyArray.Length(); - for (int32_t index = 0; index < *aCount; index++) { - nsresult rv = SetCSSProperty(*element, *cssPropertyArray[index], + size_t count = cssPropertyArray.Length(); + for (size_t index = 0; index < count; index++) { + nsresult rv = SetCSSProperty(*aElement, *cssPropertyArray[index], cssValueArray[index], aSuppressTransaction); - NS_ENSURE_SUCCESS(rv, rv); + if (NS_WARN_IF(NS_FAILED(rv))) { + return 0; + } } - return NS_OK; + return count; } // Remove from aNode the CSS inline style equivalent to HTMLProperty/aAttribute/aValue for the node @@ -955,20 +963,22 @@ CSSEditUtils::RemoveCSSEquivalentToHTMLStyle(nsIDOMNode* aNode, bool aSuppressTransaction) { nsCOMPtr<Element> element = do_QueryInterface(aNode); - NS_ENSURE_TRUE(element, NS_OK); + nsCOMPtr<nsIAtom> attribute = aAttribute ? NS_Atomize(*aAttribute) : nullptr; - return RemoveCSSEquivalentToHTMLStyle(element, aHTMLProperty, aAttribute, + return RemoveCSSEquivalentToHTMLStyle(element, aHTMLProperty, attribute, aValue, aSuppressTransaction); } nsresult CSSEditUtils::RemoveCSSEquivalentToHTMLStyle(Element* aElement, nsIAtom* aHTMLProperty, - const nsAString* aAttribute, + nsIAtom* aAttribute, const nsAString* aValue, bool aSuppressTransaction) { - MOZ_ASSERT(aElement); + if (NS_WARN_IF(!aElement)) { + return NS_OK; + } if (!IsCSSEditableProperty(aElement, aHTMLProperty, aAttribute)) { return NS_OK; @@ -1003,7 +1013,7 @@ CSSEditUtils::RemoveCSSEquivalentToHTMLStyle(Element* aElement, nsresult CSSEditUtils::GetCSSEquivalentToHTMLInlineStyleSet(nsINode* aNode, nsIAtom* aHTMLProperty, - const nsAString* aAttribute, + nsIAtom* aAttribute, nsAString& aValueString, StyleType aStyleType) { @@ -1020,7 +1030,8 @@ CSSEditUtils::GetCSSEquivalentToHTMLInlineStyleSet(nsINode* aNode, nsTArray<nsString> cssValueArray; // get the CSS equivalence with last param true indicating we want only the // "gettable" properties - GenerateCSSDeclarationsFromHTMLStyle(theElement, aHTMLProperty, aAttribute, nullptr, + GenerateCSSDeclarationsFromHTMLStyle(theElement, aHTMLProperty, aAttribute, + nullptr, cssPropertyArray, cssValueArray, true); int32_t count = cssPropertyArray.Length(); for (int32_t index = 0; index < count; index++) { @@ -1066,48 +1077,58 @@ CSSEditUtils::IsCSSEquivalentToHTMLInlineStyleSet(nsINode* aNode, StyleType aStyleType) { MOZ_ASSERT(aNode && aProperty); - bool isSet; - nsresult rv = IsCSSEquivalentToHTMLInlineStyleSet(aNode->AsDOMNode(), - aProperty, aAttribute, - isSet, aValue, aStyleType); - NS_ENSURE_SUCCESS(rv, false); - return isSet; + nsCOMPtr<nsIAtom> attribute = aAttribute ? NS_Atomize(*aAttribute) : nullptr; + return IsCSSEquivalentToHTMLInlineStyleSet(aNode, + aProperty, attribute, + aValue, aStyleType); } -nsresult +bool +CSSEditUtils::IsCSSEquivalentToHTMLInlineStyleSet(nsIDOMNode* aNode, + nsIAtom* aProperty, + const nsAString* aAttribute, + nsAString& aValue, + StyleType aStyleType) +{ + MOZ_ASSERT(aNode && aProperty); + nsCOMPtr<nsINode> node = do_QueryInterface(aNode); + nsCOMPtr<nsIAtom> attribute = aAttribute ? NS_Atomize(*aAttribute) : nullptr; + return IsCSSEquivalentToHTMLInlineStyleSet(node, aProperty, attribute, + aValue, aStyleType); +} + +bool CSSEditUtils::IsCSSEquivalentToHTMLInlineStyleSet( - nsIDOMNode* aNode, + nsINode* aNode, nsIAtom* aHTMLProperty, - const nsAString* aHTMLAttribute, - bool& aIsSet, + nsIAtom* aHTMLAttribute, nsAString& valueString, StyleType aStyleType) { - NS_ENSURE_TRUE(aNode, NS_ERROR_NULL_POINTER); + NS_ENSURE_TRUE(aNode, false); nsAutoString htmlValueString(valueString); - aIsSet = false; - nsCOMPtr<nsINode> node = do_QueryInterface(aNode); + bool isSet = false; do { valueString.Assign(htmlValueString); // get the value of the CSS equivalent styles nsresult rv = - GetCSSEquivalentToHTMLInlineStyleSet(node, aHTMLProperty, aHTMLAttribute, + GetCSSEquivalentToHTMLInlineStyleSet(aNode, aHTMLProperty, aHTMLAttribute, valueString, aStyleType); - NS_ENSURE_SUCCESS(rv, rv); + NS_ENSURE_SUCCESS(rv, false); // early way out if we can if (valueString.IsEmpty()) { - return NS_OK; + return isSet; } if (nsGkAtoms::b == aHTMLProperty) { if (valueString.EqualsLiteral("bold")) { - aIsSet = true; + isSet = true; } else if (valueString.EqualsLiteral("normal")) { - aIsSet = false; + isSet = false; } else if (valueString.EqualsLiteral("bolder")) { - aIsSet = true; + isSet = true; valueString.AssignLiteral("bold"); } else { int32_t weight = 0; @@ -1115,32 +1136,31 @@ CSSEditUtils::IsCSSEquivalentToHTMLInlineStyleSet( nsAutoString value(valueString); weight = value.ToInteger(&errorCode); if (400 < weight) { - aIsSet = true; + isSet = true; valueString.AssignLiteral("bold"); } else { - aIsSet = false; + isSet = false; valueString.AssignLiteral("normal"); } } } else if (nsGkAtoms::i == aHTMLProperty) { if (valueString.EqualsLiteral("italic") || valueString.EqualsLiteral("oblique")) { - aIsSet = true; + isSet = true; } } else if (nsGkAtoms::u == aHTMLProperty) { nsAutoString val; val.AssignLiteral("underline"); - aIsSet = ChangeStyleTransaction::ValueIncludes(valueString, val); + isSet = ChangeStyleTransaction::ValueIncludes(valueString, val); } else if (nsGkAtoms::strike == aHTMLProperty) { nsAutoString val; val.AssignLiteral("line-through"); - aIsSet = ChangeStyleTransaction::ValueIncludes(valueString, val); - } else if (aHTMLAttribute && - ((nsGkAtoms::font == aHTMLProperty && - aHTMLAttribute->EqualsLiteral("color")) || - aHTMLAttribute->EqualsLiteral("bgcolor"))) { + isSet = ChangeStyleTransaction::ValueIncludes(valueString, val); + } else if ((nsGkAtoms::font == aHTMLProperty && + aHTMLAttribute == nsGkAtoms::color) || + aHTMLAttribute == nsGkAtoms::bgcolor) { if (htmlValueString.IsEmpty()) { - aIsSet = true; + isSet = true; } else { nscolor rgba; nsAutoString subStr; @@ -1174,54 +1194,53 @@ CSSEditUtils::IsCSSEquivalentToHTMLInlineStyleSet( htmlColor.Append(char16_t(')')); } - aIsSet = htmlColor.Equals(valueString, - nsCaseInsensitiveStringComparator()); + isSet = htmlColor.Equals(valueString, + nsCaseInsensitiveStringComparator()); } else { - aIsSet = htmlValueString.Equals(valueString, - nsCaseInsensitiveStringComparator()); + isSet = htmlValueString.Equals(valueString, + nsCaseInsensitiveStringComparator()); } } } else if (nsGkAtoms::tt == aHTMLProperty) { - aIsSet = StringBeginsWith(valueString, NS_LITERAL_STRING("monospace")); + isSet = StringBeginsWith(valueString, NS_LITERAL_STRING("monospace")); } else if (nsGkAtoms::font == aHTMLProperty && aHTMLAttribute && - aHTMLAttribute->EqualsLiteral("face")) { + aHTMLAttribute == nsGkAtoms::face) { if (!htmlValueString.IsEmpty()) { const char16_t commaSpace[] = { char16_t(','), char16_t(' '), 0 }; const char16_t comma[] = { char16_t(','), 0 }; htmlValueString.ReplaceSubstring(commaSpace, comma); nsAutoString valueStringNorm(valueString); valueStringNorm.ReplaceSubstring(commaSpace, comma); - aIsSet = htmlValueString.Equals(valueStringNorm, - nsCaseInsensitiveStringComparator()); + isSet = htmlValueString.Equals(valueStringNorm, + nsCaseInsensitiveStringComparator()); } else { - aIsSet = true; + isSet = true; } - return NS_OK; - } else if (aHTMLAttribute && aHTMLAttribute->EqualsLiteral("align")) { - aIsSet = true; + return isSet; + } else if (aHTMLAttribute == nsGkAtoms::align) { + isSet = true; } else { - aIsSet = false; - return NS_OK; + return false; } if (!htmlValueString.IsEmpty() && htmlValueString.Equals(valueString, nsCaseInsensitiveStringComparator())) { - aIsSet = true; + isSet = true; } if (htmlValueString.EqualsLiteral("-moz-editor-invert-value")) { - aIsSet = !aIsSet; + isSet = !isSet; } if (nsGkAtoms::u == aHTMLProperty || nsGkAtoms::strike == aHTMLProperty) { // unfortunately, the value of the text-decoration property is not inherited. // that means that we have to look at ancestors of node to see if they are underlined - node = node->GetParentElement(); // set to null if it's not a dom element + aNode = aNode->GetParentElement(); // set to null if it's not a dom element } } while ((nsGkAtoms::u == aHTMLProperty || - nsGkAtoms::strike == aHTMLProperty) && !aIsSet && node); - return NS_OK; + nsGkAtoms::strike == aHTMLProperty) && !isSet && aNode); + return isSet; } void diff --git a/editor/libeditor/CSSEditUtils.h b/editor/libeditor/CSSEditUtils.h index 0b9a12952..5129ab88d 100644 --- a/editor/libeditor/CSSEditUtils.h +++ b/editor/libeditor/CSSEditUtils.h @@ -90,6 +90,8 @@ public: */ bool IsCSSEditableProperty(nsINode* aNode, nsIAtom* aProperty, const nsAString* aAttribute); + bool IsCSSEditableProperty(nsINode* aNode, nsIAtom* aProperty, + nsIAtom* aAttribute); /** * Adds/remove a CSS declaration to the STYLE atrribute carried by a given @@ -188,14 +190,14 @@ public: * * @param aNode [IN] A DOM node. * @param aHTMLProperty [IN] An atom containing an HTML property. - * @param aAttribute [IN] A pointer to an attribute name or nullptr if + * @param aAttribute [IN] An atom of attribute name or nullptr if * irrelevant. * @param aValueString [OUT] The list of CSS values. * @param aStyleType [IN] eSpecified or eComputed. */ nsresult GetCSSEquivalentToHTMLInlineStyleSet(nsINode* aNode, nsIAtom* aHTMLProperty, - const nsAString* aAttribute, + nsIAtom* aAttribute, nsAString& aValueString, StyleType aStyleType); @@ -205,18 +207,22 @@ public: * * @param aNode [IN] A DOM node. * @param aHTMLProperty [IN] An atom containing an HTML property. - * @param aAttribute [IN] A pointer to an attribute name or nullptr if - * irrelevant. - * @param aIsSet [OUT] A boolean being true if the css properties are - * set. + * @param aAttribute [IN] A pointer/atom to an attribute name or nullptr + * if irrelevant. * @param aValueString [IN/OUT] The attribute value (in) the list of CSS * values (out). * @param aStyleType [IN] eSpecified or eComputed. - * - * The nsIContent variant returns aIsSet instead of using an out parameter. + * @return A boolean being true if the css properties are + * set. */ bool IsCSSEquivalentToHTMLInlineStyleSet(nsINode* aContent, nsIAtom* aProperty, + nsIAtom* aAttribute, + nsAString& aValue, + StyleType aStyleType); + + bool IsCSSEquivalentToHTMLInlineStyleSet(nsINode* aContent, + nsIAtom* aProperty, const nsAString* aAttribute, const nsAString& aValue, StyleType aStyleType); @@ -227,12 +233,11 @@ public: nsAString& aValue, StyleType aStyleType); - nsresult IsCSSEquivalentToHTMLInlineStyleSet(nsIDOMNode* aNode, - nsIAtom* aHTMLProperty, - const nsAString* aAttribute, - bool& aIsSet, - nsAString& aValueString, - StyleType aStyleType); + bool IsCSSEquivalentToHTMLInlineStyleSet(nsIDOMNode* aNode, + nsIAtom* aProperty, + const nsAString* aAttribute, + nsAString& aValue, + StyleType aStyleType); /** * Adds to the node the CSS inline styles equivalent to the HTML style @@ -240,27 +245,29 @@ public: * * @param aNode [IN] A DOM node. * @param aHTMLProperty [IN] An atom containing an HTML property. - * @param aAttribute [IN] A pointer to an attribute name or nullptr if - * irrelevant. + * @param aAttribute [IN] A pointer/atom to an attribute name or nullptr + * if irrelevant. * @param aValue [IN] The attribute value. - * @param aCount [OUT] The number of CSS properties set by the call. * @param aSuppressTransaction [IN] A boolean indicating, when true, * that no transaction should be recorded. * - * aCount is returned by the dom::Element variant instead of being an out - * parameter. + * @return The number of CSS properties set by the call. */ int32_t SetCSSEquivalentToHTMLStyle(dom::Element* aElement, nsIAtom* aProperty, + nsIAtom* aAttribute, + const nsAString* aValue, + bool aSuppressTransaction); + int32_t SetCSSEquivalentToHTMLStyle(dom::Element* aElement, + nsIAtom* aProperty, + const nsAString* aAttribute, + const nsAString* aValue, + bool aSuppressTransaction); + int32_t SetCSSEquivalentToHTMLStyle(nsIDOMNode* aNode, + nsIAtom* aHTMLProperty, const nsAString* aAttribute, const nsAString* aValue, bool aSuppressTransaction); - nsresult SetCSSEquivalentToHTMLStyle(nsIDOMNode* aNode, - nsIAtom* aHTMLProperty, - const nsAString* aAttribute, - const nsAString* aValue, - int32_t* aCount, - bool aSuppressTransaction); /** * Removes from the node the CSS inline styles equivalent to the HTML style. @@ -284,7 +291,7 @@ public: * * @param aElement [IN] A DOM Element (must not be null). * @param aHTMLProperty [IN] An atom containing an HTML property. - * @param aAttribute [IN] A pointer to an attribute name or nullptr if + * @param aAttribute [IN] An atom to an attribute name or nullptr if * irrelevant. * @param aValue [IN] The attribute value. * @param aSuppressTransaction [IN] A boolean indicating, when true, @@ -292,7 +299,7 @@ public: */ nsresult RemoveCSSEquivalentToHTMLStyle(dom::Element* aElement, nsIAtom* aHTMLProperty, - const nsAString* aAttribute, + nsIAtom* aAttribute, const nsAString* aValue, bool aSuppressTransaction); @@ -409,7 +416,7 @@ private: * * @param aNode [IN] The DOM node. * @param aHTMLProperty [IN] An atom containing an HTML property. - * @param aAttribute [IN] A pointer to an attribute name or nullptr + * @param aAttribute [IN] An atom to an attribute name or nullptr * if irrelevant * @param aValue [IN] The attribute value. * @param aPropertyArray [OUT] The array of CSS properties. @@ -422,7 +429,7 @@ private: */ void GenerateCSSDeclarationsFromHTMLStyle(dom::Element* aNode, nsIAtom* aHTMLProperty, - const nsAString* aAttribute, + nsIAtom* aAttribute, const nsAString* aValue, nsTArray<nsIAtom*>& aPropertyArray, nsTArray<nsString>& aValueArray, diff --git a/editor/libeditor/EditorBase.cpp b/editor/libeditor/EditorBase.cpp index 3f419a74e..60df3571e 100644 --- a/editor/libeditor/EditorBase.cpp +++ b/editor/libeditor/EditorBase.cpp @@ -1235,12 +1235,23 @@ EditorBase::SetAttribute(nsIDOMElement* aElement, const nsAString& aAttribute, const nsAString& aValue) { + if (NS_WARN_IF(aAttribute.IsEmpty())) { + return NS_ERROR_FAILURE; + } nsCOMPtr<Element> element = do_QueryInterface(aElement); NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER); nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute); + return SetAttribute(element, attribute, aValue); +} + +nsresult +EditorBase::SetAttribute(Element* aElement, + nsIAtom* aAttribute, + const nsAString& aValue) +{ RefPtr<ChangeAttributeTransaction> transaction = - CreateTxnForSetAttribute(*element, *attribute, aValue); + CreateTxnForSetAttribute(*aElement, *aAttribute, aValue); return DoTransaction(transaction); } @@ -1269,12 +1280,22 @@ NS_IMETHODIMP EditorBase::RemoveAttribute(nsIDOMElement* aElement, const nsAString& aAttribute) { + if (NS_WARN_IF(aAttribute.IsEmpty())) { + return NS_ERROR_FAILURE; + } nsCOMPtr<Element> element = do_QueryInterface(aElement); NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER); nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute); + return RemoveAttribute(element, attribute); +} + +nsresult +EditorBase::RemoveAttribute(Element* aElement, + nsIAtom* aAttribute) +{ RefPtr<ChangeAttributeTransaction> transaction = - CreateTxnForRemoveAttribute(*element, *attribute); + CreateTxnForRemoveAttribute(*aElement, *aAttribute); return DoTransaction(transaction); } @@ -2249,25 +2270,28 @@ EditorBase::CloneAttribute(const nsAString& aAttribute, nsIDOMNode* aSourceNode) { NS_ENSURE_TRUE(aDestNode && aSourceNode, NS_ERROR_NULL_POINTER); + if (NS_WARN_IF(aAttribute.IsEmpty())) { + return NS_ERROR_FAILURE; + } - nsCOMPtr<nsIDOMElement> destElement = do_QueryInterface(aDestNode); - nsCOMPtr<nsIDOMElement> sourceElement = do_QueryInterface(aSourceNode); + nsCOMPtr<Element> destElement = do_QueryInterface(aDestNode); + nsCOMPtr<Element> sourceElement = do_QueryInterface(aSourceNode); NS_ENSURE_TRUE(destElement && sourceElement, NS_ERROR_NO_INTERFACE); + nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute); + return CloneAttribute(attribute, destElement, sourceElement); +} + +nsresult +EditorBase::CloneAttribute(nsIAtom* aAttribute, + Element* aDestElement, + Element* aSourceElement) +{ nsAutoString attrValue; - bool isAttrSet; - nsresult rv = GetAttributeValue(sourceElement, - aAttribute, - attrValue, - &isAttrSet); - NS_ENSURE_SUCCESS(rv, rv); - if (isAttrSet) { - rv = SetAttribute(destElement, aAttribute, attrValue); - } else { - rv = RemoveAttribute(destElement, aAttribute); + if (aSourceElement->GetAttr(kNameSpaceID_None, aAttribute, attrValue)) { + return SetAttribute(aDestElement, aAttribute, attrValue); } - - return rv; + return RemoveAttribute(aDestElement, aAttribute); } /** @@ -2306,11 +2330,9 @@ EditorBase::CloneAttributes(Element* aDest, RefPtr<nsDOMAttributeMap> destAttributes = aDest->Attributes(); while (RefPtr<Attr> attr = destAttributes->Item(0)) { if (destInBody) { - RemoveAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(aDest)), - attr->NodeName()); + RemoveAttribute(aDest, attr->NodeInfo()->NameAtom()); } else { - ErrorResult ignored; - aDest->RemoveAttribute(attr->NodeName(), ignored); + aDest->UnsetAttr(kNameSpaceID_None, attr->NodeInfo()->NameAtom(), true); } } @@ -2322,13 +2344,13 @@ EditorBase::CloneAttributes(Element* aDest, nsAutoString value; attr->GetValue(value); if (destInBody) { - SetAttributeOrEquivalent(static_cast<nsIDOMElement*>(GetAsDOMNode(aDest)), - attr->NodeName(), value, false); + SetAttributeOrEquivalent(aDest, attr->NodeInfo()->NameAtom(), value, + false); } else { // The element is not inserted in the document yet, we don't want to put // a transaction on the UndoStack - SetAttributeOrEquivalent(static_cast<nsIDOMElement*>(GetAsDOMNode(aDest)), - attr->NodeName(), value, true); + SetAttributeOrEquivalent(aDest, attr->NodeInfo()->NameAtom(), value, + true); } } } @@ -4678,21 +4700,32 @@ EditorBase::CreateHTMLContent(nsIAtom* aTag) kNameSpaceID_XHTML); } -nsresult +NS_IMETHODIMP EditorBase::SetAttributeOrEquivalent(nsIDOMElement* aElement, const nsAString& aAttribute, const nsAString& aValue, bool aSuppressTransaction) { - return SetAttribute(aElement, aAttribute, aValue); + nsCOMPtr<Element> element = do_QueryInterface(aElement); + if (NS_WARN_IF(!element)) { + return NS_ERROR_NULL_POINTER; + } + nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute); + return SetAttributeOrEquivalent(element, attribute, aValue, + aSuppressTransaction); } -nsresult +NS_IMETHODIMP EditorBase::RemoveAttributeOrEquivalent(nsIDOMElement* aElement, const nsAString& aAttribute, bool aSuppressTransaction) { - return RemoveAttribute(aElement, aAttribute); + nsCOMPtr<Element> element = do_QueryInterface(aElement); + if (NS_WARN_IF(!element)) { + return NS_ERROR_NULL_POINTER; + } + nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute); + return RemoveAttributeOrEquivalent(element, attribute, aSuppressTransaction); } nsresult diff --git a/editor/libeditor/EditorBase.h b/editor/libeditor/EditorBase.h index 618da12a8..08a895dcd 100644 --- a/editor/libeditor/EditorBase.h +++ b/editor/libeditor/EditorBase.h @@ -291,6 +291,19 @@ public: nsresult JoinNodes(nsINode& aLeftNode, nsINode& aRightNode); nsresult MoveNode(nsIContent* aNode, nsINode* aParent, int32_t aOffset); + nsresult CloneAttribute(nsIAtom* aAttribute, Element* aDestElement, + Element* aSourceElement); + nsresult RemoveAttribute(Element* aElement, nsIAtom* aAttribute); + virtual nsresult RemoveAttributeOrEquivalent(Element* aElement, + nsIAtom* aAttribute, + bool aSuppressTransaction) = 0; + nsresult SetAttribute(Element* aElement, nsIAtom* aAttribute, + const nsAString& aValue); + virtual nsresult SetAttributeOrEquivalent(Element* aElement, + nsIAtom* aAttribute, + const nsAString& aValue, + bool aSuppressTransaction) = 0; + /** * Method to replace certain CreateElementNS() calls. * diff --git a/editor/libeditor/HTMLEditRules.cpp b/editor/libeditor/HTMLEditRules.cpp index af4a43ab9..f24d0131d 100644 --- a/editor/libeditor/HTMLEditRules.cpp +++ b/editor/libeditor/HTMLEditRules.cpp @@ -840,19 +840,18 @@ HTMLEditRules::GetAlignment(bool* aMixed, NS_ENSURE_TRUE(nodeToExamine, NS_ERROR_NULL_POINTER); - NS_NAMED_LITERAL_STRING(typeAttrName, "align"); nsCOMPtr<Element> blockParent = htmlEditor->GetBlock(*nodeToExamine); NS_ENSURE_TRUE(blockParent, NS_ERROR_FAILURE); if (htmlEditor->IsCSSEnabled() && htmlEditor->mCSSEditUtils->IsCSSEditableProperty(blockParent, nullptr, - &typeAttrName)) { + nsGkAtoms::align)) { // We are in CSS mode and we know how to align this element with CSS nsAutoString value; // Let's get the value(s) of text-align or margin-left/margin-right htmlEditor->mCSSEditUtils->GetCSSEquivalentToHTMLInlineStyleSet( - blockParent, nullptr, &typeAttrName, value, CSSEditUtils::eComputed); + blockParent, nullptr, nsGkAtoms::align, value, CSSEditUtils::eComputed); if (value.EqualsLiteral("center") || value.EqualsLiteral("-moz-center") || value.EqualsLiteral("auto auto")) { @@ -1510,10 +1509,11 @@ HTMLEditRules::WillInsertBreak(Selection& aSelection, nsCOMPtr<Element> blockParent = htmlEditor->GetBlock(node); NS_ENSURE_TRUE(blockParent, NS_ERROR_FAILURE); - // If the active editing host is an inline element, or if the active editing - // host is the block parent itself, just append a br. + // When there is an active editing host (the <body> if it's in designMode) + // and a block which becomes the parent of line breaker is in it, do the + // standard thing. nsCOMPtr<Element> host = htmlEditor->GetActiveEditingHost(); - if (!EditorUtils::IsDescendantOf(blockParent, host)) { + if (host && !EditorUtils::IsDescendantOf(blockParent, host)) { nsresult rv = StandardBreakImpl(node, offset, aSelection); NS_ENSURE_SUCCESS(rv, rv); *aHandled = true; @@ -3303,15 +3303,15 @@ HTMLEditRules::WillMakeList(Selection* aSelection, } } NS_ENSURE_STATE(mHTMLEditor); - nsCOMPtr<nsIDOMElement> curElement = do_QueryInterface(curNode); - NS_NAMED_LITERAL_STRING(typestr, "type"); + nsCOMPtr<Element> curElement = do_QueryInterface(curNode); if (aBulletType && !aBulletType->IsEmpty()) { - rv = mHTMLEditor->SetAttribute(curElement, typestr, *aBulletType); + rv = mHTMLEditor->SetAttribute(curElement, nsGkAtoms::type, + *aBulletType); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } else { - rv = mHTMLEditor->RemoveAttribute(curElement, typestr); + rv = mHTMLEditor->RemoveAttribute(curElement, nsGkAtoms::type); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -4756,7 +4756,7 @@ HTMLEditRules::WillAlign(Selection& aSelection, NS_ENSURE_SUCCESS(rv, rv); if (useCSS) { htmlEditor->mCSSEditUtils->SetCSSEquivalentToHTMLStyle( - curNode->AsElement(), nullptr, &NS_LITERAL_STRING("align"), + curNode->AsElement(), nullptr, nsGkAtoms::align, &aAlignType, false); curDiv = nullptr; continue; @@ -4837,7 +4837,6 @@ HTMLEditRules::AlignBlockContents(nsIDOMNode* aNode, nsCOMPtr<nsINode> node = do_QueryInterface(aNode); NS_ENSURE_TRUE(node && alignType, NS_ERROR_NULL_POINTER); nsCOMPtr<nsIContent> firstChild, lastChild; - nsCOMPtr<Element> divNode; bool useCSS = mHTMLEditor->IsCSSEnabled(); @@ -4845,24 +4844,25 @@ HTMLEditRules::AlignBlockContents(nsIDOMNode* aNode, firstChild = mHTMLEditor->GetFirstEditableChild(*node); NS_ENSURE_STATE(mHTMLEditor); lastChild = mHTMLEditor->GetLastEditableChild(*node); - NS_NAMED_LITERAL_STRING(attr, "align"); if (!firstChild) { // this cell has no content, nothing to align } else if (firstChild == lastChild && firstChild->IsHTMLElement(nsGkAtoms::div)) { // the cell already has a div containing all of its content: just // act on this div. - nsCOMPtr<nsIDOMElement> divElem = do_QueryInterface(firstChild); + RefPtr<Element> divElem = firstChild->AsElement(); if (useCSS) { NS_ENSURE_STATE(mHTMLEditor); - nsresult rv = mHTMLEditor->SetAttributeOrEquivalent(divElem, attr, + nsresult rv = mHTMLEditor->SetAttributeOrEquivalent(divElem, + nsGkAtoms::align, *alignType, false); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } else { NS_ENSURE_STATE(mHTMLEditor); - nsresult rv = mHTMLEditor->SetAttribute(divElem, attr, *alignType); + nsresult rv = mHTMLEditor->SetAttribute(divElem, nsGkAtoms::align, + *alignType); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -4870,28 +4870,29 @@ HTMLEditRules::AlignBlockContents(nsIDOMNode* aNode, } else { // else we need to put in a div, set the alignment, and toss in all the children NS_ENSURE_STATE(mHTMLEditor); - divNode = mHTMLEditor->CreateNode(nsGkAtoms::div, node, 0); - NS_ENSURE_STATE(divNode); + RefPtr<Element> divElem = mHTMLEditor->CreateNode(nsGkAtoms::div, node, 0); + NS_ENSURE_STATE(divElem); // set up the alignment on the div - nsCOMPtr<nsIDOMElement> divElem = do_QueryInterface(divNode); if (useCSS) { NS_ENSURE_STATE(mHTMLEditor); nsresult rv = - mHTMLEditor->SetAttributeOrEquivalent(divElem, attr, *alignType, false); + mHTMLEditor->SetAttributeOrEquivalent(divElem, nsGkAtoms::align, + *alignType, false); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } else { NS_ENSURE_STATE(mHTMLEditor); - nsresult rv = mHTMLEditor->SetAttribute(divElem, attr, *alignType); + nsresult rv = + mHTMLEditor->SetAttribute(divElem, nsGkAtoms::align, *alignType); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } // tuck the children into the end of the active div - while (lastChild && (lastChild != divNode)) { + while (lastChild && (lastChild != divElem)) { NS_ENSURE_STATE(mHTMLEditor); - nsresult rv = mHTMLEditor->MoveNode(lastChild, divNode, 0); + nsresult rv = mHTMLEditor->MoveNode(lastChild, divElem, 0); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_STATE(mHTMLEditor); lastChild = mHTMLEditor->GetLastEditableChild(*node); @@ -6498,10 +6499,14 @@ HTMLEditRules::SplitParagraph(nsIDOMNode *aPara, // split the paragraph NS_ENSURE_STATE(mHTMLEditor); NS_ENSURE_STATE(selNode->IsContent()); - mHTMLEditor->SplitNodeDeep(*para, *selNode->AsContent(), *aOffset, - HTMLEditor::EmptyContainers::yes, - getter_AddRefs(leftPara), - getter_AddRefs(rightPara)); + int32_t offset = + mHTMLEditor->SplitNodeDeep(*para, *selNode->AsContent(), *aOffset, + HTMLEditor::EmptyContainers::yes, + getter_AddRefs(leftPara), + getter_AddRefs(rightPara)); + if (NS_WARN_IF(offset == -1)) { + return NS_ERROR_FAILURE; + } // get rid of the break, if it is visible (otherwise it may be needed to prevent an empty p) NS_ENSURE_STATE(mHTMLEditor); if (mHTMLEditor->IsVisBreak(aBRNode)) { @@ -6511,9 +6516,9 @@ HTMLEditRules::SplitParagraph(nsIDOMNode *aPara, } // remove ID attribute on the paragraph we just created - nsCOMPtr<nsIDOMElement> rightElt = do_QueryInterface(rightPara); + RefPtr<Element> rightElt = rightPara->AsElement(); NS_ENSURE_STATE(mHTMLEditor); - rv = mHTMLEditor->RemoveAttribute(rightElt, NS_LITERAL_STRING("id")); + rv = mHTMLEditor->RemoveAttribute(rightElt, nsGkAtoms::id); NS_ENSURE_SUCCESS(rv, rv); // check both halves of para to see if we need mozBR @@ -7143,9 +7148,9 @@ HTMLEditRules::CacheInlineStyles(nsIDOMNode* aNode) isSet, &outValue); } else { NS_ENSURE_STATE(mHTMLEditor); - mHTMLEditor->mCSSEditUtils->IsCSSEquivalentToHTMLInlineStyleSet(aNode, - mCachedStyles[j].tag, &(mCachedStyles[j].attr), isSet, outValue, - CSSEditUtils::eComputed); + isSet = mHTMLEditor->mCSSEditUtils->IsCSSEquivalentToHTMLInlineStyleSet( + aNode, mCachedStyles[j].tag, &(mCachedStyles[j].attr), outValue, + CSSEditUtils::eComputed); } if (isSet) { mCachedStyles[j].mPresent = true; @@ -8388,18 +8393,18 @@ HTMLEditRules::RemoveAlignment(nsIDOMNode* aNode, NS_ENSURE_SUCCESS(rv, rv); } else if (isBlock || HTMLEditUtils::IsHR(child)) { // the current node is a block element - nsCOMPtr<nsIDOMElement> curElem = do_QueryInterface(child); + nsCOMPtr<Element> curElem = do_QueryInterface(child); if (HTMLEditUtils::SupportsAlignAttr(child)) { // remove the ALIGN attribute if this element can have it NS_ENSURE_STATE(mHTMLEditor); - rv = mHTMLEditor->RemoveAttribute(curElem, NS_LITERAL_STRING("align")); + rv = mHTMLEditor->RemoveAttribute(curElem, nsGkAtoms::align); NS_ENSURE_SUCCESS(rv, rv); } if (useCSS) { if (HTMLEditUtils::IsTable(child) || HTMLEditUtils::IsHR(child)) { NS_ENSURE_STATE(mHTMLEditor); rv = mHTMLEditor->SetAttributeOrEquivalent(curElem, - NS_LITERAL_STRING("align"), + nsGkAtoms::align, aAlignType, false); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; @@ -8519,21 +8524,17 @@ HTMLEditRules::AlignBlock(Element& aElement, nsresult rv = RemoveAlignment(aElement.AsDOMNode(), aAlignType, aContentsOnly == ContentsOnly::yes); NS_ENSURE_SUCCESS(rv, rv); - NS_NAMED_LITERAL_STRING(attr, "align"); if (htmlEditor->IsCSSEnabled()) { // Let's use CSS alignment; we use margin-left and margin-right for tables // and text-align for other block-level elements rv = htmlEditor->SetAttributeOrEquivalent( - static_cast<nsIDOMElement*>(aElement.AsDOMNode()), - attr, aAlignType, false); + &aElement, nsGkAtoms::align, aAlignType, false); NS_ENSURE_SUCCESS(rv, rv); } else { // HTML case; this code is supposed to be called ONLY if the element // supports the align attribute but we'll never know... if (HTMLEditUtils::SupportsAlignAttr(aElement.AsDOMNode())) { - rv = htmlEditor->SetAttribute( - static_cast<nsIDOMElement*>(aElement.AsDOMNode()), - attr, aAlignType); + rv = htmlEditor->SetAttribute(&aElement, nsGkAtoms::align, aAlignType); NS_ENSURE_SUCCESS(rv, rv); } } diff --git a/editor/libeditor/HTMLEditor.cpp b/editor/libeditor/HTMLEditor.cpp index c2f0bdc6d..6a630cb1c 100644 --- a/editor/libeditor/HTMLEditor.cpp +++ b/editor/libeditor/HTMLEditor.cpp @@ -2529,7 +2529,7 @@ HTMLEditor::CreateElementWithDefaults(const nsAString& aTagName) // New call to use instead to get proper HTML element, bug 39919 nsCOMPtr<nsIAtom> realTagAtom = NS_Atomize(realTagName); - nsCOMPtr<Element> newElement = CreateHTMLContent(realTagAtom); + RefPtr<Element> newElement = CreateHTMLContent(realTagAtom); if (!newElement) { return nullptr; } @@ -2561,8 +2561,7 @@ HTMLEditor::CreateElementWithDefaults(const nsAString& aTagName) } else if (tagName.EqualsLiteral("td")) { nsresult rv = SetAttributeOrEquivalent( - static_cast<nsIDOMElement*>(newElement->AsDOMNode()), - NS_LITERAL_STRING("valign"), NS_LITERAL_STRING("top"), true); + newElement, nsGkAtoms::valign, NS_LITERAL_STRING("top"), true); NS_ENSURE_SUCCESS(rv, nullptr); } // ADD OTHER TAGS HERE @@ -4390,87 +4389,83 @@ HTMLEditor::IsEmptyNodeImpl(nsINode* aNode, // add to aElement the CSS inline styles corresponding to the HTML attribute // aAttribute with its value aValue nsresult -HTMLEditor::SetAttributeOrEquivalent(nsIDOMElement* aElement, - const nsAString& aAttribute, +HTMLEditor::SetAttributeOrEquivalent(Element* aElement, + nsIAtom* aAttribute, const nsAString& aValue, bool aSuppressTransaction) { + MOZ_ASSERT(aElement); + MOZ_ASSERT(aAttribute); + nsAutoScriptBlocker scriptBlocker; - if (IsCSSEnabled() && mCSSEditUtils) { - int32_t count; - nsresult rv = - mCSSEditUtils->SetCSSEquivalentToHTMLStyle(aElement, nullptr, - &aAttribute, &aValue, - &count, - aSuppressTransaction); - NS_ENSURE_SUCCESS(rv, rv); - if (count) { - // we found an equivalence ; let's remove the HTML attribute itself if it is set - nsAutoString existingValue; - bool wasSet = false; - rv = GetAttributeValue(aElement, aAttribute, existingValue, &wasSet); - NS_ENSURE_SUCCESS(rv, rv); - if (!wasSet) { - return NS_OK; - } - return aSuppressTransaction ? aElement->RemoveAttribute(aAttribute) : - RemoveAttribute(aElement, aAttribute); + if (!IsCSSEnabled() || !mCSSEditUtils) { + // we are not in an HTML+CSS editor; let's set the attribute the HTML way + return aSuppressTransaction ? + aElement->SetAttr(kNameSpaceID_None, aAttribute, aValue, true) : + SetAttribute(aElement, aAttribute, aValue); + } + + int32_t count = + mCSSEditUtils->SetCSSEquivalentToHTMLStyle(aElement, nullptr, + aAttribute, &aValue, + aSuppressTransaction); + if (count) { + // we found an equivalence ; let's remove the HTML attribute itself if it + // is set + nsAutoString existingValue; + if (!aElement->GetAttr(kNameSpaceID_None, aAttribute, existingValue)) { + return NS_OK; } - // count is an integer that represents the number of CSS declarations applied to the - // element. If it is zero, we found no equivalence in this implementation for the - // attribute - if (aAttribute.EqualsLiteral("style")) { - // if it is the style attribute, just add the new value to the existing style - // attribute's value - nsAutoString existingValue; - bool wasSet = false; - nsresult rv = GetAttributeValue(aElement, NS_LITERAL_STRING("style"), - existingValue, &wasSet); - NS_ENSURE_SUCCESS(rv, rv); - existingValue.Append(' '); - existingValue.Append(aValue); - return aSuppressTransaction ? - aElement->SetAttribute(aAttribute, existingValue) : - SetAttribute(aElement, aAttribute, existingValue); - } + return aSuppressTransaction ? + aElement->UnsetAttr(kNameSpaceID_None, aAttribute, true) : + RemoveAttribute(aElement, aAttribute); + } - // we have no CSS equivalence for this attribute and it is not the style - // attribute; let's set it the good'n'old HTML way - return aSuppressTransaction ? aElement->SetAttribute(aAttribute, aValue) : - SetAttribute(aElement, aAttribute, aValue); + // count is an integer that represents the number of CSS declarations applied + // to the element. If it is zero, we found no equivalence in this + // implementation for the attribute + if (aAttribute == nsGkAtoms::style) { + // if it is the style attribute, just add the new value to the existing + // style attribute's value + nsAutoString existingValue; + aElement->GetAttr(kNameSpaceID_None, nsGkAtoms::style, existingValue); + existingValue.Append(' '); + existingValue.Append(aValue); + return aSuppressTransaction ? + aElement->SetAttr(kNameSpaceID_None, aAttribute, existingValue, true) : + SetAttribute(aElement, aAttribute, existingValue); } - // we are not in an HTML+CSS editor; let's set the attribute the HTML way - return aSuppressTransaction ? aElement->SetAttribute(aAttribute, aValue) : - SetAttribute(aElement, aAttribute, aValue); + // we have no CSS equivalence for this attribute and it is not the style + // attribute; let's set it the good'n'old HTML way + return aSuppressTransaction ? + aElement->SetAttr(kNameSpaceID_None, aAttribute, aValue, true) : + SetAttribute(aElement, aAttribute, aValue); } nsresult -HTMLEditor::RemoveAttributeOrEquivalent(nsIDOMElement* aElement, - const nsAString& aAttribute, +HTMLEditor::RemoveAttributeOrEquivalent(Element* aElement, + nsIAtom* aAttribute, bool aSuppressTransaction) { - nsCOMPtr<dom::Element> element = do_QueryInterface(aElement); - NS_ENSURE_TRUE(element, NS_OK); - - nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute); - MOZ_ASSERT(attribute); + MOZ_ASSERT(aElement); + MOZ_ASSERT(aAttribute); if (IsCSSEnabled() && mCSSEditUtils) { nsresult rv = mCSSEditUtils->RemoveCSSEquivalentToHTMLStyle( - element, nullptr, &aAttribute, nullptr, aSuppressTransaction); + aElement, nullptr, aAttribute, nullptr, aSuppressTransaction); NS_ENSURE_SUCCESS(rv, rv); } - if (!element->HasAttr(kNameSpaceID_None, attribute)) { + if (!aElement->HasAttr(kNameSpaceID_None, aAttribute)) { return NS_OK; } return aSuppressTransaction ? - element->UnsetAttr(kNameSpaceID_None, attribute, /* aNotify = */ true) : + aElement->UnsetAttr(kNameSpaceID_None, aAttribute, /* aNotify = */ true) : RemoveAttribute(aElement, aAttribute); } @@ -4523,7 +4518,6 @@ HTMLEditor::SetCSSBackgroundColor(const nsAString& aColor) NS_ENSURE_SUCCESS(rv, rv); if (!cancel && !handled) { // Loop through the ranges in the selection - NS_NAMED_LITERAL_STRING(bgcolor, "bgcolor"); for (uint32_t i = 0; i < selection->RangeCount(); i++) { RefPtr<nsRange> range = selection->GetRangeAt(i); NS_ENSURE_TRUE(range, NS_ERROR_FAILURE); @@ -4542,13 +4536,15 @@ HTMLEditor::SetCSSBackgroundColor(const nsAString& aColor) if (blockParent && cachedBlockParent != blockParent) { cachedBlockParent = blockParent; mCSSEditUtils->SetCSSEquivalentToHTMLStyle(blockParent, nullptr, - &bgcolor, &aColor, false); + nsGkAtoms::bgcolor, + &aColor, false); } } else if (startNode == endNode && startNode->IsHTMLElement(nsGkAtoms::body) && isCollapsed) { // No block in the document, let's apply the background to the body mCSSEditUtils->SetCSSEquivalentToHTMLStyle(startNode->AsElement(), - nullptr, &bgcolor, &aColor, + nullptr, nsGkAtoms::bgcolor, + &aColor, false); } else if (startNode == endNode && (endOffset - startOffset == 1 || (!startOffset && !endOffset))) { @@ -4559,7 +4555,8 @@ HTMLEditor::SetCSSBackgroundColor(const nsAString& aColor) if (blockParent && cachedBlockParent != blockParent) { cachedBlockParent = blockParent; mCSSEditUtils->SetCSSEquivalentToHTMLStyle(blockParent, nullptr, - &bgcolor, &aColor, false); + nsGkAtoms::bgcolor, + &aColor, false); } } else { // Not the easy case. Range not contained in single text node. There @@ -4602,7 +4599,8 @@ HTMLEditor::SetCSSBackgroundColor(const nsAString& aColor) if (blockParent && cachedBlockParent != blockParent) { cachedBlockParent = blockParent; mCSSEditUtils->SetCSSEquivalentToHTMLStyle(blockParent, nullptr, - &bgcolor, &aColor, + nsGkAtoms::bgcolor, + &aColor, false); } } @@ -4613,7 +4611,8 @@ HTMLEditor::SetCSSBackgroundColor(const nsAString& aColor) if (blockParent && cachedBlockParent != blockParent) { cachedBlockParent = blockParent; mCSSEditUtils->SetCSSEquivalentToHTMLStyle(blockParent, nullptr, - &bgcolor, &aColor, + nsGkAtoms::bgcolor, + &aColor, false); } } @@ -4627,7 +4626,8 @@ HTMLEditor::SetCSSBackgroundColor(const nsAString& aColor) if (blockParent && cachedBlockParent != blockParent) { cachedBlockParent = blockParent; mCSSEditUtils->SetCSSEquivalentToHTMLStyle(blockParent, nullptr, - &bgcolor, &aColor, + nsGkAtoms::bgcolor, + &aColor, false); } } diff --git a/editor/libeditor/HTMLEditor.h b/editor/libeditor/HTMLEditor.h index dc1a41b70..494e7c383 100644 --- a/editor/libeditor/HTMLEditor.h +++ b/editor/libeditor/HTMLEditor.h @@ -118,6 +118,16 @@ public: virtual already_AddRefed<nsIContent> GetInputEventTargetContent() override; virtual bool IsEditable(nsINode* aNode) override; using EditorBase::IsEditable; + virtual nsresult RemoveAttributeOrEquivalent( + Element* aElement, + nsIAtom* aAttribute, + bool aSuppressTransaction) override; + virtual nsresult SetAttributeOrEquivalent(Element* aElement, + nsIAtom* aAttribute, + const nsAString& aValue, + bool aSuppressTransaction) override; + using EditorBase::RemoveAttributeOrEquivalent; + using EditorBase::SetAttributeOrEquivalent; // nsStubMutationObserver overrides NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED @@ -329,14 +339,6 @@ public: */ virtual nsresult SelectEntireDocument(Selection* aSelection) override; - NS_IMETHOD SetAttributeOrEquivalent(nsIDOMElement* aElement, - const nsAString& aAttribute, - const nsAString& aValue, - bool aSuppressTransaction) override; - NS_IMETHOD RemoveAttributeOrEquivalent(nsIDOMElement* aElement, - const nsAString& aAttribute, - bool aSuppressTransaction) override; - /** * Join together any adjacent editable text nodes in the range. */ diff --git a/editor/libeditor/HTMLEditorObjectResizer.cpp b/editor/libeditor/HTMLEditorObjectResizer.cpp index 111a3f975..8ed5b6e4d 100644 --- a/editor/libeditor/HTMLEditorObjectResizer.cpp +++ b/editor/libeditor/HTMLEditorObjectResizer.cpp @@ -926,35 +926,30 @@ HTMLEditor::SetFinalSize(int32_t aX, // we want one transaction only from a user's point of view AutoEditBatch batchIt(this); - NS_NAMED_LITERAL_STRING(widthStr, "width"); - NS_NAMED_LITERAL_STRING(heightStr, "height"); - - nsCOMPtr<Element> resizedObject = do_QueryInterface(mResizedObject); - NS_ENSURE_TRUE(resizedObject, ); if (mResizedObjectIsAbsolutelyPositioned) { if (setHeight) { - mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::top, y); + mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::top, y); } if (setWidth) { - mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::left, x); + mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::left, x); } } if (IsCSSEnabled() || mResizedObjectIsAbsolutelyPositioned) { if (setWidth && mResizedObject->HasAttr(kNameSpaceID_None, nsGkAtoms::width)) { - RemoveAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)), widthStr); + RemoveAttribute(mResizedObject, nsGkAtoms::width); } if (setHeight && mResizedObject->HasAttr(kNameSpaceID_None, nsGkAtoms::height)) { - RemoveAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)), heightStr); + RemoveAttribute(mResizedObject, nsGkAtoms::height); } if (setWidth) { - mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::width, + mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::width, width); } if (setHeight) { - mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::height, + mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::height, height); } } else { @@ -964,30 +959,30 @@ HTMLEditor::SetFinalSize(int32_t aX, // triggering an immediate reflow; otherwise, we have problems // with asynchronous reflow if (setWidth) { - mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::width, + mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::width, width); } if (setHeight) { - mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::height, + mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::height, height); } if (setWidth) { nsAutoString w; w.AppendInt(width); - SetAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)), widthStr, w); + SetAttribute(mResizedObject, nsGkAtoms::width, w); } if (setHeight) { nsAutoString h; h.AppendInt(height); - SetAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)), heightStr, h); + SetAttribute(mResizedObject, nsGkAtoms::height, h); } if (setWidth) { - mCSSEditUtils->RemoveCSSProperty(*resizedObject, *nsGkAtoms::width, + mCSSEditUtils->RemoveCSSProperty(*mResizedObject, *nsGkAtoms::width, EmptyString()); } if (setHeight) { - mCSSEditUtils->RemoveCSSProperty(*resizedObject, *nsGkAtoms::height, + mCSSEditUtils->RemoveCSSProperty(*mResizedObject, *nsGkAtoms::height, EmptyString()); } } diff --git a/editor/libeditor/HTMLStyleEditor.cpp b/editor/libeditor/HTMLStyleEditor.cpp index 72eb1d690..c41f0a05c 100644 --- a/editor/libeditor/HTMLStyleEditor.cpp +++ b/editor/libeditor/HTMLStyleEditor.cpp @@ -429,7 +429,7 @@ HTMLEditor::SetInlinePropertyOnNodeImpl(nsIContent& aNode, mCSSEditUtils->IsCSSEditableProperty(&aNode, &aProperty, aAttribute)) || // bgcolor is always done using CSS - aAttribute->EqualsLiteral("bgcolor"); + attrAtom == nsGkAtoms::bgcolor; if (useCSS) { nsCOMPtr<dom::Element> tmp; @@ -444,12 +444,9 @@ HTMLEditor::SetInlinePropertyOnNodeImpl(nsIContent& aNode, } // Add the CSS styles corresponding to the HTML style request - int32_t count; - nsresult rv = - mCSSEditUtils->SetCSSEquivalentToHTMLStyle(tmp->AsDOMNode(), - &aProperty, aAttribute, - &aValue, &count, false); - NS_ENSURE_SUCCESS(rv, rv); + mCSSEditUtils->SetCSSEquivalentToHTMLStyle(tmp, + &aProperty, attrAtom, + &aValue, false); return NS_OK; } @@ -576,8 +573,9 @@ HTMLEditor::SplitStyleAbovePoint(nsCOMPtr<nsINode>* aNode, // in this implementation for the node; let's check if it carries those // CSS styles nsAutoString firstValue; - mCSSEditUtils->IsCSSEquivalentToHTMLInlineStyleSet(GetAsDOMNode(node), - aProperty, aAttribute, isSet, firstValue, CSSEditUtils::eSpecified); + isSet = mCSSEditUtils->IsCSSEquivalentToHTMLInlineStyleSet( + node, aProperty, aAttribute, firstValue, + CSSEditUtils::eSpecified); } if (// node is the correct inline prop (aProperty && node->IsHTMLElement(aProperty)) || @@ -746,8 +744,6 @@ HTMLEditor::RemoveStyleInside(nsIContent& aNode, // if we weren't passed an attribute, then we want to // remove any matching inlinestyles entirely if (!aAttribute || aAttribute->IsEmpty()) { - NS_NAMED_LITERAL_STRING(styleAttr, "style"); - NS_NAMED_LITERAL_STRING(classAttr, "class"); bool hasStyleAttr = aNode.HasAttr(kNameSpaceID_None, nsGkAtoms::style); bool hasClassAttr = aNode.HasAttr(kNameSpaceID_None, nsGkAtoms::_class); @@ -756,14 +752,14 @@ HTMLEditor::RemoveStyleInside(nsIContent& aNode, // just remove the element... We need to create above the element // a span that will carry those styles or class, then we can delete // the node. - nsCOMPtr<Element> spanNode = + RefPtr<Element> spanNode = InsertContainerAbove(&aNode, nsGkAtoms::span); NS_ENSURE_STATE(spanNode); nsresult rv = - CloneAttribute(styleAttr, spanNode->AsDOMNode(), aNode.AsDOMNode()); + CloneAttribute(nsGkAtoms::style, spanNode, aNode.AsElement()); NS_ENSURE_SUCCESS(rv, rv); rv = - CloneAttribute(classAttr, spanNode->AsDOMNode(), aNode.AsDOMNode()); + CloneAttribute(nsGkAtoms::_class, spanNode, aNode.AsElement()); NS_ENSURE_SUCCESS(rv, rv); } nsresult rv = RemoveContainer(&aNode); @@ -796,15 +792,17 @@ HTMLEditor::RemoveStyleInside(nsIContent& aNode, // the HTML style defined by aProperty/aAttribute has a CSS equivalence in // this implementation for the node aNode; let's check if it carries those // css styles + nsCOMPtr<nsIAtom> attribute = + aAttribute ? NS_Atomize(*aAttribute) : nullptr; nsAutoString propertyValue; bool isSet = mCSSEditUtils->IsCSSEquivalentToHTMLInlineStyleSet(&aNode, - aProperty, aAttribute, propertyValue, CSSEditUtils::eSpecified); + aProperty, attribute, propertyValue, CSSEditUtils::eSpecified); if (isSet && aNode.IsElement()) { // yes, tmp has the corresponding css declarations in its style attribute // let's remove them mCSSEditUtils->RemoveCSSEquivalentToHTMLStyle(aNode.AsElement(), aProperty, - aAttribute, + attribute, &propertyValue, false); // remove the node if it is a span or font, if its style attribute is diff --git a/editor/libeditor/TextEditRules.cpp b/editor/libeditor/TextEditRules.cpp index 35d4a2f3d..e98d36dd3 100644 --- a/editor/libeditor/TextEditRules.cpp +++ b/editor/libeditor/TextEditRules.cpp @@ -25,7 +25,6 @@ #include "nsError.h" #include "nsGkAtoms.h" #include "nsIContent.h" -#include "nsIDOMCharacterData.h" #include "nsIDOMDocument.h" #include "nsIDOMElement.h" #include "nsIDOMNode.h" @@ -479,26 +478,24 @@ TextEditRules::CollapseSelectionToTrailingBRIfNeeded(Selection* aSelection) return NS_OK; } -static inline already_AddRefed<nsIDOMNode> -GetTextNode(Selection* selection, - EditorBase* editor) +static inline already_AddRefed<nsINode> +GetTextNode(Selection* selection) { int32_t selOffset; - nsCOMPtr<nsIDOMNode> selNode; + nsCOMPtr<nsINode> selNode; nsresult rv = - editor->GetStartNodeAndOffset(selection, - getter_AddRefs(selNode), &selOffset); + EditorBase::GetStartNodeAndOffset(selection, + getter_AddRefs(selNode), &selOffset); NS_ENSURE_SUCCESS(rv, nullptr); - if (!editor->IsTextNode(selNode)) { - // Get an nsINode from the nsIDOMNode - nsCOMPtr<nsINode> node = do_QueryInterface(selNode); - // if node is null, return it to indicate there's no text - NS_ENSURE_TRUE(node, nullptr); + if (!EditorBase::IsTextNode(selNode)) { // This should be the root node, walk the tree looking for text nodes RefPtr<NodeIterator> iter = - new NodeIterator(node, nsIDOMNodeFilter::SHOW_TEXT, NodeFilterHolder()); - while (!editor->IsTextNode(selNode)) { - if (NS_FAILED(iter->NextNode(getter_AddRefs(selNode))) || !selNode) { + new NodeIterator(selNode, nsIDOMNodeFilter::SHOW_TEXT, + NodeFilterHolder()); + while (!EditorBase::IsTextNode(selNode)) { + IgnoredErrorResult rv; + selNode = iter->NextNode(rv); + if (!selNode) { return nullptr; } } @@ -1382,13 +1379,10 @@ TextEditRules::HideLastPWInput() nsContentUtils::GetSelectionInTextControl(selection, mTextEditor->GetRoot(), start, end); - nsCOMPtr<nsIDOMNode> selNode = GetTextNode(selection, mTextEditor); + nsCOMPtr<nsINode> selNode = GetTextNode(selection); NS_ENSURE_TRUE(selNode, NS_OK); - nsCOMPtr<nsIDOMCharacterData> nodeAsText(do_QueryInterface(selNode)); - NS_ENSURE_TRUE(nodeAsText, NS_OK); - - nodeAsText->ReplaceData(mLastStart, mLastLength, hiddenText); + selNode->GetAsText()->ReplaceData(mLastStart, mLastLength, hiddenText); selection->Collapse(selNode, start); if (start != end) { selection->Extend(selNode, end); @@ -1428,9 +1422,9 @@ TextEditRules::CreateMozBR(nsIDOMNode* inParent, NS_ENSURE_SUCCESS(rv, rv); // give it special moz attr - nsCOMPtr<nsIDOMElement> brElem = do_QueryInterface(brNode); + nsCOMPtr<Element> brElem = do_QueryInterface(brNode); if (brElem) { - rv = mTextEditor->SetAttribute(brElem, NS_LITERAL_STRING("type"), + rv = mTextEditor->SetAttribute(brElem, nsGkAtoms::type, NS_LITERAL_STRING("_moz")); NS_ENSURE_SUCCESS(rv, rv); } diff --git a/editor/libeditor/TextEditor.cpp b/editor/libeditor/TextEditor.cpp index 07b06a96a..3bee7843c 100644 --- a/editor/libeditor/TextEditor.cpp +++ b/editor/libeditor/TextEditor.cpp @@ -311,9 +311,9 @@ TextEditor::UpdateMetaCharset(nsIDOMDocument* aDocument, } // set attribute to <original prefix> charset=text/html - nsCOMPtr<nsIDOMElement> metaElement = do_QueryInterface(metaNode); + RefPtr<Element> metaElement = metaNode->AsElement(); MOZ_ASSERT(metaElement); - rv = EditorBase::SetAttribute(metaElement, NS_LITERAL_STRING("content"), + rv = EditorBase::SetAttribute(metaElement, nsGkAtoms::content, Substring(originalStart, start) + charsetEquals + NS_ConvertASCIItoUTF16(aCharacterSet)); @@ -1622,8 +1622,8 @@ TextEditor::GetDOMEventTarget() nsresult -TextEditor::SetAttributeOrEquivalent(nsIDOMElement* aElement, - const nsAString& aAttribute, +TextEditor::SetAttributeOrEquivalent(Element* aElement, + nsIAtom* aAttribute, const nsAString& aValue, bool aSuppressTransaction) { @@ -1631,8 +1631,8 @@ TextEditor::SetAttributeOrEquivalent(nsIDOMElement* aElement, } nsresult -TextEditor::RemoveAttributeOrEquivalent(nsIDOMElement* aElement, - const nsAString& aAttribute, +TextEditor::RemoveAttributeOrEquivalent(Element* aElement, + nsIAtom* aAttribute, bool aSuppressTransaction) { return EditorBase::RemoveAttribute(aElement, aAttribute); diff --git a/editor/libeditor/TextEditor.h b/editor/libeditor/TextEditor.h index 31c551f85..7bb594931 100644 --- a/editor/libeditor/TextEditor.h +++ b/editor/libeditor/TextEditor.h @@ -63,14 +63,17 @@ public: // nsIEditorMailSupport overrides NS_DECL_NSIEDITORMAILSUPPORT - // Overrides of EditorBase interface methods - NS_IMETHOD SetAttributeOrEquivalent(nsIDOMElement* aElement, - const nsAString& aAttribute, - const nsAString& aValue, - bool aSuppressTransaction) override; - NS_IMETHOD RemoveAttributeOrEquivalent(nsIDOMElement* aElement, - const nsAString& aAttribute, - bool aSuppressTransaction) override; + // Overrides of EditorBase + virtual nsresult RemoveAttributeOrEquivalent( + Element* aElement, + nsIAtom* aAttribute, + bool aSuppressTransaction) override; + virtual nsresult SetAttributeOrEquivalent(Element* aElement, + nsIAtom* aAttribute, + const nsAString& aValue, + bool aSuppressTransaction) override; + using EditorBase::RemoveAttributeOrEquivalent; + using EditorBase::SetAttributeOrEquivalent; NS_IMETHOD Init(nsIDOMDocument* aDoc, nsIContent* aRoot, nsISelectionController* aSelCon, uint32_t aFlags, diff --git a/extensions/spellcheck/locales/en-US/hunspell/README_en_US.txt b/extensions/spellcheck/locales/en-US/hunspell/README_en_US.txt index 6a3813d34..aac24438b 100644 --- a/extensions/spellcheck/locales/en-US/hunspell/README_en_US.txt +++ b/extensions/spellcheck/locales/en-US/hunspell/README_en_US.txt @@ -1,6 +1,6 @@ en_US-mozilla Hunspell Dictionary -Generated from SCOWL Version 2017.01.22 -Tue Jan 24 22:59:28 EST 2017 +Generated from SCOWL Version 2019.10.06 +Fri Feb 7 12:44:15 EST 2020 http://wordlist.sourceforge.net @@ -95,10 +95,10 @@ released as part of Geoff Kuenning's Ispell and as such is covered by his BSD license. Part of SCOWL is also based on Ispell thus the Ispell copyright is included with the SCOWL copyright. -The collective work is Copyright 2000-2016 by Kevin Atkinson as well +The collective work is Copyright 2000-2018 by Kevin Atkinson as well as any of the copyrights mentioned below: - Copyright 2000-2016 by Kevin Atkinson + Copyright 2000-2018 by Kevin Atkinson Permission to use, copy, modify, distribute and sell these word lists, the associated scripts, the output created from the scripts, @@ -344,4 +344,4 @@ and Australian word list. It is under the following copyright: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Build Date: Tue Jan 24 22:59:28 EST 2017 +Build Date: Fri Feb 7 12:44:15 EST 2020 diff --git a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/5-mozilla-added b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/5-mozilla-added index 6cb38be64..becb8c0d3 100644 --- a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/5-mozilla-added +++ b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/5-mozilla-added @@ -421,6 +421,8 @@ Asher Ashleigh Ashleigh's Ashton +Assyriaca +Assyriaca's Astra Astra's Astrid @@ -486,6 +488,8 @@ Babbie's Babette Babette's Babs +Bahasa +Bahasa's Bailie Bailie's Baillie @@ -636,6 +640,8 @@ Bil Bil's Bili Bili's +Bing +Bing's Bink Bink's Binky @@ -745,6 +751,7 @@ Bucky Bucky's Budd Budd's +Buenos Burk Burk's Burkina @@ -757,6 +764,7 @@ Byram Byram's Byrom Byrom's +CAPTCHA CEOs CFCs Cad @@ -844,8 +852,6 @@ Casar Casar's Casi Casi's -Casper -Casper's Cass Cass's Cassi @@ -945,8 +951,6 @@ Chet Chet's Chev Chev's -Chico -Chico's Chilton Chilton's Chloris @@ -1051,6 +1055,7 @@ Conchita Conchita's Concordia Concordia's +Congressionally Connor Connor's Conny @@ -1167,7 +1172,6 @@ Cyrille Cyrille's D'Arcy DRM -DVDs Dacey Dacey's Dacia @@ -1251,8 +1255,6 @@ Daytona Daytona's De De's -DeKalb -DeKalb's DealTime DealTime's Deane @@ -1292,8 +1294,6 @@ Dennie Dennie's Dennison Dennison's -Denton -Denton's Deny's Denys Der @@ -1545,8 +1545,6 @@ Elly Elly's Ellyn Ellyn's -Elmira -Elmira's Elmore Elmore's Eloisa @@ -1577,6 +1575,8 @@ Emanuele Emanuele's Emeline Emeline's +Emeryville +Emeryville's Emilie Emilie's Emlen @@ -1647,6 +1647,8 @@ Eulalie Eulalie's Euphemia Euphemia's +Europaea +Europaea's Eustace Eustace's Eustacia @@ -1770,8 +1772,6 @@ Findlay Findlay's Findley Findley's -Finlay -Finlay's Fitz Fitz's Flem @@ -1854,6 +1854,7 @@ Fukushima Fukushima's Fulvia Fulvia's +GDPR GHz's GaAs Gabby @@ -1888,6 +1889,7 @@ Gan Gan's Gannon Gannon's +Garamond Gard Gardiner Gare @@ -2145,6 +2147,7 @@ Gwyneth's Gwynne Gwynne's HTTPS +HVAC Had's Hadleigh Hadleigh's @@ -2324,8 +2327,12 @@ Hinze Hinze's Hirsch Hirsch's +Hispanica +Hispanica's Hobie Hobie's +Hollandica +Hollandica's Honoria Honoria's Horatia @@ -2369,12 +2376,16 @@ Hyatt's Hyman Hyman's Hymie +IANAL +IIRC IMDb IMDb's IMDbPro IMDbPro's IPO's IPOs +ISP's +ISPs Iain Iain's Ianthe @@ -2450,10 +2461,14 @@ Isidore Isidore's Isidoro Isidoro's +Islamica +Islamica's Isobel Isobel's Issy Issy's +Italia +Italia's Ivar Ivar's Ive @@ -2469,6 +2484,7 @@ Izzy Izzy's JPEG's JPEGs +JSON Jabez Jabez's Jacinta @@ -2787,6 +2803,8 @@ Kevan Kevan's Khalil Khalil's +Khazarica +Khazarica's Ki Ki's Kile @@ -2847,6 +2865,8 @@ Krystyna Krystyna's Kuala Kuala's +Kubernetes +Kubernetes's Kyla Kyla's Kylie @@ -2879,6 +2899,7 @@ Larisa Larisa's Larissa Larissa's +Latinx Laughton Launce Launce's @@ -2897,12 +2918,8 @@ Lavinia Lavinia's Lawry Lawry's -Lawton -Lawton's Layne Layne's -Layton -Layton's Lazar Lazar's Lazare @@ -3058,8 +3075,6 @@ Lonny Lonny's LookSmart LookSmart's -Lorain -Lorain's Lorant Lorant's Lorenza @@ -3129,6 +3144,7 @@ Lyndsey Lyndsey's Lyssa Lyssa's +MDF MHz's MPEG's MPEGs @@ -3498,6 +3514,8 @@ Moise Moise's Moishe Moishe's +Mongolica +Mongolica's Monika Monika's Monro @@ -3545,8 +3563,6 @@ Murdock's Murry Murry's My's -MySQL -MySQL's MySpell MySpell's Myer @@ -3578,8 +3594,6 @@ Nanni Nanni's Nanon Nanon's -Napa -Napa's Nara Nari Nari's @@ -3612,6 +3626,9 @@ Nedda Nedda's Neddy Neddy's +Nederland +Nederland's +Nederlands Neel Neel's Neely @@ -3655,6 +3672,8 @@ Nial Nial's Niall Niall's +Nicephori +Nicephori's Nichol Nichol's Nicki @@ -3678,6 +3697,8 @@ Nicolle's Niel Niel's Niels +Nigeriana +Nigeriana's Niki Niki's Niko @@ -3729,6 +3750,7 @@ Nye Nye's Nyssa Nyssa's +OMG Obed Obed's Obie @@ -3791,6 +3813,8 @@ Otho Otho's Ottilie Ottilie's +Ottomana +Ottomana's Oxley Oxley's Ozzy @@ -3800,6 +3824,11 @@ PDA's PDAs PDF's PDFs +PNG +PNG's +PNGs +POTUS +POTUS's PRNewswire PRNewswire's Paco @@ -3906,6 +3935,7 @@ Petronella Petronella's Petronilla Petronilla's +Peyronie's Peyton Peyton's Phebe @@ -3944,14 +3974,17 @@ Piotr Piotr's Pippa Pippa's +Pixar +Pixar's +Polska PostScript PostScript's -PostgreSQL -PostgreSQL's Poul Poul's Poynter Poynter's +Praetoriana +Praetoriana's Prentiss Prentiss's Prinz @@ -4069,6 +4102,7 @@ Rea's Reade Rebeca Rebeca's +Rebecca Rebecca's Rebecka Rebecka's @@ -4226,6 +4260,8 @@ Roma Roma's Romain Romain's +Romana +Romana's Romola Romola's Romy @@ -4302,9 +4338,16 @@ Rutter Rutter's Ruy Ruy's +SCOTUS +SCOTUS's +SME +SME's +SMEs +SMEs's SNP SNP's SNPs +SSN Saba Saba's Saccharomyces @@ -4408,8 +4451,6 @@ Shanta Shanta's Shara Shara's -SharePoint -SharePoint's Sharma Sharma's Shayla @@ -4486,6 +4527,8 @@ Simmonds Simmonds's Simona Simona's +Sinica +Sinica's Siobhan Siobhan's Sion @@ -4523,6 +4566,8 @@ Sophronia Sophronia's Sorcha Sorcha's +Sovietica +Sovietica's Sparc SpiderMonkey SpiderMonkey's @@ -4571,11 +4616,15 @@ Suki Suki's Sula Sula's +Sumerica +Sumerica's Sunbird Sunbird's Sunderland Sunderland's Sunny's +Suomi +Suomi's Susann Susann's Susannah @@ -4607,10 +4656,18 @@ Symbian Symbian's Symon Symon's +Syriana +Syriana's TEirtza TEirtza's THz THz's +TIF +TIF's +TIFF +TIFF's +TIFFs +TIFs Tabb Tabb's Taber @@ -4962,6 +5019,7 @@ Vodafone's Von Von's WASPs +WTF Wadsworth Wadsworth's Wainwright @@ -5066,8 +5124,6 @@ Winslow's Witty's Woodie Woodie's -WordPress -WordPress's Worden Worden's WorldCat @@ -5083,6 +5139,12 @@ Wynne Wynne's XBL XBL's +XLS +XLS's +XLSX +XLSX's +XLSXs +XLSs XPCOM XPCOM's XPConnect @@ -5185,20 +5247,37 @@ abridgements absorbances absorbancy absorbancy's +accountabilities +accrete +accreted +accretes +acetabular +acetabulum actin +add-on +add-ons admin's adoptee adoptee's adoptees +adorbs advocator advocator's advocators adware's adwares -aggregator -aggregator's -aggregators +affordance +affordances +al alkoxy +aluminize +aluminized +amici +amicus +analytics +anaphylactic +anaphylaxes +anaphylaxis anonymization anonymization's anonymizations @@ -5208,6 +5287,9 @@ anonymizes anonymizing anthropomorphized anthropomorphizes +antiderivative +antiderivatives +antifa antisense antivirus's apatosaurus @@ -5219,9 +5301,18 @@ archaeoastronomy's archaeologic archaeomagnetic archaeomagnetism +arrestee +arrestees +arthroplasty +artisanal +artisanally +artisanship +artisanships aryl aryl's aryls +aspirational +aspirationally astroarchaeologies astroarchaeology astroarchaeology's @@ -5229,23 +5320,61 @@ astrobiology astrobiology's astrobleme astroblemes +asymptote +asymptotes asynchronicity aurei +auteur auteur's auteurs autocomplete autocompletes avant-garde +avo +avos axe axe's +backlit +backsplash +backsplashes +backstab +backstabby +backstabs +badass +badasses badging +balkanization +balkanize +balkanized +balkanizes +balkanizing +banc +bancs +barcode +barcoded +barcodes +barcoding +basilar +beaucoup +bifida +bijection +bijections +bingeable +biochem biodiesel biodiesel's +biohacker +biohacker's +biohackers +biohacking bioinformatic bioinformatic's bioinformatics biosyntheses biotech's +blanche +blockchain +blockchains blogroll blogroll's blogrolls @@ -5257,8 +5386,16 @@ bloviation bloviator bloviator's bloviators +bon +bona +bono +bons bookselling +bougie +bougies broadcasted +bullseyes +bupkis cDNA canceller canceller's @@ -5270,8 +5407,14 @@ canonicalized canonicalizes canonicalizing capita +captcha carboxylic +cardinalities +cardinality +cardiomegaly carnitas +carte +cartes cerevisiae cerevisiae's cerevisiaes @@ -5286,56 +5429,124 @@ codec's codecs codon's coli +collegial +collinear +collinearity +colocate +colocated +colocates +colocating +colocation +colocations colonoscope colonoscope's colonoscopes +combinatorics commenters +commoditization compositeness +compressions concurrents conferable config config's configs conformant +congressionally conmanly +copyrightable corrigibility corrigibility's corrigible corruptibly +cosplayed +cosplayer +cosplayers +cosplaying +cosplays +countertop +countertops +coupler +couplers court-martial court-martialed court-martialing court-martials +crapola crappiness crimeware crimeware's +criminalization +crore +crore's +crores +crowdsource +crowdsourced +crowdsources +crowdsourcing cryonic +cryptographic cryptologist cryptologist's cryptologists cryptosystem cryptosystems cul-de-sac +culpa +culpas +curation +customizable cyber +cybersecurity +cysteine +cysteine's +cysteines +cysticerci +cysticercoid +cysticercoids +cysticercoses +cysticercosis +cysticercus +cystoscope +cystoscopic +cystoscopy cytokine cytokine's datasheet datasheet's datasheets +de decertification decertifications decertified decertifies decertify decertifying +decile +deciles +decisis +decompressions deconstructionist's +decontextualize +decontextualized +decontextualizes +decontextualizing +decoupler +decouplers +decrypt +decryptable +decrypted +decrypting +decrypts +definitional +definitionally degenerations dehydrogenase's deliverables -dequeue -dequeued -dequeues +demonym +demonyms dequeuing +descalable designee designings dialoged @@ -5345,41 +5556,91 @@ dialogued dialoguer dialoguing diatomaceous +differentiator +differentiators dihydro disarrangements disassembler disassembler's disassemblers disassembly's +disbarments disclaimable disclosable discountenance's +discoverability +discoverable +disintegrations disintermediation disintermediations +dispositive +dispositive's +dispositively +dispositiveness +dispositives dissentious +distractability +distractable +distractible +diverter +diverters +dizygotic +dizygous djinn donator donator's donators +doozie +doozy +dox +doxastic +doxed +doxes +doxing +doxx +doxxed +doxxes +doxxing +dreck +dreckish +drecky +drek +duffel +duffels +duplicative durian durian's durians +dystopians +dystopias eBook eBook's eBooks eCommerce eCommerce's +ectopic +ectopically +egads elicitor elicitor's elicitors +else's +embiggen +empathic +encodings encyclopaedia -enqueue -enqueued -enqueues enqueuing +ergodic +ergodicity eschatologist eschatologist's eschatologists +et +eutrophic +evidential +evidentiality +evidentially +evidentiary exacta exactable exactas @@ -5388,12 +5649,44 @@ exactions exactor exactor's exactors +exbibyte +exbibyte's +exbibytes +exfiltrate +exfiltrated +exfiltrates +exfiltrating +exfiltration +exfiltrations experimentalism +explainer +explainers +expunction +expungement +expungements +extortionary +extrema +extremum +extremums +facto +fav +favs +fearmonger +fearmonger's +fearmongering +fearmongers +fides filesystem filesystem's filesystems filmography financials +findable +fintech +fintechs +flaneur +flaneur's +flaneurs fluidize fluidizes fluidizing @@ -5404,9 +5697,15 @@ foci forma fracker frackers +franca freegan freegans fuckhead's +fugacious +fugaciously +fugaciousness +funder +funders gamification gamified gamifies @@ -5415,10 +5714,29 @@ gamifying gastroenterologist gastroenterologist's gastroenterology +gazillionth +genomic +genomic's +geocentricism +geocentrism +geopolitically +gerontocracy +gibibyte +gibibyte's +gibibytes gigajoule gigajoule's gigajoules +glamping +glom +glomed +gloming +gloms +gochujang grande +grantor +grantor's +grantors grey grey's greybeard's @@ -5429,15 +5747,47 @@ greyest greying greyness's greys +guac +gunsmoke +habeas +hadithes +handwrite +handwrites +handwrote +haptical +haptically +haptics +harissa +headspace +heliocentrically +heliocentricism +heliocentrism hentai +hexane hexane's hexanes hippopotami +hoc holdem +hophead +hopheads +hormesis +hornbeams +howto +howto's +howtos iPods +iatrogenesis +iatrogenic idolator idolator's idolators +iftar +iftars +igniter +igniter's +igniters +impactful inactives inactivities incentivize @@ -5445,10 +5795,22 @@ incentivized incentivizes incentivizing inclosable +incorporator +incorporators incorrigibleness +infinitum +infringer +infringers inkjet inkjet's inkjets +instantiation +instantiations +integrand +integrationist +integrationist's +integrationists +integrations intermediacies intermediacy intermediated @@ -5459,24 +5821,55 @@ intermediations intermediator intermediator's intermediators +intermittences +intermittencies +interquartile interruptible intersexual intersexual's intersexualism intersexuality intersexuals +intifadas +intl +invertible +isometry +iteratively +japonica jewellery judgement judgement's judgements +kabocha +kakistocracy kbps +keester +keesters +keister +keisters +kern +kerne +kerning keylogger keylogger's keyloggers keylogging keylogging's keyloggings +kibibyte +kibibyte's +kibibytes +kludgy +kombucha +kryptonite labelled +langue +langue's +langues +lawyerly +leachate +leachates +learnt lector lector's lectors @@ -5489,37 +5882,63 @@ limnologist's limnologists limnology limnology's +lingua linguistical mRNA +malform +malforms malwares mammalia +masse +maximalist +maximalist's +maximalists +mea +mebibyte +mebibyte's +mebibytes megajoule megajoule's +merchantability +merchanting mesothelioma mesothelioma's metadata's methoxy +microcredit migrator migrator's migrators +mins misandrist misandrist's misandrists misandry +mise +mises misjudgement misjudgement's misjudgements mitigations +mocktail +mocktails modeller modeller's modellers modelling modelling's modellings +mojo +mojos +monofilament +monomial +monozygotic +monozygous motorsport motorsport's motorsports multicast +multivariable murine musculus namespace @@ -5535,29 +5954,70 @@ naïvety naïvety's naïveté naïveté's +neato +neoadjuvant +neurocysticercoses +neurocysticercosis neurophysiology's neuroscience's neurosciences neuroscientist neuroscientist's neuroscientists +neurotoxin +neurotoxins +newish newswires +nitty-gritty +nonnegative +nonreal +nosings +nutjob +nutjobs +nystagmus +octant +octantal +octants octopi +olds oligo +opensource +opioid +opioids opposable opposer outlier's -parallelization +overbroad +overrich +overrichness +oxymoronic +oxymoronically +oy +oyes +oyez parallelization's parallelizations parallelize -parallelized parallelizes parallelizing +parametrize +parametrized +paronychia +parsers +paver +pavers +pax +pebibyte +pebibyte's +pebibytes +performant permalink permalink's permalinks permittee +pharma +pharma's +pharmas phlebotomist phlebotomist's phlebotomists @@ -5565,22 +6025,69 @@ phlebotomize phlebotomized phlebotomizes phlebotomizing +phlebotomy pho phosphorylate phosphorylated phosphorylates phosphorylating +photodetector +photodetectors +photosensor +photosensors +photosensory +phyllo +piecewise +pixelate +pixelated +pixelates plaintext +polymorphically +polymorphism polynucleotide polynucleotide's polynucleotides +polypeptide polypeptide's +polypeptides +portlet +portlet's +portlets +positivities +positivity +positivity's +post-partum +pounder +pounders poutine poutines +praecipe +pre-fill +pre-filled +pre-filling +pre-fills +precedential +preclusions +prefill +prefilled +prefilling +prefills +preinstall prejudgement prejudgement's prejudgements preliminarily +preload +preloaded +preloading +preloads +preparer +preparers +prepend +prepended +prepending +prepends +prev proclaimable procreations profiler @@ -5595,11 +6102,21 @@ pronation pronator pronator's pronators +propounder +propounders proprietorships propyl +pruno pseudorandom pseudorandomly +quartile +quartiles racoon +rambutan +rambutans +ramped +rando +randos rasterization rasterization's rasterize @@ -5609,40 +6126,107 @@ rasterizes rasterizing reactivity's reappointments +rebar +rebars +rebrand +rebranded +rebranding rebroadcasted +rebuttable recency +recommender +recommenders recompilation's +reconfigurable recurse recursed recurses recursing +recusal +recusals +redactions +redirections +rediscoverable reflux's +refunder +refunders +reglet +reintegrations +relatedly relocations renominations repartitions +repaver +repavers +replead +repleaded +repleader +repleaders +repleading +repleadings +repleads +reproducibility +reputational +requestor resizable resizer +reskin +reskin's +reskinned +reskinning +reskins +respellings resubmission's +retainage +retainages retransmission's +retroreflector +retroreflectors +reviewable rheumatological rheumatologist rheumatologist's rheumatologists rheumatology rheumatology's +ribbie +ribbies +roadmap +roadmaps +rollout +rotatable rotatably +salability sativa savoir +scalable +schemas schnaps schrod schrods +scooch +scooched +scooches +scooching +scorebook +scorebook's +scorebooks +scoresheet +scoresheet's +scoresheets scot-free +screener +screeners screenshot's -searchable +scrollbar +scrollbars +segregable +seldomly selfing selfism selfist selfists +sera seraphim shemale shemale's @@ -5656,17 +6240,56 @@ signalling signup signup's signups +situ snarkily +snazziness +soffit +soffits sommelier sommelier's sommeliers spelt spick spicks +spina +spitballer +spitballers +spitballing +sponsorships spywares +stealer +stealers +stoolie +stoolie's +stoolies +stopword +stopwords +strategize +strategized +strategizing +streetwalking +struct +struct's +structs +stupefyingly +subrogate +subrogated +subrogates +subrogation substituent's substituents subsumptions +subtweet +subtweets +sucky +superset +supervillain +supervillain's +supervillains +surjection +surjections +switcheroo +switcheroos syllabi synches synesthesia @@ -5680,6 +6303,9 @@ sysadmin's sysop's tRNA tRNA's +tebibyte +tebibyte's +tebibytes telecom telecom's teleported @@ -5695,36 +6321,69 @@ textbox textbox's textboxes thaliana +theming therebetween +thoracotomy +thusly +toodles traceur traceur's traceurs trackback trackback's trackbacks +trailhead +trailheads +trainings +transcriptional transfect transfected transfecting transfects +transformational +transformative transgenderism transgene transgenes +trebuchet +trebuchets triages triaging +tung tweep tweeps +ulcerative +unboxings uncancelled uncheck unchecking unchecks +uncopyrightable +uncoupler +uncouplers undeliverables undesignated +unencrypted unironic unironically unlabelled +unpressured +unpressurized +unredacted +unrequest +unrequested +uptime +utero +vaccinator +vaccinators +vacinal validator validators +vanishingly vertebrata +vertebrobasilar +vivant +vivants volcanological volcanologist volcanologist's @@ -5734,7 +6393,40 @@ volcanology's webdesign webdesign's webdesigns +webpage +webpage's +webpages +weirded +weirding +welp whitepaper whitepaper's whitepapers +wicking +wickings +willy-nilly +winsorization +winsorize +winsorized +winsorizes +winsorizing +wishy-washy +woah wop's +wordie +wordies +xenophile +xenophiles +yay +yobibyte +yobibyte's +yobibytes +yowsa +yowsah +yowza +yowzah +zebibyte +zebibyte's +zebibytes +zuke +zukes diff --git a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/README_en_US-custom.txt b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/README_en_US-custom.txt index 0d725dadb..a0cb8582f 100644 --- a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/README_en_US-custom.txt +++ b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/README_en_US-custom.txt @@ -1,6 +1,6 @@ en_US-custom Hunspell Dictionary -Generated from SCOWL Version 2017.01.22 -Tue Jan 24 22:59:27 EST 2017 +Generated from SCOWL Version 2019.10.06 +Fri Feb 7 12:44:14 EST 2020 http://wordlist.sourceforge.net @@ -95,10 +95,10 @@ released as part of Geoff Kuenning's Ispell and as such is covered by his BSD license. Part of SCOWL is also based on Ispell thus the Ispell copyright is included with the SCOWL copyright. -The collective work is Copyright 2000-2016 by Kevin Atkinson as well +The collective work is Copyright 2000-2018 by Kevin Atkinson as well as any of the copyrights mentioned below: - Copyright 2000-2016 by Kevin Atkinson + Copyright 2000-2018 by Kevin Atkinson Permission to use, copy, modify, distribute and sell these word lists, the associated scripts, the output created from the scripts, @@ -344,5 +344,5 @@ and Australian word list. It is under the following copyright: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Build Date: Tue Jan 24 22:59:27 EST 2017 +Build Date: Fri Feb 7 12:44:14 EST 2020 With Input Command: ../mk-list -v1 --accents=both en_US 60 diff --git a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/en_US-custom.dic b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/en_US-custom.dic index 53e1bb406..8f5bb763a 100644 --- a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/en_US-custom.dic +++ b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/en_US-custom.dic @@ -1,4 +1,4 @@ -49467 +50016 0/nm 0th/pt 1/n1 @@ -75,6 +75,7 @@ AV AVI AWACS/M AWOL/M +AWS/M AZ/M AZT/M Aachen/M @@ -193,6 +194,7 @@ Agra/M Agricola/M Agrippa/M Agrippina/M +Aguadilla/M Aguascalientes Aguilar/M Aguinaldo/M @@ -344,6 +346,7 @@ Alsatian/SM Alsop/M Alston/M Alta/M +Altaba/M Altai/M Altaic/M Altair/M @@ -353,6 +356,7 @@ Altiplano/M Altman/M Altoids/M Alton/M +Altoona/M Aludra/M Alva/M Alvarado/M @@ -387,7 +391,9 @@ Americanization/MS Americanize/GDS Amerind/SM Amerindian/MS +Ames/M Ameslan/M +Amgen/M Amharic/M Amherst/M Amie/M @@ -459,6 +465,7 @@ Angevin/M Angie/M Angkor/M Angle/MS +Angleton/M Anglia/M Anglican/SM Anglicanism/MS @@ -474,6 +481,7 @@ Angora/SM Angstrom/M Anguilla/M Angus/M +Anhui/M Aniakchak/M Anibal/M Anita/M @@ -488,6 +496,7 @@ Annapurna/M Anne/M Annette/M Annie/M +Anniston/M Annmarie/M Annunciation/SM Anouilh/M @@ -586,6 +595,8 @@ Arctic/M Arcturus/M Ardabil Arden/M +Arduino/M +Arecibo/M Arequipa/M Ares/M Argentina/M @@ -657,6 +668,7 @@ Asgard/M Ashanti/M Ashcroft/M Ashe/M +Asheville/M Ashgabat Ashikaga/M Ashkenazim/M @@ -701,6 +713,7 @@ Atacama/M Atahualpa/M Atalanta/M Atari/M +Atascadero/M Ataturk/M Atatürk/M Athabasca/M @@ -732,6 +745,7 @@ Attucks/M Atwood/M Au/M Aubrey/M +Auburn/M Auckland/M Auden/M Audi/M @@ -786,6 +800,7 @@ Avior/M Avis/M Avogadro/M Avon/M +Avondale/M Axis Axum/M Ayala/M @@ -866,6 +881,7 @@ Bahamas/M Bahamian/MS Bahia/M Bahrain/M +Baidu/M Baikal/M Bailey/M Baird/M @@ -928,6 +944,7 @@ Barbour/M Barbra/M Barbuda/M Barcelona/M +Barceloneta/M Barclay/SM Barclays/M Bardeen/M @@ -1026,6 +1043,8 @@ Beck/MR Becker/M Becket/M Beckett/M +Beckley/M +Beckman Becky/M Becquerel/M Bede/M @@ -1046,6 +1065,7 @@ Beirut/M Bekesy/M Bela/M Belarus/M +Belarusian Belau/M Belem/M Belfast/M @@ -1060,10 +1080,12 @@ Bella/M Bellamy/M Bellatrix/M Belleek/M +Bellingham/M Bellini/M Bellow/M Belmont/M Belmopan/M +Beloit/M Belorussian/MS Belshazzar/M Beltane/M @@ -1072,7 +1094,9 @@ Ben/M Benacerraf/M Benares/M Benchley/M +Bend/MR Bender/M +Bendictus Bendix/M Benedict/M Benedictine/MS @@ -1144,6 +1168,7 @@ Bertie/M Bertillon/M Bertram/M Bertrand/M +Berwick/M Beryl/M Berzelius/M Bess/M @@ -1183,6 +1208,7 @@ Bic/M Biddle/M Biden/M Bierce/M +BigQuery/M Bigfoot/M Biggles/M Biko/M @@ -1193,6 +1219,8 @@ Billie/M Billings/M Billy/M Bimini/M +Binghamton/M +Biogen/M Bioko/M Bird/M Birdseye/M @@ -1219,6 +1247,7 @@ Blackburn/M Blackfeet/M Blackfoot/M Blackpool/M +Blacksburg/M Blackshirt/M Blackstone/M Blackwell/M @@ -1244,6 +1273,8 @@ Bloom/MR Bloomer/M Bloomfield/M Bloomingdale/M +Bloomington/M +Bloomsburg/M Bloomsbury/M Blu Blucher/M @@ -1330,6 +1361,7 @@ Bosporus/M Boston/MS Bostonian/M Boswell/M +Botha Botox Botswana/M Botticelli/M @@ -1354,6 +1386,7 @@ Br/MT Brad/MY Bradbury/M Braddock/M +Bradenton/M Bradford/M Bradley/M Bradly/M @@ -1398,6 +1431,7 @@ Breathalyzer Brecht/M Breckenridge/M Bremen/M +Bremerton/M Brenda/M Brendan/M Brennan/M @@ -1410,6 +1444,7 @@ Breton/M Brett/M Brewer/M Brewster/M +Brexit Brezhnev/M Brian/M Briana/M @@ -1433,6 +1468,7 @@ Brighton/M Brigid/M Brigitte/M Brillo/M +Brillouin Brinkley/M Brisbane/M Bristol/M @@ -1589,7 +1625,7 @@ CBC/M CBS/M CCTV CCU -CD/M +CD/SM CDC CDT CEO/M @@ -1612,6 +1648,7 @@ CPO CPR/M CPU/M CRT/SM +CSS/M CST/M CT/M CV @@ -1645,6 +1682,7 @@ Calderon/M Caldwell/M Caleb/M Caledonia/M +Calexico/M Calgary/M Calhoun/M Cali/M @@ -1668,6 +1706,7 @@ Calvinism/MS Calvinist/MS Calvinistic Camacho/M +Camarillo/M Cambodia/M Cambodian/SM Cambrian/SM @@ -1741,6 +1780,7 @@ Caracalla/M Caracas/M Caravaggio/M Carboloy/M +Carbondale/M Carboniferous/M Carborundum/M Cardenas/M @@ -1792,6 +1832,7 @@ Carrillo/M Carroll/M Carson/M Carter/M +Cartersville/M Cartesian/M Carthage/M Carthaginian/MS @@ -1810,6 +1851,7 @@ Casey/M Cash/M Casio/M Caspar/M +Casper/M Caspian/M Cassandra/SM Cassatt/M @@ -1869,6 +1911,7 @@ Cecily/M Cedric/M Celebes/M Celeste/M +Celgene/M Celia/M Celina/M Cellini/M @@ -1909,6 +1952,8 @@ Challenger/M Chalmers Chamberlain/M Chambers/M +Chambersburg/M +Champaign/M Champlain/M Champollion/M Chan/M @@ -1941,6 +1986,7 @@ Charleston/MS Charley/M Charlie/M Charlotte/M +Charlottesville/M Charlottetown/M Charmaine/M Charmin/M @@ -2007,6 +2053,7 @@ Chicana/M Chicano/M Chickasaw/MS Chiclets/M +Chico/M Chihuahua/MS Chile/M Chilean/MS @@ -2054,6 +2101,7 @@ Christmastide/MS Christmastime/MS Christoper/M Christopher/M +Chromebook/MS Chronicles Chrysler/M Chrysostom/M @@ -2097,6 +2145,7 @@ Clarice/M Clarissa/M Clark/M Clarke/M +Clarksville/M Claude/M Claudette/M Claudia/M @@ -2129,6 +2178,7 @@ Clint/M Clinton/M Clio/M Clive/M +Clojure/M Clorets/M Clorox/M Closure/M @@ -2232,6 +2282,7 @@ Congreve/M Conley/M Conn/MR Connecticut/M +Connellsville/M Connemara/M Conner/M Connery/M @@ -2240,6 +2291,7 @@ Connolly/M Connors/M Conrad/M Conrail/M +Conroe/M Conservative Constable/M Constance/M @@ -2308,6 +2360,7 @@ Corvette/M Corvus/M Cory/M Cosby/M +CosmosDB/M Cossack/M Costco/M Costello/M @@ -2324,12 +2377,14 @@ Courbet/M Courtney/M Cousteau/M Coventry/SM +Covington/M Coward/M Cowell/M Cowley/M Cowper/M Cox/M Coy/M +Coyle/M Cozumel/M Cpl Cr/MT @@ -2466,7 +2521,7 @@ DPT DST DTP DUI -DVD +DVD/S DVR/SM DWI Dachau/M @@ -2502,6 +2557,7 @@ Dan/M Dana/M Danae/M Danaë/M +Danbury/M Dane/SM Danelaw/M Dangerfield/M @@ -2517,6 +2573,7 @@ Dante/M Danton/M Danube/M Danubian/M +Danville/M Daphne/M Darby/M Darcy/M @@ -2566,6 +2623,7 @@ Day/M Dayan Dayton/M DeGeneres/M +DeKalb/M Deadhead/M Dean/M Deana/M @@ -2630,6 +2688,7 @@ Delphi/M Delphic/M Delphinus/M Delta/M +Deltona/M Dem/G Demavend/M Demerol/M @@ -2651,6 +2710,7 @@ Denise/M Denmark/M Dennis/M Denny/M +Denton/M Denver/M Deon/M Depp/M @@ -2740,6 +2800,7 @@ Dixie/M Dixiecrat/M Dixieland/SM Dixon/M +Django/M Djibouti/M Dmitri/M Dnepr @@ -2807,6 +2868,7 @@ Dorthy/M Dortmund/M Dostoevsky/M Dot/M +Dothan/M Dotson/M Douala/M Douay/M @@ -2837,6 +2899,7 @@ Dristan/M Dropbox/M Drudge/M Druid/M +Drupal/M Dryden/M Dschubba/M Du @@ -2847,6 +2910,7 @@ Dubcek/M Dubhe/M Dublin/M Dubrovnik/M +Dubuque/M Duchamp/M Dudley/M Duffy/M @@ -2897,6 +2961,7 @@ Dwight/M Dy/M Dyer/M Dylan/M +DynamoDB/M Dyson/M Dzerzhinsky/M Dzungaria/M @@ -3009,11 +3074,13 @@ Eisner/M Elaine/M Elam/M Elanor/M +Elasticsearch/M Elastoplast/M Elba/M Elbe/M Elbert/M Elbrus/M +Eldersburg/M Eldon/M Eleanor/M Eleazar/M @@ -3033,6 +3100,8 @@ Elisha/M Eliza/M Elizabeth/M Elizabethan/SM +Elizabethtown/M +Elkhart/M Ella/M Ellen/M Ellesmere/M @@ -3044,6 +3113,7 @@ Ellis/M Ellison/M Elma/M Elmer/M +Elmira/M Elmo/M Elnath/M Elnora/M @@ -3064,6 +3134,7 @@ Elvira/M Elvis/M Elway/M Elwood/M +Elyria/M Elysee/M Elysian/M Elysium/SM @@ -3145,6 +3216,7 @@ Erin/M Eris/MS Eritrea/M Eritrean/SM +Erlang/M Erlenmeyer/M Erma/M Erna/M @@ -3222,6 +3294,7 @@ Europe/M European/MS Eurydice/M Eustachian/M +Eustis/M Euterpe/M Eva/M Evan/SM @@ -3292,9 +3365,12 @@ Fagin/M Fahd/M Fahrenheit/M Fairbanks/M +Fairfield/M +Fairhope/M Faisal/M Faisalabad/M Faith/M +Fajardo/M Falasha/M Falkland/SM Falklands/M @@ -3307,6 +3383,7 @@ Faraday/M Fargo/M Farley/M Farmer/M +Farmington/M Farragut/M Farrakhan/M Farrell/M @@ -3329,6 +3406,7 @@ Faustus/M Fawkes/M Fay/M Faye/M +Fayetteville/M Fe/M Feb/M February/SM @@ -3379,23 +3457,27 @@ Fillmore/M Filofax/M Finch/M Finland/M +Finlay/M Finley/M Finn/SM Finnbogadottir/M Finnegan/M Finnish/M Fiona/M +Firebase/M Firefox/M Firestone/M Fischer/M Fisher/M Fisk/M Fitch/M +Fitchburg/M Fitzgerald/M Fitzpatrick/M Fitzroy/M Fizeau/M Fla +Flagstaff/M Flanagan/M Flanders/M Flathead @@ -3490,6 +3572,7 @@ Freddie/M Freddy/M Frederic/M Frederick/M +Fredericksburg/M Fredericton/M Fredric/M Fredrick/M @@ -3516,6 +3599,7 @@ Friday/SM Frieda/M Friedan/M Friedman/M +Friedmann/M Friend/SM Frigga/M Frigidaire/M @@ -3539,6 +3623,7 @@ Fuchs/M Fuentes/M Fugger/M Fuji/M +Fujian/M Fujitsu/M Fujiwara/M Fujiyama/M @@ -3552,6 +3637,7 @@ Fulton/M Funafuti/M Fundy/M Furies/M +Furman/M Furtwangler/M Furtwängler/M Fushun/M @@ -3606,6 +3692,7 @@ Gaia/M Gail/M Gaiman/M Gaines/M +Gainesville/M Gainsborough/M Galahad/SM Galapagos/M @@ -3644,6 +3731,7 @@ Gandhian/M Ganesha/M Ganges/M Gangtok/M +Gansu/M Gantry/M Ganymede/M Gap/M @@ -3667,6 +3755,7 @@ Gary/M Garza/M Gascony/M Gasser/M +Gastonia/M Gastroenterology Gates/M Gatling/M @@ -3771,6 +3860,7 @@ Gillian/M Gilligan/M Gilman Gilmore/M +Gilroy/M Gina/M Ginger/M Gingrich/M @@ -3841,6 +3931,7 @@ Goldie/M Goldilocks/M Golding/M Goldman/M +Goldsboro/M Goldsmith/M Goldwater/M Goldwyn/M @@ -3857,6 +3948,7 @@ Gonzalez/M Gonzalo/M Good/M Goodall/M +Goode/M Goodman/M Goodrich/M Goodwill/M @@ -3907,6 +3999,7 @@ Grant/M Grass/M Graves/M Gray/M +Grayslake/M Grecian/M Greece/M Greek/SM @@ -3919,6 +4012,7 @@ Greenpeace/M Greensboro/M Greensleeves/M Greenspan/M +Greenville/M Greenwich/M Greer/M Greg/M @@ -3966,12 +4060,14 @@ Guadeloupe/M Guallatiri/M Guam/M Guamanian +Guangdong/M Guangzhou/M Guantanamo/M Guarani/M Guarnieri/M Guatemala/M Guatemalan/MS +Guayama/M Guayaquil/M Gucci/M Guelph/M @@ -3988,10 +4084,12 @@ Guinean/MS Guinevere/M Guinness/M Guiyang/M +Guizhou/M Guizot/M Gujarat/M Gujarati/M Gujranwala/M +Gulfport/M Gullah/M Gulliver/M Gumbel/M @@ -4020,6 +4118,7 @@ Gödel/M Göteborg/M H/M HBO/M +HBase/M HDD HDMI HDTV @@ -4049,15 +4148,18 @@ Habakkuk/M Haber/M Hadar/M Hades/M +Hadoop/M Hadrian/M Hafiz/M Hagar/M +Hagerstown/M Haggai/M Hagiographa/M Hague/M Hahn/M Haida/SM Haifa/M +Hainan/M Haiphong/M Haiti/M Haitian/MS @@ -4103,6 +4205,7 @@ Hancock/M Handel/M Handy/M Haney/M +Hanford/M Hangul/M Hangzhou/M Hank/M @@ -4131,6 +4234,7 @@ Harlan/M Harlem/M Harlequin/M Harley/M +Harlingen/M Harlow/M Harmon/M Harold/M @@ -4143,6 +4247,7 @@ Harrington/M Harris/M Harrisburg/M Harrison/M +Harrisonburg/M Harrods/M Harry/M Hart/M @@ -4161,6 +4266,7 @@ Hathaway/M Hatsheput/M Hatteras/M Hattie/M +Hattiesburg/M Hauptmann/M Hausa/M Hausdorff/M @@ -4186,6 +4292,7 @@ Hayward/M Haywood/M Hayworth/M Hazel/M +Hazleton/M Hazlitt/M He/M Head/M @@ -4195,6 +4302,7 @@ Heather/M Heaviside/M Heb Hebe/M +Hebei/M Hebert/M Hebraic/M Hebraism/SM @@ -4213,6 +4321,7 @@ Heidegger/M Heidelberg/M Heidi/M Heifetz/M +Heilongjiang/M Heimlich/M Heine/M Heineken/M @@ -4225,6 +4334,7 @@ Helen/M Helena/M Helene/M Helga/M +Helicobacter Helicon/M Heliopolis/M Helios/M @@ -4243,7 +4353,9 @@ Heloise/M Helsinki/M Helvetian Helvetius/M +Hemet/M Hemingway/M +Henan/M Hench/M Henderson/M Hendrick/MS @@ -4283,6 +4395,7 @@ Hermosillo/M Hernandez/M Herod/M Herodotus/M +Heroku/M Herr/MG Herrera/M Herrick/M @@ -4297,6 +4410,7 @@ Herzegovina/M Herzl/M Heshvan/M Hesiod/M +Hesperia/M Hesperus/M Hess/M Hesse/M @@ -4318,6 +4432,7 @@ Hibernia/M Hibernian Hickman/M Hickok/M +Hickory/M Hicks/M Hieronymus/M Higashiosaka @@ -4325,6 +4440,7 @@ Higgins/M Highlander/SM Highlands Highness/M +Hightstown/M Hilario/M Hilary/M Hilbert/M @@ -4348,6 +4464,7 @@ Hinduism/SM Hindustan/M Hindustani/SM Hines/M +Hinesville/M Hinton/M Hipparchus/M Hippocrates/M @@ -4450,6 +4567,7 @@ Host/SM Hotpoint/M Hottentot/SM Houdini/M +Houma/M House/M Housman/M Houston/M @@ -4466,6 +4584,7 @@ Hts Huang/M Hubbard/M Hubble/M +Hubei/M Huber/M Hubert/M Huck/M @@ -4486,10 +4605,12 @@ Hull/M Humberto/M Humboldt/M Hume/M +Hummel/M Hummer/M Humphrey/SM Humvee/M Hun/SM +Hunan/M Hung/M Hungarian/SM Hungary/M @@ -4499,6 +4620,7 @@ Hunter/M Huntington/M Huntley/M Huntsville/M +Hurd/M Hurley/M Huron/M Hurst/M @@ -4622,6 +4744,7 @@ Indianan/SM Indianapolis/M Indianian Indies/M +Indio/M Indira/M Indochina/M Indochinese/M @@ -4690,6 +4813,7 @@ Irving/M Irwin/M Isaac/M Isabel/M +Isabela/M Isabella/M Isabelle/M Isaiah/M @@ -4799,6 +4923,7 @@ Janacek/M Jane/M Janell/M Janelle/M +Janesville/M Janet/M Janette/M Janice/M @@ -4901,6 +5026,8 @@ Jewess/MS Jewish/PM Jewry/M Jezebel/SM +Jiangsu/M +Jiangxi/M Jidda/M Jilin/M Jill/M @@ -4945,6 +5072,7 @@ Johnny/M Johns/M Johnson/M Johnston/M +Johnstown/M Jolene/M Joliet/M Jolson/M @@ -4955,6 +5083,7 @@ Jonas/M Jonathan/M Jonathon/M Jones/M +Jonesboro/M Joni/M Jonson/M Joplin/M @@ -5051,7 +5180,9 @@ Kafka/M Kafkaesque/M Kagoshima/M Kahlua/M +Kahului/M Kaifeng/M +Kailua/M Kaiser/MS Kaitlin/M Kalahari/M @@ -5072,6 +5203,8 @@ Kanchenjunga/M Kandahar/M Kandinsky/M Kane/M +Kaneohe/M +Kankakee/M Kannada/M Kano/M Kanpur/M @@ -5164,8 +5297,10 @@ Kenmore/M Kennan/M Kennedy/M Kenneth/M +Kennewick/M Kennith/M Kenny/M +Kenosha/M Kent/M Kenton/M Kentuckian/MS @@ -5222,11 +5357,13 @@ Kigali/M Kikuyu/M Kilauea/M Kilimanjaro/M +Killeen/M Kilroy/M Kim/M Kimberley/M Kimberly/M King/M +Kingsport/M Kingston/M Kingstown/M Kinko's @@ -5252,6 +5389,7 @@ Kirsten/M Kisangani/M Kishinev/M Kislev/M +Kissimmee/M Kissinger/M Kit/M Kitakyushu/M @@ -5295,6 +5433,7 @@ Kohinoor/M Kohl/M Koizumi/M Kojak/M +Kokomo/M Kolyma/M Kommunizma/M Kong/M @@ -5312,6 +5451,7 @@ Korzybski/M Kosciusko/M Kossuth/M Kosygin/M +Kotlin/M Koufax/M Kowloon/M Kr/M @@ -5413,6 +5553,7 @@ Labradorean Labradorian Lacey/M Lachesis/M +Lactobacillus Lacy/M Ladoga/M Ladonna/M @@ -5427,6 +5568,7 @@ Lahore/M Laius/M Lajos/M Lakeisha/M +Lakeland/M Lakewood Lakisha/M Lakota/M @@ -5468,6 +5610,7 @@ Laocoon/M Laos/M Laotian/SM Laplace/M +Laplacian Lapland/MR Lapp/SM Lara/M @@ -5516,8 +5659,10 @@ Lavonne/M Lawanda/M Lawrence/M Lawson/M +Lawton/M Layamon/M Layla/M +Layton/M Lazaro/M Lazarus/M Le/SM @@ -5543,6 +5688,7 @@ Leda/M Lederberg/M Lee/M Leeds/M +Leesburg/M Leeuwenhoek/M Leeward/M Left @@ -5582,6 +5728,7 @@ Lent/SMN Lenten/M Leo/SM Leola/M +Leominster/M Leon/M Leona/M Leonard/M @@ -5624,11 +5771,14 @@ Levy/M Lew/M Lewinsky/M Lewis/M +Lewiston/M +Lewisville/M Lexington/M Lexus/M Lhasa/MS Lhotse/M Li/MY +Liaoning/M Libby/M Liberace/M Liberal @@ -5702,6 +5852,7 @@ Lithuania/M Lithuanian/MS Little/M Litton/M +Livermore/M Liverpool/M Liverpudlian/SM Livia/M @@ -5725,6 +5876,7 @@ Lockean/M Lockheed/M Lockwood/M Lodge/M +Lodi/M Lodz/M Loewe/M Loewi/M @@ -5742,16 +5894,20 @@ Lombard/M Lombardi/M Lombardy/M Lome/M +Lompoc/M Lon/M London/MRZ Londoner/M Long/M Longfellow/M +Longmont/M Longstreet/M Longueuil +Longview/M Lonnie/M Lopez/M Lora/M +Lorain/M Loraine/M Lord/SM Lordship/SM @@ -5760,6 +5916,7 @@ Loren/M Lorena/M Lorene/M Lorentz/M +Lorentzian Lorenz/M Lorenzo/M Loretta/M @@ -5869,6 +6026,7 @@ Lyly/M Lyman/M Lyme/M Lynch/M +Lynchburg/M Lynda/M Lyndon/M Lynette/M @@ -5955,6 +6113,7 @@ Madeira/SM Madeleine/M Madeline/M Madelyn/M +Madera/M Madge/M Madison/M Madonna/SM @@ -5973,6 +6132,7 @@ Maggie/M Maghreb/M Magi Maginot/M +Magnificat Magnitogorsk/M Magog/M Magoo/M @@ -6064,6 +6224,7 @@ Mandalay/M Mandarin/M Mandela/M Mandelbrot/M +Mandeville/M Mandingo/M Mandrell/M Mandy/M @@ -6075,12 +6236,14 @@ Manichean/M Manila/SM Manitoba/M Manitoulin/M +Mankato/M Manley/M Mann/GM Mannheim/M Manning/M Mansfield/M Manson/M +Manteca/M Mantegna/M Mantle/M Manuel/M @@ -6130,6 +6293,7 @@ Margrethe/M Marguerite/M Mari/SM Maria/M +MariaDB/M Marian/M Mariana/SM Marianas/M @@ -6210,6 +6374,7 @@ Maryellen/M Maryland/MR Marylander/M Marylou/M +Marysville/M Masada/M Masai/M Masaryk/M @@ -6230,6 +6395,7 @@ Master/S MasterCard/M Masters/M Mather/M +Matheson/M Mathew/SM Mathews/M Mathewson/M @@ -6237,6 +6403,7 @@ Mathias/M Mathis/M Matilda/M Matisse/M +Matlab/M Matt/M Mattel/M Matterhorn/M @@ -6248,6 +6415,7 @@ Maud/M Maude/M Maugham/M Maui/M +Mauldin/M Maupassant/M Maura/M Maureen/M @@ -6290,6 +6458,7 @@ Mb/M Mbabane/M Mbini/M McAdam/M +McAllen/M McBride/M McCain/M McCall/M @@ -6317,8 +6486,10 @@ McGovern/M McGowan/M McGuffey/M McGuire/M +McHenry/M McIntosh/M McIntyre/M +McJob McKay/M McKee/M McKenzie/M @@ -6348,6 +6519,7 @@ Mecca/MS Medan/M Medea/M Medellin/M +Medford/M Media/M Medicaid/SM Medicare/SM @@ -6384,6 +6556,7 @@ Melton/M Melva/M Melville/M Melvin/M +Memcached/M Memling/M Memphis/M Menander/M @@ -6400,6 +6573,7 @@ Menelaus/M Menelik/M Menes/M Mengzi +Menifee/M Menkalinan/M Menkar/M Menkent/M @@ -6416,6 +6590,7 @@ Mephistopheles/M Merak/M Mercado/M Mercator/M +Merced/M Mercedes/M Mercer/M Mercia/M @@ -6497,6 +6672,7 @@ Micronesian/M Microsoft/M Midas/M Middleton/M +Middletown/M Mideast Mideastern Midland/MS @@ -6529,6 +6705,7 @@ Milosevic/M Milquetoast/M Miltiades/M Milton/M +Miltonian Miltonic/M Miltown/M Milwaukee/M @@ -6573,6 +6750,7 @@ Miss Mississauga/M Mississippi/M Mississippian/SM +Missoula/M Missouri/M Missourian/MS Missy/M @@ -6645,7 +6823,9 @@ Monday/SM Mondrian/M Monegasque/SM Monera/M +Monessen/M Monet/M +MongoDB/M Mongol/SM Mongolia/M Mongolian/SM @@ -6670,6 +6850,7 @@ Montcalm/M Monte/M Montenegrin/M Montenegro/M +Monterey/M Monterrey/M Montesquieu/M Montessori/M @@ -6700,6 +6881,7 @@ Mordred/M More/M Moreno/M Morgan/SM +Morgantown/M Moriarty/M Morin/M Morison/M @@ -6715,6 +6897,7 @@ Morpheus/M Morphy/M Morris/M Morrison/M +Morristown/M Morrow/M Morse/M Mort/M @@ -6772,6 +6955,7 @@ Mumbai/M Mumford/M Munch/M Munchhausen/M +Muncie/M Munich/M Munoz/M Munro/M @@ -6782,12 +6966,14 @@ Murat/M Murchison/M Murcia Murdoch/M +Murfreesboro/M Muriel/M Murillo/M Murine/M Murmansk/M Murphy/M Murray/M +Murrieta/M Murrow/M Murrumbidgee/M Muscat/M @@ -6796,12 +6982,14 @@ Muscovy/M Muse/M Musharraf/M Musial/M +Muskegon/M Muskogee/M Muslim/MS Mussolini/M Mussorgsky/M Mutsuhito/M Muzak/M +MySQL/M MySpace/M Myanmar/M Mycenae/M @@ -6859,6 +7047,7 @@ NSF NSFW NT NV +NVIDIA/M NW/M NWT NY @@ -6885,6 +7074,7 @@ Nam/M Namath/M Namibia/M Namibian/MS +Nampa/M Nan/M Nanak/M Nanchang/M @@ -6897,6 +7087,7 @@ Nansen/M Nantes/M Nantucket/M Naomi/M +Napa/M Naphtali/M Napier/M Naples/M @@ -6974,6 +7165,7 @@ Nelsen/M Nelson/M Nembutal/M Nemesis/M +Neo/M Neogene/M Neolithic Nepal/M @@ -7003,6 +7195,7 @@ Nevadian Nevis/M Nevsky/M Newark/M +Newburgh/M Newcastle/M Newfoundland/MRS Newman/M @@ -7098,6 +7291,7 @@ Noreen/M Norfolk/M Noriega/M Norma/M +Normal/M Norman/MS Normand/M Normandy/M @@ -7196,6 +7390,8 @@ Obama/M Obamacare Oberlin/M Oberon/M +Ocala/M +Ocaml/M Occam/M Occident Occidental/MS @@ -7310,6 +7506,7 @@ Ore/N Oreg Oregon/M Oregonian/SM +Orem/M Oreo/M Orestes/M Orient/M @@ -7363,6 +7560,7 @@ Ouija/MS Ovid/M Owen/SM Owens/M +Owensboro/M Oxford/SM Oxnard/M Oxonian/M @@ -7393,6 +7591,7 @@ PET/M PFC PG PGP +PHP/M PIN PJ's PLO/M @@ -7449,6 +7648,7 @@ Paley/M Palikir/M Palisades/M Palladio/M +Palmdale/M Palmer/M Palmerston/M Palmolive/M @@ -7487,6 +7687,7 @@ Paris/M Parisian/MS Park/SMR Parker/M +Parkersburg/M Parkinson/M Parkinsonism Parkman/M @@ -7505,7 +7706,9 @@ Parsons/M Parthenon/M Parthia/M Pasadena/M +Pascagoula/M Pascal/SM +Pasco/M Pasquale/M Passion/SM Passover/MS @@ -7621,6 +7824,7 @@ Peru/M Peruvian/MS Peshawar/M Petain/M +Petaluma/M Pete/RMZ Peter/M Peters/MN @@ -7710,6 +7914,7 @@ Pitt/SM Pittman/M Pitts/M Pittsburgh/M +Pittsfield/M Pius/M Pizarro/M Pkwy @@ -7741,6 +7946,7 @@ Plymouth/M Pm/M Po/M Pocahontas/M +Pocatello/M Pocono/SM Poconos/M Podgorica/M @@ -7801,6 +8007,7 @@ Porrima/M Porsche/M Port/MR Porter/M +Porterville/M Portia/M Portland/M Porto/M @@ -7809,12 +8016,15 @@ Portugal/M Portuguese/M Poseidon/M Post/M +PostgreSQL/M Potemkin/M Potomac/M Potsdam/M Pottawatomie/M Potter/M Potts/M +Pottstown/M +Poughkeepsie/M Pound/M Poussin/M Powell/M @@ -7850,6 +8060,7 @@ Pretoria/M Priam/M Pribilof/M Price/M +Priceline/M Priestley/M Prince/M Princeton/M @@ -7930,6 +8141,7 @@ Putin/M Putnam/M Puzo/M Pvt +PyTorch/M Pygmalion/M Pygmy/SM Pyle/M @@ -7958,11 +8170,13 @@ Qantas/M Qatar/M Qatari/MS Qingdao/M +Qinghai/M Qiqihar/M Qom/M Quaalude/M Quaker/MS Quakerism/SM +Qualcomm/M Quaoar/M Quasimodo/M Quaternary/M @@ -8003,6 +8217,7 @@ RCA/M RCMP RD RDA +RDS/M REIT REM/SM RF @@ -8035,6 +8250,7 @@ Rachel/M Rachelle/M Rachmaninoff/M Racine/M +Radcliff/M Radcliffe/M Rae/M Rafael/M @@ -8106,10 +8322,13 @@ Rebekah/M Recife/M Reconstruction/M Red/SM +Redding/M Redeemer/M Redford/M Redgrave/M +Redis/M Redmond/M +Redshift/M Reebok/M Reed/M Reese/M @@ -8229,7 +8448,7 @@ Ritz/M Rivas/M Rivera/M Rivers/M -Riverside +Riverside/M Riviera/MS Riyadh/M Rizal/M @@ -8468,6 +8687,7 @@ SOSes SPCA SPF SQL +SQLite/M SRO SS SSA @@ -8530,6 +8750,7 @@ Salas/M Salazar/M Salem/M Salerno/M +Salesforce/M Salinas/M Salinger/M Salisbury/M @@ -8663,6 +8884,7 @@ Schindler/M Schlesinger/M Schliemann/M Schlitz/M +Schloss/M Schmidt/M Schnabel/M Schnauzer/M @@ -8727,8 +8949,10 @@ Seaborg/M Seagram/M Sean/M Sears/M +Seaside/M Seattle/M Sebastian/M +Sebring/M Sec Seconal/M Secretariat/M @@ -8741,6 +8965,7 @@ Sega/M Segovia/M Segre/M Segundo/M +Segway/S Seiko/M Seine/M Seinfeld/M @@ -8807,6 +9032,7 @@ Seychelles/M Seyfert/M Seymour/M Sgt +Shaanxi/M Shackleton/M Shaffer/M Shah/M @@ -8815,13 +9041,16 @@ Shaker Shakespeare/M Shakespearean/M Shana/M +Shandong/M Shane/M Shanghai/M Shankara/M Shanna/M Shannon/M Shantung/M +Shanxi/M Shapiro/M +SharePoint/M Shari'a/M Shari/M Sharif/M @@ -8844,6 +9073,7 @@ Shcharansky/M Shea/M Sheba/M Shebeli/M +Sheboygan/M Sheena/M Sheetrock/M Sheffield/M @@ -8911,6 +9141,7 @@ Sibelius/M Siberia/M Siberian/MS Sibyl/M +Sichuan/M Sicilian/SM Sicily/M Sid/M @@ -8942,6 +9173,7 @@ Simon/M Simone/M Simpson/SM Simpsons/M +Simpsonville/M Sims/M Sinai/M Sinatra/M @@ -8978,6 +9210,7 @@ Slater/M Slav/SM Slavic/M Slavonic/M +Slidell/M Slinky/M Sloan/M Sloane/M @@ -9014,6 +9247,7 @@ Snowbelt/M Snyder/M Soave/M Soc +Socastee/M Socorro/M Socrates/M Socratic/M @@ -9080,6 +9314,7 @@ Sparks/M Sparta/M Spartacus/M Spartan/MS +Spartanburg/M Spears/M Speer/M Spence/RM @@ -9102,6 +9337,7 @@ Spitsbergen/M Spitz/M Spock/M Spokane/M +Springdale/M Springfield/M Springsteen/M Sprint/M @@ -9143,6 +9379,7 @@ Staten/M States Stateside Staubach/M +Staunton/M Ste Steadicam/M Steele/M @@ -9168,6 +9405,7 @@ Sterne/M Sterno/M Stetson/M Steuben/M +Steubenville/M Steve/M Steven/MS Stevens/M @@ -9446,6 +9684,7 @@ Tatar/MS Tate/M Tatum/M Taurus/MS +Tavares/M Tawney/M Taylor/M Tb/M @@ -9471,13 +9710,17 @@ Teletype Tell/MR Teller/M Telugu/M +Temecula/M Tempe Templar/M +Temple/M Tenn/M Tennessean/SM Tennessee/M Tennyson/M +Tennysonian Tenochtitlan/M +TensorFlow/M Teotihuacan/M Terence/M Teresa/M @@ -9509,6 +9752,7 @@ Tevet/M Tex/M Texaco/M Texan/MS +Texarkana/M Texas/M Th/M Thackeray/M @@ -9624,6 +9868,7 @@ Titian/M Titicaca/M Tito/M Titus/M +Titusville/M Tl/M Tlaloc/M Tlingit/M @@ -9783,6 +10028,7 @@ Turkey/M Turkic/MS Turkish/M Turkmenistan/M +Turlock/M Turner/M Turpin/M Tuscaloosa/M @@ -9875,6 +10121,7 @@ Unicode/M Unilever/M Union/SM Unionist +Uniontown/M Uniroyal/M Unitarian/MS Unitarianism/MS @@ -9909,6 +10156,7 @@ Ut Utah/M Utahan/MS Ute/SM +Utica/M Utopia/SM Utopian/SM Utrecht/M @@ -9921,6 +10169,7 @@ VA VAT/M VAX VAXes +VBA/M VCR/M VD/M VDT @@ -9941,11 +10190,13 @@ VP VT VTOL Va/M +Vacaville/M Vader/M Vaduz/M Val/M Valarie/M Valdez/M +Valdosta/M Valencia/SM Valenti/M Valentin/M @@ -9959,7 +10210,7 @@ Valery/M Valhalla/M Valium/MS Valkyrie/SM -Vallejo +Vallejo/M Valletta/M Valois/M Valparaiso/M @@ -10046,6 +10297,7 @@ Victor/M Victoria/M Victorian/MS Victorianism +Victorville/M Victrola/M Vidal/M Vienna/M @@ -10059,8 +10311,9 @@ Vijayanagar/M Vijayawada/M Viking/MS Vila/M -Villa/M +Villa/SM Villarreal/M +Villas/M Villon/M Vilma/M Vilnius/M @@ -10068,6 +10321,7 @@ Vilyui/M Vince/M Vincent/M Vindemiatrix/M +Vineland/M Vinson/M Viola/M Violet/M @@ -10078,6 +10332,7 @@ Virginian/SM Virgo/SM Visa/M Visakhapatnam/M +Visalia/M Visayans/M Vishnu/M Visigoth/M @@ -10156,7 +10411,8 @@ Waldo/M Waldorf/M Wales/M Walesa/M -Walgreen/M +Walgreen/SM +Walgreens/M Walker/M Walkman/M Wall/SMR @@ -10196,15 +10452,19 @@ Waterford/M Watergate/M Waterloo/MS Waters/M +Watertown/M Watkins/M Watson/M +Watsonville/M Watt/SM Watteau/M Watts/M Watusi/M Waugh/M +Wausau/M Wave Wayne/M +Waynesboro/M Weaver/M Web/MR Webb/M @@ -10221,6 +10481,7 @@ Wei/M Weierstrass/M Weill/M Weinberg/M +Weirton/M Weiss/M Weissmuller/M Weizmann/M @@ -10234,6 +10495,7 @@ Welsh/M Welshman/M Welshmen/M Welshwoman +Wenatchee/M Wendell/M Wendi/M Wendy/M @@ -10309,7 +10571,9 @@ Willard/M Willemstad/M William/SM Williams/M +Williamsburg/M Williamson/M +Williamsport/M Willie/M Willis/M Willy/M @@ -10365,6 +10629,7 @@ Wong/M Wood/SM Woodard/M Woodhull/M +Woodland/M Woodrow/M Woods/M Woodstock/M @@ -10377,6 +10642,7 @@ Wooster/M Wooten/M Worcester/SM Worcestershire/M +WordPress/M Wordsworth/M Workman/M Worms/M @@ -10407,6 +10673,7 @@ XL/M XML XS XXL +Xamarin/M Xanadu/M Xanthippe/M Xavier/M @@ -10422,7 +10689,9 @@ Xian/SM Xiaoping/M Ximenes/M Xingu/M +Xinjiang/M Xiongnu/M +Xizang/M Xmas/MS Xochipilli/M Xuzhou/M @@ -10459,6 +10728,7 @@ Yaren Yaroslavl/M Yataro/M Yates/M +Yauco/M Yb/M Yeager/M Yeats/M @@ -10546,11 +10816,13 @@ Zen/M Zenger/M Zeno/M Zephaniah/M +Zephyrhills/M Zephyrus/M Zeppelin/M Zest/M Zeus/M Zhdanov +Zhejiang/M Zhengzhou/M Zhivago/M Zhukov/M @@ -10873,6 +11145,7 @@ acetyl acetylene/M ache/DSMG achene/MS +achievable/U achieve/BLZGDRS achievement/SM achiever/M @@ -11206,6 +11479,7 @@ affiliate/EGNDS affiliated/U affiliation/EM affiliations +affine affinity/SM affirm/AGDS affirmation/AMS @@ -11271,6 +11545,7 @@ ageless/YP agelessness/M agency/SM agenda/SM +agenesis agent/AMS ageratum/M agglomerate/DSMGNX @@ -11284,6 +11559,7 @@ aggravating/Y aggravation/M aggregate/MGNDSX aggregation/M +aggregator/SM aggression/M aggressive/PY aggressiveness/M @@ -11677,9 +11953,11 @@ amide/MS amidship/S amidst amigo/MS +amine/S amino amir/SM amiss +amitriptyline amity/M ammeter/SM ammo/M @@ -11738,7 +12016,9 @@ amulet/MS amuse/LGDS amusement/MS amusing/Y +amygdala amylase/M +amyloid an/CS anabolism/M anachronism/SM @@ -11855,6 +12135,7 @@ angularity/SM angulation anhydrous aniline/M +anilingus animadversion/MS animadvert/GSD animal/MS @@ -11909,6 +12190,7 @@ annular annulled annulling annulment/SM +annulus annunciation/SM anode/MS anodize/GDS @@ -12002,6 +12284,7 @@ antidemocratic antidepressant/MS antidote/MS antifascist/MS +antiferromagnetic antifreeze/M antigen/SM antigenic @@ -12018,6 +12301,8 @@ antimatter/M antimicrobial antimissile antimony/M +antineutrino/SM +antineutron/MS antinuclear antioxidant/MS antiparticle/SM @@ -12034,6 +12319,7 @@ antipodean/MS antipodes/M antipollution antipoverty +antiproton/MS antiquarian/SM antiquarianism/M antiquary/SM @@ -12574,8 +12860,9 @@ assigner/MS assignment/AMS assignor/MS assimilate/DSGN +assimilated/U assimilation/M -assist/GMDS +assist/GVMDS assistance/M assistant/SM assisted/U @@ -12586,9 +12873,11 @@ associate's associate/EDSGNV association/EM associations +associativity assonance/M assonant/MS assort/GLDS +assortative assortment/MS asst assuage/GDS @@ -12899,6 +13188,7 @@ avoid/SDGB avoidable/U avoidably/U avoidance/M +avoidant avoirdupois/M avouch/DSG avow/EDGS @@ -13708,6 +13998,7 @@ benign/Y benignant benignity/M bent/SM +bentonite bentwood/M benumb/DSG benzene/M @@ -13920,9 +14211,11 @@ billycan/S bimbo/MS bimetallic/SM bimetallism/M +bimodal bimonthly/SM bin/SM binary/SM +binaural bind's bind/AUGS binder/MS @@ -13948,6 +14241,7 @@ biodegrade/DSGB biodiversity/M bioethics/M biofeedback/M +biofilm/MS biog biographer/SM biographic @@ -13958,6 +14252,7 @@ biologic biological/Y biologist/MS biology/M +biomarker/MS biomass/M biomedical bionic/S @@ -14495,6 +14790,7 @@ bookshop/SM bookstall/S bookstore/MS bookworm/SM +boolean boom/SZGMDR boombox/MS boomerang/MDGS @@ -14573,6 +14869,7 @@ botcher/M both bother/SMDG botheration +bothered/U bothersome botnet/SM bottle/DRSMZG @@ -15050,7 +15347,7 @@ bulldogged bulldogging bulldoze/ZGDRS bulldozer/M -bullet/SM +bullet/SMD bulletin/MDGS bulletproof/SDG bullfight/SMRZG @@ -15068,6 +15365,7 @@ bullishness/M bullock/SM bullpen/SM bullring/MS +bullseye bullshit/MS! bullshitted/! bullshitter/SM! @@ -15441,6 +15739,8 @@ cameo/MS camera/MS cameraman/M cameramen +camerapeople +cameraperson camerawoman/M camerawomen camerawork @@ -15481,6 +15781,7 @@ canceler/M cancellation/SM cancelled cancelling +cancelous cancer/MS cancerous candelabra/SM @@ -15703,6 +16004,7 @@ carjack/JSDRZG carjacker/M carjacking/M carload/SM +carmaker/S carmine/SM carnage/M carnal/Y @@ -15950,6 +16252,7 @@ caviar/M cavil/ZGJMDRS caviler/M caving/M +cavitation cavity/FSM cavort/DGS caw/SMDG @@ -16089,6 +16392,7 @@ cession/KAFSM cesspit/S cesspool/MS cetacean/MS +ceteris cf cg ch/IFVT @@ -16708,6 +17012,7 @@ cl clack/GMDS clad/U cladding/M +clade claim's claim/CKEAGDS claimable/A @@ -16774,6 +17079,7 @@ classifieds classifier/MS classify/ACSDGN classiness/M +classism classless/P classmate/MS classroom/MS @@ -16912,6 +17218,7 @@ cloistral clomp/SDG clonal clone/DSMG +clonidine clonk/SMDG clop/MS clopped @@ -16977,8 +17284,8 @@ clunker/M clunky/TR cluster/MDSG clutch/GMDS -clutter/MDSG -cluttered/U +clutter's +clutter/UDSG clvi clvii clxi @@ -17050,6 +17357,7 @@ cochlear cock/MDGS cockade/SM cockamamie +cockatiel/MS cockatoo/SM cockatrice/SM cockchafer/S @@ -17101,6 +17409,7 @@ coeducation/M coeducational coefficient/MS coelenterate/MS +coenzyme coequal/MYS coerce/DRSZGNV coercer/M @@ -17218,7 +17527,7 @@ college/SM collegiality/M collegian/MS collegiate -collide/DSG +collide/DRSZG collie/RSMZ collier/M colliery/SM @@ -17301,10 +17610,10 @@ combined/U combiner/MS combings/M combo/SM +combust/SGVD combustibility/M combustible/MS combustion/M -combustive come/IMZGRS comeback/MS comedian/MS @@ -17421,9 +17730,11 @@ communistic community/SM commutation/MS commutative +commutativity commutator/SM commute/BDRSMZG commuter/M +comorbidity comp/MDYGS compact/TGSMDRYP compaction @@ -17438,7 +17749,7 @@ comparability/M comparable/I comparably/I comparative/MYS -compare/BDSMG +compare/BDSG comparison/MS compartment/SM compartmental @@ -17514,6 +17825,7 @@ composedly composer/MS composite/MYGNXDS composition/CM +compositional compositor/SM compost/SGMD composure/EM @@ -17529,7 +17841,7 @@ comprehensions comprehensive/PMYS comprehensiveness/M compress's -compress/CGDS +compress/CGVDS compressed/U compressible compression/CM @@ -17647,6 +17959,7 @@ condiment/MS condition's condition/AGSD conditional/SMY +conditionality conditioned/U conditioner/SM conditioning/M @@ -17720,6 +18033,7 @@ confluence/MS confluent conform/ZB conformable/U +conformal conformance/M conformism/M conformist/SM @@ -17984,6 +18298,7 @@ continuum/M contort/GD contortion/MS contortionist/SM +contra contraband/M contrabassoon/S contraception/M @@ -18254,6 +18569,7 @@ corrector correlate/XDSMGNV correlated/U correlation/M +correlational correlative/MS correspond/SDG correspondence/SM @@ -18283,6 +18599,7 @@ cortege/MS cortex/M cortical cortices +cortisol cortisone/M cortège/SM corundum/M @@ -18411,6 +18728,7 @@ countersign/GSMD countersignature/MS countersink/GSM counterspy/SM +counterstroke/SM countersunk countertenor/MS countervail/GSD @@ -18460,6 +18778,9 @@ couscous/M cousin/SM couture/M couturier/MS +covalent +covariance +covariant cove/MS coven/SM covenant/MDSG @@ -18718,6 +19039,7 @@ criteria criterion/M critic/SM critical/UY +criticality criticism/MS criticize/ZGDRS criticizer/M @@ -18858,6 +19180,7 @@ cryosurgery/M crypt/SM cryptic cryptically +cryptocurrency/SM cryptogram/SM cryptographer/SM cryptography/M @@ -19059,6 +19382,7 @@ cw cwt cyan/M cyanide/M +cyanobacteria cyberbully/SM cybercafe/S cybercafé/S @@ -19229,6 +19553,8 @@ dastard/MYS dastardliness/M data database/SM +dataset's +datasets datatype date/DRSMZGV datebook/S @@ -19236,6 +19562,7 @@ dated/U dateless dateline/MGDS dater/M +dateset dative/MS datum/M daub/SZGMDR @@ -19404,6 +19731,7 @@ declination/M decline/DRSMZG decliner/M declivity/SM +decoherence decolletage/SM decollete decongestant/MS @@ -19423,8 +19751,7 @@ decoy/GMDS decreasing/Y decree/MDS decreeing -decremented -decrements +decrement/GDS decrepit decrepitude/M decriminalization/M @@ -19887,6 +20214,7 @@ determinedly determiner/SM determinism/M deterministic +deterministically deterred/U deterrence/M deterrent/MS @@ -19988,6 +20316,8 @@ dialyses dialysis/M dialyzes diam +diamagnetic +diamagnetism diamante diamanté diameter/SM @@ -20012,6 +20342,7 @@ diatom/SM diatomic diatonic diatribe/SM +diazepam dibble/DSMG dibs/M dice/GDS @@ -20070,6 +20401,7 @@ differ/DG difference/IM differences different/IY +differentiable differential/SM differentiate/DSGN differentiated/U @@ -20083,6 +20415,7 @@ diffraction/M diffuse/DSYGNVP diffuseness/M diffusion/M +diffusivity dig/SM digerati/M digest/SMDGV @@ -20128,6 +20461,7 @@ diligent/Y dill/MS dilly/SM dillydally/DSG +diluent dilute/DSGNX diluted/U dilution/M @@ -20410,7 +20744,7 @@ dissimilitude/S dissing dissipate/GNDS dissipation/M -dissociate/GNDS +dissociate/GNVDS dissociation/M dissoluble/I dissolute/YNP @@ -20795,6 +21129,7 @@ downstairs/M downstate/M downstream downswing/MS +downtempo downtime/M downtown/M downtrend/MS @@ -21170,6 +21505,9 @@ dysphoria dysphoric dysprosium/M dystonia +dystopi +dystopia +dystopian dz débridement débutante/SM @@ -21269,6 +21607,7 @@ ecclesial ecclesiastic/SM ecclesiastical/Y echelon/SM +echidna echinoderm/SM echo's echo/ADG @@ -21291,7 +21630,7 @@ ecological/Y ecologist/MS ecology/M econ -econometric +econometric/S economic/S economical/UY economics/M @@ -21388,7 +21727,9 @@ effluence/M effluent/MS effluvia effluvium/M +efflux effort/SM +effortful effortless/YP effortlessness/M effrontery/M @@ -21431,6 +21772,7 @@ eh eider/SM eiderdown/MS eigenvalue/S +eigenvector/S eight/SM eighteen/MHS eighteenth/M @@ -21521,6 +21863,7 @@ electroshock/M electrostatic/S electrostatics/M electrotype/MS +electroweak eleemosynary elegance/IM elegant/IY @@ -21695,6 +22038,7 @@ emotionless emotive/Y empanel/GDS empathetic +empathically empathize/DSG empathy/M emperor/MS @@ -21823,6 +22167,7 @@ endoscopic endoscopy/M endothelial endothermic +endotracheal endow/SDLG endowment/MS endpoint/SM @@ -21902,6 +22247,7 @@ enormous/PY enormousness/M enough/M enplane/DSG +enqueue/DS enquirer/S enquiringly enrage/GDS @@ -21931,6 +22277,7 @@ entanglement/EM entanglements entente/SM enter/ASGD +enteral enteric enteritis/M enterprise/MGS @@ -21964,6 +22311,7 @@ entomology/M entourage/SM entr'acte entrails/M +entrained entrance/LDSMG entrancement/M entrancing/Y @@ -22232,9 +22580,10 @@ estimate/MGNDSX estimation/M estimator/SM estoppel +estradiol estrange/LDSG estrangement/MS -estrogen/M +estrogen/MS estrous estrus/MS estuary/SM @@ -22253,6 +22602,7 @@ ethereal/Y ethic/SM ethical/UY ethics/M +ethmoid ethnic/SM ethnically ethnicity/M @@ -22282,12 +22632,16 @@ etymologist/SM etymology/SM eucalypti eucalyptus/MS +eucaryote/SM +eucaryotic euchre/DSMG euclidean eugenic/S eugenically eugenicist/MS eugenics/M +eukaryote/SM +eukaryotic eulogist/MS eulogistic eulogize/ZGDRS @@ -22310,6 +22664,7 @@ eutectic euthanasia/M euthanize/DSG euthenics/M +eutrophication evacuate/XDSGN evacuation/M evacuee/MS @@ -22317,6 +22672,7 @@ evade/DRSZG evader/M evaluate/AGNVDSX evaluation/AM +evaluator/S evanescence/M evanescent evangelic @@ -22437,6 +22793,7 @@ excited/Y excitement/SM exciter/M exciting/Y +exciton excl exclaim/DGS exclamation/SM @@ -22523,6 +22880,7 @@ exigent exiguity/M exiguous exile/DSMG +exilic exist/SDG existence/MS existent @@ -22682,6 +23040,7 @@ extemporize/GDS extend/SZGDRB extender/M extendible +extensibility extensible extension/SM extensional @@ -22714,7 +23073,7 @@ extortioner/M extortionist/MS extra/SM extracellular -extract/MDGS +extract/MDGVS extraction/SM extractor/MS extracurricular @@ -22787,6 +23146,7 @@ eyetooth/M eyewash/M eyewitness/MS f/CIAVTR +fMRI fa/M fab fable/DSM @@ -22802,6 +23162,7 @@ facecloth/M facecloths faceless facelift/SM +facepalm/SDG facet/SMDG facetious/YP facetiousness/M @@ -22844,7 +23205,7 @@ fagging faggot/SMG fagot/SMG faience/M -fail/MDGJS +fail/DGJS failing/M faille/M failure/SM @@ -23157,6 +23518,7 @@ ferocity/M ferret/GSMD ferric ferromagnetic +ferromagnetism ferrous ferrule/MS ferry/DSMG @@ -23757,6 +24119,7 @@ fluorite/M fluorocarbon/MS fluoroscope/SM fluoroscopic +fluoxetine flurry/GDSM flush/MDRSTG fluster/MDSG @@ -24115,6 +24478,7 @@ foulmouthed foulness/M found/FSDG foundation/SM +foundational founded/U founder/GMDS foundling/SM @@ -24253,6 +24617,7 @@ freezing's freight/MDRZGS freighter/M french +frenemy/S frenetic frenetically frenzied/Y @@ -24452,6 +24817,7 @@ functionalism functionalist/S functionality/S functionary/SM +functor fund/AMDGS fundamental/SMY fundamentalism/M @@ -24500,6 +24866,7 @@ furnished/U furnishings/M furniture/M furor/SM +furosemide furred furrier/M furriness/M @@ -25181,6 +25548,7 @@ glum/YP glummer glummest glumness/M +gluon/S glut/MNS gluten/M glutenous @@ -25194,6 +25562,7 @@ glycerin/M glycerine/M glycerol/M glycogen/M +glycol glyph gm gnarl/SMDG @@ -25545,6 +25914,7 @@ greenish greenmail/M greenness/M greenroom/SM +greenstone greensward/M greenwood/M greet/ZGJSDR @@ -25909,6 +26279,7 @@ hacktivist/MS hackwork/M had haddock/SM +hadith hadn't hadst hafnium/M @@ -26100,6 +26471,7 @@ happenstance/SM happily/U happiness/UM happy/URTP +haptic harangue/MGDS harass/LZGDRS harasser/M @@ -26249,6 +26621,7 @@ hawthorn/MS hay/GSMD haycock/SM hayloft/SM +haymaker/S haymaking haymow/SM hayrick/MS @@ -26487,6 +26860,7 @@ hematological hematologist/MS hematology/M heme/M +hemiplegia hemisphere/SM hemispheric hemispherical @@ -26555,6 +26929,7 @@ heretic/SM heretical hereto heretofore +hereunder hereunto hereupon herewith @@ -26566,6 +26941,7 @@ hermetic hermetical/Y hermit/SM hermitage/MS +hermitian hernia/SM hernial herniate/GNDS @@ -26711,6 +27087,7 @@ hippest hippie/M hipping hippo/SM +hippocampus hippodrome/SM hippopotamus/MS hippy/SM @@ -26727,6 +27104,7 @@ histamine/MS histogram/MS histologist/SM histology/M +histopathology historian/MS historic historical/Y @@ -26892,6 +27270,7 @@ homogenize/DSG homograph/M homographs homologous +homology homonym/SM homophobia/M homophobic @@ -26973,6 +27352,7 @@ horizontal/SMY hormonal hormone/SM horn/MDS +hornbeam hornblende/M hornet/MS hornless @@ -27306,6 +27686,8 @@ hydraulics/M hydro/M hydrocarbon/MS hydrocephalus/M +hydrochloride +hydrocortisone hydrodynamic/S hydrodynamics/M hydroelectric @@ -27323,6 +27705,7 @@ hydrolysis/M hydrolyze/DSG hydrometer/SM hydrometry/M +hydrophilic hydrophobia/M hydrophobic hydrophone/SM @@ -27332,6 +27715,7 @@ hydroponically hydroponics/M hydrosphere/M hydrotherapy/M +hydrothermal hydrous hydroxide/SM hyena/SM @@ -27353,12 +27737,14 @@ hyperbola/SM hyperbole/M hyperbolic hypercritical/Y +hypercube hyperglycemia/M hyperinflation hyperlink/GSMD hypermarket/S hypermedia/M hyperparathyroidism +hyperplane hypersensitive/P hypersensitiveness/M hypersensitivity/SM @@ -27371,6 +27757,7 @@ hyperthyroidism/M hypertrophy/DSMG hyperventilate/GNDS hyperventilation/M +hypervisor/MS hyphen/MDSG hyphenate/XDSMGN hyphenation/M @@ -27411,6 +27798,7 @@ hysteric/SM hysterical/Y hysterics/M i/US +iOS/M iPad/M iPhone/M iPod/M @@ -27851,6 +28239,7 @@ impulse/MGNVDS impulsion/M impulsive/PY impulsiveness/M +impulsivity impunity/M impure/RYT impurity/SM @@ -27885,7 +28274,7 @@ incalculably incandescence/M incandescent/Y incantation/SM -incapacitate/GDS +incapacitate/GNDS incarcerate/XDSGN incarceration/M incarnadine/DSG @@ -27956,7 +28345,7 @@ incorrigible incorrigibly incorruptibly increasing/Y -increment/SMD +increment/SMDG incremental/Y incrementalism incrementalist/SM @@ -28158,7 +28547,7 @@ inflammable inflammation/SM inflammatory inflatable/SM -inflate/DSGNB +inflate/ADSG inflation/EM inflationary inflect/SDG @@ -28177,6 +28566,7 @@ infomercial/SM inform/Z informal/Y informant/SM +informatics information/EM informational informative/PY @@ -28252,6 +28642,7 @@ initiatory inject/SDG injection/SM injector/SM +injunctive injure/DRSZG injured/U injurer/M @@ -28296,6 +28687,7 @@ inoculation/MS inoperative inordinate/Y inorganic +inositol inquire/ZGDR inquirer/M inquiring/Y @@ -28369,6 +28761,7 @@ inspector/MS inspectorate/MS inspiration/MS inspirational +inspiratory inspired/U inspiring/U inst @@ -28412,6 +28805,7 @@ instrumentation/M insubordinate insufferable insufferably +insula insular insularity/M insulate/GNDS @@ -28540,6 +28934,8 @@ intermezzo/MS interminably intermingle/DSG intermission/SM +intermittence +intermittency intermittent/Y intermix/GDS internal/SY @@ -28559,6 +28955,9 @@ internist/MS internment/M internship/MS interoffice +interoperability +interoperable +interoperate/S interpenetrate/DSGN interpersonal interplanetary @@ -28617,6 +29016,7 @@ intestacy/M intestate intestinal intestine/MS +intifada intimacy/SM intimate/MYGNDSX intimation/M @@ -28689,7 +29089,8 @@ inventiveness/M inventor/MS inventory/DSMG inverse/SMY -invert/SMDG +invert/SMDRZG +inverter/M invest/ASDGL investigate/GNVDSX investigation/M @@ -28723,6 +29124,7 @@ involuntariness/M involuntary/P involution/M involve/LDSG +involved/U involvement/SM inward/SY ioctl @@ -28853,6 +29255,7 @@ isometric/S isometrically isometrics/M isomorphic +isomorphism isosceles isotherm/SM isotope/SM @@ -29315,6 +29718,7 @@ kerosene/M kestrel/MS ketch/MS ketchup/M +ketone/S kettle/SM kettledrum/SM key/SGMD @@ -29905,6 +30309,8 @@ leapfrogged leapfrogging leapt learn/AUGDS +learnability +learnable learnedly learner/MS learning's @@ -30718,6 +31124,7 @@ lumberjack/SM lumberman/M lumbermen lumberyard/SM +lumen luminary/SM luminescence/M luminescent @@ -30726,6 +31133,7 @@ luminous/Y lummox/MS lump/MDNSG lumpectomy/S +lumpenproletariat lumpiness/M lumpish lumpy/TRP @@ -30767,6 +31175,7 @@ lutanist/SM lute/MS lutenist/SM lutetium/M +lux luxuriance/M luxuriant/Y luxuriate/DSGN @@ -30913,6 +31322,7 @@ magniloquence/M magniloquent magnitude/SM magnolia/MS +magnon magnum/MS magpie/MS magus/M @@ -30954,6 +31364,8 @@ mainstay/MS mainstream/SMDG maintain/ZGBDRS maintainability +maintainable/U +maintained/U maintenance/M maintop/SM maisonette/MS @@ -31396,6 +31808,7 @@ maxilla/M maxillae maxillary maxim/SM +maxima maximal/Y maximization/M maximize/GDS @@ -31482,7 +31895,7 @@ meddlesome media/SM medial/AY median/MS -mediate/DSGN +mediate/ADSGN mediated/U mediation/AM mediator/MS @@ -31664,6 +32077,7 @@ merino/MS merit/CSM merited/U meriting +meritless meritocracy/SM meritocratic meritorious/PY @@ -31758,6 +32172,7 @@ meteorological meteorologist/SM meteorology/M meter/GMD +metformin methadone/M methamphetamine/M methane/M @@ -31823,12 +32238,14 @@ microelectronics/M microfiber/MS microfiche/M microfilm/GMDS +microfinance microfloppies microgroove/SM microlight/MS microloan/MS -micromanage/GDSL +micromanage/ZGDRSL micromanagement/M +micromanager/M micrometeorite/SM micrometer/MS micron/MS @@ -32015,6 +32432,7 @@ minicam/MS minicomputer/SM minifloppies minim/SM +minima minimal/Y minimalism/M minimalist/MS @@ -32183,6 +32601,7 @@ misquotation/MS misquote/MGDS misread/GJS misreading/M +misremember/GDS misreport/MDGS misrepresent/GDS misrepresentation/MS @@ -32250,6 +32669,7 @@ mitotic mitral mitt/MNSX mitten/M +mitzvah mix/ZGMDRSB mixed/U mixer/M @@ -32318,6 +32738,7 @@ modify/DRSXZGN modish/YP modishness/M modular +modularization modulate/CGNDS modulation/CM modulations @@ -32379,6 +32800,7 @@ momentous/PY momentousness/M momentum/M mommy/SM +monad monarch/M monarchic monarchical @@ -32396,6 +32818,7 @@ monetarily monetarism/M monetarist/MS monetary +monetization/C monetize/CGDS money/SMD moneybag/MS @@ -32532,6 +32955,7 @@ mopping moraine/SM moral/SMY morale/M +moralism moralist/MS moralistic moralistically @@ -32774,6 +33198,8 @@ mulligan/SM mulligatawny/M mullion/SMD multi +multicellular +multichannel multicolored multicultural multiculturalism/M @@ -32793,6 +33219,7 @@ multilingualism/M multimedia/M multimillionaire/SM multinational/SM +multipart multiparty multiplayer/M multiple/MS @@ -32830,6 +33257,7 @@ mummy/SM mumps/M mun munch/GDS +munchie/S munchies/M munchkin/SM mundane/SY @@ -32864,6 +33292,7 @@ muscly muscular/Y muscularity/M musculature/M +musculoskeletal muse/MGDSJ musette/MS museum/MS @@ -32911,6 +33340,7 @@ musty/PTR mutability/M mutably mutagen/MS +mutagenic mutant/MS mutate/XGNVDS mutation/M @@ -33017,6 +33447,7 @@ nanny/SM nanobot/S nanosecond/SM nanotechnology/SM +nanotube nap/SM napalm/MDSG nape/MS @@ -33217,6 +33648,7 @@ neocolonialism/M neocolonialist/MS neocon/SM neoconservative/SM +neocortex neodymium/M neolithic neologism/SM @@ -33277,6 +33709,7 @@ neurologist/SM neurology/M neuron/MS neuronal +neuroscience neuroses neurosis/M neurosurgeon/MS @@ -33284,6 +33717,7 @@ neurosurgery/M neurosurgical neurotic/MS neurotically +neuroticism neurotransmitter/SM neut neuter/MDGS @@ -33361,6 +33795,7 @@ nickle/S nickname/DSMG nicotine/M niece/SM +nifedipine niff niffy nifty/TR @@ -33442,6 +33877,7 @@ nitpicker/M nitpicking/M nitrate/DSMGN nitration/M +nitric nitrification/M nitrite/SM nitro @@ -33582,6 +34018,8 @@ nondepreciating nondescript nondestructive nondetachable +nondeterminism +nondeterministic nondisciplinary nondisclosure/M nondiscrimination/M @@ -34188,6 +34626,7 @@ octogenarian/SM octopus/MS ocular/MS oculist/SM +oculomotor odalisque/SM odd/STRYLP oddball/SM @@ -34329,6 +34768,7 @@ omnivore/MS omnivorous/PY omnivorousness/M on/Y +onboard once/M oncogene/SM oncologist/SM @@ -34454,6 +34894,7 @@ or oracle/SM oracular oral/MYS +orality orange/SMP orangeade/MS orangery/SM @@ -34480,6 +34921,7 @@ ordain/SDLG ordainment/M ordeal/SM order/EAMDGS +ordered/U orderings orderliness/EM orderly/PSM @@ -34576,6 +35018,7 @@ osmium/M osmosis/M osmotic osprey/SM +ossicles ossification/M ossify/NGDS ostensible @@ -34640,6 +35083,7 @@ outdoorsy outdraw/GS outdrawn outdrew +outercourse outermost outerwear/M outface/GDS @@ -34880,6 +35324,7 @@ overhung overindulge/GDS overindulgence/M overindulgent +overinflated overjoy/GSD overkill/M overladen @@ -35030,6 +35475,7 @@ own/ESGD owner/MS ownership/M ox/MN +oxalate oxblood/M oxbow/MS oxcart/SM @@ -35037,6 +35483,7 @@ oxford/SM oxidant/MS oxidase oxidation/M +oxidative oxide/MS oxidization/M oxidize/ZGDRS @@ -35152,6 +35599,7 @@ palazzo pale/MYTGPDRSJ paleface/MS paleness/M +paleo paleographer/MS paleography/M paleolithic @@ -35310,17 +35758,21 @@ parallax/MS parallel/SGMD paralleled/U parallelism/MS +parallelization +parallelized parallelogram/SM paralyses paralysis/M paralytic/SM paralyze/DSG paralyzing/Y +paramagnetic paramecia paramecium/M paramedic/MS paramedical/MS parameter/MS +parameterize/D parametric paramilitary/SM paramount @@ -35380,6 +35832,7 @@ paresis/M parfait/MS pariah/M pariahs +paribus parietal parimutuel/MS paring/M @@ -35567,6 +36020,7 @@ patriarchate/MS patriarchs patriarchy/SM patrician/SM +patricidal patricide/SM patrimonial patrimony/SM @@ -35677,6 +36131,7 @@ pecs pectic pectin/M pectoral/MS +pectoralis peculate/GNDS peculation/M peculator/SM @@ -35965,12 +36420,14 @@ permissiveness/M permit/MS permitted permitting +permittivity permutation/SM permute/DSG pernicious/YP perniciousness/M peroration/MS peroxide/MGDS +perpend perpendicular/SMY perpendicularity/M perpetrate/DSGN @@ -35982,6 +36439,7 @@ perpetuation/M perpetuity/M perplex/GDS perplexed/Y +perplexing/Y perplexity/SM perquisite/SM persecute/GNXDS @@ -36073,6 +36531,7 @@ peter/GMD petiole/SM petite/MS petition/ZGMDRS +petitionary petitioner/M petrel/MS petrifaction/M @@ -36137,6 +36596,7 @@ pharmacologist/SM pharmacology/M pharmacopeia/SM pharmacopoeia/MS +pharmacotherapy pharmacy/SM pharyngeal pharynges @@ -36156,6 +36616,7 @@ phenomenological phenomenology phenomenon/MS phenotype +phenytoin pheromone/MS phew phi/SM @@ -36218,6 +36679,7 @@ phonographs phonological/Y phonologist/MS phonology/M +phonon phony/PTGDRSM phooey phosphate/MS @@ -36263,6 +36725,7 @@ phototropic phototropism phototypesetter phototypesetting +photovoltaic phrasal phrase's phrase/AGDS @@ -36295,6 +36758,7 @@ physiology/M physiotherapist/MS physiotherapy/M physique/MS +phytoplankton pi/SMDRHZG pianissimo/SM pianist/MS @@ -36328,6 +36792,7 @@ picnicked picnicker/SM picnicking picot/SM +pictogram/S pictograph/M pictographs pictorial/MYS @@ -36600,6 +37065,7 @@ plantlike plaque/SM plash/MDSG plasma/M +plasmon plaster/SZGMDR plasterboard/M plasterer/M @@ -36998,6 +37464,7 @@ popularity/UM popularization/M popularize/DSG populate/ACGDS +populated/U population/CM populations populism/M @@ -37063,9 +37530,9 @@ poseur/SM posh/TR posit/DSGV position/CKEMS -positional/K +positional/KE positioned/K -positioning/K +positioning/AK positive/MYPS positiveness/M positivism @@ -37244,6 +37711,7 @@ preacher/M preachment/M preachy/RT preadolescence/SM +preadolescent preamble/MGDS prearrange/LGDS prearrangement/M @@ -37315,6 +37783,7 @@ predigest/GDS predilection/SM predispose/GDS predisposition/MS +prednisone predominance/M predominant/Y predominate/YGDS @@ -37358,6 +37827,7 @@ prehistoric prehistorical/Y prehistory/M prehuman +preinstalled prejudge/GDS prejudgment/SM prejudice/MGDS @@ -37394,6 +37864,7 @@ preoccupation/SM preoccupy/DSG preoperative preordain/GDS +preowned prep/MS prepackage/DSG prepacked @@ -37632,11 +38103,13 @@ probationer/M probe/MGDSBJ probity/M problem/MS -problematic +problematic/U problematical/Y probosces proboscis/MS procaine/M +procaryote/SM +procaryotic procedural procedure/SM proceed/GJDS @@ -37644,6 +38117,7 @@ proceeding/M proceeds/M process's process/AGDS +processable processed/U procession/GD processional/MS @@ -37735,6 +38209,7 @@ projectile/SM projection/SM projectionist/SM projector/MS +prokaryote/MS prokaryotic prole/S proletarian/MS @@ -37822,6 +38297,7 @@ proportionate/EY proposal/MS propped propping +propranolol proprietary/SM proprieties/M proprietor/SM @@ -37848,6 +38324,7 @@ proselyte/DSMG proselytism/M proselytize/DRSZG proselytizer/M +prosocial prosody/SM prospect/MDGVS prospective/Y @@ -38003,6 +38480,7 @@ psychopathology psychopaths psychopathy/M psychopharmacology +psychophysiology psychos/S psychosis/M psychosomatic @@ -38175,6 +38653,7 @@ purplish purport/SMDG purported/Y purpose/DSMYG +purposed/A purposeful/YP purposefulness/M purposeless/PY @@ -38310,8 +38789,11 @@ quantifiable quantification/M quantifier/M quantify/NDRSZG +quantitation quantitative/Y quantity/SM +quantization +quantize quantum/M quarantine/MGDS quark/MS @@ -38367,7 +38849,9 @@ questioned/U questioner/M questioning/MY questionnaire/SM -queue/MDSG +queue's +queue/CDS +queuing quibble/DRSMZG quibbler/M quiche/SM @@ -38397,6 +38881,7 @@ quilting/M quin/S quince/SM quine/S +quinidine quinine/M quinoa quinsy/M @@ -38489,6 +38974,7 @@ radar/SM radarscope/SM raddled radial/SMY +radian/S radiance/M radiant/Y radiate/DSGNX @@ -38766,6 +39252,7 @@ reach/MDSGB reachable/U reacquire/DSG react/V +reactance reactant/SM reactionary/SM reactivity @@ -38874,7 +39361,7 @@ recline/DRSZG recliner/M recluse/SMV recognizable/U -recognizably +recognizably/U recognize/DRSGB recognized/U recombination @@ -39014,8 +39501,10 @@ reflationary reflect/GVSD reflection/MS reflective/Y +reflectivity reflector/MS reflexive/SMY +reflexivity reflexology reforge/DSG reform/MZ @@ -39063,6 +39552,7 @@ regenerate/V regex/M regexp/S reggae/M +regicidal regicide/MS regime/SM regimen/SM @@ -39113,6 +39603,7 @@ rehearsal/MS rehearsed/U rehi rehung +reify/NDSG reign/MDSG reimburse/BDSGL reimbursement/MS @@ -39133,7 +39624,7 @@ rejoinder/SM rejuvenate/DSGN rejuvenation/M rel -relate/DRSXZGNV +relate/DRSBXZGNV relatedness/M relater/M relation/M @@ -39260,6 +39751,7 @@ repartee/M repatriate/XDSMGN repatriation/M repeat/SMDRZGB +repeatability repeatable/U repeatably repeated/Y @@ -39296,6 +39788,7 @@ reportage/M reported/Y reportorial reposeful +reposition repository/SM reprehend/DGS reprehensibility/M @@ -39349,13 +39842,13 @@ requiter/M reread/SG rerecord/GDS rerunning +resample/GDS resat rescind/SDG rescission/M rescue/DRSMZG rescuer/M reseal/B -resell/SG resemble/DSG resend resent/LSDG @@ -39388,6 +39881,7 @@ resist/SMDRZG resistance/SM resistant/U resistible +resistivity resistless resistor/MS resit/S @@ -39490,8 +39984,10 @@ reticence/M reticent/Y reticulated reticulation/MS +reticulum retina/SM retinal +retinoblastoma retinue/SM retiree/SM retirement/MS @@ -39533,6 +40029,7 @@ revealing/Y reveille/M revel/JMDRSZG revelation/SM +revelatory reveler/M revelry/SM revenge/MGDS @@ -40069,6 +40566,7 @@ running/M runny/RT runoff/SM runt/MS +runtime runty/RT runway/SM rupee/SM @@ -40324,7 +40822,7 @@ sanitarian/SM sanitarium/SM sanitary/IU sanitation/M -sanitize/GDS +sanitize/ZGDRS sanity/IM sank sans @@ -40469,6 +40967,7 @@ scaffold/SMG scaffolding/M scag/S scagged +scalability scalar/S scalawag/MS scald/MDSG @@ -40576,6 +41075,7 @@ schilling/MS schism/SM schismatic/SM schist/M +schistosomiasis schizo/SM schizoid/MS schizophrenia/M @@ -40857,6 +41357,7 @@ seaplane/SM seaport/MS sear/GMDS search/AZGMDRS +searchable/U searcher/AM searching/Y searchlight/MS @@ -41027,8 +41528,9 @@ selfishness/UM selfless/PY selflessness/M selfsame -sell/ZGMRS -seller/M +sell's +sell/AZGRS +seller's selloff/MS sellotape/DSG sellout/MS @@ -41195,7 +41697,7 @@ serge/M sergeant/MS serial/SMY serialization/SM -serialize/GDS +serialize/GDSB series/M serif/MS serigraph/M @@ -42626,6 +43128,7 @@ solvency/IM solvent/IMS solver/SM somatic +somatosensory somber/PY somberness/M sombre/PY @@ -42800,6 +43303,7 @@ spaceport/SM spacer/M spaceship/SM spacesuit/SM +spacetime spacewalk/SGMD spacewoman/M spacewomen @@ -42992,6 +43496,7 @@ spindly/TR spine/SM spineless/YP spinet/SM +spinless spinnaker/SM spinner/MS spinneret/SM @@ -43033,6 +43538,7 @@ spitting spittle/M spittoon/MS spiv/S +splanchnic splash/GMDS splashdown/MS splashily @@ -43785,6 +44291,7 @@ streptomycin/M stress/MDSG stressed/U stressful +stressors stretch/BZGMDRS stretcher/MDG stretchmarks @@ -43969,6 +44476,7 @@ subculture/MS subcutaneous/Y subdivide/GDS subdivision/SM +subdomain/MS subdominant subdue/DSG subeditor/S @@ -44020,7 +44528,9 @@ subordinate/DSMGN subordination/IM suborn/SGD subornation/M +subpar subparagraph +subpart subplot/MS subpoena/GMDS subprime @@ -44283,6 +44793,7 @@ superconducting superconductive superconductivity/M superconductor/SM +supercritical superego/MS supererogation/M supererogatory @@ -44309,6 +44820,7 @@ superiority/M superlative/SMY superman/M supermarket/SM +supermassive supermen supermodel/SM supermom/MS @@ -44329,6 +44841,7 @@ supersede/GDS supersize/GDS supersonic superstar/MS +superstardom superstate/S superstition/MS superstitious/Y @@ -44371,7 +44884,7 @@ suppose/GDS supposed/Y supposition/MS suppository/SM -suppress/GDS +suppress/GVDS suppressant/MS suppressible suppression/M @@ -44459,6 +44972,7 @@ suss/DSG sustain/SDBG sustainability sustainable/U +sustainably sustenance/M sutler/MS suttee @@ -44579,6 +45093,7 @@ switchback/MS switchblade/SM switchboard/SM switcher/M +switchover swivel/MDGS swiz swizz @@ -44631,6 +45146,7 @@ symbolical/Y symbolism/M symbolization/M symbolize/DSG +symbology symmetric/Y symmetrical/Y symmetry/SM @@ -44656,6 +45172,7 @@ synchronicity synchronization/SM synchronize/GDS synchronous/Y +synchrony syncopate/DSGN syncopation/M syncope/M @@ -44924,6 +45441,7 @@ tartness/M tarty/T taser/GMDS task/GMDS +taskbar taskmaster/MS taskmistress/MS tassel/MDSG @@ -45396,6 +45914,7 @@ thereof thereon thereto theretofore +thereunder thereunto thereupon therewith @@ -45805,6 +46324,7 @@ toboggan/ZGSMDR tobogganer/M tobogganing/M toccata/S +tocopherol tocsin/SM today/M toddle/DRSMZG @@ -46068,6 +46588,7 @@ trabecula trabecular trabecule trace/JDRSMZG +traceability traceable/U tracer/M tracery/SM @@ -46172,6 +46693,7 @@ transcriber/M transcript/MS transcription/SM transducer/MS +transduction transect/DSG transept/MS transfer/MBS @@ -46256,6 +46778,7 @@ transshipment/M transshipped transshipping transubstantiation/M +transversal transverse/MYS transvestism/M transvestite/MS @@ -46353,7 +46876,7 @@ trestle/MS trews trey/MS triad/SM -triage/M +triage/MD trial/ASM trialed trialing @@ -46812,6 +47335,8 @@ typography/M typology/SM tyrannic tyrannical/Y +tyrannicidal +tyrannicide/S tyrannize/GDS tyrannosaur/MS tyrannosaurus/MS @@ -46819,6 +47344,7 @@ tyrannous tyranny/SM tyrant/SM tyro/MS +tzatziki u/S ubiquitous/Y ubiquity/M @@ -46851,6 +47377,8 @@ ultrahigh ultralight/SM ultramarine/M ultramodern +ultrasensitive +ultrashort ultrasonic ultrasonically ultrasound/MS @@ -46885,7 +47413,9 @@ unanimous/Y unapparent unappetizing unappreciative +unary unassertive +unassimilable unassuming/Y unavailing/Y unaware/S @@ -46898,6 +47428,7 @@ unblinking/Y unblushing/Y unbosom/DG unbound/D +unbox/GDS unbreakable unbroken uncanny/T @@ -46915,6 +47446,7 @@ uncleanly/T unclear/DRT uncomfortable uncommon/T +uncompelling uncomplaining/Y uncomplicated uncomprehending/Y @@ -46991,6 +47523,7 @@ undergrowth/M underhand underhanded/PY underhandedness/M +underinflated underlain underlay/SM underlie/S @@ -47176,10 +47709,13 @@ unity/EM univalent univalve/SM universal/MYS +universalism +universalist universality/M universalize/DSG universe/SM university/SM +univocal unjust/Y unkempt unkind/T @@ -47243,6 +47779,7 @@ unrepentant unreported unrepresentative unrest/M +unrevealing unripe/TR unroll/GDS unromantic @@ -47251,7 +47788,6 @@ unruly/RTP unsafe/YTR unsavory unscathed -unsearchable unseeing/Y unseemly/T unseen/M @@ -47489,6 +48025,7 @@ vagary/SM vagina/SM vaginae vaginal/Y +vaginitis vagrancy/M vagrant/MS vague/RYTP @@ -47670,6 +48207,7 @@ vent/DGS ventilate/GNDS ventilation/M ventilator/SM +ventilatory ventral ventricle/SM ventricular @@ -47687,6 +48225,7 @@ veracity/M veranda/SM verandah/M verandahs +verapamil verb/KMS verbal/MYS verbalization/M @@ -47820,6 +48359,7 @@ vicissitude/SM victim/MS victimization/M victimize/GDS +victimless victor/MS victorious/Y victory/SM @@ -47836,6 +48376,7 @@ videotape/DSMG videotex vie/DS view/AMDRSZG +viewable viewer/AM viewership/M viewfinder/SM @@ -48029,6 +48570,7 @@ volatile volatility/M volatilize/DSG volcanic +volcanism volcano/M volcanoes vole/MS @@ -48044,6 +48586,7 @@ volubility/M voluble volubly volume/SM +volumetric voluminous/YP voluminousness/M voluntarily/I @@ -48077,6 +48620,7 @@ voyageur/SM voyeur/MS voyeurism/M voyeuristic +vulcanism vulcanization/M vulcanize/GDS vulgar/RYT @@ -48221,6 +48765,7 @@ ware/MS warehouse/DSMG warez warfare/M +warfarin warhead/MS warhorse/SM warily/U @@ -48348,6 +48893,7 @@ wattle/MGDS wave/MZGDRS waveband/S waveform +wavefront wavelength/M wavelengths wavelet/SM @@ -48646,6 +49192,7 @@ whiteboard/S whitecap/SM whitefish/MS whitehead/MS +whitelist/GDS whiten/ZGDRJ whitener/M whiteness/M @@ -49071,6 +49618,8 @@ works/M worksheet/MS workshop/MS workshy +worksite/S +workspace workstation/MS worktable/MS worktop/S diff --git a/extensions/spellcheck/locales/en-US/hunspell/en-US.dic b/extensions/spellcheck/locales/en-US/hunspell/en-US.dic index 429c95198..cd9fe9964 100644 --- a/extensions/spellcheck/locales/en-US/hunspell/en-US.dic +++ b/extensions/spellcheck/locales/en-US/hunspell/en-US.dic @@ -1,4 +1,4 @@ -52348 +53235 0/nm 0th/pt 1/n1 @@ -76,6 +76,7 @@ AV AVI AWACS/M AWOL/M +AWS/M AZ/M AZT/M Aachen/M @@ -240,6 +241,7 @@ Agra/M Agricola/M Agrippa/M Agrippina/M +Aguadilla/M Aguascalientes Aguilar/M Aguinaldo/M @@ -456,6 +458,7 @@ Alsatian/SM Alsop/M Alston/M Alta/M +Altaba/M Altai/M Altaic/M Altair/M @@ -465,6 +468,7 @@ Altiplano/M Altman/M Altoids/M Alton/M +Altoona/M Aludra/M Alva/M Alvan/M @@ -504,7 +508,7 @@ Ambros/M Ambrose Ambrosio/M Ambrosius/M -Ame/M +Ame/SM Amelia/M Amelie/M Amen/M @@ -520,7 +524,9 @@ Amerigo/M Amerind/SM Amerindian/MS Amery/M +Ames/M Ameslan/M +Amgen/M Amharic/M Amherst/M Ami/M @@ -612,6 +618,7 @@ Angevin/M Angie/M Angkor/M Angle/MS +Angleton/M Anglia/M Anglican/SM Anglicanism/MS @@ -627,6 +634,7 @@ Angora/SM Angstrom/M Anguilla/M Angus/M +Anhui/M Ania/M Aniakchak/M Anibal/M @@ -648,6 +656,7 @@ Annemarie/M Annette/M Anni/SM Annie/M +Anniston/M Annmarie/M Annunciation/SM Anny/M @@ -769,6 +778,8 @@ Arda/M Ardabil Arden/M Ardis/M +Arduino/M +Arecibo/M Arequipa/M Ares/M Aretha/M @@ -871,6 +882,7 @@ Ashanti/M Ashby/M Ashcroft/M Ashe/RM +Asheville/M Ashgabat Ashikaga/M Ashkenazim/M @@ -899,6 +911,7 @@ Assamese/M Assembly Assisi/M Assyria/M +Assyriaca/M Assyrian/SM Astaire/M Astana/M @@ -919,6 +932,7 @@ Atacama/M Atahualpa/M Atalanta/M Atari/M +Atascadero/M Ataturk/M Atatürk/M Athabasca/M @@ -954,6 +968,7 @@ Aube Aubert/M Aubrey/M Aubry/M +Auburn/M Auckland/M Auden/M Audi/M @@ -1024,6 +1039,7 @@ Avis/M Aviva/M Avogadro/M Avon/M +Avondale/M Avram/M Avril/M Axe/M @@ -1049,7 +1065,7 @@ Azov/M Aztec/SM Aztecan/M Aztlan/M -B/MNRT +B/MNRTG BA/M BASIC/SM BB/M @@ -1113,8 +1129,10 @@ Bahama/SM Bahamanian Bahamas/M Bahamian/MS +Bahasa/M Bahia/M Bahrain/M +Baidu/M Baikal/M Bailey/M Bailie/M @@ -1186,6 +1204,7 @@ Barbour/M Barbra/M Barbuda/M Barcelona/M +Barceloneta/M Barclay/SM Barclays/M Barde/M @@ -1311,6 +1330,8 @@ Becket/M Beckett/M Beckham/M Beckie/M +Beckley/M +Beckman Becky/M Becquerel/M Bede/M @@ -1332,6 +1353,7 @@ Bekesy/M Bel/M Bela/M Belarus/M +Belarusian Belau/M Belem/M Belfast/M @@ -1348,10 +1370,12 @@ Bellamy/M Bellatrix/M Belleek/M Bellevue/M +Bellingham/M Bellini/M Bellow/M Belmont/M Belmopan/M +Beloit/M Belorussian/MS Belshazzar/M Beltane/M @@ -1362,7 +1386,9 @@ Ben/M Benacerraf/M Benares/M Benchley/M +Bend/MR Bender/M +Bendictus Bendix/M Benedetta/M Benedetto/M @@ -1457,6 +1483,7 @@ Bertillon/M Berton/M Bertram/M Bertrand/M +Berwick/M Beryl/M Berzelius/M Bespin/M @@ -1509,6 +1536,7 @@ Bic/M Biddle/M Biden/M Bierce/M +BigQuery/M Bigfoot/M Biggles/M Biko/M @@ -1521,9 +1549,12 @@ Billie/M Billings/M Billy/M Bimini/M +Bing/M +Binghamton/M Bink/M Binky/M Binnie/M +Biogen/M Bioko/M Bird/M Birdseye/M @@ -1556,6 +1587,7 @@ Blackburn/M Blackfeet/M Blackfoot/M Blackpool/M +Blacksburg/M Blackshirt/M Blackstone/M Blackwell/M @@ -1587,6 +1619,8 @@ Bloomberg/M Bloomer/M Bloomfield/M Bloomingdale/M +Bloomington/M +Bloomsburg/M Bloomsbury/M Blu Blucher/M @@ -1678,6 +1712,7 @@ Bosporus/M Boston/MS Bostonian/M Boswell/M +Botha Botox Botswana/M Botticelli/M @@ -1705,6 +1740,7 @@ Brad/MNY Bradbury/M Braddock/M Braden/M +Bradenton/M Bradford/M Bradley/M Bradly/M @@ -1755,6 +1791,7 @@ Brecht/M Breckenridge/M Bree/M Bremen/M +Bremerton/M Bren/M Brenda/M Brendan/M @@ -1771,6 +1808,7 @@ Breton/M Brett/M Brewer/M Brewster/M +Brexit Brezhnev/M Brian/M Briana/M @@ -1802,6 +1840,7 @@ Brigit/M Brigitta/M Brigitte/M Brillo/M +Brillouin Brinkley/M Briny's Brion/M @@ -1892,6 +1931,7 @@ Buddhism/SM Buddhist/SM Buddy/M Budweiser/M +Buenos Buffalo/M Buffy/M Buford/M @@ -1972,6 +2012,7 @@ CAD/M CAI CAM CAP +CAPTCHA CARE CATV CB @@ -1979,7 +2020,7 @@ CBC/M CBS/M CCTV CCU -CD/M +CD/SM CDC CDT CEO/SM @@ -2002,6 +2043,7 @@ CPO CPR/M CPU/M CRT/SM +CSS/M CST/M CT/M CV @@ -2038,6 +2080,7 @@ Caldwell/M Cale/M Caleb/M Caledonia/M +Calexico/M Calgary/M Calhoun/M Cali/M @@ -2064,6 +2107,7 @@ Calvinism/MS Calvinist/MS Calvinistic Camacho/M +Camarillo/M Cambodia/M Cambodian/SM Cambrian/SM @@ -2146,6 +2190,7 @@ Caracalla/M Caracas/M Caravaggio/M Carboloy/M +Carbondale/M Carboniferous/M Carborundum/M Cardenas/M @@ -2222,6 +2267,7 @@ Carrol/M Carroll/M Carson/M Carter/M +Cartersville/M Cartesian/M Carthage/M Carthaginian/MS @@ -2329,6 +2375,7 @@ Celeste/M Celestia/M Celestina/M Celestine/M +Celgene/M Celia/M Celie/M Celina/M @@ -2375,6 +2422,8 @@ Challenger/M Chalmers Chamberlain/M Chambers/M +Chambersburg/M +Champaign/M Champlain/M Champollion/M Chan/M @@ -2417,6 +2466,7 @@ Charlie/M Charlot/M Charlotta/M Charlotte/M +Charlottesville/M Charlottetown/M Charlton Charmaine/M @@ -2554,6 +2604,7 @@ Christoph/MR Christophe Christopher/M Christos/M +Chromebook/MS Chronicles Chrysler/M Chrysostom/M @@ -2610,6 +2661,7 @@ Clarita/M Clark/M Clarke/M Clarkson/M +Clarksville/M Clary/M Claude/M Claudette/M @@ -2655,6 +2707,7 @@ Clinton/M Clio/M Clive/M Clo/M +Clojure/M Clorets/M Clorox/M Closure/M @@ -2767,11 +2820,12 @@ Congolese/M Congregational Congregationalist/MS Congress/MS -Congressional +Congressional/Y Congreve/M Conley/M Conn/MR Connecticut/M +Connellsville/M Connemara/M Conner/M Connery/M @@ -2783,6 +2837,7 @@ Conny/M Conrad/M Conrado/M Conrail/M +Conroe/M Conroy/M Conservative Constable/M @@ -2879,6 +2934,7 @@ Cosette/M Cosimo/M Cosme/M Cosmo/M +CosmosDB/M Cossack/M Costa/M Costanza/M @@ -2899,12 +2955,14 @@ Courtenay/M Courtney/M Cousteau/M Coventry/SM +Covington/M Coward/M Cowell/M Cowley/M Cowper/M Cox/M Coy/M +Coyle/M Cozumel/M Cpl Cr/MT @@ -3116,6 +3174,7 @@ Dan/M Dana/M Danae/M Danaë/M +Danbury/M Dane/SM Danelaw/M Danette/M @@ -3140,6 +3199,7 @@ Dante/M Danton/M Danube/M Danubian/M +Danville/M Daphne/M Dar/MNH Dara/M @@ -3287,6 +3347,7 @@ Delphic/M Delphine/M Delphinus/M Delta/M +Deltona/M Dem/G Demavend/M Demerol/M @@ -3432,6 +3493,7 @@ Dixie/M Dixiecrat/M Dixieland/SM Dixon/M +Django/M Djibouti/M Dmitri/M Dnepr @@ -3522,6 +3584,7 @@ Dortmund/M Dosi/M Dostoevsky/M Dot/M +Dothan/M Dotson/M Dottie/M Dotty's @@ -3561,6 +3624,7 @@ Dropbox/M Dru/M Drudge/M Druid/M +Drupal/M Drusilla/M Dryden/M Dschubba/M @@ -3572,6 +3636,7 @@ Dubcek/M Dubhe/M Dublin/M Dubrovnik/M +Dubuque/M Duchamp/M Dudley/M Duff/M @@ -3634,6 +3699,7 @@ Dyan/M Dyer/M Dylan/M Dyna/M +DynamoDB/M Dyson/M Dzerzhinsky/M Dzungaria/M @@ -3780,6 +3846,7 @@ Elaine/M Elam/M Elana/M Elanor/M +Elasticsearch/M Elastoplast/M Elayne/M Elba/M @@ -3787,6 +3854,7 @@ Elbe/M Elbert/M Elbrus/M Elden/M +Eldersburg/M Eldin/M Eldon/M Eldredge/M @@ -3823,7 +3891,9 @@ Elissa/M Eliza/M Elizabeth/M Elizabethan/SM +Elizabethtown/M Elke/M +Elkhart/M Ella/M Elle/M Ellen/M @@ -3873,6 +3943,7 @@ Elway/M Elwin/M Elwood/M Elwyn/M +Elyria/M Elyse/M Elysee/M Elysian/M @@ -3886,6 +3957,7 @@ Emanuele/M Emeline/M Emerson/M Emery/M +Emeryville/M Emil/M Emile/M Emilia/M @@ -3976,6 +4048,7 @@ Eris/MS Eritrea/M Eritrean/SM Erl/M +Erlang/M Erlenmeyer/M Erma/M Erna/M @@ -4069,12 +4142,14 @@ Eurasian/MS Euripides/M Eurodollar/SM Europa/M +Europaea/M Europe/M European/MS Eurydice/M Eustace/M Eustachian/M Eustacia/M +Eustis/M Euterpe/M Ev/M Eva/M @@ -4164,11 +4239,14 @@ Fahd/M Fahrenheit/M Fairbanks/M Fairfax +Fairfield/M +Fairhope/M Fairleigh/M Fairlie/M Faisal/M Faisalabad/M Faith/M +Fajardo/M Falasha/M Falkland/SM Falklands/M @@ -4187,6 +4265,7 @@ Farah/M Fargo/M Farley/M Farmer/M +Farmington/M Farr/M Farragut/M Farrah/M @@ -4217,6 +4296,7 @@ Fawkes/M Fay/M Faye/M Fayette/M +Fayetteville/M Fayre/M Fe/M Feb/M @@ -4301,18 +4381,21 @@ Finnbogadottir/M Finnegan/M Finnish/M Fiona/M +Firebase/M Firefox/M Firestone/M Fischer/M Fisher/M Fisk/M Fitch/M +Fitchburg/M Fitz/M Fitzgerald/M Fitzpatrick/M Fitzroy/M Fizeau/M Fla +Flagstaff/M Flanagan/M Flanders/M Flathead @@ -4438,6 +4521,7 @@ Frederic/M Frederica/M Frederich/M Frederick/M +Fredericksburg/M Frederico/M Fredericton/M Frederik/M @@ -4472,6 +4556,7 @@ Frieda/M Friedan/M Friederike/M Friedman/M +Friedmann/M Friedrich Friend/SM Frigga/M @@ -4497,6 +4582,7 @@ Fuchs/M Fuentes/M Fugger/M Fuji/M +Fujian/M Fujitsu/M Fujiwara/M Fujiyama/M @@ -4512,6 +4598,7 @@ Fulvia/M Funafuti/M Fundy/M Furies/M +Furman/M Furtwangler/M Furtwängler/M Fushun/M @@ -4524,6 +4611,7 @@ GATT/M GB/M GCC/M GDP/M +GDPR GE/M GED GHQ/M @@ -4574,6 +4662,7 @@ Gaia/M Gail/M Gaiman/M Gaines/M +Gainesville/M Gainsborough/M Galahad/SM Galapagos/M @@ -4621,9 +4710,11 @@ Ganesha/M Ganges/M Gangtok/M Gannon/M +Gansu/M Gantry/M Ganymede/M Gap/M +Garamond Garbo/M Garcia/M Gard @@ -4656,6 +4747,7 @@ Gasparo/M Gasper/M Gasser/M Gaston/M +Gastonia/M Gastroenterology Gates/M Gatling/M @@ -4813,6 +4905,7 @@ Gilligan/M Gilly/M Gilman Gilmore/M +Gilroy/M Gina/M Ginevra/M Ginger/M @@ -4906,6 +4999,7 @@ Goldie/M Goldilocks/M Golding/M Goldman/M +Goldsboro/M Goldsmith/M Goldwater/M Goldwyn/M @@ -4923,6 +5017,7 @@ Gonzalez/M Gonzalo/M Good/M Goodall/M +Goode/M Goodman/M Goodrich/M Goodwill/M @@ -4989,6 +5084,7 @@ Grata/M Gratia/M Graves/M Gray/M +Grayslake/M Grazia/M Grecian/M Greece/M @@ -5002,6 +5098,7 @@ Greenpeace/M Greensboro/M Greensleeves/M Greenspan/M +Greenville/M Greenwich/M Greer/M Greg/M @@ -5061,12 +5158,14 @@ Guadeloupe/M Guallatiri/M Guam/M Guamanian +Guangdong/M Guangzhou/M Guantanamo/M Guarani/M Guarnieri/M Guatemala/M Guatemalan/MS +Guayama/M Guayaquil/M Gucci/M Guelph/M @@ -5089,10 +5188,12 @@ Guinean/MS Guinevere/M Guinness/M Guiyang/M +Guizhou/M Guizot/M Gujarat/M Gujarati/M Gujranwala/M +Gulfport/M Gullah/M Gulliver/M Gumbel/M @@ -5133,6 +5234,7 @@ Gödel/M Göteborg/M H/M HBO/M +HBase/M HDD HDMI HDTV @@ -5157,6 +5259,7 @@ HTML/M HTTP HTTPS HUD/M +HVAC Ha/M Haas/M Habakkuk/M @@ -5166,12 +5269,14 @@ Hadar/M Hades/M Hadleigh/M Hadley/M +Hadoop/M Hadria/M Hadrian/M Hafiz/M Hagan/M Hagar/M Hagen +Hagerstown/M Haggai/M Hagiographa/M Hague/M @@ -5179,6 +5284,7 @@ Hahn/M Haida/SM Haifa/M Hailey/M +Hainan/M Haiphong/M Haiti/M Haitian/MS @@ -5236,6 +5342,7 @@ Hancock/M Handel/M Handy/M Haney/M +Hanford/M Hangul/M Hangzhou/M Hank/M @@ -5271,6 +5378,7 @@ Harlem/M Harlequin/M Harley/M Harlin/M +Harlingen/M Harlow/M Harman/M Harmon/M @@ -5291,6 +5399,7 @@ Harriott/M Harris/M Harrisburg/M Harrison/M +Harrisonburg/M Harrods/M Harry/M Hart/M @@ -5319,6 +5428,7 @@ Hatsheput/M Hatteras/M Hatti/M Hattie/M +Hattiesburg/M Hatty/M Hauptmann/M Hausa/M @@ -5348,6 +5458,7 @@ Haywood/M Hayworth/M Hayyim/M Hazel/M +Hazleton/M Hazlett/M Hazlitt/M He/M @@ -5358,6 +5469,7 @@ Heather/M Heaviside/M Heb Hebe/M +Hebei/M Hebert/M Hebraic/M Hebraism/SM @@ -5380,6 +5492,7 @@ Heidegger/M Heidelberg/M Heidi/M Heifetz/M +Heilongjiang/M Heimlich/M Heine/M Heineken/M @@ -5395,6 +5508,7 @@ Helena/M Helene/M Helga/M Helge/M +Helicobacter Helicon/M Heliopolis/M Helios/M @@ -5414,7 +5528,9 @@ Helsinki/M Helvetian Helvetica Helvetius/M +Hemet/M Hemingway/M +Henan/M Hench/M Henderson/M Hendrick/MS @@ -5467,6 +5583,7 @@ Hernandez/M Hernando/M Herod/M Herodotus/M +Heroku/M Herold/M Herr/MG Herrera/M @@ -5489,6 +5606,7 @@ Herzegovina/M Herzl/M Heshvan/M Hesiod/M +Hesperia/M Hesperus/M Hess/M Hesse/M @@ -5515,6 +5633,7 @@ Hibernia/M Hibernian Hickman/M Hickok/M +Hickory/M Hicks/M Hieronymus/M Higashiosaka @@ -5522,6 +5641,7 @@ Higgins/M Highlander/SM Highlands Highness/M +Hightstown/M Hilario/M Hilary/M Hilbert/M @@ -5555,6 +5675,7 @@ Hinduism/SM Hindustan/M Hindustani/SM Hines/M +Hinesville/M Hinton/M Hinze/M Hipparchus/M @@ -5566,6 +5687,7 @@ Hirohito/M Hiroshima/M Hirsch/M Hispanic/SM +Hispanica/M Hispaniola/M Hiss/M Hitachi/M @@ -5604,6 +5726,7 @@ Holiday/M Holiness Holland/ZSMR Hollander/M +Hollandica/M Hollerith/M Holley/M Hollie/M @@ -5669,6 +5792,7 @@ Hotpoint/M Hottentot/SM Houdini/M Houghton/M +Houma/M House/M Housman/M Houston/M @@ -5688,6 +5812,7 @@ Hts Huang/M Hubbard/M Hubble/M +Hubei/M Huber/M Hubert/M Huck/M @@ -5713,10 +5838,12 @@ Humberto/M Humboldt/M Hume/M Humfrey/M +Hummel/M Hummer/M Humphrey/SM Humvee/M Hun/SM +Hunan/M Hung/M Hungarian/SM Hungary/M @@ -5726,6 +5853,7 @@ Hunter/M Huntington/M Huntley/M Huntsville/M +Hurd/M Hurley/M Huron/M Hurst/M @@ -5760,6 +5888,7 @@ I'm I've I/M IA +IANAL IBM/M ICBM/SM ICC @@ -5769,6 +5898,7 @@ IDE IE IED IEEE +IIRC IKEA/M IL IMDb/M @@ -5792,7 +5922,7 @@ IRS/M ISBN ISIS ISO/M -ISP +ISP/SM ISS IT IUD @@ -5873,6 +6003,7 @@ Indianan/SM Indianapolis/M Indianian Indies/M +Indio/M Indira/M Indochina/M Indochinese/M @@ -5957,6 +6088,7 @@ Isa Isaac/M Isaak/M Isabel/M +Isabela/M Isabella/M Isabelle/M Isadora/M @@ -5979,6 +6111,7 @@ Isis/M Islam/MS Islamabad/M Islamic/M +Islamica/M Islamism/M Islamist/M Islamophobia @@ -5999,6 +6132,7 @@ Isuzu/M It Itaipu/M Ital +Italia/M Italian/SM Italianate Italy/M @@ -6034,6 +6168,7 @@ JD JFK/M JP JPEG/SM +JSON JV Jabez/M Jacinta/M @@ -6097,6 +6232,7 @@ Jane/M Janek/M Janell/M Janelle/M +Janesville/M Janet/M Janette/M Janey/M @@ -6231,6 +6367,8 @@ Jewess/MS Jewish/PM Jewry/M Jezebel/SM +Jiangsu/M +Jiangxi/M Jidda/M Jilin/M Jill/M @@ -6286,6 +6424,7 @@ Johnny/M Johns/M Johnson/M Johnston/M +Johnstown/M Jojo/M Jolene/M Joli/M @@ -6301,6 +6440,7 @@ Jonathan/M Jonathon/M Jone/SM Jones/M +Jonesboro/M Joni/M Jonson/M Joplin/M @@ -6424,10 +6564,12 @@ Kafkaesque/M Kagoshima/M Kahlil/M Kahlua/M +Kahului/M Kai/M Kaia/M Kaifeng/M Kaila/M +Kailua/M Kain/M Kaine/M Kaiser/MS @@ -6457,7 +6599,9 @@ Kandahar/M Kandinsky/M Kandy Kane/M +Kaneohe/M Kania/M +Kankakee/M Kannada/M Kano/M Kanpur/M @@ -6600,8 +6744,10 @@ Kennan/M Kennedy/M Kenneth/M Kennett/M +Kennewick/M Kennith/M Kenny/M +Kenosha/M Kent/M Kenton/M Kentuckian/MS @@ -6648,6 +6794,7 @@ Kharkov/M Khartoum/M Khayyam/M Khazar/M +Khazarica/M Khmer/M Khoikhoi/M Khoisan/M @@ -6672,6 +6819,7 @@ Kile/M Kiley/M Kilian/M Kilimanjaro/M +Killeen/M Killian/M Kilroy/M Kim/M @@ -6684,6 +6832,7 @@ Kimmy/M Kincaid/M King/M Kingsley +Kingsport/M Kingston/M Kingstown/M Kinko/M @@ -6713,6 +6862,7 @@ Kirsten/M Kisangani/M Kishinev/M Kislev/M +Kissimmee/M Kissinger/M Kit/M Kitakyushu/M @@ -6760,6 +6910,7 @@ Kohinoor/M Kohl/M Koizumi/M Kojak/M +Kokomo/M Kolyma/M Kommunizma/M Kong/M @@ -6785,6 +6936,7 @@ Kosciusko/M Kosovo/M Kossuth/M Kosygin/M +Kotlin/M Koufax/M Kowloon/M Kr/M @@ -6825,6 +6977,7 @@ Krystal/M Krystyna/M Kshatriya/M Kuala/M +Kubernetes/M Kublai/M Kubrick/M Kuhn/M @@ -6892,6 +7045,7 @@ Labradorean Labradorian Lacey/M Lachesis/M +Lactobacillus Lacy/M Ladoga/M Ladonna/M @@ -6908,6 +7062,7 @@ Lainey/M Laius/M Lajos/M Lakeisha/M +Lakeland/M Lakers/M Lakewood Lakisha/M @@ -6957,6 +7112,7 @@ Laocoon/M Laos/M Laotian/SM Laplace/M +Laplacian Lapland/MR Lapp/SM Lara/M @@ -6982,6 +7138,7 @@ Latham/M Latin/MRS Latina Latino/SM +Latinx Latisha/M Latonya/M Latoya/M @@ -7052,6 +7209,7 @@ Lee/M Leeds/M Leela/M Leena/M +Leesburg/M Leese/M Leeuwenhoek/M Leeward/M @@ -7099,6 +7257,7 @@ Lent/SMN Lenten/M Leo/SM Leola/M +Leominster/M Leon/M Leona/M Leonard/M @@ -7157,6 +7316,8 @@ Lew/M Lewes Lewinsky/M Lewis/M +Lewiston/M +Lewisville/M Lexi/M Lexie/M Lexington/M @@ -7173,6 +7334,7 @@ Lian/M Liana/M Liane/M Lianne/M +Liaoning/M Libbey/M Libbie/M Libby/M @@ -7274,6 +7436,7 @@ Little/M Litton/M Liv/M LiveJournal/M +Livermore/M Liverpool/M Liverpudlian/SM Livia/M @@ -7301,6 +7464,7 @@ Lockean/M Lockheed/M Lockwood/M Lodge/M +Lodi/M Lodovico/M Lodz/M Loewe/M @@ -7321,14 +7485,17 @@ Lombard/M Lombardi/M Lombardy/M Lome/M +Lompoc/M Lon/M Lona/M London/MRZ Londoner/M Long/M Longfellow/M +Longmont/M Longstreet/M Longueuil +Longview/M Loni/M Lonnie/M Lonny/M @@ -7345,6 +7512,7 @@ Loren/M Lorena/M Lorene/M Lorentz/M +Lorentzian Lorenz/M Lorenza/M Lorenzo/M @@ -7485,6 +7653,7 @@ Lyman/M Lyme/M Lyn/M Lynch/M +Lynchburg/M Lynda/M Lynde/M Lyndon/M @@ -7509,6 +7678,7 @@ MBA/M MC MCI/M MD/M +MDF MDT ME MEGO/S @@ -7586,6 +7756,7 @@ Madeleine/M Madeline/M Madelon/M Madelyn/M +Madera/M Madge/M Madison/M Madonna/SM @@ -7608,6 +7779,7 @@ Maggy/M Maghreb/M Magi Maginot/M +Magnificat Magnitogorsk/M Magog/M Magoo/M @@ -7718,6 +7890,7 @@ Mandarin/M Mandel/M Mandela/M Mandelbrot/M +Mandeville/M Mandi/M Mandie/M Mandingo/M @@ -7731,6 +7904,7 @@ Manichean/M Manila/SM Manitoba/M Manitoulin/M +Mankato/M Manley/M Mann/GM Mannheim/M @@ -7742,6 +7916,7 @@ Manolo/M Manon/M Mansfield/M Manson/M +Manteca/M Mantegna/M Mantle/M Manuel/M @@ -7809,6 +7984,7 @@ Marguerite/M Margy/M Mari/SM Maria/M +MariaDB/M Mariam/M Marian/M Mariana/SM @@ -7924,6 +8100,7 @@ Marylander/M Marylin/M Marylou/M Marys +Marysville/M Masada/M Masai/M Masaryk/M @@ -7951,6 +8128,7 @@ Mateo/M MathML/M Mathe/MR Mather/M +Matheson/M Mathew/SM Mathews/M Mathewson/M @@ -7962,6 +8140,7 @@ Matias/M Matilda/M Matilde/M Matisse/M +Matlab/M Matt/M Mattel/M Matteo/M @@ -7979,6 +8158,7 @@ Maude/M Maudie/M Maugham/M Maui/M +Mauldin/M Maupassant/M Maura/M Maureen/M @@ -8033,6 +8213,7 @@ Mbini/M Mbps McAdam/M McAfee/M +McAllen/M McBride/M McCain/M McCall/M @@ -8061,8 +8242,10 @@ McGovern/M McGowan/M McGuffey/M McGuire/M +McHenry/M McIntosh/M McIntyre/M +McJob McKay/M McKee/M McKenzie/M @@ -8094,6 +8277,7 @@ Mecca/MS Medan/M Medea/M Medellin/M +Medford/M Media/M Medicaid/SM Medicare/SM @@ -8145,6 +8329,7 @@ Melva/M Melville/M Melvin/M Melvyn/M +Memcached/M Memling/M Memphis/M Menander/M @@ -8162,6 +8347,7 @@ Menelaus/M Menelik/M Menes/M Mengzi +Menifee/M Menkalinan/M Menkar/M Menkent/M @@ -8178,6 +8364,7 @@ Mephistopheles/M Merak/M Mercado/M Mercator/M +Merced/M Mercedes/M Mercer/M Merci/M @@ -8278,6 +8465,7 @@ Micronesian/M Microsoft/M Midas/M Middleton/M +Middletown/M Mideast Mideastern Midland/MS @@ -8318,6 +8506,7 @@ Milosevic/M Milquetoast/M Miltiades/M Milton/M +Miltonian Miltonic/M Miltown/M Milwaukee/M @@ -8379,6 +8568,7 @@ Missie/M Mississauga/M Mississippi/M Mississippian/SM +Missoula/M Missouri/M Missourian/MS Missy/M @@ -8454,11 +8644,14 @@ Monday/SM Mondrian/M Monegasque/SM Monera/M +Monessen/M Monet/M +MongoDB/M Mongol/SM Mongolia/M Mongolian/SM Mongolic/M +Mongolica/M Mongoloid Monica/M Monika/M @@ -8481,6 +8674,7 @@ Montcalm/M Monte/M Montenegrin/M Montenegro/M +Monterey/M Monterrey/M Montesquieu/M Montessori/M @@ -8518,6 +8712,7 @@ Moreno/M Morey/M Morgan/SM Morgana/M +Morgantown/M Morgen/M Moria/M Moriarty/M @@ -8538,6 +8733,7 @@ Morphy/M Morrie/M Morris/M Morrison/M +Morristown/M Morrow/M Morse/M Mort/MN @@ -8601,6 +8797,7 @@ Mumbai/M Mumford/M Munch/M Munchhausen/M +Muncie/M Munich/M Munoz/M Munro/M @@ -8613,12 +8810,14 @@ Murchison/M Murcia Murdoch/M Murdock/M +Murfreesboro/M Muriel/M Murillo/M Murine/M Murmansk/M Murphy/M Murray/M +Murrieta/M Murrow/M Murrumbidgee/M Murry/M @@ -8628,6 +8827,7 @@ Muscovy/M Muse/M Musharraf/M Musial/M +Muskegon/M Muskogee/M Muslim/MS Mussolini/M @@ -8699,6 +8899,7 @@ NSPR/M NSS/M NT NV +NVIDIA/M NW/M NWT NY @@ -8728,6 +8929,7 @@ Nam/M Namath/M Namibia/M Namibian/MS +Nampa/M Nan/M Nana/M Nanak/M @@ -8823,6 +9025,7 @@ Ned/M Neda/M Nedda/M Neddy/M +Nederland/SM Neel/M Neely/M Nefertiti/M @@ -8848,6 +9051,7 @@ Nelsen/M Nelson/M Nembutal/M Nemesis/M +Neo/M Neogene/M Neolithic Nepal/M @@ -8888,6 +9092,7 @@ Nevin/MS Nevis/M Nevsky/M Newark/M +Newburgh/M Newcastle/M Newfoundland/MRS Newman/M @@ -8912,6 +9117,7 @@ Nicaraguan/SM Niccolo/M Nice/M Nicene/M +Nicephori/M Nichiren/M Nichol/SM Nicholas/M @@ -8947,6 +9153,7 @@ Nigel/M Niger/M Nigeria/M Nigerian/MS +Nigeriana/M Nigerien/M Nightingale/M Nijinsky/M @@ -9018,6 +9225,7 @@ Noreen/M Norfolk/M Noriega/M Norma/M +Normal/M Norman/MS Normand/M Normandy/M @@ -9101,6 +9309,7 @@ OHSA/M OJ OK/SMDG OMB/M +OMG ON OPEC/M OR @@ -9124,6 +9333,8 @@ Obed/M Oberlin/M Oberon/M Obie +Ocala/M +Ocaml/M Occam/M Occident Occidental/MS @@ -9252,6 +9463,7 @@ Oreg Oregon/M Oregonian/SM Orel +Orem/M Oren/M Oreo/M Orestes/M @@ -9316,11 +9528,13 @@ Ottawa/SM Ottilie/M Otto/M Ottoman/M +Ottomana/M Ouagadougou/M Ouija/MS Ovid/M Owen/SM Owens/M +Owensboro/M Oxford/SM Oxley/M Oxnard/M @@ -9354,12 +9568,15 @@ PET/M PFC PG PGP +PHP/M PIN PJ's PLO/M PM/SMDG PMS/M +PNG/SM PO +POTUS/M POW/M PP PPS @@ -9416,6 +9633,7 @@ Palikir/M Palin/M Palisades/M Palladio/M +Palmdale/M Palmer/M Palmerston/M Palmolive/M @@ -9462,6 +9680,7 @@ Parisian/MS Park/SMR Parke/M Parker/M +Parkersburg/M Parkinson/M Parkinsonism Parkman/M @@ -9480,8 +9699,10 @@ Parsons/M Parthenon/M Parthia/M Pasadena/M +Pascagoula/M Pascal/SM Pascale/M +Pasco/M Pasquale/M Passion/SM Passover/MS @@ -9632,6 +9853,7 @@ Peruvian/MS Peshawar/M Peta/M Petain/M +Petaluma/M Pete/RMZ Peter/M Peterborough/M @@ -9646,6 +9868,7 @@ Petronella/M Petronilla/M Petty/M Peugeot/M +Peyronie's Peyton/M Pfc Pfizer/M @@ -9746,7 +9969,9 @@ Pitt/SM Pittman/M Pitts/M Pittsburgh/M +Pittsfield/M Pius/M +Pixar/M Pizarro/M Pkwy Pl @@ -9777,6 +10002,7 @@ Plymouth/M Pm/M Po/M Pocahontas/M +Pocatello/M Pocono/SM Poconos/M Podgorica/M @@ -9807,6 +10033,7 @@ Pollux/M Polly/M Pollyanna/M Polo/M +Polska Poltava/M Polyhymnia/M Polynesia/M @@ -9837,6 +10064,7 @@ Porrima/M Porsche/M Port/MR Porter/M +Porterville/M Portia/M Portland/M Porto/M @@ -9853,6 +10081,8 @@ Potsdam/M Pottawatomie/M Potter/M Potts/M +Pottstown/M +Poughkeepsie/M Poul/M Pound/M Poussin/M @@ -9867,6 +10097,7 @@ Pr/M Prada/M Prado/M Praetorian/M +Praetoriana/M Prague/M Praia/M Prakrit/M @@ -9891,6 +10122,7 @@ Pretoria/M Priam/M Pribilof/M Price/M +Priceline/M Priestley/M Prince/M Princeton/M @@ -9983,6 +10215,7 @@ Putin/M Putnam/M Puzo/M Pvt +PyTorch/M Pygmalion/M Pygmy/SM Pyle/M @@ -10012,11 +10245,13 @@ Qantas/M Qatar/M Qatari/MS Qingdao/M +Qinghai/M Qiqihar/M Qom/M Quaalude/M Quaker/MS Quakerism/SM +Qualcomm/M Quaoar/M Quasimodo/M Quaternary/M @@ -10070,6 +10305,7 @@ RCA/M RCMP RD RDA +RDS/M REIT REM/SM RF @@ -10104,6 +10340,7 @@ Rachel/M Rachelle/M Rachmaninoff/M Racine/M +Radcliff/M Radcliffe/M Rae/M Raf/M @@ -10203,17 +10440,20 @@ Realtor/M Reasoner/M Reba/M Rebeca/M -Rebecca's +Rebecca/M Rebecka/M Rebekah/M Recife/M Reconstruction/M Red/SM -Redd/M +Redd/GM +Redding/M Redeemer/M Redford/M Redgrave/M +Redis/M Redmond/M +Redshift/M Ree/DSM Reebok/M Reece/M @@ -10382,7 +10622,7 @@ Riva/SM Rivas/M Rivera/M Rivers/M -Riverside +Riverside/M Riviera/MS Riyadh/M Rizal/M @@ -10481,6 +10721,7 @@ Rom Roma/M Romain/M Roman/MS +Romana/M Romanesque/MS Romania/M Romanian/MS @@ -10668,6 +10909,7 @@ SASE SAT SBA SC/M +SCOTUS/M SCSI/M SD SDI @@ -10681,6 +10923,8 @@ SJ SJW SK SLR +SME/SM +SMEs/M SNP/SM SO/S SOB/M @@ -10690,10 +10934,12 @@ SOSes SPCA SPF SQL +SQLite/M SRO SS SSA SSE/M +SSN SSS SST SSW/M @@ -10757,6 +11003,7 @@ Salazar/M Saleem/M Salem/M Salerno/M +Salesforce/M Salim/M Salinas/M Salinger/M @@ -10917,6 +11164,7 @@ Schindler/M Schlesinger/M Schliemann/M Schlitz/M +Schloss/M Schmidt/M Schnabel/M Schnauzer/M @@ -10985,10 +11233,12 @@ Seagram/M Seamus/M Sean/M Sears/M +Seaside/M Seattle/M Sebastian/M Sebastiano/M Sebastien/M +Sebring/M Sec Seconal/M Secretariat/M @@ -11001,6 +11251,7 @@ Sega/M Segovia/M Segre/M Segundo/M +Segway/S Seiko/M Seine/M Seinfeld/M @@ -11076,6 +11327,7 @@ Seychelles/M Seyfert/M Seymour/M Sgt +Shaanxi/M Shackleton/M Shaffer/M Shah/M @@ -11086,6 +11338,7 @@ Shakespearean/M Shalom's Shamus/M Shana/M +Shandong/M Shandy/M Shane/M Shanghai/M @@ -11095,6 +11348,7 @@ Shanna/M Shannon/M Shanta/M Shantung/M +Shanxi/M Shapiro/M Shara/M SharePoint/M @@ -11124,6 +11378,7 @@ Shcharansky/M Shea/M Sheba/M Shebeli/M +Sheboygan/M Sheela/M Sheena/M Sheetrock/M @@ -11211,6 +11466,7 @@ Sibley/M Sibyl/M Sibylla/M Sibylle/M +Sichuan/M Sicilian/SM Sicily/M Sid/M @@ -11257,6 +11513,7 @@ Simona/M Simone/M Simpson/SM Simpsons/M +Simpsonville/M Sims/M Sinai/M Sinatra/M @@ -11270,6 +11527,7 @@ Singer/M Singh/M Singleton/M Sinhalese/M +Sinica/M Sinkiang/M Siobhan/M Sioux/M @@ -11301,6 +11559,7 @@ Slater/M Slav/SM Slavic/M Slavonic/M +Slidell/M Slinky/M Sloan/M Sloane/M @@ -11340,6 +11599,7 @@ Snowl/M Snyder/M Soave/M Soc +Socastee/M Socorro/M Socrates/M Socratic/M @@ -11397,6 +11657,7 @@ Southey/M Souths Southwest/MS Soviet/M +Sovietica/M Soweto/M Soyinka/M Soyuz/M @@ -11415,6 +11676,7 @@ Sparks/M Sparta/M Spartacus/M Spartan/MS +Spartanburg/M Spears/M Speer/M Spence/RM @@ -11438,6 +11700,7 @@ Spitsbergen/M Spitz/M Spock/M Spokane/M +Springdale/M Springfield/M Springsteen/M Sprint/M @@ -11487,6 +11750,7 @@ Staten/M States Stateside Staubach/M +Staunton/M Stavros Ste Steadicam/M @@ -11520,6 +11784,7 @@ Sterne/M Sterno/M Stetson/M Steuben/M +Steubenville/M Steve/M Steven/MS Stevens/M @@ -11601,6 +11866,7 @@ Sumatra/M Sumatran/SM Sumeria/M Sumerian/SM +Sumerica/M Summer/MS Summers/M Sumner/M @@ -11619,6 +11885,7 @@ Sunni/SM Sunnite/MS Sunny's Sunnyvale/M +Suomi/M Superbowl/M Superfund/M Superglue/M @@ -11698,6 +11965,7 @@ Syracuse/M Syria/M Syriac/M Syrian/MS +Syriana/M Szilard/M Szymborska/M Sèvres/M @@ -11719,6 +11987,8 @@ TEirtza/M TGIF THC THz/M +TIF/SM +TIFF/SM TKO/M TLC/M TM @@ -11845,6 +12115,7 @@ Tate/M Tatiana/M Tatum/M Taurus/MS +Tavares/M Tawney/M Taylor/M Tb/M @@ -11875,14 +12146,18 @@ Teletype Tell/MR Teller/M Telugu/M +Temecula/M Tempe Templar/M +Temple/M Templeton/M Tenn/M Tennessean/SM Tennessee/M Tennyson/M +Tennysonian Tenochtitlan/M +TensorFlow/M Teodor/M Teodora/M Teodoro/M @@ -11923,6 +12198,7 @@ Tevet/M Tex/M Texaco/M Texan/MS +Texarkana/M Texas/M Th/M Thacher/M @@ -12072,6 +12348,7 @@ Titian/M Titicaca/M Tito/M Titus/M +Titusville/M Tl/M Tlaloc/M Tlingit/M @@ -12270,6 +12547,7 @@ Turkey/M Turkic/MS Turkish/M Turkmenistan/M +Turlock/M Turner/M Turpin/M Tuscaloosa/M @@ -12382,6 +12660,7 @@ Unicode/M Unilever/M Union/SM Unionist +Uniontown/M Uniroyal/M Unitarian/MS Unitarianism/MS @@ -12420,6 +12699,7 @@ Uta/M Utah/M Utahan/MS Ute/SM +Utica/M Utopia/SM Utopian/SM Utrecht/M @@ -12432,6 +12712,7 @@ VA VAT/M VAX VAXes +VBA/M VCR/M VD/M VDT @@ -12452,6 +12733,7 @@ VP VT VTOL Va/M +Vacaville/M Vachel/M Vaclav/M Vader/M @@ -12461,6 +12743,7 @@ Val/M Valarie/M Valdemar/M Valdez/M +Valdosta/M Valencia/SM Valenti/M Valentia/M @@ -12478,7 +12761,7 @@ Valhalla/M Valium/MS Valkyrie/SM Valle/M -Vallejo +Vallejo/M Valletta/M Valli/M Valois/M @@ -12585,6 +12868,7 @@ Victor/M Victoria/M Victorian/MS Victorianism +Victorville/M Victrola/M Vida/M Vidal/M @@ -12600,8 +12884,9 @@ Vijayawada/M Viking/MS Vikki/M Vila/M -Villa/M +Villa/SM Villarreal/M +Villas/M Villon/M Vilma/M Vilnius/M @@ -12611,6 +12896,7 @@ Vina/M Vince/M Vincent/M Vindemiatrix/M +Vineland/M Vinnie/M Vinny/M Vinson/M @@ -12628,6 +12914,7 @@ Virginie/M Virgo/SM Visa/M Visakhapatnam/M +Visalia/M Visayans/M Vishnu/M Visigoth/M @@ -12689,6 +12976,7 @@ WMD WNW/M WP WSW/M +WTF WTO WV WW @@ -12720,7 +13008,8 @@ Waldo/M Waldorf/M Wales/M Walesa/M -Walgreen/M +Walgreen/SM +Walgreens/M Walker/M Walkman/M Wall/SMR @@ -12768,19 +13057,23 @@ Waterford/M Watergate/M Waterloo/MS Waters/M +Watertown/M Watkins/M Watson/M +Watsonville/M Watt/SM Watteau/M Watts/M Watusi/M Waugh/M +Wausau/M Wave Waverley/M Waverly/M Wayland/M Waylon/M Wayne/M +Waynesboro/M Weave/RM Weaver/M Web/MR @@ -12800,6 +13093,7 @@ Weider/M Weierstrass/M Weill/M Weinberg/M +Weirton/M Weiss/M Weissmuller/M Weizmann/M @@ -12814,6 +13108,7 @@ Welsh/M Welshman/M Welshmen/M Welshwoman +Wenatchee/M Wendel/M Wendell/M Wendi/M @@ -12910,7 +13205,9 @@ Willey/M Willi/MS William/SM Williams/M +Williamsburg/M Williamson/M +Williamsport/M Willie/M Willis/M Willy/M @@ -12980,6 +13277,7 @@ Wood/SM Woodard/M Woodhull/M Woodie/M +Woodland/M Woodrow/M Woods/M Woodstock/M @@ -13028,6 +13326,8 @@ X/M XBL/M XEmacs/M XL/M +XLS/SM +XLSX/SM XML XPCOM/M XPConnect/M @@ -13036,6 +13336,7 @@ XS XUL/M XULRunner/M XXL +Xamarin/M Xanadu/M Xanax/M Xanthippe/M @@ -13055,7 +13356,9 @@ Xiaoping/M Ximenes/M Ximenez/M Xingu/M +Xinjiang/M Xiongnu/M +Xizang/M Xmas/MS Xochipilli/M Xuzhou/M @@ -13096,6 +13399,7 @@ Yaroslavl/M Yasmin/M Yataro/M Yates/M +Yauco/M Yb/M Yeager/M Yeats/M @@ -13211,6 +13515,7 @@ Zenger/M Zenia/M Zeno/M Zephaniah/M +Zephyrhills/M Zephyrus/M Zeppelin/M Zest/M @@ -13218,6 +13523,7 @@ Zeus/M Zhang/M Zhao/M Zhdanov +Zhejiang/M Zhengzhou/M Zhivago/M Zhou/M @@ -13499,7 +13805,7 @@ accordion/MS accordionist/MS accost/GMDS account/MDSBG -accountability/M +accountability/SM accountable/U accountancy/M accountant/MS @@ -13512,7 +13818,8 @@ accoutrements accredit/SGD accreditation/M accredited/U -accretion/MS +accrete/NDSX +accretion/M accrual/MS accrue/GDS acct @@ -13539,6 +13846,8 @@ acerbate/DSG acerbic acerbically acerbity/M +acetabular +acetabulum acetaminophen/M acetate/MS acetic @@ -13548,6 +13857,7 @@ acetyl acetylene/M ache/DSMG achene/MS +achievable/U achieve/BLZGDRS achievement/SM achiever/M @@ -13653,6 +13963,7 @@ adaptability/M adaptation/MS adapter/M adaption/S +add-on/S add/SDRBZG addend/MS addenda @@ -13754,6 +14065,7 @@ adoption/SM adorableness/M adorably adoration/M +adorbs adore/BZGDRS adorer/M adoring/Y @@ -13882,6 +14194,7 @@ affiliate/EGNDS affiliated/U affiliation/EM affiliations +affine affinity/SM affirm/AGDS affirmation/AMS @@ -13895,6 +14208,7 @@ affluent/Y afford/GDSB affordability affordably +affordance/S afforest/EGSD afforestation/M affray/MS @@ -13947,6 +14261,7 @@ ageless/YP agelessness/M agency/SM agenda/SM +agenesis agent/AMS ageratum/M agglomerate/DSMGNX @@ -14083,6 +14398,7 @@ ajar aka akimbo akin +al/YV alabaster/M alack alacrity/M @@ -14112,7 +14428,7 @@ alderman/M aldermen alderwoman/M alderwomen -ale/SMV +ale/SM aleatory alehouse/SM alembic/SM @@ -14266,6 +14582,7 @@ altruistic altruistically alum/SM alumina/M +aluminize/D aluminum/M alumna/M alumnae @@ -14350,14 +14667,18 @@ amiably amicability/M amicable amicably +amici +amicus amid amide/MS amidship/S amidst amigo/MS +amine/S amino amir/SM amiss +amitriptyline amity/M ammeter/SM ammo/M @@ -14416,7 +14737,9 @@ amulet/MS amuse/LGDS amusement/MS amusing/Y +amygdala amylase/M +amyloid an/CS anabolism/M anachronism/SM @@ -14441,7 +14764,7 @@ analysand/MS analyses/A analysis/AM analyst/SM -analytic +analytic/S analytical/Y analyticalally analyzable @@ -14449,6 +14772,9 @@ analyze/ADSG analyzer/SM anapest/SM anapestic/MS +anaphylactic +anaphylaxes +anaphylaxis anarchic anarchically anarchism/M @@ -14533,6 +14859,7 @@ angularity/SM angulation anhydrous aniline/M +anilingus animadversion/MS animadvert/GSD animal/MS @@ -14587,6 +14914,7 @@ annular annulled annulling annulment/SM +annulus annunciation/SM anode/MS anodize/GDS @@ -14680,8 +15008,11 @@ anticyclone/SM anticyclonic antidemocratic antidepressant/MS +antiderivative/S antidote/MS +antifa antifascist/MS +antiferromagnetic antifreeze/M antigen/SM antigenic @@ -14698,6 +15029,8 @@ antimatter/M antimicrobial antimissile antimony/M +antineutrino/SM +antineutron/MS antinuclear antioxidant/MS antiparticle/SM @@ -14714,6 +15047,7 @@ antipodean/MS antipodes/M antipollution antipoverty +antiproton/MS antiquarian/SM antiquarianism/M antiquary/SM @@ -15095,6 +15429,7 @@ arras/MS array/EGMDS arrears/M arrest/AGMDS +arrestee/S arrhythmia/M arrhythmic arrhythmical @@ -15123,6 +15458,7 @@ artful/PY artfulness/M arthritic/MS arthritis/M +arthroplasty arthropod/MS arthroscope/SM arthroscopic @@ -15144,6 +15480,8 @@ artilleryman/M artillerymen artiness/M artisan/MS +artisanal/Y +artisanship/S artist/MS artiste/MS artistic/I @@ -15212,6 +15550,7 @@ aspidistra/MS aspirant/MS aspirate/MGNDSX aspiration/M +aspirational/Y aspirator/SM aspire/GDS aspirin/MS @@ -15260,8 +15599,9 @@ assigner/MS assignment/AMS assignor/MS assimilate/DSGN +assimilated/U assimilation/M -assist/GMDS +assist/GVMDS assistance/M assistant/SM assisted/U @@ -15272,9 +15612,11 @@ associate's associate/EDSGNV association/EM associations +associativity assonance/M assonant/MS assort/GLDS +assortative assortment/MS asst assuage/GDS @@ -15334,6 +15676,7 @@ asymmetric asymmetrical/Y asymmetry/SM asymptomatic +asymptote/S asymptotic asymptotically asynchronicity @@ -15491,8 +15834,7 @@ auspiciousness/M austere/RYT austerity/SM austral -auteur's -auteurs +auteur/SM authentic/IU authentically authenticate/XGNDS @@ -15587,6 +15929,7 @@ avidity/M avionic/S avionics/M avitaminosis/M +avo/S avocado/SM avocation/MS avocational @@ -15594,6 +15937,7 @@ avoid/SDGB avoidable/U avoidably/U avoidance/M +avoidant avoirdupois/M avouch/DSG avow/EDGS @@ -15706,6 +16050,7 @@ backhoe/MS backing/M backlash/MS backless +backlit backlog/MS backlogged backlogging @@ -15726,8 +16071,11 @@ backslide/RSZG backslider/M backspace/DSMG backspin/M +backsplash/S +backstab/S backstabber/MS backstabbing +backstabby backstage/M backstair/S backstop/SM @@ -15759,6 +16107,7 @@ bacteriologist/SM bacteriology/M bacterium/M bad/MYP +badass/S badder baddest baddie/M @@ -15828,6 +16177,8 @@ baleful/PY balefulness/M baler/M balk/SGMD +balkanization +balkanize/GDS balky/RT ball/SGMD ballad/SM @@ -15869,6 +16220,7 @@ ban/SM banal/Y banality/SM banana/SM +banc/S band's band/ESGD bandage/DSMG @@ -15935,7 +16287,7 @@ baptize/ZGDRS baptized/U baptizer/M bar's -bar/ECUTS +bar/ECAUTS barb/SZGMDR barbacoa barbarian/SM @@ -15956,6 +16308,7 @@ barbie/S barbiturate/SM barbwire/M barcarole/SM +barcode/GDS bard/SM bardic bare/DRSPYG @@ -16051,6 +16404,7 @@ bashing/M basic/MS basically basil/M +basilar basilica/MS basilisk/MS basin/MS @@ -16189,6 +16543,7 @@ beating/M beatitude/SM beatnik/MS beau/SM +beaucoup beaut/MS beauteous/Y beautician/SM @@ -16404,6 +16759,7 @@ benign/Y benignant benignity/M bent/SM +bentonite bentwood/M benumb/DSG benzene/M @@ -16556,6 +16912,7 @@ biennial/MYS biennium/MS bier/M biff/SGD +bifida bifocal/S bifocals/M bifurcate/XDSGN @@ -16579,6 +16936,7 @@ bigness/M bigot/MDS bigotry/SM bigwig/MS +bijection/S bijou/M bijoux bike/DRSMZG @@ -16616,9 +16974,11 @@ billycan/S bimbo/MS bimetallic/SM bimetallism/M +bimodal bimonthly/SM bin/SM binary/SM +binaural bind's bind/AUGS binder/MS @@ -16626,6 +16986,7 @@ bindery/SM binding/MS bindweed/M binge/MGDS +bingeable bingeing bingo/M binman @@ -16636,6 +16997,7 @@ binning binocular/MS binomial/SM bio/SM +biochem biochemical/SMY biochemist/MS biochemistry/M @@ -16645,17 +17007,21 @@ biodiesel/M biodiversity/M bioethics/M biofeedback/M +biofilm/MS biog biographer/SM biographic biographical/Y biography/SM +biohacker/MS +biohacking bioinformatic/MS biol biologic biological/Y biologist/MS biology/M +biomarker/MS biomass/M biomedical bionic/S @@ -16801,6 +17167,7 @@ blameworthiness/M blameworthy/P blammo blanch/GDS +blanche blancmange/MS bland/PTRY blandish/DSLG @@ -16897,6 +17264,7 @@ blockader/M blockage/MS blockbuster/SM blockbusting/M +blockchain/S blocker/MS blockhead/SM blockhouse/MS @@ -17129,6 +17497,8 @@ bomber/M bombproof bombshell/SM bombsite/S +bon/S +bona bonanza/MS bonbon/MS bonce/S @@ -17157,6 +17527,7 @@ bonito/MS bonk/SZGD bonnet/MS bonny/TR +bono bonobo/MS bonsai/M bonus/MS @@ -17198,6 +17569,7 @@ bookshop/SM bookstall/S bookstore/MS bookworm/SM +boolean boom/SZGMDR boombox/MS boomerang/MDGS @@ -17276,6 +17648,7 @@ botcher/M both bother/SMDG botheration +bothered/U bothersome botnet/SM bottle/DRSMZG @@ -17291,6 +17664,7 @@ bougainvillea/MS bough/M boughs bought +bougie/S bouillabaisse/SM bouillon/MS boulder/SM @@ -17406,7 +17780,7 @@ bran/M branch/GMDS branchlike brand/ZGMDRS -branded/U +branded/UA brander/M brandish/DSG brandy/GDSM @@ -17753,7 +18127,7 @@ bulldogged bulldogging bulldoze/ZGDRS bulldozer/M -bullet/SM +bullet/SMD bulletin/MDGS bulletproof/SDG bullfight/SMRZG @@ -17771,6 +18145,7 @@ bullishness/M bullock/SM bullpen/SM bullring/MS +bullseye/S bullshit/MS! bullshitted/! bullshitter/SM! @@ -17822,6 +18197,7 @@ bunting/M buoy/MDGS buoyancy/M buoyant/Y +bupkis bur/SMY burble/DSMG burbs/M @@ -18145,6 +18521,8 @@ cameo/MS camera/MS cameraman/M cameramen +camerapeople +cameraperson camerawoman/M camerawomen camerawork @@ -18186,6 +18564,7 @@ cancellation/SM cancelled/U canceller/M cancelling +cancelous cancer/MS cancerous candelabra/SM @@ -18314,6 +18693,7 @@ capsulize/DSG capt captain/SMDG captaincy/SM +captcha caption/SMDG captious/YP captiousness/M @@ -18368,12 +18748,14 @@ cardiac cardie/S cardigan/SM cardinal/SMY +cardinality/S cardio cardiogram/SM cardiograph/M cardiographs cardiologist/MS cardiology/M +cardiomegaly cardiomyopathy cardiopulmonary cardiovascular @@ -18412,6 +18794,7 @@ carjack/JSDRZG carjacker/M carjacking/M carload/SM +carmaker/S carmine/SM carnage/M carnal/Y @@ -18469,6 +18852,7 @@ carsick/P carsickness/M cart/SZGMDR cartage/M +carte/S cartel/MS carter/M carthorse/SM @@ -18660,6 +19044,7 @@ caviar/M cavil/ZGJMDRS caviler/M caving/M +cavitation cavity/FSM cavort/DGS caw/SMDG @@ -18800,6 +19185,7 @@ cession/KAFSM cesspit/S cesspool/MS cetacean/MS +ceteris cf cg ch/IFVT @@ -19421,6 +19807,7 @@ cl clack/GMDS clad/U cladding/M +clade claim's claim/CKEAGDS claimable/AKE @@ -19487,6 +19874,7 @@ classifieds classifier/MS classify/ACSDGN classiness/M +classism classless/P classmate/MS classroom/MS @@ -19625,6 +20013,7 @@ cloistral clomp/SDG clonal clone/DSMG +clonidine clonk/SMDG clop/MS clopped @@ -19691,8 +20080,8 @@ clunker/M clunky/TR cluster/MDSG clutch/GMDS -clutter/MDSG -cluttered/U +clutter's +clutter/UDSG clvi clvii clxi @@ -19764,6 +20153,7 @@ cochlear cock/MDGS cockade/SM cockamamie +cockatiel/MS cockatoo/SM cockatrice/SM cockchafer/S @@ -19816,6 +20206,7 @@ coeducation/M coeducational coefficient/MS coelenterate/MS +coenzyme coequal/MYS coerce/DRSZGNV coercer/M @@ -19931,13 +20322,16 @@ collectivize/DSG collector/MS colleen/SM college/SM +collegial collegiality/M collegian/MS collegiate -collide/DSG +collide/DRSZG collie/RSMZ collier/M colliery/SM +collinear +collinearity collision/SM collocate/MGNDSX collocation/M @@ -19952,6 +20346,7 @@ colloquy/M collude/DSG collusion/M collusive +colocate/XDSGN cologne/SM colon/SM colonel/SM @@ -20012,16 +20407,17 @@ combativeness/M combed/U comber/M combination/SM +combinatorics combine's combine/ADSG combined/U combiner/MS combings/M combo/SM +combust/SGVD combustibility/M combustible/MS combustion/M -combustive come/IMZGRS comeback/MS comedian/MS @@ -20105,6 +20501,7 @@ commode's commode/EIS commodification commodious/Y +commoditization commodity/SM commodore/SM common's @@ -20138,9 +20535,11 @@ communistic community/SM commutation/MS commutative +commutativity commutator/SM commute/BDRSMZG commuter/M +comorbidity comp/MDYGS compact/TGSMDRYP compaction @@ -20155,7 +20554,7 @@ comparability/M comparable/I comparably/I comparative/MYS -compare/BDSMG +compare/BDSG comparison/MS compartment/SM compartmental @@ -20232,6 +20631,7 @@ composedly composer/MS composite/MYGNXPDS composition/CM +compositional compositor/SM compost/SGMD composure/EM @@ -20247,10 +20647,10 @@ comprehensions comprehensive/PMYS comprehensiveness/M compress's -compress/CGDS +compress/CGVDS compressed/U compressible -compression/CM +compression/CMS compressor/SM comprise/GDS compromise/MGDS @@ -20365,6 +20765,7 @@ condiment/MS condition's condition/AGSD conditional/SMY +conditionality conditioned/U conditioner/SM conditioning/M @@ -20419,7 +20820,7 @@ confidentiality/M confider/M confiding/Y configuration/S -configure/B +configure/ABD confined/U confinement/MS confirm/ASDG @@ -20438,6 +20839,7 @@ confluence/MS confluent conform/ZB conformable/U +conformal conformance/M conformant conformism/M @@ -20472,7 +20874,7 @@ congregational congregationalism/M congregationalist/MS congress/MS -congressional +congressional/Y congressman/M congressmen congresspeople @@ -20612,7 +21014,6 @@ constrict/GVSD constriction/SM constrictor/SM construable -construct's construct/CADVGS construction/CAMS constructional @@ -20682,7 +21083,7 @@ contestable/I contestant/MS contested/U contextualization -contextualize/DSG +contextualize/CDSG contiguity/M contiguous/Y continence/IM @@ -20701,6 +21102,7 @@ continuum/M contort/GD contortion/MS contortionist/SM +contra contraband/M contrabassoon/S contraception/M @@ -20876,7 +21278,8 @@ copycatted copycatting copyist/MS copyleft -copyright/GSMD +copyright/GSBMD +copyrightable/U copywriter/MS coquetry/SM coquette/DSMG @@ -20971,6 +21374,7 @@ corrector correlate/XDSMGNV correlated/U correlation/M +correlational correlative/MS correspond/SDG correspondence/SM @@ -21003,6 +21407,7 @@ cortege/MS cortex/M cortical cortices +cortisol cortisone/M cortège/SM corundum/M @@ -21031,7 +21436,7 @@ cosmonaut/SM cosmopolitan/MS cosmopolitanism/M cosmos/MS -cosplay +cosplay/DRSZG cosponsor/GSMD cosset/SGD cossetted @@ -21130,8 +21535,10 @@ countersign/GSMD countersignature/MS countersink/GSM counterspy/SM +counterstroke/SM countersunk countertenor/MS +countertop/S countervail/GSD counterweight/MS countess/MS @@ -21150,7 +21557,7 @@ coup's coup/AS coupe/SM couple's -couple/UCGSD +couple/UCGZSRD couplet/MS coupling/SM coupon/SM @@ -21180,6 +21587,9 @@ couscous/M cousin/SM couture/M couturier/MS +covalent +covariance +covariant cove/MS coven/SM covenant/MDSG @@ -21291,6 +21701,7 @@ cranky/PRT cranny/DSM crap/MS crape/SM +crapola crapped crapper/S crappie/M @@ -21412,6 +21823,7 @@ crime/SM crimeware/M criminal/MYS criminality/M +criminalization/C criminalize/CGDS criminologist/MS criminology/M @@ -21438,6 +21850,7 @@ criteria criterion/M critic/SM critical/UY +criticality criticism/MS criticize/ZGDRS criticizer/M @@ -21470,6 +21883,7 @@ cropper/MS cropping croquet/M croquette/SM +crore/SM crosier/MS cross's cross/AUGTSD @@ -21514,6 +21928,7 @@ crowbar/MS crowd/SMDG crowded/U crowdfund/SDG +crowdsource/DSG crowfeet crowfoot/SM crown/SMDG @@ -21575,11 +21990,14 @@ cryogenic/S cryogenics/M cryonic/S cryosurgery/M -crypt/SM +crypt's +crypt/S cryptic cryptically +cryptocurrency/SM cryptogram/SM cryptographer/SM +cryptographic cryptography/M cryptologist/MS cryptosystem/S @@ -21623,6 +22041,7 @@ cullender/MS culminate/XDSGN culmination/M culotte/SM +culpa/S culpability/M culpable/I culpably @@ -21673,7 +22092,7 @@ curability/M curacao curacy/SM curare/M -curate/DSMGV +curate/DSMGNV curative/MS curator/KMS curatorial @@ -21755,7 +22174,7 @@ customary/U customer/M customhouse/SM customization/M -customize/DSG +customize/DSGB cut/TSMR cutaneous cutaway/MS @@ -21782,6 +22201,7 @@ cw cwt cyan/M cyanide/M +cyanobacteria cyber cyberbully/SM cybercafe/S @@ -21789,6 +22209,7 @@ cybercafé/S cybernetic/S cybernetics/M cyberpunk/SM +cybersecurity cybersex cyberspace/MS cyborg/SM @@ -21817,8 +22238,17 @@ cynosure/MS cypher/M cypress/MS cyst/MS +cysteine/SM cystic +cysticerci +cysticercoid/S +cysticercoses +cysticercosis +cysticercus cystitis +cystoscope +cystoscopic +cystoscopy cytokine/SM cytologist/SM cytology/M @@ -21953,6 +22383,8 @@ dastard/MYS dastardliness/M data database/SM +dataset's +datasets datasheet/SM datatype date/DRSMZGV @@ -21961,6 +22393,7 @@ dated/U dateless dateline/MGDS dater/M +dateset dative/MS datum/M daub/SZGMDR @@ -21997,6 +22430,7 @@ dc dd/SDG dded/K dding/K +de deacon/MS deaconess/MS dead/XTMNRY @@ -22101,6 +22535,7 @@ decidable/U decide/BZGDRS decided/Y deciduous +decile/S deciliter/MS decimal/SM decimalization @@ -22110,6 +22545,7 @@ decimeter/MS decipherable/UI decision/IM decisions +decisis decisive/IPY decisiveness/IM deck/SGMD @@ -22129,6 +22565,7 @@ declination/M decline/DRSMZG decliner/M declivity/SM +decoherence decolletage/SM decollete decongestant/MS @@ -22148,12 +22585,12 @@ decoy/GMDS decreasing/Y decree/MDS decreeing -decremented -decrements +decrement/GDS decrepit decrepitude/M decriminalization/M decry/GDS +decrypt/BSGD decryption dedicate/AGDS dedication/SM @@ -22227,6 +22664,7 @@ definer/MS definite/IYVP definiteness/IM definition/AM +definitional/Y definitions definitive/Y deflate/GNDS @@ -22334,7 +22772,7 @@ demigoddess/MS demijohn/SM demimondaine/SM demimonde/M -demise/MGDS +demise/MGD demitasse/MS demo/GMD democracy/SM @@ -22367,6 +22805,7 @@ demonstration/M demonstrative/MYSP demonstrativeness/M demonstrator/MS +demonym/S demote/GD demotic demount @@ -22578,7 +23017,7 @@ destitute/N destitution/M destroy/SZGDR destroyer/M -destruct/GVMDS +destruct/GVD destructibility/IM destructible/I destruction/M @@ -22614,6 +23053,7 @@ determinedly determiner/SM determinism/M deterministic +deterministically deterred/U deterrence/M deterrent/MS @@ -22715,6 +23155,8 @@ dialyses dialysis/M dialyzes diam +diamagnetic +diamagnetism diamante diamanté diameter/SM @@ -22740,6 +23182,7 @@ diatomaceous diatomic diatonic diatribe/SM +diazepam dibble/DSMG dibs/M dice/GDS @@ -22798,10 +23241,12 @@ differ/DG difference/IM differences different/IY +differentiable differential/SM differentiate/DSGN differentiated/U differentiation/M +differentiator/S difficult/Y difficulty/SM diffidence/M @@ -22811,6 +23256,7 @@ diffraction/M diffuse/DSYGNVP diffuseness/M diffusion/M +diffusivity dig/SM digerati/M digest/SMDGV @@ -22857,6 +23303,7 @@ diligent/Y dill/MS dilly/SM dillydally/DSG +diluent dilute/DSGNX diluted/U dilution/M @@ -22942,7 +23389,7 @@ directer direction/IM directional directionless -directions +directions/A directive/SM directly directness/IM @@ -22969,7 +23416,7 @@ disappointing/Y disarming/Y disastrous/Y disbandment/M -disbarment/M +disbarment/SM disbelieving/Y disbursal/M disburse/DSGL @@ -23007,7 +23454,8 @@ discotheque/SM discourage/LGDS discouragement/SM discouraging/Y -discover/ASDG +discover/ABSDG +discoverability discovered/U discoverer/MS discovery/ASM @@ -23139,7 +23587,7 @@ dissimilitude/S dissing dissipate/GNDS dissipation/M -dissociate/GNDS +dissociate/GNVDS dissociation/M dissoluble/I dissolute/YNP @@ -23172,8 +23620,10 @@ distinguishable/I distinguished/U distort/GDR distortion/MS -distract/DG +distract/DGB +distractability distracted/Y +distractible distraction/S distrait distraught @@ -23226,7 +23676,7 @@ diversify/GNDS diversion/M diversionary diversity/SM -divert/SDG +divert/SDRZG diverticulitis/M divest/SLDG divestiture/MS @@ -23255,6 +23705,8 @@ divot/SM divulge/GDS divvy/DSMG dixieland/M +dizygotic +dizygous dizzily dizziness/M dizzy/DRSPTG @@ -23425,6 +23877,8 @@ doorstepping doorstop/MS doorway/SM dooryard/MS +doozie +doozy dopa/M dopamine dope/MZGDRS @@ -23526,6 +23980,7 @@ downstairs/M downstate/M downstream downswing/MS +downtempo downtime/M downtown/M downtrend/MS @@ -23537,7 +23992,10 @@ downy/RT dowry/SM dowse/DRSZG dowser/M +dox/GDS +doxastic doxology/SM +doxx/DSG doyen/SM doyenne/MS doz/XGDNS @@ -23627,9 +24085,13 @@ drear drearily dreariness/M dreary/RPT +dreck +dreckish +drecky dredge/DRSMZG dredger/M dregs/M +drek drench/GDS dress/AUGSDM dressage/M @@ -23773,6 +24235,7 @@ duelist/SM duenna/MS duet/MS duff/MDRZGS +duffel/S duffer/M dug dugout/MS @@ -23826,7 +24289,7 @@ duper/M duple duplex/MS duplicate's -duplicate/AGNDS +duplicate/AGNVDS duplication/AM duplicator/MS duplicitous @@ -23902,6 +24365,9 @@ dysphoria dysphoric dysprosium/M dystonia +dystopi +dystopia/S +dystopian/S dz débridement débutante/SM @@ -24003,6 +24469,7 @@ ecclesial ecclesiastic/SM ecclesiastical/Y echelon/SM +echidna echinoderm/SM echo's echo/ADG @@ -24025,7 +24492,7 @@ ecological/Y ecologist/MS ecology/M econ -econometric +econometric/S economic/S economical/UY economics/M @@ -24040,6 +24507,8 @@ ecru/M ecstasy/SM ecstatic ecstatically +ectopic +ectopically ecu/S ecumenical/Y ecumenicism/M @@ -24122,7 +24591,9 @@ effluence/M effluent/MS effluvia effluvium/M +efflux effort/SM +effortful effortless/YP effortlessness/M effrontery/M @@ -24132,7 +24603,7 @@ effuse/DSGNVX effusion/M effusive/YP effusiveness/M -egad +egad/S egalitarian/SM egalitarianism/M egg/GSMD @@ -24165,6 +24636,7 @@ eh eider/SM eiderdown/MS eigenvalue/S +eigenvector/S eight/SM eighteen/MHS eighteenth/M @@ -24255,6 +24727,7 @@ electroshock/M electrostatic/S electrostatics/M electrotype/MS +electroweak eleemosynary elegance/IM elegant/IY @@ -24312,7 +24785,7 @@ elope/DSGL elopement/MS eloquence/M eloquent/Y -else +else/M elsewhere elucidate/DSGNX elucidation/M @@ -24358,6 +24831,7 @@ ember/SM embezzle/ZGLDRS embezzlement/M embezzler/M +embiggen embitter/GLDS embitterment/M emblazon/GDLS @@ -24430,6 +24904,8 @@ emotionless emotive/Y empanel/GDS empathetic +empathic +empathically empathize/DSG empathy/M emperor/MS @@ -24502,7 +24978,7 @@ enclave/MS enclose/GDS enclosed/U enclosure/SM -encode/DRSZG +encode/DRSJZG encoder/M encomium/MS encompass/GDS @@ -24516,6 +24992,7 @@ encroachment/SM encrust/DGS encrustation/SM encrypt/DGS +encrypted/U encryption encumber/EGSD encumbered/U @@ -24559,6 +25036,7 @@ endoscopic endoscopy/M endothelial endothermic +endotracheal endow/SDLG endowment/MS endpoint/SM @@ -24668,6 +25146,7 @@ entanglement/EM entanglements entente/SM enter/ASGD +enteral enteric enteritis/M enterprise/MGS @@ -24701,6 +25180,7 @@ entomology/M entourage/SM entr'acte entrails/M +entrained entrance/LDSMG entrancement/M entrancing/Y @@ -24873,6 +25353,8 @@ erelong eremite/MS erg/SM ergo +ergodic +ergodicity ergonomic/S ergonomically ergonomics/M @@ -24970,12 +25452,14 @@ estimate/MGNDSX estimation/M estimator/SM estoppel +estradiol estrange/LDSG estrangement/MS -estrogen/M +estrogen/MS estrous estrus/MS estuary/SM +et eta/SM etc etch/DRSZGJ @@ -24991,6 +25475,7 @@ ethereal/Y ethic/SM ethical/UY ethics/M +ethmoid ethnic/SM ethnically ethnicity/M @@ -25020,12 +25505,16 @@ etymologist/SM etymology/SM eucalypti eucalyptus/MS +eucaryote/SM +eucaryotic euchre/DSMG euclidean eugenic/S eugenically eugenicist/MS eugenics/M +eukaryote/SM +eukaryotic eulogist/MS eulogistic eulogize/ZGDRS @@ -25048,6 +25537,8 @@ eutectic euthanasia/M euthanize/DSG euthenics/M +eutrophic +eutrophication evacuate/XDSGN evacuation/M evacuee/MS @@ -25055,6 +25546,7 @@ evade/DRSZG evader/M evaluate/AGNVDSX evaluation/AM +evaluator/S evanescence/M evanescent evangelic @@ -25099,6 +25591,9 @@ evict/SDG eviction/MS evidence/MGDS evident/Y +evidential/Y +evidentiality +evidentiary evil/MRYTSP evildoer/SM evildoing/M @@ -25144,6 +25639,7 @@ exasperate/DSGN exasperated/Y exasperating/Y exasperation/M +exbibyte/MS excavate/GNDSX excavation/M excavator/SM @@ -25177,6 +25673,7 @@ excited/Y excitement/SM exciter/M exciting/Y +exciton excl exclaim/DGS exclamation/SM @@ -25238,6 +25735,7 @@ exerciser/M exert/SDG exertion/MS exeunt +exfiltrate/GNXDS exfoliate/GNDS exhalation/MS exhale/DSG @@ -25263,6 +25761,7 @@ exigent exiguity/M exiguous exile/DSMG +exilic exist/SDG existence/MS existent @@ -25353,6 +25852,7 @@ expiry/M explain/ADGS explainable explained/U +explainer/S explanation/MS explanatory expletive/MS @@ -25407,7 +25907,9 @@ expropriate/GNXDS expropriation/M expropriator/SM expulsion/MS -expunge/GDS +expunction +expunge/LGDS +expungement/S expurgate/DSGNX expurgated/U expurgation/M @@ -25423,6 +25925,7 @@ extemporize/GDS extend/SZGDRB extender/M extendible +extensibility extensible extension/SM extensional @@ -25450,12 +25953,13 @@ extolled extolling extort/SGD extortion/MRZ +extortionary extortionate/Y extortioner/M extortionist/MS extra/SM extracellular -extract/MDGS +extract/MDGVS extraction/SM extractor/MS extracurricular @@ -25479,11 +25983,13 @@ extravagance/MS extravagant/Y extravaganza/MS extravehicular +extrema extreme/PMYTRS extremeness/M extremism/M extremist/MS extremity/SM +extremum/S extricable/I extricate/GNDS extrication/M @@ -25528,6 +26034,7 @@ eyetooth/M eyewash/M eyewitness/MS f/CIAVTR +fMRI fa/M fab fable/DSM @@ -25543,6 +26050,7 @@ facecloth/M facecloths faceless facelift/SM +facepalm/SDG facet/SMDG facetious/YP facetiousness/M @@ -25561,6 +26069,7 @@ factional factionalism/M factious factitious +facto factoid/SM factor's factor/ASDG @@ -25585,7 +26094,7 @@ fagging faggot/SMG fagot/SMG faience/M -fail/MDGJS +fail/DGJS failing/M faille/M failure/SM @@ -25779,6 +26288,7 @@ fauna/SM fauvism/M fauvist/SM faux +fav/S fave/S favor/ESMDG favorable/U @@ -25798,6 +26308,7 @@ fearful/YP fearfulness/M fearless/PY fearlessness/M +fearmonger/MSG fearsome feasibility/M feasible/IU @@ -25898,6 +26409,7 @@ ferocity/M ferret/GSMD ferric ferromagnetic +ferromagnetism ferrous ferrule/MS ferry/DSMG @@ -25997,6 +26509,7 @@ fiddler/M fiddlesticks fiddly/TR fidelity/IM +fides fidget/SGMD fidgety fiduciary/SM @@ -26096,7 +26609,7 @@ financial/YS financier/MS financing/M finch/MS -find/JMRZGS +find/BJMRZGS finder/M finding/M findings/M @@ -26128,6 +26641,8 @@ finite/IY fink/MDGS finned finny +fintech +fintechs fir/ZGSJMDRH fire/MS firearm/SM @@ -26273,6 +26788,7 @@ flamingo/MS flammability/IM flammable/SM flan/MS +flaneur/SM flange/MS flank/SZGMDR flanker/M @@ -26500,6 +27016,7 @@ fluorite/M fluorocarbon/MS fluoroscope/SM fluoroscopic +fluoxetine flurry/GDSM flush/MDRSTG fluster/MDSG @@ -26862,6 +27379,7 @@ foulmouthed foulness/M found/FSDG foundation/SM +foundational founded/U founder/GMDS foundling/SM @@ -26920,6 +27438,7 @@ framed/U framer/M framework/SM franc/SM +franca franchise's franchise/EDSG franchisee/SM @@ -27001,6 +27520,7 @@ freezing's freight/MDRZGS freighter/M french +frenemy/S frenetic frenetically frenzied/Y @@ -27164,6 +27684,7 @@ fuehrer/MS fuel's fuel/ADGS fug +fugacious/PY fugal fuggy fugitive/MS @@ -27200,7 +27721,8 @@ functionalism functionalist/S functionality/S functionary/SM -fund/AMDGS +functor +fund/AMDRZGS fundamental/SMY fundamentalism/M fundamentalist/SM @@ -27248,6 +27770,7 @@ furnished/U furnishings/M furniture/M furor/SM +furosemide furred furrier/M furriness/M @@ -27530,7 +28053,7 @@ gazelle/MS gazer/M gazette/MGDS gazetteer/MS -gazillion/S +gazillion/HS gazpacho/M gazump/DGS gear/MDGS @@ -27609,7 +28132,7 @@ genning genocidal genocide/MS genome/MS -genomics +genomic/SM genre/SM gent/AMS genteel/YP @@ -27638,6 +28161,8 @@ genus/M geocache/DSG geocentric geocentrically +geocentricism +geocentrism geochemistry/M geode/SM geodesic/SM @@ -27663,7 +28188,7 @@ geometry/SM geophysical geophysicist/SM geophysics/M -geopolitical +geopolitical/Y geopolitics/M geostationary geosynchronous @@ -27683,6 +28208,7 @@ germicide/MS germinal/M germinate/GNDS germination/M +gerontocracy gerontological gerontologist/MS gerontology/M @@ -27730,6 +28256,7 @@ gibbet/GMDS gibbon/MS gibbous gibe/MGDS +gibibyte/MS giblet/SM giddily giddiness/M @@ -27831,6 +28358,7 @@ glamorization/M glamorize/DSG glamorous/Y glamour/GMDS +glamping glance/DSMG gland/SM glandes @@ -27899,6 +28427,7 @@ globular globule/MS globulin/M glockenspiel/SM +glom/DGS gloom/M gloomily gloominess/M @@ -27933,6 +28462,7 @@ glum/YP glummer glummest glumness/M +gluon/S glut/MNS gluten/M glutenous @@ -27946,6 +28476,7 @@ glycerin/M glycerine/M glycerol/M glycogen/M +glycol glyph gm gnarl/SMDG @@ -27986,6 +28517,7 @@ goblet/SM goblin/SM gobsmacked gobstopper/S +gochujang god/SM godawful godchild/M @@ -28209,6 +28741,7 @@ granola/M grant/SMDRZG grantee/MS granter/M +grantor/MS grantsmanship/M granular granularity/M @@ -28299,6 +28832,7 @@ greenish greenmail/M greenness/M greenroom/SM +greenstone greensward/M greenwood/M greet/ZGJSDR @@ -28470,6 +29004,7 @@ grungy/RT grunion/SM grunt/SGMD gt +guac guacamole/M guanine/M guano/M @@ -28579,6 +29114,7 @@ gunshot/MS gunslinger/SM gunsmith/M gunsmiths +gunsmoke gunwale/MS guppy/SM gurgle/MGDS @@ -28641,6 +29177,7 @@ gyve/MGDS h'm h/NRSXZGVJ ha/SH +habeas haberdasher/SM haberdashery/SM habiliment/SM @@ -28667,6 +29204,7 @@ hacktivist/MS hackwork/M had haddock/SM +hadith/S hadn't hadst hafnium/M @@ -28824,8 +29362,10 @@ handspring/MS handstand/SM handwork/M handwoven +handwrite/GS handwriting/M handwritten +handwrote handy/UTR handyman/M handymen @@ -28858,6 +29398,8 @@ happenstance/SM happily/U happiness/UM happy/URTP +haptic/S +haptical/Y harangue/MGDS harass/LZGDRS harasser/M @@ -28902,6 +29444,7 @@ harelip/SM harelipped harem/SM haricot/S +harissa hark/DGS harlequin/SM harlot/SM @@ -29007,6 +29550,7 @@ hawthorn/MS hay/GSMD haycock/SM hayloft/SM +haymaker/S haymaking haymow/SM hayrick/MS @@ -29075,6 +29619,7 @@ headship/SM headshrinker/SM headsman/M headsmen +headspace headstall/SM headstand/SM headstone/SM @@ -29207,6 +29752,9 @@ helical helices helicopter/SGMD heliocentric +heliocentrically +heliocentricism +heliocentrism heliotrope/SM helipad/S heliport/MS @@ -29245,6 +29793,7 @@ hematological hematologist/MS hematology/M heme/M +hemiplegia hemisphere/SM hemispheric hemispherical @@ -29314,6 +29863,7 @@ heretic/SM heretical hereto heretofore +hereunder hereunto hereupon herewith @@ -29325,6 +29875,7 @@ hermetic hermetical/Y hermit/SM hermitage/MS +hermitian hernia/SM hernial herniate/GNDS @@ -29370,8 +29921,7 @@ hexagon/MS hexagonal hexagram/SM hexameter/SM -hexane's -hexanes +hexane/SM hey heyday/SM hf @@ -29472,6 +30022,7 @@ hippest hippie/M hipping hippo/SM +hippocampus hippodrome/SM hippopotami hippopotamus/MS @@ -29489,6 +30040,7 @@ histamine/MS histogram/MS histologist/SM histology/M +histopathology historian/MS historic historical/Y @@ -29539,6 +30091,7 @@ hobnobbed hobnobbing hobo/MS hoboes +hoc hock/MDSG hockey/M hockshop/MS @@ -29655,6 +30208,7 @@ homogenize/DSG homograph/M homographs homologous +homology homonym/SM homophobia/M homophobic @@ -29724,6 +30278,7 @@ hopeful/PSMY hopefulness/M hopeless/YP hopelessness/M +hophead/S hopped hopper/MS hopping @@ -29733,9 +30288,11 @@ horde/DSMG horehound/SM horizon/SM horizontal/SMY +hormesis hormonal hormone/SM horn/MDS +hornbeam/S hornblende/M hornet/MS hornless @@ -29902,6 +30459,7 @@ howitzer/SM howl/MDRSZG howler/M howsoever +howto/SM hoyden/MS hoydenish hp @@ -30069,6 +30627,8 @@ hydraulics/M hydro/M hydrocarbon/MS hydrocephalus/M +hydrochloride +hydrocortisone hydrodynamic/S hydrodynamics/M hydroelectric @@ -30086,6 +30646,7 @@ hydrolysis/M hydrolyze/DSG hydrometer/SM hydrometry/M +hydrophilic hydrophobia/M hydrophobic hydrophone/SM @@ -30095,6 +30656,7 @@ hydroponically hydroponics/M hydrosphere/M hydrotherapy/M +hydrothermal hydrous hydroxide/SM hyena/SM @@ -30116,12 +30678,14 @@ hyperbola/SM hyperbole/M hyperbolic hypercritical/Y +hypercube hyperglycemia/M hyperinflation hyperlink/GSMD hypermarket/S hypermedia/M hyperparathyroidism +hyperplane hypersensitive/P hypersensitiveness/M hypersensitivity/SM @@ -30134,6 +30698,7 @@ hyperthyroidism/M hypertrophy/DSMG hyperventilate/GNDS hyperventilation/M +hypervisor/MS hyphen/MDSG hyphenate/XDSMGN hyphenation/M @@ -30174,6 +30739,7 @@ hysteric/SM hysterical/Y hysterics/M i/US +iOS/M iPad/M iPhone/M iPod/MS @@ -30182,6 +30748,8 @@ iamb/MS iambi iambic/SM iambus/MS +iatrogenesis +iatrogenic ibex/MS ibid ibidem @@ -30266,11 +30834,12 @@ idyllically if/SM iffiness/M iffy/RTP +iftar/S igloo/SM igneous -ignitable -ignite/AGDS -ignition/MS +ignite/ZGNBXDRS +igniter/M +ignition/M ignoble ignobly ignominious/Y @@ -30408,6 +30977,7 @@ immutable immutably imp/SMR impact/SMDG +impactful impair/SDGL impaired/U impairment/MS @@ -30615,6 +31185,7 @@ impulse/MGNVDS impulsion/M impulsive/PY impulsiveness/M +impulsivity impunity/M impure/RYT impurity/SM @@ -30649,7 +31220,7 @@ incalculably incandescence/M incandescent/Y incantation/SM -incapacitate/GDS +incapacitate/GNDS incarcerate/XDSGN incarceration/M incarnadine/DSG @@ -30714,12 +31285,13 @@ inconvenience/GD incorporate/ADSGN incorporated/U incorporation/AM +incorporator/S incorporeal incorrect/Y incorrigible/P incorrigibly increasing/Y -increment/SMD +increment/SMDG incremental/Y incrementalism incrementalist/SM @@ -30911,6 +31483,7 @@ infinitesimal/SMY infinitival infinitive/MS infinitude/M +infinitum infinity/SM infirm infirmary/SM @@ -30921,7 +31494,7 @@ inflammable inflammation/SM inflammatory inflatable/SM -inflate/DSGNB +inflate/ADSG inflation/EM inflationary inflect/SDG @@ -30940,6 +31513,7 @@ infomercial/SM inform/Z informal/Y informant/SM +informatics information/EM informational informative/PY @@ -30953,6 +31527,7 @@ infrastructural infrastructure/SM infrequence/M infrequent/Y +infringe/LZR infringement/MS infuriate/GDS infuriating/Y @@ -31015,6 +31590,7 @@ initiatory inject/SDG injection/SM injector/SM +injunctive injure/DRSZG injured/U injurer/M @@ -31060,6 +31636,7 @@ inoculation/MS inoperative inordinate/Y inorganic +inositol inquire/ZGDR inquirer/M inquiring/Y @@ -31133,6 +31710,7 @@ inspector/MS inspectorate/MS inspiration/MS inspirational +inspiratory inspired/U inspiring/U inst @@ -31143,7 +31721,7 @@ installment/SM instance/GD instant/MRYS instantaneous/Y -instantiate/DSG +instantiate/DSXGN instar instate/AGDS instead @@ -31176,6 +31754,7 @@ instrumentation/M insubordinate insufferable insufferably +insula insular insularity/M insulate/GNDS @@ -31201,8 +31780,10 @@ intact intaglio/MS integer/MS integral/SMY -integrate/AEVNGSD -integration/EAM +integrand +integrate/AEVNGXSD +integration/AEM +integrationist/SM integrator integrity/M integument/SM @@ -31307,6 +31888,8 @@ intermezzo/MS interminably intermingle/DSG intermission/SM +intermittence/S +intermittency/S intermittent/Y intermix/GDS internal/SY @@ -31326,6 +31909,9 @@ internist/MS internment/M internship/MS interoffice +interoperability +interoperable +interoperate/S interpenetrate/DSGN interpersonal interplanetary @@ -31339,6 +31925,7 @@ interpretation/AMS interpretative interpreted/U interpreter/MS +interquartile interracial interred/E interregnum/SM @@ -31388,12 +31975,14 @@ intestacy/M intestate intestinal intestine/MS +intifada/S intimacy/SM intimate/MYGNDSX intimation/M intimidate/GNDS intimidating/Y intimidation/M +intl intonation/SM intoxicant/SM intoxicate/DSGN @@ -31460,7 +32049,9 @@ inventiveness/M inventor/MS inventory/DSMG inverse/SMY -invert/SMDG +invert/SMDRZG +inverter/M +invertible invest/ASDGL investigate/GNVDSX investigation/M @@ -31494,6 +32085,7 @@ involuntariness/M involuntary/P involution/M involve/LDSG +involved/U involvement/SM inward/SY ioctl @@ -31624,7 +32216,9 @@ isomerism/M isometric/S isometrically isometrics/M +isometry isomorphic +isomorphism isosceles isotherm/SM isotope/SM @@ -31651,6 +32245,7 @@ itemization/M itemize/GDS iterate/AXGNVDS iteration/AM +iterative/Y iterator/S itinerant/SM itinerary/SM @@ -31713,6 +32308,7 @@ japan/SM japanned japanning jape/MGDS +japonica jar/SM jardiniere/SM jardinière/SM @@ -32025,6 +32621,7 @@ kWh kabbala kabbalah kabob/SM +kabocha kaboom kabuki/M kaddish/MS @@ -32032,6 +32629,7 @@ kaffeeklatch/MS kaffeeklatsch/MS kahuna/S kaiser/MS +kakistocracy kale/M kaleidoscope/MS kaleidoscopic @@ -32070,7 +32668,9 @@ keep/MRSZG keeper/M keeping/M keepsake/MS +keester/S keg/SM +keister/S kelp/M kelvin/SM ken/SM @@ -32085,11 +32685,14 @@ keratitis kerbside kerchief/SM kerfuffle/S +kern/G +kerne kernel/SM kerosene/M kestrel/MS ketch/MS ketchup/M +ketone/S kettle/SM kettledrum/SM key/SGMD @@ -32114,6 +32717,7 @@ khan/MS kibble/DSMG kibbutz/MS kibbutzim +kibibyte/SM kibitz/ZGDRS kibitzer/M kibosh/M @@ -32235,6 +32839,7 @@ kleptocracy kleptomania/M kleptomaniac/SM kludge/GDS +kludgy kluge/DS klutz/MS klutziness/M @@ -32306,6 +32911,7 @@ kohl kohlrabi/M kohlrabies kola/MS +kombucha kook/MS kookaburra/SM kookiness/M @@ -32324,6 +32930,7 @@ krone/RM kronor kronur krypton/M +kryptonite króna/M krónur kt @@ -32482,6 +33089,7 @@ landsmen landward/S lane/MS language/MS +langue/SM languid/PY languidness/M languish/DSG @@ -32626,7 +33234,7 @@ lawn/MS lawnmower/SM lawrencium/M lawsuit/MS -lawyer/SM +lawyer/SMY lax/TRYP laxative/MS laxity/M @@ -32657,6 +33265,7 @@ lb/S lbw lea/SM leach/DSG +leachate/S lead/MDNRSZG leader/M leaderless @@ -32683,9 +33292,12 @@ leapfrogged leapfrogging leapt learn/AUGDS +learnability +learnable learnedly learner/MS learning's +learnt lease/ADSMG leaseback/SM leasehold/MRSZ @@ -33067,6 +33679,7 @@ lingerie/M lingering/Y lingo/M lingoes +lingua lingual linguine/M linguini/SM @@ -33500,6 +34113,7 @@ lumberjack/SM lumberman/M lumbermen lumberyard/SM +lumen luminary/SM luminescence/M luminescent @@ -33508,6 +34122,7 @@ luminous/Y lummox/MS lump/MDNSG lumpectomy/S +lumpenproletariat lumpiness/M lumpish lumpy/TRP @@ -33549,6 +34164,7 @@ lutanist/SM lute/MS lutenist/SM lutetium/M +lux luxuriance/M luxuriant/Y luxuriate/DSGN @@ -33696,6 +34312,7 @@ magniloquence/M magniloquent magnitude/SM magnolia/MS +magnon magnum/MS magpie/MS magus/M @@ -33737,6 +34354,8 @@ mainstay/MS mainstream/SMDG maintain/ZGBDRS maintainability +maintainable/U +maintained/U maintenance/M maintop/SM maisonette/MS @@ -33786,8 +34405,8 @@ maleness/M malevolence/M malevolent/Y malfeasance/M +malform/SD malformation/SM -malformed malfunction/MDSG malice/M malicious/PY @@ -34077,6 +34696,7 @@ masquerader/M mass/MDSGV massacre/MGDS massage/DSMG +masse masseur/SM masseuse/MS massif/MS @@ -34181,7 +34801,9 @@ maxilla/M maxillae maxillary maxim/SM +maxima maximal/Y +maximalist/SM maximization/M maximize/GDS maximum/SM @@ -34205,6 +34827,7 @@ mazurka/MS mañana/M mdse me/DSH +mea/S mead/M meadow/MS meadowlark/MS @@ -34230,7 +34853,6 @@ meant/U meantime/M meanwhile/M meany/SM -meas measles/M measly/RT measurable @@ -34249,6 +34871,7 @@ meatloaf/M meatloaves meatpacking/M meaty/TPR +mebibyte/SM mecca/SM mechanic/MS mechanical/Y @@ -34267,7 +34890,7 @@ meddlesome media/SM medial/AY median/MS -mediate/DSGN +mediate/ADSGN mediated/U mediation/AM mediator/MS @@ -34428,7 +35051,8 @@ mercerize/GDS merchandise/MZGDRS merchandiser/M merchandising/M -merchant/MBS +merchant/GMBS +merchantability merchantman/M merchantmen merciful/UY @@ -34450,6 +35074,7 @@ merino/MS merit/CSM merited/U meriting +meritless meritocracy/SM meritocratic meritorious/PY @@ -34545,6 +35170,7 @@ meteorological meteorologist/SM meteorology/M meter/GMD +metformin methadone/M methamphetamine/M methane/M @@ -34604,6 +35230,7 @@ microcode microcomputer/MS microcosm/MS microcosmic +microcredit microdot/SM microeconomics/M microelectronic/S @@ -34611,12 +35238,14 @@ microelectronics/M microfiber/MS microfiche/M microfilm/GMDS +microfinance microfloppies microgroove/SM microlight/MS microloan/MS -micromanage/GDSL +micromanage/ZGDRSL micromanagement/M +micromanager/M micrometeorite/SM micrometer/MS micron/MS @@ -34765,7 +35394,7 @@ mimicker/SM mimicking mimicry/SM mimosa/SM -min +min/S minaret/MS minatory mince/DRSMZG @@ -34804,6 +35433,7 @@ minicam/MS minicomputer/SM minifloppies minim/SM +minima minimal/Y minimalism/M minimalist/MS @@ -34913,6 +35543,7 @@ misdo/JG misdoes misdoing/M misdone +mise/CKS miser/SBMY miserableness/M miserably @@ -34975,6 +35606,7 @@ misquotation/MS misquote/MGDS misread/GJS misreading/M +misremember/GDS misreport/MDGS misrepresent/GDS misrepresentation/MS @@ -35042,6 +35674,7 @@ mitotic mitral mitt/MNSX mitten/M +mitzvah mix/ZGMDRSB mixed/U mixer/M @@ -35076,6 +35709,7 @@ mocker/M mockery/SM mocking/Y mockingbird/SM +mocktail/S mod/STM modal/SM modality/S @@ -35112,6 +35746,7 @@ modify/DRSXZGN modish/YP modishness/M modular +modularization modulate/CGNDS modulation/CM modulations @@ -35133,6 +35768,7 @@ moistness/M moisture/M moisturize/ZGDRS moisturizer/M +mojo/S molar/SM molasses/M mold/MDRJSZG @@ -35173,6 +35809,7 @@ momentous/PY momentousness/M momentum/M mommy/SM +monad monarch/M monarchic monarchical @@ -35190,6 +35827,7 @@ monetarily monetarism/M monetarist/MS monetary +monetization/C monetize/CGDS money/SMD moneybag/MS @@ -35228,6 +35866,7 @@ monocular monodic monodist/SM monody/SM +monofilament monogamist/MS monogamous/Y monogamy/M @@ -35247,6 +35886,7 @@ monomania/M monomaniac/MS monomaniacal monomer/SM +monomial mononucleosis/M monophonic monoplane/SM @@ -35270,6 +35910,8 @@ monotonousness/M monotony/M monounsaturated monoxide/MS +monozygotic +monozygous monseigneur/M monsieur/M monsignor/SM @@ -35326,6 +35968,7 @@ mopping moraine/SM moral/SMY morale/M +moralism moralist/MS moralistic moralistically @@ -35570,6 +36213,8 @@ mulligatawny/M mullion/SMD multi multicast +multicellular +multichannel multicolored multicultural multiculturalism/M @@ -35589,6 +36234,7 @@ multilingualism/M multimedia/M multimillionaire/SM multinational/SM +multipart multiparty multiplayer/M multiple/MS @@ -35610,6 +36256,7 @@ multitask/GS multitasking/M multitude/SM multitudinous +multivariable multivariate multiverse/SM multivitamin/MS @@ -35626,6 +36273,7 @@ mummy/SM mumps/M mun munch/GDS +munchie/S munchies/M munchkin/SM mundane/SY @@ -35661,6 +36309,7 @@ muscly muscular/Y muscularity/M musculature/M +musculoskeletal musculus muse/MGDSJ musette/MS @@ -35709,6 +36358,7 @@ musty/PTR mutability/M mutably mutagen/MS +mutagenic mutant/MS mutate/XGNVDS mutation/M @@ -35817,6 +36467,7 @@ nano nanobot/S nanosecond/SM nanotechnology/SM +nanotube nap/SM napalm/MDSG nape/MS @@ -35935,6 +36586,7 @@ neat/NRYPXT neaten/GD neath neatness/M +neato nebula/M nebulae nebular @@ -36013,6 +36665,7 @@ nelson/SM nematode/SM nemeses nemesis/M +neoadjuvant neoclassic neoclassical neoclassicism/M @@ -36020,6 +36673,7 @@ neocolonialism/M neocolonialist/MS neocon/SM neoconservative/SM +neocortex neodymium/M neolithic neologism/SM @@ -36075,14 +36729,15 @@ neurasthenia/M neurasthenic/MS neuritic/MS neuritis/M +neurocysticercoses +neurocysticercosis neurological/Y neurologist/SM neurology/M neuron/MS neuronal neurophysiology's -neuroscience's -neurosciences +neuroscience/MS neuroscientist/MS neuroses neurosis/M @@ -36091,6 +36746,8 @@ neurosurgery/M neurosurgical neurotic/MS neurotically +neuroticism +neurotoxin/S neurotransmitter/SM neut neuter/MDGS @@ -36115,6 +36772,7 @@ newcomer/SM newel/SM newfangled newfound +newish newline/S newlywed/SM newness/M @@ -36169,6 +36827,7 @@ nickle/S nickname/DSMG nicotine/M niece/SM +nifedipine niff niffy nifty/TR @@ -36250,6 +36909,7 @@ nitpicker/M nitpicking/M nitrate/DSMGN nitration/M +nitric nitrification/M nitrite/SM nitro @@ -36258,6 +36918,7 @@ nitrogen/M nitrogenous nitroglycerin/M nitroglycerine/M +nitty-gritty nitwit/MS nix/GMDS no/SM @@ -36389,6 +37050,8 @@ nondepreciating nondescript nondestructive nondetachable +nondeterminism +nondeterministic nondisciplinary nondisclosure/M nondiscrimination/M @@ -36469,6 +37132,7 @@ nonmilitant nonmilitary nonnarcotic/SM nonnative/MS +nonnegative nonnegotiable nonnuclear nonnumerical @@ -36513,6 +37177,7 @@ nonracial nonradioactive nonrandom nonreactive +nonreal nonreciprocal/SM nonreciprocating nonrecognition/M @@ -36635,7 +37300,7 @@ northwest/ZMR northwester/MY northwestern northwestward/S -nose/MGDS +nose/MGDSJ nosebag/S nosebleed/MS nosecone/SM @@ -36787,6 +37452,7 @@ nutcase/S nutcracker/MS nuthatch/MS nuthouse/S +nutjob/S nutmeat/SM nutmeg/SM nutpick/SM @@ -36816,6 +37482,7 @@ nympho/S nymphomania/M nymphomaniac/SM nymphs +nystagmus née o o'clock @@ -36988,6 +37655,8 @@ octagon/MS octagonal octal octane/MS +octant/S +octantal octave/MS octavo/MS octet/SM @@ -36996,6 +37665,7 @@ octopi octopus/MS ocular/MS oculist/SM +oculomotor odalisque/SM odd/STRYLP oddball/SM @@ -37092,7 +37762,7 @@ ointment/SM okapi/SM okay/MDSG okra/MS -old/TMNRP +old/STMNRP oldie/SM oldish oldness/M @@ -37138,6 +37808,7 @@ omnivore/MS omnivorous/PY omnivorousness/M on/Y +onboard once/M oncogene/SM oncologist/SM @@ -37198,6 +37869,7 @@ openhandedness/M openhearted opening/M openness/M +opensource openwork/M opera/MS operable/I @@ -37217,6 +37889,7 @@ opiate/SM opine/GNXDS opinion/M opinionated +opioid/S opium/M opossum/MS opp @@ -37263,6 +37936,7 @@ or oracle/SM oracular oral/MYS +orality orange/SMP orangeade/MS orangery/SM @@ -37289,6 +37963,7 @@ ordain/SDLG ordainment/M ordeal/SM order/EAMDGS +ordered/U orderings orderliness/EM orderly/PSM @@ -37385,6 +38060,7 @@ osmium/M osmosis/M osmotic osprey/SM +ossicles ossification/M ossify/NGDS ostensible @@ -37449,6 +38125,7 @@ outdoorsy outdraw/GS outdrawn outdrew +outercourse outermost outerwear/M outface/GDS @@ -37602,6 +38279,7 @@ overbook/DGS overbore overborne overbought +overbroad overbuild/SG overbuilt overburden/GSD @@ -37689,6 +38367,7 @@ overhung overindulge/GDS overindulgence/M overindulgent +overinflated overjoy/GSD overkill/M overladen @@ -37739,6 +38418,7 @@ overreach/GDS overreact/SDG overreaction/SM overrefined +overrich/P overridden override/MGS overripe/M @@ -37839,6 +38519,7 @@ own/ESGD owner/MS ownership/M ox/MN +oxalate oxblood/M oxbow/MS oxcart/SM @@ -37846,6 +38527,7 @@ oxford/SM oxidant/MS oxidase oxidation/M +oxidative oxide/MS oxidization/M oxidize/ZGDRS @@ -37857,6 +38539,11 @@ oxygenate/DSGN oxygenation/M oxymora oxymoron/M +oxymoronic +oxymoronically +oy +oyes +oyez oyster/SM oz ozone/M @@ -37961,6 +38648,7 @@ palazzo pale/MYTGPDRSJ paleface/MS paleness/M +paleo paleographer/MS paleography/M paleolithic @@ -38127,12 +38815,15 @@ paralysis/M paralytic/SM paralyze/DSG paralyzing/Y +paramagnetic paramecia paramecium/M paramedic/MS paramedical/MS parameter/MS +parameterize/D parametric +parametrize/D paramilitary/SM paramount paramountcy @@ -38191,6 +38882,7 @@ paresis/M parfait/MS pariah/M pariahs +paribus parietal parimutuel/MS paring/M @@ -38220,6 +38912,7 @@ parodist/SM parody/GDSM parole/MGDS parolee/MS +paronychia parotid paroxysm/SM paroxysmal @@ -38231,7 +38924,7 @@ parricide/MS parring parrot/GMDS parry/GDSM -parse/DRSG +parse/DRSZG parsec/MS parsimonious/Y parsimony/M @@ -38379,6 +39072,7 @@ patriarchate/MS patriarchs patriarchy/SM patrician/SM +patricidal patricide/SM patrimonial patrimony/SM @@ -38415,7 +39109,7 @@ pauper/MS pauperism/M pauperize/DSG pause/DSMG -pave/AGDS +pave/AZGDRS paved/U pavement/MS pavilion/SM @@ -38428,6 +39122,7 @@ pawnbroker/MS pawnbroking/M pawnshop/MS pawpaw/MS +pax pay's pay/ASGBL payback/SM @@ -38479,6 +39174,7 @@ peat/M peaty/TR pebble/MGDS pebbly +pebibyte/SM pecan/SM peccadillo/M peccadilloes @@ -38489,6 +39185,7 @@ pecs pectic pectin/M pectoral/MS +pectoralis peculate/GNDS peculation/M peculator/SM @@ -38704,6 +39401,7 @@ perforation/M perforce perform/SDRZG performance/SM +performant performative performed/U performer/M @@ -38779,12 +39477,14 @@ permit/MS permitted permittee permitting +permittivity permutation/SM permute/DSG pernicious/YP perniciousness/M peroration/MS peroxide/MGDS +perpend perpendicular/SMY perpendicularity/M perpetrate/DSGN @@ -38796,6 +39496,7 @@ perpetuation/M perpetuity/M perplex/GDS perplexed/Y +perplexing/Y perplexity/SM perquisite/SM persecute/GNXDS @@ -38887,6 +39588,7 @@ peter/GMD petiole/SM petite/MS petition/ZGMDRS +petitionary petitioner/M petrel/MS petrifaction/M @@ -38941,6 +39643,7 @@ pharaoh/M pharaohs pharisaic pharisee/SM +pharma/MS pharmaceutic/MS pharmaceutical/SM pharmaceutics/M @@ -38951,6 +39654,7 @@ pharmacologist/SM pharmacology/M pharmacopeia/SM pharmacopoeia/MS +pharmacotherapy pharmacy/SM pharyngeal pharynges @@ -38970,6 +39674,7 @@ phenomenological phenomenology phenomenon/MS phenotype +phenytoin pheromone/MS phew phi/SM @@ -39004,6 +39709,7 @@ phisher/M phlebitis/M phlebotomist/MS phlebotomize/GDS +phlebotomy phlegm/M phlegmatic phlegmatically @@ -39035,6 +39741,7 @@ phonographs phonological/Y phonologist/MS phonology/M +phonon phony/PTGDRSM phooey phosphate/MS @@ -39050,6 +39757,7 @@ photo/SGMD photocell/MS photocopier/M photocopy/DRSMZG +photodetector/S photoelectric photoelectrically photoengrave/DRSJZG @@ -39069,6 +39777,8 @@ photojournalist/SM photometer/MS photon/MS photosensitive +photosensor/S +photosensory photostat/SM photostatic photostatted @@ -39080,6 +39790,7 @@ phototropic phototropism phototypesetter phototypesetting +photovoltaic phrasal phrase's phrase/AGDS @@ -39091,6 +39802,7 @@ phrenologist/SM phrenology/M phyla phylactery/SM +phyllo phylogeny/M phylum/M phys @@ -39112,6 +39824,7 @@ physiology/M physiotherapist/MS physiotherapy/M physique/MS +phytoplankton pi/SMDRHZG pianissimo/SM pianist/MS @@ -39145,6 +39858,7 @@ picnicked picnicker/SM picnicking picot/SM +pictogram/S pictograph/M pictographs pictorial/MYS @@ -39158,6 +39872,7 @@ pie/SM piebald/MS piece/DSMG piecemeal +piecewise piecework/MRZ pieceworker/M piecrust/SM @@ -39334,6 +40049,7 @@ pivot/MDGS pivotal pix/M pixel/MS +pixelate/DS pixie/MS pizazz/M pizza/MS @@ -39418,6 +40134,7 @@ plantlike plaque/SM plash/MDSG plasma/M +plasmon plaster/SZGMDR plasterboard/M plasterer/M @@ -39476,8 +40193,8 @@ playtime/M playwright/SM plaza/MS plea/MS -plead/DRZGSJ -pleader/M +plead/ADRZGSJ +pleader's pleading/MY pleasant/UTYP pleasanter @@ -39729,11 +40446,13 @@ polymeric polymerization/M polymerize/GDS polymorphic +polymorphically +polymorphism polymorphous polynomial/MS polynucleotide/SM polyp/MS -polypeptide's +polypeptide/SM polyphonic polyphony/M polypropylene/M @@ -39818,6 +40537,7 @@ popularity/UM popularization/M popularize/DSG populate/ACGDS +populated/U population/CM populations populism/M @@ -39867,6 +40587,7 @@ porticoes portiere/MS portion/KSGMD portière/MS +portlet/SM portliness/M portly/RPT portmanteau/MS @@ -39881,15 +40602,16 @@ pose/CAKEGDS poser/EKSM poseur/SM posh/TR -posit/DSGV +posit/DSG position/CKEMS -positional/K +positional/KE positioned/K -positioning/K -positive/MYPS +positioning/AK +positive/EMYPS positiveness/M positivism positivist/S +positivity/SM positron/MS poss posse/MS @@ -39902,6 +40624,7 @@ possibility/SM possible/SM possibly possum/SM +post-partum post/ZGMDRSJ postage/M postal @@ -40000,7 +40723,7 @@ poultice/DSMG poultry/M pounce/DSMG pound's -pound/KDSG +pound/KDRSZG poundage/M pounding/SM pour/GDSJ @@ -40031,6 +40754,7 @@ practice/DSMGB practiced/U practicum/SM practitioner/SM +praecipe praetor/SM praetorian pragmatic/MS @@ -40060,11 +40784,13 @@ prawn/MDSG pray/ZGDRS prayer/M prayerful/Y +pre-fill/GDS preach/DRSZGL preacher/M preachment/M preachy/RT preadolescence/SM +preadolescent preamble/MGDS prearrange/LGDS prearrangement/M @@ -40079,6 +40805,7 @@ precautionary precede/DSG precedence/M precedent/SM +precedential precept/SM preceptor/SM precinct/MS @@ -40095,7 +40822,7 @@ precise/DRSYTGNP preciseness/M precision/M preclude/GDS -preclusion/M +preclusion/SM precocious/YP precociousness/M precocity/M @@ -40136,6 +40863,7 @@ predigest/GDS predilection/SM predispose/GDS predisposition/MS +prednisone predominance/M predominant/Y predominate/YGDS @@ -40166,6 +40894,7 @@ preferment/M preferred preferring prefigure/GDS +prefill/GSD prefix/MDSG preform/GSD prefrontal @@ -40179,6 +40908,7 @@ prehistoric prehistorical/Y prehistory/M prehuman +preinstall/D prejudge/LGDS prejudgement/MS prejudgment/SM @@ -40192,6 +40922,7 @@ prelim/SM preliminarily preliminary/SM preliterate +preload/SGD prelude/MS premarital premature/Y @@ -40217,17 +40948,19 @@ preoccupation/SM preoccupy/DSG preoperative preordain/GDS +preowned prep/MS prepackage/DSG prepacked prepaid preparation/SM preparatory -prepare/GDS +prepare/ZGDRS prepared/UP preparedness/UM prepay/GSL prepayment/MS +prepend/DGS preponderance/SM preponderant/Y preponderate/GDS @@ -40297,8 +41030,10 @@ pressing/SMY pressman/M pressmen pressure/DSMG +pressured/U pressurization/M pressurize/CGDS +pressurized/U pressurizer/SM prestidigitation/M prestige/M @@ -40332,6 +41067,7 @@ prettily prettiness/M pretty/TGDRSMP pretzel/MS +prev prevail/DGS prevalence/M prevalent @@ -40456,11 +41192,13 @@ probationer/M probe/MGDSBJ probity/M problem/MS -problematic +problematic/U problematical/Y probosces proboscis/MS procaine/M +procaryote/SM +procaryotic procedural procedure/SM proceed/GJDS @@ -40468,6 +41206,7 @@ proceeding/M proceeds/M process's process/AGDS +processable processed/U procession/GD processional/MS @@ -40558,6 +41297,7 @@ projectile/SM projection/SM projectionist/SM projector/MS +prokaryote/MS prokaryotic prole/S proletarian/MS @@ -40577,7 +41317,7 @@ prominence/M prominent/Y promiscuity/M promiscuous/Y -promise/DSMG +promise/DMG promising/Y promissory promo/M @@ -40647,6 +41387,7 @@ proportionate/EY proposal/MS propped propping +propranolol proprietary/SM proprieties/M proprietor/SM @@ -40674,6 +41415,7 @@ proselyte/DSMG proselytism/M proselytize/DRSZG proselytizer/M +prosocial prosody/SM prospect/MDGVS prospective/Y @@ -40774,6 +41516,7 @@ prudish/YP prudishness/M prune/MZGDRS pruner/M +pruno prurience/M prurient/Y pry/ZTGDRSM @@ -40830,6 +41573,7 @@ psychopathology psychopaths psychopathy/M psychopharmacology +psychophysiology psychos/S psychosis/M psychosomatic @@ -41002,6 +41746,7 @@ purplish purport/SMDG purported/Y purpose/DSMYG +purposed/A purposeful/YP purposefulness/M purposeless/PY @@ -41137,8 +41882,11 @@ quantifiable quantification/M quantifier/M quantify/NDRSZG +quantitation quantitative/Y quantity/SM +quantization +quantize quantum/M quarantine/MGDS quark/MS @@ -41157,6 +41905,7 @@ quartermaster/MS quarterstaff/M quarterstaves quartet/SM +quartile/S quarto/MS quartz/M quasar/MS @@ -41225,6 +41974,7 @@ quilting/M quin/S quince/SM quine/S +quinidine quinine/M quinoa quinsy/M @@ -41318,6 +42068,7 @@ radar/SM radarscope/SM raddled radial/SMY +radian/S radiance/M radiant/Y radiate/DSGNX @@ -41423,6 +42174,7 @@ ramble/DRSMZGJ rambler/M rambunctious/PY rambunctiousness/M +rambutan/S ramekin/SM ramie/M ramification/M @@ -41430,7 +42182,7 @@ ramify/DSXNG ramjet/SM rammed ramming -ramp/GMS +ramp/GMDS rampage/DSMG rampancy/M rampant/Y @@ -41450,6 +42202,7 @@ rancor/M rancorous/Y rand/M randiness/M +rando/S random/PSY randomization/M randomize/DSG @@ -41597,6 +42350,7 @@ reach/MDSGB reachable/U reacquire/DSG react/V +reactance reactant/SM reactionary/SM reactivity/M @@ -41651,9 +42405,11 @@ rebid/S rebidding rebirth/M reboil/SDG +rebrand/G rebuild/SG rebuke/DSMG rebuking/Y +rebuttable rebuttal/MS rec'd rec/M @@ -41707,10 +42463,11 @@ recline/DRSZG recliner/M recluse/SMV recognizable/U -recognizably +recognizably/U recognize/DRSGB recognized/U recombination +recommend/ZR recompense/DSMG recompile/GD recon/S @@ -41718,7 +42475,6 @@ reconcile/GDSB reconciliation/S recondite reconfiguration -reconfigure/D reconnaissance/MS reconnoiter/DGS reconstruct/V @@ -41763,12 +42519,14 @@ recurrence/SM recurrent/Y recurring recurse/XNV +recusal/S recuse/DSG recyclable/SM recycling/M red/PSM redact/SDG -redaction/M +redacted/U +redaction/SM redactor/SM redbird/SM redbreast/MS @@ -41849,8 +42607,10 @@ reflationary reflect/GVSD reflection/MS reflective/Y +reflectivity reflector/MS reflexive/SMY +reflexivity reflexology reforge/DSG reform/MZ @@ -41898,6 +42658,7 @@ regenerate/V regex/M regexp/S reggae/M +regicidal regicide/MS regime/SM regimen/SM @@ -41913,6 +42674,7 @@ registrant/MS registrar/MS registration/SM registry/SM +reglet regnant regress/MDSGV regression/MS @@ -41948,7 +42710,9 @@ rehearsal/MS rehearsed/U rehi rehung +reify/NDSG reign/MDSG +reignite/DSG reimburse/BDSGL reimbursement/MS rein/GD @@ -41968,7 +42732,8 @@ rejoinder/SM rejuvenate/DSGN rejuvenation/M rel -relate/DRSXZGNV +relate/DRSBXZGNV +related/YP relatedness/M relater/M relation/M @@ -42095,6 +42860,7 @@ repartee/M repatriate/XDSMGN repatriation/M repeat/SMDRZGB +repeatability repeatable/U repeatably repeated/Y @@ -42131,6 +42897,7 @@ reportage/M reported/Y reportorial reposeful +reposition repository/SM reprehend/DGS reprehensibility/M @@ -42150,6 +42917,7 @@ reprise/SMG reproach/GMDSB reproachful/Y reprobate/MS +reproducibility reproductive reprogramming reproving/Y @@ -42169,9 +42937,11 @@ repurchase/GDS reputability/M reputably/E reputation/MS +reputational repute/DSMGB reputed/Y request/GDR +requestor requiem/SM require/LDG requirement/MS @@ -42184,13 +42954,13 @@ requiter/M reread/SG rerecord/GDS rerunning +resample/GDS resat rescind/SDG rescission/M rescue/DRSMZG rescuer/M reseal/B -resell/SG resemble/DSG resend resent/LSDG @@ -42223,6 +42993,7 @@ resist/SMDRZG resistance/SM resistant/U resistible +resistivity resistless resistor/MS resit/S @@ -42250,7 +43021,6 @@ respectably respectful/EY respectfulness/M respective/Y -respell/SGD respiration/M respirator/SM respiratory @@ -42305,6 +43075,7 @@ resuscitation/M resuscitator/SM retailer/MS retain/SDRZG +retainage/S retainer/M retake/G retaliate/DSGNVX @@ -42325,8 +43096,10 @@ reticence/M reticent/Y reticulated reticulation/MS +reticulum retina/SM retinal +retinoblastoma retinue/SM retiree/SM retirement/MS @@ -42352,6 +43125,7 @@ retrofitting retrograde/DSG retrogress/GVDS retrogression/M +retroreflector/S retrorocket/MS retrospect/MDSGV retrospection/M @@ -42368,6 +43142,7 @@ revealing/Y reveille/M revel/JMDRSZG revelation/SM +revelatory reveler/M revelry/SM revenge/MGDS @@ -42471,6 +43246,7 @@ ribald ribaldry/M ribbed ribber/SM +ribbie/S ribbing ribbon/SM riboflavin/M @@ -42622,6 +43398,7 @@ roadblock/MDSG roadhouse/SM roadie/MS roadkill/M +roadmap/S roadrunner/SM roadshow/SM roadside/SM @@ -42690,6 +43467,7 @@ rollerskating/M rollick/SDG rollicking/M rollmop/S +rollout rollover/SM romaine/MS roman/M @@ -42749,7 +43527,7 @@ rot/SM rota/S rotary/SM rotatably -rotate/DSGNX +rotate/DSGNBX rotation/M rotational rotatory @@ -42908,6 +43686,7 @@ running/M runny/RT runoff/SM runt/MS +runtime runty/RT runway/SM rupee/SM @@ -43038,6 +43817,7 @@ saith sake/M saki/M salaam/SMDG +salability salable/U salacious/PY salaciousness/M @@ -43163,7 +43943,7 @@ sanitarian/SM sanitarium/SM sanitary/IU sanitation/M -sanitize/GDS +sanitize/ZGDRS sanity/IM sank sans @@ -43310,11 +44090,12 @@ scaffold/SMG scaffolding/M scag/S scagged +scalability scalar/S scalawag/MS scald/MDSG scale's -scale/CGDS +scale/CGDSB scaleless scalene scaliness/M @@ -43405,7 +44186,7 @@ schedule's schedule/ADSG scheduled/U scheduler/S -schema +schema/S schemata schematic/SM schematically @@ -43417,6 +44198,7 @@ schilling/MS schism/SM schismatic/SM schist/M +schistosomiasis schizo/SM schizoid/MS schizophrenia/M @@ -43495,6 +44277,7 @@ scolding/M scoliosis/M sconce/SM scone/MS +scooch/DSG scoop/MDSG scoopful/MS scoot/DRSZG @@ -43505,11 +44288,13 @@ scorch/MDRSZG scorcher/M score/MZGDRS scoreboard/SM +scorebook/SM scorecard/MS scorekeeper/MS scoreless scoreline/S scorer/M +scoresheet/SM scorn/MDRSZG scorner/M scornful/Y @@ -43566,7 +44351,7 @@ scree/MDS screech/GMDS screechy/TR screed/S -screen/SJMDG +screen/SJMDRZG screening/M screenplay/SM screensaver/SM @@ -43601,6 +44386,7 @@ scrofula/M scrofulous scrog/S scroll/GSMD +scrollbar/S scrooge/MS scrota scrotal @@ -43829,6 +44615,7 @@ segfault/S segment/GSMD segmentation/M segmented/U +segregable segregate/CDSGN segregated/U segregation/CM @@ -43853,7 +44640,7 @@ seismologist/MS seismology/M seize/GDS seizure/MS -seldom +seldom/Y select/CSGVD selection/SM selective/Y @@ -43874,8 +44661,9 @@ selfist/S selfless/PY selflessness/M selfsame -sell/ZGMRS -seller/M +sell's +sell/AZGRS +seller's selloff/MS sellotape/DSG sellout/MS @@ -44024,6 +44812,7 @@ sequin/SMD sequinned sequitur sequoia/MS +sera seraglio/MS serape/SM seraph/M @@ -44043,7 +44832,7 @@ serge/M sergeant/MS serial/SMY serialization/SM -serialize/GDS +serialize/GDSB series/M serif/MS serigraph/M @@ -44778,6 +45567,7 @@ site/MGDS sitemap/SM sitter/SM sitting/SM +situ situate/DSXGN situation/M situational @@ -44847,16 +45637,16 @@ skimp/SDG skimpily skimpiness/M skimpy/RTP -skin/MS +skin/AMS skincare/M skinflick/MS skinflint/MS skinful skinhead/MS skinless -skinned +skinned/A skinniness/M -skinning +skinning/A skinny/RMTP skint skintight @@ -45236,7 +46026,7 @@ snarly/TR snatch/ZGMDRS snatcher/M snazzily -snazzy/TR +snazzy/TRP sneak/SMDRZG sneaker/M sneakily @@ -45390,6 +46180,7 @@ sodomize/GDS sodomy/M soever sofa/MS +soffit/S soft/NRYXTP softback softball/MS @@ -45477,6 +46268,7 @@ solvency/IM solvent/IMS solver/SM somatic +somatosensory somber/PY somberness/M sombre/PY @@ -45652,6 +46444,7 @@ spaceport/SM spacer/M spaceship/SM spacesuit/SM +spacetime spacewalk/SGMD spacewoman/M spacewomen @@ -45786,15 +46579,16 @@ speedy/TPR speleological speleologist/MS speleology/M -spell/JSMDRZG +spell's +spell/AJSDG spellbind/ZGRS spellbinder/M spellbound spellcheck/MDRZGS spellchecker/M spelldown/SM -speller/M -spelling/M +speller/MS +spelling's spelt spelunker/MS spelunking/M @@ -45839,6 +46633,7 @@ spillage/MS spillover/SM spillway/MS spin/MS +spina spinach/M spinal/SMY spindle/MGDS @@ -45846,6 +46641,7 @@ spindly/TR spine/SM spineless/YP spinet/SM +spinless spinnaker/SM spinner/MS spinneret/SM @@ -45875,7 +46671,7 @@ spirituous spirochete/SM spiry spit/MDGS -spitball/SM +spitball/ZGSMR spite/ASM spiteful/PY spitefuller @@ -45887,6 +46683,7 @@ spitting spittle/M spittoon/MS spiv/S +splanchnic splash/GMDS splashdown/MS splashily @@ -45941,7 +46738,7 @@ sponger/M sponginess/M spongy/RPT sponsor/MDGS -sponsorship/M +sponsorship/SM spontaneity/M spontaneous/Y spoof/SMDG @@ -46302,7 +47099,7 @@ steadiness/UM steady/TGPDRSM steak/SM steakhouse/SM -steal/SMHG +steal/SMRHZG stealth/M stealthily stealthiness/M @@ -46520,6 +47317,7 @@ stony/TRP stood stooge/MS stool/SM +stoolie/SM stoop/GSMD stop's stop/US @@ -46534,6 +47332,7 @@ stopper/GSMD stopping/U stopple/DSMG stopwatch/MS +stopword/S storage/M store's store/ADSG @@ -46602,6 +47401,7 @@ strategic/S strategical/Y strategics/M strategist/SM +strategize/DG strategy/SM strati stratification/M @@ -46624,6 +47424,7 @@ streetcar/MS streetlamp/S streetlight/SM streetwalker/SM +streetwalking streetwise strength/M strengthen/AGDS @@ -46639,6 +47440,7 @@ streptomycin/M stress/MDSG stressed/U stressful +stressors stretch/BZGMDRS stretcher/MDG stretchmarks @@ -46706,6 +47508,7 @@ stropping stroppy/TRP strove struck +struct/CFSM structural/Y structuralism structuralist/S @@ -46770,6 +47573,7 @@ stuntman stuntmen stupefaction/M stupefy/DSG +stupefying/Y stupendous/Y stupid/TMRYS stupidity/SM @@ -46823,6 +47627,7 @@ subculture/MS subcutaneous/Y subdivide/GDS subdivision/SM +subdomain/MS subdominant subdue/DSG subeditor/S @@ -46875,12 +47680,15 @@ subordinate/DSMGN subordination/IM suborn/SGD subornation/M +subpar subparagraph +subpart subplot/MS subpoena/GMDS subprime subprofessional/SM subprogram/S +subrogate/DSN subroutine/SM subscribe/UASDG subscriber/MS @@ -46943,6 +47751,7 @@ subtrahend/SM subtropic/S subtropical subtropics/M +subtweet/S suburb/MS suburban/SM suburbanite/SM @@ -46976,6 +47785,7 @@ suck/MDRZGS sucker/GMD suckle/DSJG suckling/M +sucky sucrose/M suction/SMDG sudden/PY @@ -47138,6 +47948,7 @@ superconducting superconductive superconductivity/M superconductor/SM +supercritical superego/MS supererogation/M supererogatory @@ -47164,6 +47975,7 @@ superiority/M superlative/SMY superman/M supermarket/SM +supermassive supermen supermodel/SM supermom/MS @@ -47181,9 +47993,11 @@ superscribe/GDS superscript/MS superscription/M supersede/GDS +superset supersize/GDS supersonic superstar/MS +superstardom superstate/S superstition/MS superstitious/Y @@ -47193,6 +48007,7 @@ supertanker/MS superuser/S supervene/GDS supervention/M +supervillain/MS supervise/XGNDS supervised/U supervision/M @@ -47226,7 +48041,7 @@ suppose/GDS supposed/Y supposition/MS suppository/SM -suppress/GDS +suppress/GVDS suppressant/MS suppressible suppression/M @@ -47259,6 +48074,7 @@ surge/DSMG surgeon/MS surgery/SM surgical/Y +surjection/S surliness/M surly/PTR surmise/MGDS @@ -47314,6 +48130,7 @@ suss/DSG sustain/SDBG sustainability sustainable/U +sustainably sustenance/M sutler/MS suttee @@ -47434,6 +48251,8 @@ switchback/MS switchblade/SM switchboard/SM switcher/M +switcheroo/S +switchover swivel/MDGS swiz swizz @@ -47487,6 +48306,7 @@ symbolical/Y symbolism/M symbolization/M symbolize/DSG +symbology symmetric/Y symmetrical/Y symmetry/SM @@ -47513,6 +48333,7 @@ synchronicity synchronization/SM synchronize/GDS synchronous/Y +synchrony syncopate/DSGN syncopation/M syncope/M @@ -47786,6 +48607,7 @@ tartness/M tarty/T taser/GMDS task/GMDS +taskbar taskmaster/MS taskmistress/MS tassel/MDSG @@ -47889,6 +48711,7 @@ teaspoon/SM teaspoonful/SM teat/MS teatime/S +tebibyte/MS tech/M techie/S technetium/M @@ -48221,7 +49044,7 @@ theistic them thematic thematically -theme/DSM +theme/DSMG themselves then/M thence @@ -48264,6 +49087,7 @@ thereof thereon thereto theretofore +thereunder thereunto thereupon therewith @@ -48348,6 +49172,7 @@ tho thole/SM thong/SM thoracic +thoracotomy thorax/MS thorium/M thorn/SM @@ -48465,7 +49290,7 @@ thunderstorm/SM thunderstruck thundery thunk/S -thus +thus/Y thwack/ZGSMDR thwacker/M thwart/GSMD @@ -48673,6 +49498,7 @@ toboggan/ZGSMDR tobogganer/M tobogganing/M toccata/S +tocopherol tocsin/SM today/M toddle/DRSMZG @@ -48757,6 +49583,7 @@ tonsorial tonsure/DSMG tony/RT too +toodles took/A tool's tool/ADGS @@ -48936,6 +49763,7 @@ trabecula trabecular trabecule trace/JDRSMZG +traceability traceable/U tracer/M tracery/SM @@ -48952,7 +49780,7 @@ tracker/M trackless tracksuit/S tract's -tract/CEKFAS +tract/CKFEAS tractability/IM tractable/I tractably/I @@ -48989,7 +49817,8 @@ trail/ZGSMDR trailblazer/MS trailblazing/M trailer/M -train/ZGSMDRB +trailhead/S +train/ZGSMDRBJ trained/U trainee/SM trainer/M @@ -49041,7 +49870,9 @@ transcribe/ZGDRS transcriber/M transcript/MS transcription/SM +transcriptional transducer/MS +transduction transect/DSG transept/MS transfect/SGD @@ -49056,6 +49887,8 @@ transfinite transfix/DSG transform/BSZGMDR transformation/SM +transformational +transformative transformer/M transfuse/DSXGN transfusion/M @@ -49130,6 +49963,7 @@ transshipment/M transshipped transshipping transubstantiation/M +transversal transverse/MYS transvestism/M transvestite/MS @@ -49187,6 +50021,7 @@ treatise/SM treatment/MS treaty/SM treble/MGDS +trebuchet/S tree/MDS treeing treeless @@ -49227,7 +50062,7 @@ trestle/MS trews trey/MS triad/SM -triage/MGS +triage/MGDS trial/ASM trialed trialing @@ -49506,6 +50341,7 @@ tunefulness/M tuneless/Y tuner/M tuneup/SM +tung tungsten/M tunic/SM tunnel/JSMDRZG @@ -49687,6 +50523,8 @@ typography/M typology/SM tyrannic tyrannical/Y +tyrannicidal +tyrannicide/S tyrannize/GDS tyrannosaur/MS tyrannosaurus/MS @@ -49694,6 +50532,7 @@ tyrannous tyranny/SM tyrant/SM tyro/MS +tzatziki u/S ubiquitous/Y ubiquity/M @@ -49708,7 +50547,7 @@ uhf ukase/SM ukulele/SM ulcer/SM -ulcerate/XDSGN +ulcerate/XDSGNV ulceration/M ulcerous ulna/M @@ -49726,6 +50565,8 @@ ultrahigh ultralight/SM ultramarine/M ultramodern +ultrasensitive +ultrashort ultrasonic ultrasonically ultrasound/MS @@ -49760,7 +50601,9 @@ unanimous/Y unapparent unappetizing unappreciative +unary unassertive +unassimilable unassuming/Y unavailing/Y unaware/S @@ -49773,6 +50616,7 @@ unblinking/Y unblushing/Y unbosom/DG unbound/D +unbox/JGDS unbreakable unbroken uncanny/T @@ -49790,6 +50634,7 @@ uncleanly/T unclear/DRT uncomfortable uncommon/T +uncompelling uncomplaining/Y uncomplicated uncomprehending/Y @@ -49866,6 +50711,7 @@ undergrowth/M underhand underhanded/PY underhandedness/M +underinflated underlain underlay/SM underlie/S @@ -50050,10 +50896,13 @@ unity/EM univalent univalve/SM universal/MYS +universalism +universalist universality/M universalize/DSG universe/SM university/SM +univocal unjust/Y unkempt unkind/T @@ -50117,7 +50966,9 @@ unremitting/Y unrepentant unreported unrepresentative +unrequest/D unrest/M +unrevealing unripe/TR unroll/GDS unromantic @@ -50256,6 +51107,7 @@ uptempo upthrust/GSM uptick/SM uptight +uptime uptown/M uptrend upturn/GSMD @@ -50322,6 +51174,7 @@ usury/M utensil/SM uteri uterine +utero uterus/M utilitarian/MS utilitarianism/M @@ -50348,9 +51201,11 @@ vacationer/M vacationist/SM vaccinate/GNDSX vaccination/M +vaccinator/S vaccine/SM vacillate/XGNDS vacillation/M +vacinal vacuity/M vacuole/MS vacuous/YP @@ -50363,6 +51218,7 @@ vagary/SM vagina/SM vaginae vaginal/Y +vaginitis vagrancy/M vagrant/MS vague/RYTP @@ -50418,6 +51274,7 @@ vane/MS vanguard/MS vanilla/SM vanish/JDSG +vanishing/Y vanity/SM vanned vanning @@ -50545,6 +51402,7 @@ vent/DGS ventilate/GNDS ventilation/M ventilator/SM +ventilatory ventral ventricle/SM ventricular @@ -50562,6 +51420,7 @@ veracity/M veranda/SM verandah/M verandahs +verapamil verb/KMS verbal/MYS verbalization/M @@ -50620,6 +51479,7 @@ vertebrae vertebral vertebrata vertebrate/IMS +vertebrobasilar vertex/MS vertical/MYS vertices @@ -50696,6 +51556,7 @@ vicissitude/SM victim/MS victimization/M victimize/GDS +victimless victor/MS victorious/Y victory/SM @@ -50711,7 +51572,7 @@ videophone/MS videotape/DSMG videotex vie/DS -view/AMDRSZG +view/AMDRBSZG viewer/AM viewership/M viewfinder/SM @@ -50858,6 +51719,7 @@ vivace vivacious/PY vivaciousness/M vivacity/M +vivant/S vivaria vivarium/SM vivid/RYTP @@ -50905,6 +51767,7 @@ volatile volatility/M volatilize/DSG volcanic +volcanism volcano/M volcanoes volcanological @@ -50923,6 +51786,7 @@ volubility/M voluble volubly volume/SM +volumetric voluminous/YP voluminousness/M voluntarily/I @@ -50956,6 +51820,7 @@ voyageur/SM voyeur/MS voyeurism/M voyeuristic +vulcanism vulcanization/M vulcanize/GDS vulgar/RYT @@ -51100,6 +51965,7 @@ ware/MS warehouse/DSMG warez warfare/M +warfarin warhead/MS warhorse/SM warily/U @@ -51227,6 +52093,7 @@ wattle/MGDS wave/MZGDRS waveband/S waveform +wavefront wavelength/M wavelengths wavelet/SM @@ -51311,6 +52178,7 @@ webisode/MS weblog/MS webmaster/SM webmistress/MS +webpage/SM website/SM wed/AS wedded/A @@ -51355,7 +52223,7 @@ weightlifter/MS weightlifting/M weighty/PTR weir/MS -weird/PTRY +weird/PTGDRY weirdie/MS weirdness/M weirdo/MS @@ -51371,6 +52239,7 @@ wellington/MS wellness/M wellspring/MS welly/S +welp welsh/ZGDRS welsher/M welt/MDRSZG @@ -51526,6 +52395,7 @@ whiteboard/S whitecap/SM whitefish/MS whitehead/MS +whitelist/GDS whiten/ZGDRJ whitener/M whiteness/M @@ -51593,7 +52463,7 @@ whupping why'd why/M whys -wick/MDRSZ +wick/MDRSZGJ wicked/TPRY wickedness/M wicker/M @@ -51661,6 +52531,7 @@ williwaw/MS willow/SM willowy willpower/M +willy-nilly willy/S wilt/MDSG wily/RTP @@ -51733,6 +52604,8 @@ winnower/M wino/MS winsome/YTRP winsomeness/M +winsorization +winsorize/GDS winter/GSMD wintergreen/M winterize/GDS @@ -51763,6 +52636,7 @@ wishbone/SM wisher/M wishful/Y wishlist's +wishy-washy wisp/MS wispy/RT wist @@ -51808,6 +52682,7 @@ wizardry/M wizened wk/Y woad/M +woah wobble/MGDS wobbliness/M wobbly/RTP @@ -51908,6 +52783,7 @@ word's word/ADSG wordage/M wordbook/SM +wordie wordily wordiness/M wording/SM @@ -51915,7 +52791,7 @@ wordless/Y wordplay/M wordsmith wordsmiths -wordy/TPR +wordy/TPRS wore work's work/ADJSG @@ -51952,6 +52828,8 @@ works/M worksheet/MS workshop/MS workshy +worksite/S +workspace workstation/MS worktable/MS worktop/S @@ -52080,6 +52958,7 @@ xcix xcvi xcvii xenon/M +xenophile/S xenophobe/MS xenophobia/M xenophobic @@ -52159,6 +53038,7 @@ yawl/MS yawn/MDRSZG yawner/M yaws/M +yay yd ye/RST yea/SM @@ -52208,6 +53088,7 @@ yipping yo yob/S yobbo/S +yobibyte/SM yodel/SMDRZG yodeler/M yoga/M @@ -52239,6 +53120,10 @@ youthfulness/M youths yow yowl/MDSG +yowsa +yowsah +yowza +yowzah yr/S ytterbium/M yttrium/M @@ -52271,6 +53156,7 @@ zealot/MS zealotry/M zealous/YP zealousness/M +zebibyte/SM zebra/SM zebu/MS zed/SM @@ -52335,6 +53221,7 @@ zorch zoster zounds zucchini/MS +zuke/S zwieback/M zydeco/M zygote/SM diff --git a/gfx/2d/DrawTargetD2D1.cpp b/gfx/2d/DrawTargetD2D1.cpp index d9deb4c10..a2e854107 100644 --- a/gfx/2d/DrawTargetD2D1.cpp +++ b/gfx/2d/DrawTargetD2D1.cpp @@ -14,6 +14,7 @@ #include "FilterNodeD2D1.h" #include "ExtendInputEffectD2D1.h" #include "Tools.h" +#include "nsWindowsHelpers.h" using namespace std; @@ -1177,7 +1178,7 @@ DrawTargetD2D1::GetDWriteFactory() } decltype(DWriteCreateFactory)* createDWriteFactory; - HMODULE dwriteModule = LoadLibraryW(L"dwrite.dll"); + HMODULE dwriteModule = LoadLibrarySystem32(L"dwrite.dll"); createDWriteFactory = (decltype(DWriteCreateFactory)*) GetProcAddress(dwriteModule, "DWriteCreateFactory"); diff --git a/hal/Hal.cpp b/hal/Hal.cpp index 67930c355..981f49125 100644 --- a/hal/Hal.cpp +++ b/hal/Hal.cpp @@ -264,30 +264,6 @@ private: bool mHasValidCache; }; -class BatteryObserversManager : public CachingObserversManager<BatteryInformation> -{ -protected: - void EnableNotifications() { - PROXY_IF_SANDBOXED(EnableBatteryNotifications()); - } - - void DisableNotifications() { - PROXY_IF_SANDBOXED(DisableBatteryNotifications()); - } - - void GetCurrentInformationInternal(BatteryInformation* aInfo) { - PROXY_IF_SANDBOXED(GetCurrentBatteryInformation(aInfo)); - } -}; - -static BatteryObserversManager& -BatteryObservers() -{ - static BatteryObserversManager sBatteryObservers; - AssertMainThread(); - return sBatteryObservers; -} - class NetworkObserversManager : public CachingObserversManager<NetworkInformation> { protected: @@ -356,35 +332,6 @@ ScreenConfigurationObservers() return sScreenConfigurationObservers; } -void -RegisterBatteryObserver(BatteryObserver* aObserver) -{ - AssertMainThread(); - BatteryObservers().AddObserver(aObserver); -} - -void -UnregisterBatteryObserver(BatteryObserver* aObserver) -{ - AssertMainThread(); - BatteryObservers().RemoveObserver(aObserver); -} - -void -GetCurrentBatteryInformation(BatteryInformation* aInfo) -{ - AssertMainThread(); - *aInfo = BatteryObservers().GetCurrentInformation(); -} - -void -NotifyBatteryChange(const BatteryInformation& aInfo) -{ - AssertMainThread(); - BatteryObservers().CacheInformation(aInfo); - BatteryObservers().BroadcastCachedInformation(); -} - bool GetScreenEnabled() { AssertMainThread(); @@ -10,7 +10,6 @@ #include "base/basictypes.h" #include "base/platform_thread.h" #include "nsTArray.h" -#include "mozilla/dom/battery/Types.h" #include "mozilla/dom/MozPowerManagerBinding.h" #include "mozilla/dom/network/Types.h" #include "mozilla/dom/power/Types.h" @@ -88,29 +87,6 @@ void CancelVibrate(nsPIDOMWindowInner* aWindow); void CancelVibrate(const hal::WindowIdentifier &id); /** - * Inform the battery backend there is a new battery observer. - * @param aBatteryObserver The observer that should be added. - */ -void RegisterBatteryObserver(BatteryObserver* aBatteryObserver); - -/** - * Inform the battery backend a battery observer unregistered. - * @param aBatteryObserver The observer that should be removed. - */ -void UnregisterBatteryObserver(BatteryObserver* aBatteryObserver); - -/** - * Returns the current battery information. - */ -void GetCurrentBatteryInformation(hal::BatteryInformation* aBatteryInfo); - -/** - * Notify of a change in the battery state. - * @param aBatteryInfo The new battery information. - */ -void NotifyBatteryChange(const hal::BatteryInformation& aBatteryInfo); - -/** * Determine whether the device's screen is currently enabled. */ bool GetScreenEnabled(); diff --git a/hal/cocoa/CocoaBattery.cpp b/hal/cocoa/CocoaBattery.cpp deleted file mode 100644 index 6f1b7b1dc..000000000 --- a/hal/cocoa/CocoaBattery.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim set: sw=2 ts=2 et lcs=trail\:.,tab\:>~ : */ -/* 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/. */ - -#import <CoreFoundation/CoreFoundation.h> -#import <IOKit/ps/IOPowerSources.h> -#import <IOKit/ps/IOPSKeys.h> - -#include <mozilla/Hal.h> -#include <mozilla/dom/battery/Constants.h> -#include <mozilla/Services.h> - -#include <nsIObserverService.h> -#include <nsIObserver.h> - -#include <dlfcn.h> - -#define IOKIT_FRAMEWORK_PATH "/System/Library/Frameworks/IOKit.framework/IOKit" - -#ifndef kIOPSTimeRemainingUnknown - #define kIOPSTimeRemainingUnknown ((CFTimeInterval)-1.0) -#endif -#ifndef kIOPSTimeRemainingUnlimited - #define kIOPSTimeRemainingUnlimited ((CFTimeInterval)-2.0) -#endif - -using namespace mozilla::dom::battery; - -namespace mozilla { -namespace hal_impl { - -typedef CFTimeInterval (*IOPSGetTimeRemainingEstimateFunc)(void); - -class MacPowerInformationService -{ -public: - static MacPowerInformationService* GetInstance(); - static void Shutdown(); - static bool IsShuttingDown(); - - void BeginListening(); - void StopListening(); - - static void HandleChange(void *aContext); - - ~MacPowerInformationService(); - -private: - MacPowerInformationService(); - - // The reference to the runloop that is notified of power changes. - CFRunLoopSourceRef mRunLoopSource; - - double mLevel; - bool mCharging; - double mRemainingTime; - bool mShouldNotify; - - friend void GetCurrentBatteryInformation(hal::BatteryInformation* aBatteryInfo); - - static MacPowerInformationService* sInstance; - static bool sShuttingDown; - - static void* sIOKitFramework; - static IOPSGetTimeRemainingEstimateFunc sIOPSGetTimeRemainingEstimate; -}; - -void* MacPowerInformationService::sIOKitFramework; -IOPSGetTimeRemainingEstimateFunc MacPowerInformationService::sIOPSGetTimeRemainingEstimate; - -/* - * Implementation of mozilla::hal_impl::EnableBatteryNotifications, - * mozilla::hal_impl::DisableBatteryNotifications, - * and mozilla::hal_impl::GetCurrentBatteryInformation. - */ - -void -EnableBatteryNotifications() -{ - if (!MacPowerInformationService::IsShuttingDown()) { - MacPowerInformationService::GetInstance()->BeginListening(); - } -} - -void -DisableBatteryNotifications() -{ - if (!MacPowerInformationService::IsShuttingDown()) { - MacPowerInformationService::GetInstance()->StopListening(); - } -} - -void -GetCurrentBatteryInformation(hal::BatteryInformation* aBatteryInfo) -{ - MacPowerInformationService* powerService = MacPowerInformationService::GetInstance(); - - aBatteryInfo->level() = powerService->mLevel; - aBatteryInfo->charging() = powerService->mCharging; - aBatteryInfo->remainingTime() = powerService->mRemainingTime; -} - -bool MacPowerInformationService::sShuttingDown = false; - -/* - * Following is the implementation of MacPowerInformationService. - */ - -MacPowerInformationService* MacPowerInformationService::sInstance = nullptr; - -namespace { -struct SingletonDestroyer final : public nsIObserver -{ - NS_DECL_ISUPPORTS - NS_DECL_NSIOBSERVER - -private: - ~SingletonDestroyer() {} -}; - -NS_IMPL_ISUPPORTS(SingletonDestroyer, nsIObserver) - -NS_IMETHODIMP -SingletonDestroyer::Observe(nsISupports*, const char* aTopic, const char16_t*) -{ - MOZ_ASSERT(!strcmp(aTopic, "xpcom-shutdown")); - MacPowerInformationService::Shutdown(); - return NS_OK; -} -} // namespace - -/* static */ MacPowerInformationService* -MacPowerInformationService::GetInstance() -{ - if (sInstance) { - return sInstance; - } - - sInstance = new MacPowerInformationService(); - - nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); - if (obs) { - obs->AddObserver(new SingletonDestroyer(), "xpcom-shutdown", false); - } - - return sInstance; -} - -bool -MacPowerInformationService::IsShuttingDown() -{ - return sShuttingDown; -} - -void -MacPowerInformationService::Shutdown() -{ - sShuttingDown = true; - delete sInstance; - sInstance = nullptr; -} - -MacPowerInformationService::MacPowerInformationService() - : mRunLoopSource(nullptr) - , mLevel(kDefaultLevel) - , mCharging(kDefaultCharging) - , mRemainingTime(kDefaultRemainingTime) - , mShouldNotify(false) -{ - // IOPSGetTimeRemainingEstimate (and the related constants) are only available - // on 10.7, so we test for their presence at runtime. - sIOKitFramework = dlopen(IOKIT_FRAMEWORK_PATH, RTLD_LAZY | RTLD_LOCAL); - if (sIOKitFramework) { - sIOPSGetTimeRemainingEstimate = - (IOPSGetTimeRemainingEstimateFunc)dlsym(sIOKitFramework, "IOPSGetTimeRemainingEstimate"); - } else { - sIOPSGetTimeRemainingEstimate = nullptr; - } -} - -MacPowerInformationService::~MacPowerInformationService() -{ - MOZ_ASSERT(!mRunLoopSource, - "The observers have not been correctly removed! " - "(StopListening should have been called)"); - - if (sIOKitFramework) { - dlclose(sIOKitFramework); - } -} - -void -MacPowerInformationService::BeginListening() -{ - // Set ourselves up to be notified about changes. - MOZ_ASSERT(!mRunLoopSource, "IOPS Notification Loop Source already set up. " - "(StopListening should have been called)"); - - mRunLoopSource = ::IOPSNotificationCreateRunLoopSource(HandleChange, this); - if (mRunLoopSource) { - ::CFRunLoopAddSource(::CFRunLoopGetCurrent(), mRunLoopSource, - kCFRunLoopDefaultMode); - - // Invoke our callback now so we have data if GetCurrentBatteryInformation is - // called before a change happens. - HandleChange(this); - mShouldNotify = true; - } -} - -void -MacPowerInformationService::StopListening() -{ - MOZ_ASSERT(mRunLoopSource, "IOPS Notification Loop Source not set up. " - "(StopListening without BeginListening)"); - - ::CFRunLoopRemoveSource(::CFRunLoopGetCurrent(), mRunLoopSource, - kCFRunLoopDefaultMode); - mRunLoopSource = nullptr; -} - -void -MacPowerInformationService::HandleChange(void* aContext) { - MacPowerInformationService* power = - static_cast<MacPowerInformationService*>(aContext); - - CFTypeRef data = ::IOPSCopyPowerSourcesInfo(); - if (!data) { - ::CFRelease(data); - return; - } - - // Get the list of power sources. - CFArrayRef list = ::IOPSCopyPowerSourcesList(data); - if (!list) { - ::CFRelease(list); - return; - } - - // Default values. These will be used if there are 0 sources or we can't find - // better information. - double level = kDefaultLevel; - double charging = kDefaultCharging; - double remainingTime = kDefaultRemainingTime; - - // Look for the first battery power source to give us the information we need. - // Usually there's only 1 available, depending on current power source. - for (CFIndex i = 0; i < ::CFArrayGetCount(list); ++i) { - CFTypeRef source = ::CFArrayGetValueAtIndex(list, i); - CFDictionaryRef currPowerSourceDesc = ::IOPSGetPowerSourceDescription(data, source); - if (!currPowerSourceDesc) { - continue; - } - - // Get a battery level estimate. This key is required. - int currentCapacity = 0; - const void* cfRef = ::CFDictionaryGetValue(currPowerSourceDesc, CFSTR(kIOPSCurrentCapacityKey)); - ::CFNumberGetValue((CFNumberRef)cfRef, kCFNumberSInt32Type, ¤tCapacity); - - // This key is also required. - int maxCapacity = 0; - cfRef = ::CFDictionaryGetValue(currPowerSourceDesc, CFSTR(kIOPSMaxCapacityKey)); - ::CFNumberGetValue((CFNumberRef)cfRef, kCFNumberSInt32Type, &maxCapacity); - - if (maxCapacity > 0) { - level = static_cast<double>(currentCapacity)/static_cast<double>(maxCapacity); - } - - // Find out if we're charging. - // This key is optional, we fallback to kDefaultCharging if the current power - // source doesn't have that info. - if(::CFDictionaryGetValueIfPresent(currPowerSourceDesc, CFSTR(kIOPSIsChargingKey), &cfRef)) { - charging = ::CFBooleanGetValue((CFBooleanRef)cfRef); - - // Get an estimate of how long it's going to take until we're fully charged. - // This key is optional. - if (charging) { - // Default value that will be changed if we happen to find the actual - // remaining time. - remainingTime = level == 1.0 ? kDefaultRemainingTime : kUnknownRemainingTime; - - if (::CFDictionaryGetValueIfPresent(currPowerSourceDesc, - CFSTR(kIOPSTimeToFullChargeKey), &cfRef)) { - int timeToCharge; - ::CFNumberGetValue((CFNumberRef)cfRef, kCFNumberIntType, &timeToCharge); - if (timeToCharge != kIOPSTimeRemainingUnknown) { - remainingTime = timeToCharge*60; - } - } - } else if (sIOPSGetTimeRemainingEstimate) { // not charging - // See if we can get a time estimate. - CFTimeInterval estimate = sIOPSGetTimeRemainingEstimate(); - if (estimate == kIOPSTimeRemainingUnlimited || estimate == kIOPSTimeRemainingUnknown) { - remainingTime = kUnknownRemainingTime; - } else { - remainingTime = estimate; - } - } - } - - break; - } - - bool isNewData = level != power->mLevel || charging != power->mCharging || - remainingTime != power->mRemainingTime; - - power->mRemainingTime = remainingTime; - power->mCharging = charging; - power->mLevel = level; - - // Notify the observers if stuff changed. - if (power->mShouldNotify && isNewData) { - hal::NotifyBatteryChange(hal::BatteryInformation(power->mLevel, - power->mCharging, - power->mRemainingTime)); - } - - ::CFRelease(data); - ::CFRelease(list); -} - -} // namespace hal_impl -} // namespace mozilla diff --git a/hal/fallback/FallbackBattery.cpp b/hal/fallback/FallbackBattery.cpp deleted file mode 100644 index 3e5e71574..000000000 --- a/hal/fallback/FallbackBattery.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set sw=2 ts=8 et ft=cpp : */ -/* 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 "Hal.h" -#include "mozilla/dom/battery/Constants.h" - -namespace mozilla { -namespace hal_impl { - -void -EnableBatteryNotifications() -{} - -void -DisableBatteryNotifications() -{} - -void -GetCurrentBatteryInformation(hal::BatteryInformation* aBatteryInfo) -{ - aBatteryInfo->level() = dom::battery::kDefaultLevel; - aBatteryInfo->charging() = dom::battery::kDefaultCharging; - aBatteryInfo->remainingTime() = dom::battery::kDefaultRemainingTime; -} - -} // hal_impl -} // namespace mozilla diff --git a/hal/linux/UPowerClient.cpp b/hal/linux/UPowerClient.cpp deleted file mode 100644 index 9f6e04379..000000000 --- a/hal/linux/UPowerClient.cpp +++ /dev/null @@ -1,508 +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 "Hal.h" -#include "HalLog.h" -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> -#include <mozilla/Attributes.h> -#include <mozilla/dom/battery/Constants.h> -#include "nsAutoRef.h" -#include <cmath> - -/* - * Helper that manages the destruction of glib objects as soon as they leave - * the current scope. - * - * We are specializing nsAutoRef class. - */ - -template <> -class nsAutoRefTraits<GHashTable> : public nsPointerRefTraits<GHashTable> -{ -public: - static void Release(GHashTable* ptr) { g_hash_table_unref(ptr); } -}; - -using namespace mozilla::dom::battery; - -namespace mozilla { -namespace hal_impl { - -/** - * This is the declaration of UPowerClient class. This class is listening and - * communicating to upower daemon through DBus. - * There is no header file because this class shouldn't be public. - */ -class UPowerClient -{ -public: - static UPowerClient* GetInstance(); - - void BeginListening(); - void StopListening(); - - double GetLevel(); - bool IsCharging(); - double GetRemainingTime(); - - ~UPowerClient(); - -private: - UPowerClient(); - - enum States { - eState_Unknown = 0, - eState_Charging, - eState_Discharging, - eState_Empty, - eState_FullyCharged, - eState_PendingCharge, - eState_PendingDischarge - }; - - /** - * Update the currently tracked device. - * @return whether everything went ok. - */ - void UpdateTrackedDeviceSync(); - - /** - * Returns a hash table with the properties of aDevice. - * Note: the caller has to unref the hash table. - */ - GHashTable* GetDevicePropertiesSync(DBusGProxy* aProxy); - void GetDevicePropertiesAsync(DBusGProxy* aProxy); - static void GetDevicePropertiesCallback(DBusGProxy* aProxy, - DBusGProxyCall* aCall, - void* aData); - - /** - * Using the device properties (aHashTable), this method updates the member - * variable storing the values we care about. - */ - void UpdateSavedInfo(GHashTable* aHashTable); - - /** - * Callback used by 'DeviceChanged' signal. - */ - static void DeviceChanged(DBusGProxy* aProxy, const gchar* aObjectPath, - UPowerClient* aListener); - - /** - * Callback used by 'PropertiesChanged' signal. - * This method is called when the the battery level changes. - * (Only with upower >= 0.99) - */ - static void PropertiesChanged(DBusGProxy* aProxy, const gchar*, - GHashTable*, char**, - UPowerClient* aListener); - - /** - * Callback called when mDBusConnection gets a signal. - */ - static DBusHandlerResult ConnectionSignalFilter(DBusConnection* aConnection, - DBusMessage* aMessage, - void* aData); - - // The DBus connection object. - DBusGConnection* mDBusConnection; - - // The DBus proxy object to upower. - DBusGProxy* mUPowerProxy; - - // The path of the tracked device. - gchar* mTrackedDevice; - - // The DBusGProxy for the tracked device. - DBusGProxy* mTrackedDeviceProxy; - - double mLevel; - bool mCharging; - double mRemainingTime; - - static UPowerClient* sInstance; - - static const guint sDeviceTypeBattery = 2; - static const guint64 kUPowerUnknownRemainingTime = 0; -}; - -/* - * Implementation of mozilla::hal_impl::EnableBatteryNotifications, - * mozilla::hal_impl::DisableBatteryNotifications, - * and mozilla::hal_impl::GetCurrentBatteryInformation. - */ - -void -EnableBatteryNotifications() -{ - UPowerClient::GetInstance()->BeginListening(); -} - -void -DisableBatteryNotifications() -{ - UPowerClient::GetInstance()->StopListening(); -} - -void -GetCurrentBatteryInformation(hal::BatteryInformation* aBatteryInfo) -{ - UPowerClient* upowerClient = UPowerClient::GetInstance(); - - aBatteryInfo->level() = upowerClient->GetLevel(); - aBatteryInfo->charging() = upowerClient->IsCharging(); - aBatteryInfo->remainingTime() = upowerClient->GetRemainingTime(); -} - -/* - * Following is the implementation of UPowerClient. - */ - -UPowerClient* UPowerClient::sInstance = nullptr; - -/* static */ UPowerClient* -UPowerClient::GetInstance() -{ - if (!sInstance) { - sInstance = new UPowerClient(); - } - - return sInstance; -} - -UPowerClient::UPowerClient() - : mDBusConnection(nullptr) - , mUPowerProxy(nullptr) - , mTrackedDevice(nullptr) - , mTrackedDeviceProxy(nullptr) - , mLevel(kDefaultLevel) - , mCharging(kDefaultCharging) - , mRemainingTime(kDefaultRemainingTime) -{ -} - -UPowerClient::~UPowerClient() -{ - NS_ASSERTION(!mDBusConnection && !mUPowerProxy && !mTrackedDevice && !mTrackedDeviceProxy, - "The observers have not been correctly removed! " - "(StopListening should have been called)"); -} - -void -UPowerClient::BeginListening() -{ - GError* error = nullptr; - mDBusConnection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); - - if (!mDBusConnection) { - HAL_LOG("Failed to open connection to bus: %s\n", error->message); - g_error_free(error); - return; - } - - DBusConnection* dbusConnection = - dbus_g_connection_get_connection(mDBusConnection); - - // Make sure we do not exit the entire program if DBus connection get lost. - dbus_connection_set_exit_on_disconnect(dbusConnection, false); - - // Listening to signals the DBus connection is going to get so we will know - // when it is lost and we will be able to disconnect cleanly. - dbus_connection_add_filter(dbusConnection, ConnectionSignalFilter, this, - nullptr); - - mUPowerProxy = dbus_g_proxy_new_for_name(mDBusConnection, - "org.freedesktop.UPower", - "/org/freedesktop/UPower", - "org.freedesktop.UPower"); - - UpdateTrackedDeviceSync(); - - /* - * TODO: we should probably listen to DeviceAdded and DeviceRemoved signals. - * If we do that, we would have to disconnect from those in StopListening. - * It's not yet implemented because it requires testing hot plugging and - * removal of a battery. - */ - dbus_g_proxy_add_signal(mUPowerProxy, "DeviceChanged", G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal(mUPowerProxy, "DeviceChanged", - G_CALLBACK (DeviceChanged), this, nullptr); -} - -void -UPowerClient::StopListening() -{ - // If mDBusConnection isn't initialized, that means we are not really listening. - if (!mDBusConnection) { - return; - } - - dbus_connection_remove_filter( - dbus_g_connection_get_connection(mDBusConnection), - ConnectionSignalFilter, this); - - dbus_g_proxy_disconnect_signal(mUPowerProxy, "DeviceChanged", - G_CALLBACK (DeviceChanged), this); - - g_free(mTrackedDevice); - mTrackedDevice = nullptr; - - if (mTrackedDeviceProxy) { - dbus_g_proxy_disconnect_signal(mTrackedDeviceProxy, "PropertiesChanged", - G_CALLBACK (PropertiesChanged), this); - - g_object_unref(mTrackedDeviceProxy); - mTrackedDeviceProxy = nullptr; - } - - g_object_unref(mUPowerProxy); - mUPowerProxy = nullptr; - - dbus_g_connection_unref(mDBusConnection); - mDBusConnection = nullptr; - - // We should now show the default values, not the latest we got. - mLevel = kDefaultLevel; - mCharging = kDefaultCharging; - mRemainingTime = kDefaultRemainingTime; -} - -void -UPowerClient::UpdateTrackedDeviceSync() -{ - GType typeGPtrArray = dbus_g_type_get_collection("GPtrArray", - DBUS_TYPE_G_OBJECT_PATH); - GPtrArray* devices = nullptr; - GError* error = nullptr; - - // Reset the current tracked device: - g_free(mTrackedDevice); - mTrackedDevice = nullptr; - - // Reset the current tracked device proxy: - if (mTrackedDeviceProxy) { - dbus_g_proxy_disconnect_signal(mTrackedDeviceProxy, "PropertiesChanged", - G_CALLBACK (PropertiesChanged), this); - - g_object_unref(mTrackedDeviceProxy); - mTrackedDeviceProxy = nullptr; - } - - // If that fails, that likely means upower isn't installed. - if (!dbus_g_proxy_call(mUPowerProxy, "EnumerateDevices", &error, G_TYPE_INVALID, - typeGPtrArray, &devices, G_TYPE_INVALID)) { - HAL_LOG("Error: %s\n", error->message); - g_error_free(error); - return; - } - - /* - * We are looking for the first device that is a battery. - * TODO: we could try to combine more than one battery. - */ - for (guint i=0; i<devices->len; ++i) { - gchar* devicePath = static_cast<gchar*>(g_ptr_array_index(devices, i)); - - DBusGProxy* proxy = dbus_g_proxy_new_from_proxy(mUPowerProxy, - "org.freedesktop.DBus.Properties", - devicePath); - - nsAutoRef<GHashTable> hashTable(GetDevicePropertiesSync(proxy)); - - if (g_value_get_uint(static_cast<const GValue*>(g_hash_table_lookup(hashTable, "Type"))) == sDeviceTypeBattery) { - UpdateSavedInfo(hashTable); - mTrackedDevice = devicePath; - mTrackedDeviceProxy = proxy; - break; - } - - g_object_unref(proxy); - g_free(devicePath); - } - - if (mTrackedDeviceProxy) { - dbus_g_proxy_add_signal(mTrackedDeviceProxy, "PropertiesChanged", - G_TYPE_STRING, - dbus_g_type_get_map("GHashTable", G_TYPE_STRING, - G_TYPE_VALUE), - G_TYPE_STRV, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(mTrackedDeviceProxy, "PropertiesChanged", - G_CALLBACK (PropertiesChanged), this, nullptr); - } - - g_ptr_array_free(devices, true); -} - -/* static */ void -UPowerClient::DeviceChanged(DBusGProxy* aProxy, const gchar* aObjectPath, - UPowerClient* aListener) -{ - if (!aListener->mTrackedDevice) { - return; - } - -#if GLIB_MAJOR_VERSION >= 2 && GLIB_MINOR_VERSION >= 16 - if (g_strcmp0(aObjectPath, aListener->mTrackedDevice)) { -#else - if (g_ascii_strcasecmp(aObjectPath, aListener->mTrackedDevice)) { -#endif - return; - } - - aListener->GetDevicePropertiesAsync(aListener->mTrackedDeviceProxy); -} - -/* static */ void -UPowerClient::PropertiesChanged(DBusGProxy* aProxy, const gchar*, GHashTable*, - char**, UPowerClient* aListener) -{ - aListener->GetDevicePropertiesAsync(aListener->mTrackedDeviceProxy); -} - -/* static */ DBusHandlerResult -UPowerClient::ConnectionSignalFilter(DBusConnection* aConnection, - DBusMessage* aMessage, void* aData) -{ - if (dbus_message_is_signal(aMessage, DBUS_INTERFACE_LOCAL, "Disconnected")) { - static_cast<UPowerClient*>(aData)->StopListening(); - // We do not return DBUS_HANDLER_RESULT_HANDLED here because the connection - // might be shared and some other filters might want to do something. - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -GHashTable* -UPowerClient::GetDevicePropertiesSync(DBusGProxy* aProxy) -{ - GError* error = nullptr; - GHashTable* hashTable = nullptr; - GType typeGHashTable = dbus_g_type_get_map("GHashTable", G_TYPE_STRING, - G_TYPE_VALUE); - if (!dbus_g_proxy_call(aProxy, "GetAll", &error, G_TYPE_STRING, - "org.freedesktop.UPower.Device", G_TYPE_INVALID, - typeGHashTable, &hashTable, G_TYPE_INVALID)) { - HAL_LOG("Error: %s\n", error->message); - g_error_free(error); - return nullptr; - } - - return hashTable; -} - -/* static */ void -UPowerClient::GetDevicePropertiesCallback(DBusGProxy* aProxy, - DBusGProxyCall* aCall, void* aData) -{ - GError* error = nullptr; - GHashTable* hashTable = nullptr; - GType typeGHashTable = dbus_g_type_get_map("GHashTable", G_TYPE_STRING, - G_TYPE_VALUE); - if (!dbus_g_proxy_end_call(aProxy, aCall, &error, typeGHashTable, - &hashTable, G_TYPE_INVALID)) { - HAL_LOG("Error: %s\n", error->message); - g_error_free(error); - } else { - sInstance->UpdateSavedInfo(hashTable); - hal::NotifyBatteryChange(hal::BatteryInformation(sInstance->mLevel, - sInstance->mCharging, - sInstance->mRemainingTime)); - g_hash_table_unref(hashTable); - } -} - -void -UPowerClient::GetDevicePropertiesAsync(DBusGProxy* aProxy) -{ - dbus_g_proxy_begin_call(aProxy, "GetAll", GetDevicePropertiesCallback, nullptr, - nullptr, G_TYPE_STRING, - "org.freedesktop.UPower.Device", G_TYPE_INVALID); -} - -void -UPowerClient::UpdateSavedInfo(GHashTable* aHashTable) -{ - bool isFull = false; - - /* - * State values are confusing... - * First of all, after looking at upower sources (0.9.13), it seems that - * PendingDischarge and PendingCharge are not used. - * In addition, FullyCharged and Empty states are not clear because we do not - * know if the battery is actually charging or not. Those values come directly - * from sysfs (in the Linux kernel) which have four states: "Empty", "Full", - * "Charging" and "Discharging". In sysfs, "Empty" and "Full" are also only - * related to the level, not to the charging state. - * In this code, we are going to assume that Full means charging and Empty - * means discharging because if that is not the case, the state should not - * last a long time (actually, it should disappear at the following update). - * It might be even very hard to see real cases where the state is Empty and - * the battery is charging or the state is Full and the battery is discharging - * given that plugging/unplugging the battery should have an impact on the - * level. - */ - switch (g_value_get_uint(static_cast<const GValue*>(g_hash_table_lookup(aHashTable, "State")))) { - case eState_Unknown: - mCharging = kDefaultCharging; - break; - case eState_FullyCharged: - isFull = true; - MOZ_FALLTHROUGH; - case eState_Charging: - case eState_PendingCharge: - mCharging = true; - break; - case eState_Discharging: - case eState_Empty: - case eState_PendingDischarge: - mCharging = false; - break; - } - - /* - * The battery level might be very close to 100% (like 99%) without - * increasing. It seems that upower sets the battery state as 'full' in that - * case so we should trust it and not even try to get the value. - */ - if (isFull) { - mLevel = 1.0; - } else { - mLevel = round(g_value_get_double(static_cast<const GValue*>(g_hash_table_lookup(aHashTable, "Percentage"))))*0.01; - } - - if (isFull) { - mRemainingTime = 0; - } else { - mRemainingTime = mCharging ? g_value_get_int64(static_cast<const GValue*>(g_hash_table_lookup(aHashTable, "TimeToFull"))) - : g_value_get_int64(static_cast<const GValue*>(g_hash_table_lookup(aHashTable, "TimeToEmpty"))); - - if (mRemainingTime == kUPowerUnknownRemainingTime) { - mRemainingTime = kUnknownRemainingTime; - } - } -} - -double -UPowerClient::GetLevel() -{ - return mLevel; -} - -bool -UPowerClient::IsCharging() -{ - return mCharging; -} - -double -UPowerClient::GetRemainingTime() -{ - return mRemainingTime; -} - -} // namespace hal_impl -} // namespace mozilla diff --git a/hal/moz.build b/hal/moz.build index a1acfa320..d817e4a01 100644 --- a/hal/moz.build +++ b/hal/moz.build @@ -34,14 +34,6 @@ if CONFIG['OS_TARGET'] == 'Linux': 'linux/LinuxMemory.cpp', 'linux/LinuxPower.cpp', ] - if CONFIG['MOZ_ENABLE_DBUS']: - UNIFIED_SOURCES += [ - 'linux/UPowerClient.cpp', - ] - else: - UNIFIED_SOURCES += [ - 'fallback/FallbackBattery.cpp', - ] elif CONFIG['OS_TARGET'] == 'WINNT': UNIFIED_SOURCES += [ 'fallback/FallbackAlarm.cpp', @@ -51,13 +43,8 @@ elif CONFIG['OS_TARGET'] == 'WINNT': 'fallback/FallbackVibration.cpp', 'windows/WindowsSensor.cpp', ] - # WindowsBattery.cpp cannot be built in unified mode because it relies on HalImpl.h. - SOURCES += [ - 'windows/WindowsBattery.cpp', - ] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': UNIFIED_SOURCES += [ - 'cocoa/CocoaBattery.cpp', 'fallback/FallbackAlarm.cpp', 'fallback/FallbackMemory.cpp', 'fallback/FallbackPower.cpp', @@ -73,18 +60,9 @@ elif CONFIG['OS_TARGET'] in ('OpenBSD', 'NetBSD', 'FreeBSD', 'DragonFly'): 'fallback/FallbackSensor.cpp', 'fallback/FallbackVibration.cpp', ] - if CONFIG['MOZ_ENABLE_DBUS']: - UNIFIED_SOURCES += [ - 'linux/UPowerClient.cpp', - ] - else: - UNIFIED_SOURCES += [ - 'fallback/FallbackBattery.cpp', - ] else: UNIFIED_SOURCES += [ 'fallback/FallbackAlarm.cpp', - 'fallback/FallbackBattery.cpp', 'fallback/FallbackMemory.cpp', 'fallback/FallbackPower.cpp', 'fallback/FallbackScreenConfiguration.cpp', diff --git a/hal/sandbox/PHal.ipdl b/hal/sandbox/PHal.ipdl index 1af550aff..8701e1219 100644 --- a/hal/sandbox/PHal.ipdl +++ b/hal/sandbox/PHal.ipdl @@ -20,12 +20,6 @@ using PRTime from "prtime.h"; namespace mozilla { namespace hal { -struct BatteryInformation { - double level; - bool charging; - double remainingTime; -}; - struct SensorData { SensorType sensor; PRTime timestamp; @@ -69,7 +63,6 @@ nested(upto inside_cpow) sync protocol PHal { manager PContent; child: - async NotifyBatteryChange(BatteryInformation aBatteryInfo); async NotifyNetworkChange(NetworkInformation aNetworkInfo); async NotifyWakeLockChange(WakeLockInformation aWakeLockInfo); async NotifyScreenConfigurationChange(ScreenConfiguration aScreenOrientation); @@ -80,11 +73,6 @@ parent: async Vibrate(uint32_t[] pattern, uint64_t[] id, PBrowser browser); async CancelVibrate(uint64_t[] id, PBrowser browser); - async EnableBatteryNotifications(); - async DisableBatteryNotifications(); - sync GetCurrentBatteryInformation() - returns (BatteryInformation aBatteryInfo); - async EnableNetworkNotifications(); async DisableNetworkNotifications(); sync GetCurrentNetworkInformation() diff --git a/hal/sandbox/SandboxHal.cpp b/hal/sandbox/SandboxHal.cpp index aeaeb724e..579f3b472 100644 --- a/hal/sandbox/SandboxHal.cpp +++ b/hal/sandbox/SandboxHal.cpp @@ -13,7 +13,6 @@ #include "mozilla/hal_sandbox/PHalParent.h" #include "mozilla/dom/TabParent.h" #include "mozilla/dom/TabChild.h" -#include "mozilla/dom/battery/Types.h" #include "mozilla/dom/network/Types.h" #include "mozilla/dom/ScreenOrientation.h" #include "mozilla/EnumeratedRange.h" @@ -70,24 +69,6 @@ CancelVibrate(const WindowIdentifier &id) } void -EnableBatteryNotifications() -{ - Hal()->SendEnableBatteryNotifications(); -} - -void -DisableBatteryNotifications() -{ - Hal()->SendDisableBatteryNotifications(); -} - -void -GetCurrentBatteryInformation(BatteryInformation* aBatteryInfo) -{ - Hal()->SendGetCurrentBatteryInformation(aBatteryInfo); -} - -void EnableNetworkNotifications() { Hal()->SendEnableNetworkNotifications(); @@ -376,7 +357,6 @@ bool SystemServiceIsRunning(const char* aSvcName) } class HalParent : public PHalParent - , public BatteryObserver , public NetworkObserver , public ISensorObserver , public WakeLockObserver @@ -390,7 +370,6 @@ public: { // NB: you *must* unconditionally unregister your observer here, // if it *may* be registered below. - hal::UnregisterBatteryObserver(this); hal::UnregisterNetworkObserver(this); hal::UnregisterScreenConfigurationObserver(this); for (auto sensor : MakeEnumeratedRange(NUM_SENSOR_TYPE)) { @@ -432,30 +411,6 @@ public: } virtual bool - RecvEnableBatteryNotifications() override { - // We give all content battery-status permission. - hal::RegisterBatteryObserver(this); - return true; - } - - virtual bool - RecvDisableBatteryNotifications() override { - hal::UnregisterBatteryObserver(this); - return true; - } - - virtual bool - RecvGetCurrentBatteryInformation(BatteryInformation* aBatteryInfo) override { - // We give all content battery-status permission. - hal::GetCurrentBatteryInformation(aBatteryInfo); - return true; - } - - void Notify(const BatteryInformation& aBatteryInfo) override { - Unused << SendNotifyBatteryChange(aBatteryInfo); - } - - virtual bool RecvEnableNetworkNotifications() override { // We give all content access to this network-status information. hal::RegisterNetworkObserver(this); @@ -769,12 +724,6 @@ public: } virtual bool - RecvNotifyBatteryChange(const BatteryInformation& aBatteryInfo) override { - hal::NotifyBatteryChange(aBatteryInfo); - return true; - } - - virtual bool RecvNotifySensorChange(const hal::SensorData &aSensorData) override; virtual bool diff --git a/hal/windows/WindowsBattery.cpp b/hal/windows/WindowsBattery.cpp deleted file mode 100644 index 520330242..000000000 --- a/hal/windows/WindowsBattery.cpp +++ /dev/null @@ -1,127 +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 "Hal.h" -#include "HalImpl.h" -#include "mozilla/Preferences.h" -#include "mozilla/dom/battery/Constants.h" - -#include <windows.h> - -using namespace mozilla::dom::battery; - -namespace mozilla { -namespace hal_impl { - -static HPOWERNOTIFY sPowerHandle = nullptr; -static HPOWERNOTIFY sCapacityHandle = nullptr; -static HWND sHWnd = nullptr; - -static -LRESULT CALLBACK -BatteryWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - if (msg != WM_POWERBROADCAST || wParam != PBT_POWERSETTINGCHANGE) { - return DefWindowProc(hwnd, msg, wParam, lParam); - } - - hal::BatteryInformation currentInfo; - - // Since we need update remainingTime, we cannot use LPARAM. - hal_impl::GetCurrentBatteryInformation(¤tInfo); - - hal::NotifyBatteryChange(currentInfo); - return TRUE; -} - -void -EnableBatteryNotifications() -{ - // Create custom window to watch battery event - // If we can get Gecko's window handle, this is unnecessary. - - if (sHWnd == nullptr) { - WNDCLASSW wc; - HMODULE hSelf = GetModuleHandle(nullptr); - - if (!GetClassInfoW(hSelf, L"MozillaBatteryClass", &wc)) { - ZeroMemory(&wc, sizeof(WNDCLASSW)); - wc.hInstance = hSelf; - wc.lpfnWndProc = BatteryWindowProc; - wc.lpszClassName = L"MozillaBatteryClass"; - RegisterClassW(&wc); - } - - sHWnd = CreateWindowW(L"MozillaBatteryClass", L"Battery Watcher", - 0, 0, 0, 0, 0, - nullptr, nullptr, hSelf, nullptr); - } - - if (sHWnd == nullptr) { - return; - } - - sPowerHandle = - RegisterPowerSettingNotification(sHWnd, - &GUID_ACDC_POWER_SOURCE, - DEVICE_NOTIFY_WINDOW_HANDLE); - sCapacityHandle = - RegisterPowerSettingNotification(sHWnd, - &GUID_BATTERY_PERCENTAGE_REMAINING, - DEVICE_NOTIFY_WINDOW_HANDLE); -} - -void -DisableBatteryNotifications() -{ - if (sPowerHandle) { - UnregisterPowerSettingNotification(sPowerHandle); - sPowerHandle = nullptr; - } - - if (sCapacityHandle) { - UnregisterPowerSettingNotification(sCapacityHandle); - sCapacityHandle = nullptr; - } - - if (sHWnd) { - DestroyWindow(sHWnd); - sHWnd = nullptr; - } -} - -void -GetCurrentBatteryInformation(hal::BatteryInformation* aBatteryInfo) -{ - SYSTEM_POWER_STATUS status; - if (!GetSystemPowerStatus(&status)) { - aBatteryInfo->level() = kDefaultLevel; - aBatteryInfo->charging() = kDefaultCharging; - aBatteryInfo->remainingTime() = kDefaultRemainingTime; - return; - } - - aBatteryInfo->level() = - status.BatteryLifePercent == 255 ? kDefaultLevel - : ((double)status.BatteryLifePercent) / 100.0; - aBatteryInfo->charging() = (status.ACLineStatus != 0); - if (status.ACLineStatus != 0) { - if (aBatteryInfo->level() == 1.0) { - // GetSystemPowerStatus API may returns -1 for BatteryFullLifeTime. - // So, if battery is 100%, set kDefaultRemainingTime at force. - aBatteryInfo->remainingTime() = kDefaultRemainingTime; - } else { - aBatteryInfo->remainingTime() = - status.BatteryFullLifeTime == (DWORD)-1 ? kUnknownRemainingTime - : status.BatteryFullLifeTime; - } - } else { - aBatteryInfo->remainingTime() = - status.BatteryLifeTime == (DWORD)-1 ? kUnknownRemainingTime - : status.BatteryLifeTime; - } -} - -} // hal_impl -} // mozilla diff --git a/image/ClippedImage.cpp b/image/ClippedImage.cpp index 539471851..6372f5950 100644 --- a/image/ClippedImage.cpp +++ b/image/ClippedImage.cpp @@ -242,13 +242,13 @@ ClippedImage::GetIntrinsicSize(nsSize* aSize) } NS_IMETHODIMP -ClippedImage::GetIntrinsicRatio(nsSize* aRatio) +ClippedImage::GetIntrinsicRatio(AspectRatio* aRatio) { if (!ShouldClip()) { return InnerImage()->GetIntrinsicRatio(aRatio); } - *aRatio = nsSize(mClip.width, mClip.height); + *aRatio = AspectRatio::FromSize(mClip.width, mClip.height); return NS_OK; } diff --git a/image/ClippedImage.h b/image/ClippedImage.h index 140cc1909..65963b756 100644 --- a/image/ClippedImage.h +++ b/image/ClippedImage.h @@ -35,7 +35,7 @@ public: NS_IMETHOD GetWidth(int32_t* aWidth) override; NS_IMETHOD GetHeight(int32_t* aHeight) override; NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override; - NS_IMETHOD GetIntrinsicRatio(nsSize* aRatio) override; + NS_IMETHOD GetIntrinsicRatio(AspectRatio* aRatio) override; NS_IMETHOD_(already_AddRefed<SourceSurface>) GetFrame(uint32_t aWhichFrame, uint32_t aFlags) override; NS_IMETHOD_(already_AddRefed<SourceSurface>) diff --git a/image/DynamicImage.cpp b/image/DynamicImage.cpp index 670595aec..aeb1fcf78 100644 --- a/image/DynamicImage.cpp +++ b/image/DynamicImage.cpp @@ -136,10 +136,10 @@ DynamicImage::GetIntrinsicSize(nsSize* aSize) } NS_IMETHODIMP -DynamicImage::GetIntrinsicRatio(nsSize* aSize) +DynamicImage::GetIntrinsicRatio(AspectRatio* aRatio) { - IntSize intSize(mDrawable->Size()); - *aSize = nsSize(intSize.width, intSize.height); + auto size = mDrawable->Size(); + *aRatio = AspectRatio::FromSize(size); return NS_OK; } diff --git a/image/ImageWrapper.cpp b/image/ImageWrapper.cpp index f7068dfc5..5ed6c7817 100644 --- a/image/ImageWrapper.cpp +++ b/image/ImageWrapper.cpp @@ -146,9 +146,9 @@ ImageWrapper::GetIntrinsicSize(nsSize* aSize) } NS_IMETHODIMP -ImageWrapper::GetIntrinsicRatio(nsSize* aSize) +ImageWrapper::GetIntrinsicRatio(AspectRatio* aRatio) { - return mInnerImage->GetIntrinsicRatio(aSize); + return mInnerImage->GetIntrinsicRatio(aRatio); } NS_IMETHODIMP_(Orientation) diff --git a/image/OrientedImage.cpp b/image/OrientedImage.cpp index 9489ceafd..0b6560df1 100644 --- a/image/OrientedImage.cpp +++ b/image/OrientedImage.cpp @@ -59,12 +59,12 @@ OrientedImage::GetIntrinsicSize(nsSize* aSize) } NS_IMETHODIMP -OrientedImage::GetIntrinsicRatio(nsSize* aRatio) +OrientedImage::GetIntrinsicRatio(AspectRatio* aRatio) { nsresult rv = InnerImage()->GetIntrinsicRatio(aRatio); if (mOrientation.SwapsWidthAndHeight()) { - swap(aRatio->width, aRatio->height); + *aRatio = aRatio->Inverted(); } return rv; diff --git a/image/OrientedImage.h b/image/OrientedImage.h index 604ab3d4f..b77571f4a 100644 --- a/image/OrientedImage.h +++ b/image/OrientedImage.h @@ -31,7 +31,7 @@ public: NS_IMETHOD GetWidth(int32_t* aWidth) override; NS_IMETHOD GetHeight(int32_t* aHeight) override; NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override; - NS_IMETHOD GetIntrinsicRatio(nsSize* aRatio) override; + NS_IMETHOD GetIntrinsicRatio(AspectRatio* aRatio) override; NS_IMETHOD_(already_AddRefed<SourceSurface>) GetFrame(uint32_t aWhichFrame, uint32_t aFlags) override; NS_IMETHOD_(already_AddRefed<SourceSurface>) diff --git a/image/RasterImage.cpp b/image/RasterImage.cpp index b67ec3bef..5725aee3a 100644 --- a/image/RasterImage.cpp +++ b/image/RasterImage.cpp @@ -240,13 +240,14 @@ RasterImage::GetIntrinsicSize(nsSize* aSize) //****************************************************************************** NS_IMETHODIMP -RasterImage::GetIntrinsicRatio(nsSize* aRatio) +RasterImage::GetIntrinsicRatio(AspectRatio* aRatio) { if (mError) { return NS_ERROR_FAILURE; } - *aRatio = nsSize(mSize.width, mSize.height); + *aRatio = AspectRatio::FromSize(mSize); + return NS_OK; } diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp index 3028c1c2e..3fcb296f5 100644 --- a/image/VectorImage.cpp +++ b/image/VectorImage.cpp @@ -628,7 +628,7 @@ VectorImage::GetIntrinsicSize(nsSize* aSize) //****************************************************************************** NS_IMETHODIMP -VectorImage::GetIntrinsicRatio(nsSize* aRatio) +VectorImage::GetIntrinsicRatio(AspectRatio* aRatio) { if (mError || !mIsFullyLoaded) { return NS_ERROR_FAILURE; diff --git a/image/encoders/jpeg/nsJPEGEncoder.cpp b/image/encoders/jpeg/nsJPEGEncoder.cpp index 04cfef07b..e5835c295 100644 --- a/image/encoders/jpeg/nsJPEGEncoder.cpp +++ b/image/encoders/jpeg/nsJPEGEncoder.cpp @@ -8,6 +8,7 @@ #include "nsString.h" #include "nsStreamUtils.h" #include "gfxColor.h" +#include "mozilla/CheckedInt.h" #include <setjmp.h> #include "jerror.h" @@ -430,10 +431,14 @@ nsJPEGEncoder::emptyOutputBuffer(jpeg_compress_struct* cinfo) that->mImageBufferUsed = that->mImageBufferSize; // expand buffer, just double size each time - that->mImageBufferSize *= 2; + uint8_t* newBuf = nullptr; + CheckedInt<uint32_t> bufSize = + CheckedInt<uint32_t>(that->mImageBufferSize) * 2; + if (bufSize.isValid()) { + that->mImageBufferSize = bufSize.value(); + newBuf = (uint8_t*)realloc(that->mImageBuffer, that->mImageBufferSize); + } - uint8_t* newBuf = (uint8_t*)realloc(that->mImageBuffer, - that->mImageBufferSize); if (!newBuf) { // can't resize, just zero (this will keep us from writing more) free(that->mImageBuffer); diff --git a/image/imgIContainer.idl b/image/imgIContainer.idl index 20c949037..ba1c494af 100644 --- a/image/imgIContainer.idl +++ b/image/imgIContainer.idl @@ -12,6 +12,7 @@ #include "gfxMatrix.h" #include "gfxRect.h" #include "mozilla/gfx/2D.h" +#include "mozilla/AspectRatio.h" #include "mozilla/Maybe.h" #include "mozilla/RefPtr.h" #include "nsRect.h" @@ -55,6 +56,7 @@ native SamplingFilter(mozilla::gfx::SamplingFilter); native nsIntRectByVal(nsIntRect); [ref] native nsIntSize(nsIntSize); native nsSize(nsSize); +native AspectRatio(mozilla::AspectRatio); [ptr] native nsIFrame(nsIFrame); native TempRefImageContainer(already_AddRefed<mozilla::layers::ImageContainer>); [ref] native ImageRegion(mozilla::image::ImageRegion); @@ -101,7 +103,7 @@ interface imgIContainer : nsISupports * The (dimensionless) intrinsic ratio of this image. In the case of any * error, an exception will be thrown. */ - [noscript] readonly attribute nsSize intrinsicRatio; + [noscript] readonly attribute AspectRatio intrinsicRatio; /** * Given a size at which this image will be displayed, and the drawing diff --git a/js/src/jit/IonBuilder.cpp b/js/src/jit/IonBuilder.cpp index f08baf865..3d0b73f04 100644 --- a/js/src/jit/IonBuilder.cpp +++ b/js/src/jit/IonBuilder.cpp @@ -3823,7 +3823,7 @@ IonBuilder::improveTypesAtTypeOfCompare(MCompare* ins, bool trueBranch, MTest* t tmp.addType(TypeSet::PrimitiveType(ValueTypeFromMIRType(subject->type())), alloc_->lifoAlloc()); } - if (inputTypes->unknown()) + if (inputTypes->unknown() || inputTypes->hasType(TypeSet::MagicArgType())) return true; // Note: we cannot remove the AnyObject type in the false branch, @@ -3905,7 +3905,7 @@ IonBuilder::improveTypesAtNullOrUndefinedCompare(MCompare* ins, bool trueBranch, tmp.addType(TypeSet::PrimitiveType(ValueTypeFromMIRType(subject->type())), alloc_->lifoAlloc()); } - if (inputTypes->unknown()) + if (inputTypes->unknown() || inputTypes->hasType(TypeSet::MagicArgType())) return true; TemporaryTypeSet* type; @@ -3969,7 +3969,7 @@ IonBuilder::improveTypesAtTest(MDefinition* ins, bool trueBranch, MTest* test) tmp.addType(TypeSet::PrimitiveType(ValueTypeFromMIRType(subject->type())), alloc_->lifoAlloc()); } - if (oldType->unknown()) + if (oldType->unknown() || oldType->hasType(TypeSet::MagicArgType())) return true; TemporaryTypeSet* type = nullptr; @@ -4049,7 +4049,7 @@ IonBuilder::improveTypesAtTest(MDefinition* ins, bool trueBranch, MTest* test) } // If ins does not have a typeset we return as we cannot optimize. - if (oldType->unknown()) + if (oldType->unknown() || oldType->hasType(TypeSet::MagicArgType())) return true; // Decide either to set or remove. diff --git a/js/src/jit/Sink.cpp b/js/src/jit/Sink.cpp index b2c36fae5..2764fc1cb 100644 --- a/js/src/jit/Sink.cpp +++ b/js/src/jit/Sink.cpp @@ -71,8 +71,12 @@ Sink(MIRGenerator* mir, MIRGraph& graph) for (MUseIterator i(ins->usesBegin()), e(ins->usesEnd()); i != e; i++) { hasUses = true; MNode* consumerNode = (*i)->consumer(); - if (consumerNode->isResumePoint()) + if (consumerNode->isResumePoint()) { + if (!consumerNode->toResumePoint()->isRecoverableOperand(*i)) { + hasLiveUses = true; + } continue; + } MDefinition* consumer = consumerNode->toDefinition(); if (consumer->isRecoveredOnBailout()) diff --git a/js/src/jsdate.cpp b/js/src/jsdate.cpp index c6a369e2d..41722ffa9 100755 --- a/js/src/jsdate.cpp +++ b/js/src/jsdate.cpp @@ -21,6 +21,8 @@ #include "mozilla/FloatingPoint.h" #include "mozilla/Sprintf.h" +#include "nsCRT.h" + #include <ctype.h> #include <math.h> #include <string.h> @@ -958,11 +960,20 @@ ParseDate(const CharT* s, size_t length, ClippedTime* result) while (i < length) { int c = s[i]; i++; - if (c <= ' ' || c == ',' || c == '-') { - if (c == '-' && '0' <= s[i] && s[i] <= '9') + + // Spaces, ASCII control characters, and commas are ignored. + if (c <= ' ' || c == ',') + continue; + + // Dashes are delimiters if they're immediately followed by a number field. + // If they're not followed by a number field, they're simply ignored. + if (c == '-') { + if (i < length && nsCRT::IsAsciiDigit(s[i])) { prevc = c; + } continue; } + if (c == '(') { /* comments) */ int depth = 1; while (i < length) { @@ -977,7 +988,9 @@ ParseDate(const CharT* s, size_t length, ClippedTime* result) } continue; } - if ('0' <= c && c <= '9') { + + // Parse a number field. + if (nsCRT::IsAsciiDigit(c)) { int n = c - '0'; while (i < length && '0' <= (c = s[i]) && c <= '9') { n = n * 10 + c - '0'; diff --git a/js/src/vm/NativeObject.h b/js/src/vm/NativeObject.h index 3a3e50244..e9c59ff7c 100644 --- a/js/src/vm/NativeObject.h +++ b/js/src/vm/NativeObject.h @@ -646,7 +646,10 @@ class NativeObject : public ShapedObject uint32_t slotSpan() const { if (inDictionaryMode()) return lastProperty()->base()->slotSpan(); - return lastProperty()->slotSpan(); + + // Get the class from the object group rather than the base shape to avoid a + // race between Shape::ensureOwnBaseShape and background sweeping. + return lastProperty()->slotSpan(getClass()); } /* Whether a slot is at a fixed offset from this object. */ diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 9a827546f..d5df17020 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -3546,10 +3546,10 @@ ComputeDrawnSizeForBackground(const CSSSizeOrRatio& aIntrinsicSize, imageSize.width = ComputeRoundedSize(imageSize.width, aBgPositioningArea.width); if (!isRepeatRoundInBothDimensions && aLayerSize.mHeightType == nsStyleImageLayers::Size::DimensionType::eAuto) { - // Restore intrinsic rato - if (aIntrinsicSize.mRatio.width) { - float scale = float(aIntrinsicSize.mRatio.height) / aIntrinsicSize.mRatio.width; - imageSize.height = NSCoordSaturatingNonnegativeMultiply(imageSize.width, scale); + // Restore intrinsic ratio + if (aIntrinsicSize.mRatio) { + imageSize.height = + aIntrinsicSize.mRatio.Inverted().ApplyTo(imageSize.width); } } } @@ -3560,10 +3560,9 @@ ComputeDrawnSizeForBackground(const CSSSizeOrRatio& aIntrinsicSize, imageSize.height = ComputeRoundedSize(imageSize.height, aBgPositioningArea.height); if (!isRepeatRoundInBothDimensions && aLayerSize.mWidthType == nsStyleImageLayers::Size::DimensionType::eAuto) { - // Restore intrinsic rato - if (aIntrinsicSize.mRatio.height) { - float scale = float(aIntrinsicSize.mRatio.width) / aIntrinsicSize.mRatio.height; - imageSize.width = NSCoordSaturatingNonnegativeMultiply(imageSize.height, scale); + // Restore intrinsic ratio + if (aIntrinsicSize.mRatio) { + imageSize.width = aIntrinsicSize.mRatio.ApplyTo(imageSize.height); } } } @@ -5264,17 +5263,11 @@ CSSSizeOrRatio::ComputeConcreteSize() const return nsSize(mWidth, mHeight); } if (mHasWidth) { - nscoord height = NSCoordSaturatingNonnegativeMultiply( - mWidth, - double(mRatio.height) / mRatio.width); - return nsSize(mWidth, height); + return nsSize(mWidth, mRatio.Inverted().ApplyTo(mWidth)); } MOZ_ASSERT(mHasHeight); - nscoord width = NSCoordSaturatingNonnegativeMultiply( - mHeight, - double(mRatio.width) / mRatio.height); - return nsSize(width, mHeight); + return nsSize(mRatio.ApplyTo(mHeight), mHeight); } CSSSizeOrRatio @@ -5297,6 +5290,16 @@ nsImageRenderer::ComputeIntrinsicSize() if (haveHeight) { result.SetHeight(nsPresContext::CSSPixelsToAppUnits(imageIntSize.height)); } + + if (!haveHeight && haveWidth && result.mRatio) { + nscoord intrinsicHeight = + result.mRatio.Inverted().ApplyTo(imageIntSize.width); + result.SetHeight(nsPresContext::CSSPixelsToAppUnits(intrinsicHeight)); + } else if (haveHeight && !haveWidth && result.mRatio) { + nscoord intrinsicWidth = result.mRatio.ApplyTo(imageIntSize.height); + result.SetWidth(nsPresContext::CSSPixelsToAppUnits(intrinsicWidth)); + } + break; } case eStyleImageType_Element: @@ -5379,9 +5382,7 @@ nsImageRenderer::ComputeConcreteSize(const CSSSizeOrRatio& aSpecifiedSize, if (aSpecifiedSize.mHasWidth) { nscoord height; if (aIntrinsicSize.HasRatio()) { - height = NSCoordSaturatingNonnegativeMultiply( - aSpecifiedSize.mWidth, - double(aIntrinsicSize.mRatio.height) / aIntrinsicSize.mRatio.width); + height = aIntrinsicSize.mRatio.Inverted().ApplyTo(aSpecifiedSize.mWidth); } else if (aIntrinsicSize.mHasHeight) { height = aIntrinsicSize.mHeight; } else { @@ -5393,9 +5394,7 @@ nsImageRenderer::ComputeConcreteSize(const CSSSizeOrRatio& aSpecifiedSize, MOZ_ASSERT(aSpecifiedSize.mHasHeight); nscoord width; if (aIntrinsicSize.HasRatio()) { - width = NSCoordSaturatingNonnegativeMultiply( - aSpecifiedSize.mHeight, - double(aIntrinsicSize.mRatio.width) / aIntrinsicSize.mRatio.height); + width = aIntrinsicSize.mRatio.ApplyTo(aSpecifiedSize.mHeight); } else if (aIntrinsicSize.mHasWidth) { width = aIntrinsicSize.mWidth; } else { @@ -5406,32 +5405,57 @@ nsImageRenderer::ComputeConcreteSize(const CSSSizeOrRatio& aSpecifiedSize, /* static */ nsSize nsImageRenderer::ComputeConstrainedSize(const nsSize& aConstrainingSize, - const nsSize& aIntrinsicRatio, + const AspectRatio& aIntrinsicRatio, FitType aFitType) { - if (aIntrinsicRatio.width <= 0 && aIntrinsicRatio.height <= 0) { + if (!aIntrinsicRatio) { return aConstrainingSize; } - float scaleX = double(aConstrainingSize.width) / aIntrinsicRatio.width; - float scaleY = double(aConstrainingSize.height) / aIntrinsicRatio.height; + // Suppose we're doing a "contain" fit. If the image's aspect ratio has a + // "fatter" shape than the constraint area, then we need to use the + // constraint area's full width, and we need to use the aspect ratio to + // produce a height. ON the other hand, if the aspect ratio is "skinnier", we + // use the constraint area's full height, and we use the aspect ratio to + // produce a width. (If instead we're doing a "cover" fit, then it can easily + // be seen that we should do precisely the opposite.) + // + // This is equivalent to the more descriptive alternative: + // + // AspectRatio::FromSize(aConstrainingSize) < aIntrinsicRatio + // + // But gracefully handling the case where one of the two dimensions from + // aConstrainingSize is zero. This is easy to prove since: + // + // aConstrainingSize.width / aConstrainingSize.height < aIntrinsicRatio + // + // Is trivially equivalent to: + // + // aIntrinsicRatio.width < aIntrinsicRatio * aConstrainingSize.height + // + // For the cases where height is not zero. + // + // We use float math here to avoid losing precision for very lareg backgrounds + // since we use saturating nscoord math otherwise. + const float constraintWidth = float(aConstrainingSize.width); + const float hypotheticalWidth = + aIntrinsicRatio.ApplyToFloat(aConstrainingSize.height); + nsSize size; - if ((aFitType == CONTAIN) == (scaleX < scaleY)) { + if ((aFitType == CONTAIN) == (constraintWidth < hypotheticalWidth)) { size.width = aConstrainingSize.width; - size.height = NSCoordSaturatingNonnegativeMultiply( - aIntrinsicRatio.height, scaleX); + size.height = aIntrinsicRatio.Inverted().ApplyTo(aConstrainingSize.width); // If we're reducing the size by less than one css pixel, then just use the // constraining size. if (aFitType == CONTAIN && aConstrainingSize.height - size.height < nsPresContext::AppUnitsPerCSSPixel()) { size.height = aConstrainingSize.height; } } else { - size.width = NSCoordSaturatingNonnegativeMultiply( - aIntrinsicRatio.width, scaleY); + size.height = aConstrainingSize.height; + size.width = aIntrinsicRatio.ApplyTo(aConstrainingSize.height); if (aFitType == CONTAIN && aConstrainingSize.width - size.width < nsPresContext::AppUnitsPerCSSPixel()) { size.width = aConstrainingSize.width; } - size.height = aConstrainingSize.height; } return size; } diff --git a/layout/base/nsCSSRendering.h b/layout/base/nsCSSRendering.h index 791e9656e..8ebeb7537 100644 --- a/layout/base/nsCSSRendering.h +++ b/layout/base/nsCSSRendering.h @@ -17,6 +17,7 @@ #include "nsLayoutUtils.h" #include "nsStyleStruct.h" #include "nsIFrame.h" +#include "mozilla/AspectRatio.h" class gfxDrawable; class nsStyleContext; @@ -41,8 +42,7 @@ class ImageContainer; struct CSSSizeOrRatio { CSSSizeOrRatio() - : mRatio(0, 0) - , mHasWidth(false) + : mHasWidth(false) , mHasHeight(false) {} bool CanComputeConcreteSize() const @@ -50,12 +50,12 @@ struct CSSSizeOrRatio return mHasWidth + mHasHeight + HasRatio() >= 2; } bool IsConcrete() const { return mHasWidth && mHasHeight; } - bool HasRatio() const { return mRatio.width > 0 && mRatio.height > 0; } + bool HasRatio() const { return !!mRatio; } bool IsEmpty() const { return (mHasWidth && mWidth <= 0) || (mHasHeight && mHeight <= 0) || - mRatio.width <= 0 || mRatio.height <= 0; + !mRatio; } // CanComputeConcreteSize must return true when ComputeConcreteSize is @@ -67,7 +67,7 @@ struct CSSSizeOrRatio mWidth = aWidth; mHasWidth = true; if (mHasHeight) { - mRatio = nsSize(mWidth, mHeight); + mRatio = AspectRatio::FromSize(mWidth, mHeight); } } void SetHeight(nscoord aHeight) @@ -75,7 +75,7 @@ struct CSSSizeOrRatio mHeight = aHeight; mHasHeight = true; if (mHasWidth) { - mRatio = nsSize(mWidth, mHeight); + mRatio = AspectRatio::FromSize(mWidth, mHeight); } } void SetSize(const nsSize& aSize) @@ -84,16 +84,16 @@ struct CSSSizeOrRatio mHeight = aSize.height; mHasWidth = true; mHasHeight = true; - mRatio = aSize; + mRatio = AspectRatio::FromSize(mWidth, mHeight); } - void SetRatio(const nsSize& aRatio) + void SetRatio(const AspectRatio& aRatio) { MOZ_ASSERT(!mHasWidth || !mHasHeight, "Probably shouldn't be setting a ratio if we have a concrete size"); mRatio = aRatio; } - nsSize mRatio; + AspectRatio mRatio; nscoord mWidth; nscoord mHeight; bool mHasWidth; @@ -184,11 +184,9 @@ public: /** * Compute the size of the rendered image using either the 'cover' or * 'contain' constraints (aFitType). - * aIntrinsicRatio may be an invalid ratio, that is one or both of its - * dimensions can be less than or equal to zero. */ static nsSize ComputeConstrainedSize(const nsSize& aConstrainingSize, - const nsSize& aIntrinsicRatio, + const mozilla::AspectRatio& aIntrinsicRatio, FitType aFitType); /** * Compute the size of the rendered image (the concrete size) where no cover/ diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index fdcdcac78..74dbd63e6 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3966,7 +3966,7 @@ nsLayoutUtils::GetTextShadowRectsUnion(const nsRect& aTextAndDecorationsRect, enum ObjectDimensionType { eWidth, eHeight }; static nscoord ComputeMissingDimension(const nsSize& aDefaultObjectSize, - const nsSize& aIntrinsicRatio, + const AspectRatio& aIntrinsicRatio, const Maybe<nscoord>& aSpecifiedWidth, const Maybe<nscoord>& aSpecifiedHeight, ObjectDimensionType aDimensionToCompute) @@ -3977,21 +3977,15 @@ ComputeMissingDimension(const nsSize& aDefaultObjectSize, // 1. "If the object has an intrinsic aspect ratio, the missing dimension of // the concrete object size is calculated using the intrinsic aspect // ratio and the present dimension." - if (aIntrinsicRatio.width > 0 && aIntrinsicRatio.height > 0) { + if (aIntrinsicRatio) { // Fill in the missing dimension using the intrinsic aspect ratio. - nscoord knownDimensionSize; - float ratio; if (aDimensionToCompute == eWidth) { - knownDimensionSize = *aSpecifiedHeight; - ratio = aIntrinsicRatio.width / aIntrinsicRatio.height; - } else { - knownDimensionSize = *aSpecifiedWidth; - ratio = aIntrinsicRatio.height / aIntrinsicRatio.width; + return aIntrinsicRatio.ApplyTo(*aSpecifiedHeight); } - return NSCoordSaturatingNonnegativeMultiply(knownDimensionSize, ratio); + return aIntrinsicRatio.Inverted().ApplyTo(*aSpecifiedWidth); } - // 2. "Otherwise, if the missing dimension is present in the object’s + // 2. "Otherwise, if the missing dimension is present in the object's // intrinsic dimensions, [...]" // NOTE: *Skipping* this case, because we already know it's not true -- we're // in this function because the missing dimension is *not* present in @@ -4029,7 +4023,7 @@ ComputeMissingDimension(const nsSize& aDefaultObjectSize, static Maybe<nsSize> MaybeComputeObjectFitNoneSize(const nsSize& aDefaultObjectSize, const IntrinsicSize& aIntrinsicSize, - const nsSize& aIntrinsicRatio) + const AspectRatio& aIntrinsicRatio) { // "If the object has an intrinsic height or width, its size is resolved as // if its intrinsic dimensions were given as the specified size." @@ -4076,15 +4070,13 @@ MaybeComputeObjectFitNoneSize(const nsSize& aDefaultObjectSize, static nsSize ComputeConcreteObjectSize(const nsSize& aConstraintSize, const IntrinsicSize& aIntrinsicSize, - const nsSize& aIntrinsicRatio, + const AspectRatio& aIntrinsicRatio, uint8_t aObjectFit) { // Handle default behavior (filling the container) w/ fast early return. // (Also: if there's no valid intrinsic ratio, then we have the "fill" // behavior & just use the constraint size.) - if (MOZ_LIKELY(aObjectFit == NS_STYLE_OBJECT_FIT_FILL) || - aIntrinsicRatio.width == 0 || - aIntrinsicRatio.height == 0) { + if (MOZ_LIKELY(aObjectFit == NS_STYLE_OBJECT_FIT_FILL) || !aIntrinsicRatio) { return aConstraintSize; } @@ -4171,7 +4163,7 @@ HasInitialObjectFitAndPosition(const nsStylePosition* aStylePos) /* static */ nsRect nsLayoutUtils::ComputeObjectDestRect(const nsRect& aConstraintRect, const IntrinsicSize& aIntrinsicSize, - const nsSize& aIntrinsicRatio, + const AspectRatio& aIntrinsicRatio, const nsStylePosition* aStylePos, nsPoint* aAnchorPoint) { @@ -5092,10 +5084,12 @@ nsLayoutUtils::IntrinsicForAxis(PhysicalAxis aAxis, styleMinBSize.GetCoordValue() == 0)) || styleMaxBSize.GetUnit() != eStyleUnit_None) { - nsSize ratio(aFrame->GetIntrinsicRatio()); - nscoord ratioISize = (horizontalAxis ? ratio.width : ratio.height); - nscoord ratioBSize = (horizontalAxis ? ratio.height : ratio.width); - if (ratioBSize != 0) { + AspectRatio ratio = aFrame->GetIntrinsicRatio(); + if (ratio) { + // Convert 'ratio' if necessary, so that it's storing ISize/BSize: + if (!horizontalAxis) { + ratio = ratio.Inverted(); + } AddStateBitToAncestors(aFrame, NS_FRAME_DESCENDANT_INTRINSIC_ISIZE_DEPENDS_ON_BSIZE); @@ -5111,14 +5105,14 @@ nsLayoutUtils::IntrinsicForAxis(PhysicalAxis aAxis, (aPercentageBasis.isNothing() && GetPercentBSize(styleBSize, aFrame, horizontalAxis, h))) { h = std::max(0, h - bSizeTakenByBoxSizing); - result = NSCoordMulDiv(h, ratioISize, ratioBSize); + result = ratio.ApplyTo(h); } if (GetDefiniteSize(styleMaxBSize, aFrame, !isInlineAxis, aPercentageBasis, &h) || (aPercentageBasis.isNothing() && GetPercentBSize(styleMaxBSize, aFrame, horizontalAxis, h))) { h = std::max(0, h - bSizeTakenByBoxSizing); - nscoord maxISize = NSCoordMulDiv(h, ratioISize, ratioBSize); + nscoord maxISize = ratio.ApplyTo(h); if (maxISize < result) { result = maxISize; } @@ -5131,7 +5125,7 @@ nsLayoutUtils::IntrinsicForAxis(PhysicalAxis aAxis, (aPercentageBasis.isNothing() && GetPercentBSize(styleMinBSize, aFrame, horizontalAxis, h))) { h = std::max(0, h - bSizeTakenByBoxSizing); - nscoord minISize = NSCoordMulDiv(h, ratioISize, ratioBSize); + nscoord minISize = ratio.ApplyTo(h); if (minISize > result) { result = minISize; } @@ -6594,12 +6588,12 @@ nsLayoutUtils::DrawSingleImage(gfxContext& aContext, /* static */ void nsLayoutUtils::ComputeSizeForDrawing(imgIContainer *aImage, CSSIntSize& aImageSize, /*outparam*/ - nsSize& aIntrinsicRatio, /*outparam*/ + AspectRatio& aIntrinsicRatio, /*outparam*/ bool& aGotWidth, /*outparam*/ bool& aGotHeight /*outparam*/) { aGotWidth = NS_SUCCEEDED(aImage->GetWidth(&aImageSize.width)); - aGotHeight = NS_SUCCEEDED(aImage->GetHeight(&aImageSize.height)); + aGotHeight = NS_SUCCEEDED(aImage->GetHeight(&aImageSize.height)); bool gotRatio = NS_SUCCEEDED(aImage->GetIntrinsicRatio(&aIntrinsicRatio)); if (!(aGotWidth && aGotHeight) && !gotRatio) { @@ -6607,7 +6601,7 @@ nsLayoutUtils::ComputeSizeForDrawing(imgIContainer *aImage, // decoded) and should return zero size. aGotWidth = aGotHeight = true; aImageSize = CSSIntSize(0, 0); - aIntrinsicRatio = nsSize(0, 0); + aIntrinsicRatio = AspectRatio(); } } @@ -6616,7 +6610,7 @@ nsLayoutUtils::ComputeSizeForDrawingWithFallback(imgIContainer* aImage, const nsSize& aFallbackSize) { CSSIntSize imageSize; - nsSize imageRatio; + AspectRatio imageRatio; bool gotHeight, gotWidth; ComputeSizeForDrawing(aImage, imageSize, imageRatio, gotWidth, gotHeight); @@ -6624,19 +6618,13 @@ nsLayoutUtils::ComputeSizeForDrawingWithFallback(imgIContainer* aImage, // intrinsic ratio of the image. if (gotWidth != gotHeight) { if (!gotWidth) { - if (imageRatio.height != 0) { - imageSize.width = - NSCoordSaturatingNonnegativeMultiply(imageSize.height, - float(imageRatio.width) / - float(imageRatio.height)); + if (imageRatio) { + imageSize.width = imageRatio.ApplyTo(imageSize.height); gotWidth = true; } } else { - if (imageRatio.width != 0) { - imageSize.height = - NSCoordSaturatingNonnegativeMultiply(imageSize.width, - float(imageRatio.height) / - float(imageRatio.width)); + if (imageRatio) { + imageSize.height = imageRatio.Inverted().ApplyTo(imageSize.width); gotHeight = true; } } diff --git a/layout/base/nsLayoutUtils.h b/layout/base/nsLayoutUtils.h index 36a43e46b..21407511a 100644 --- a/layout/base/nsLayoutUtils.h +++ b/layout/base/nsLayoutUtils.h @@ -65,6 +65,7 @@ struct nsStyleImageOrientation; struct nsOverflowAreas; namespace mozilla { +struct aspectRatio; enum class CSSPseudoElementType : uint8_t; class EventListenerManager; class SVGImageContext; @@ -126,6 +127,7 @@ enum class RelativeTo { */ class nsLayoutUtils { + typedef mozilla::AspectRatio AspectRatio; typedef mozilla::dom::DOMRectList DOMRectList; typedef mozilla::layers::Layer Layer; typedef mozilla::ContainerLayerParameters ContainerLayerParameters; @@ -1217,7 +1219,7 @@ public: */ static nsRect ComputeObjectDestRect(const nsRect& aConstraintRect, const IntrinsicSize& aIntrinsicSize, - const nsSize& aIntrinsicRatio, + const AspectRatio& aIntrinsicRatio, const nsStylePosition* aStylePos, nsPoint* aAnchorPoint = nullptr); @@ -1837,7 +1839,7 @@ public: */ static void ComputeSizeForDrawing(imgIContainer* aImage, CSSIntSize& aImageSize, - nsSize& aIntrinsicRatio, + AspectRatio& aIntrinsicRatio, bool& aGotWidth, bool& aGotHeight); diff --git a/layout/generic/AspectRatio.h b/layout/generic/AspectRatio.h new file mode 100644 index 000000000..0056c0620 --- /dev/null +++ b/layout/generic/AspectRatio.h @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_AspectRatio_h +#define mozilla_AspectRatio_h + +/* The aspect ratio of a box, in a "width / height" format. */ + +#include "mozilla/Attributes.h" +#include "nsCoord.h" +#include <algorithm> +#include <limits> + +namespace mozilla { + +struct AspectRatio { + AspectRatio() : mRatio(0.0f) {} + explicit AspectRatio(float aRatio) : mRatio(std::max(aRatio, 0.0f)) {} + + static AspectRatio FromSize(float aWidth, float aHeight) { + if (aWidth == 0.0f || aHeight == 0.0f) { + return AspectRatio(); + } + return AspectRatio(aWidth / aHeight); + } + + static AspectRatio FromSize(nsSize aSize) { + return FromSize(aSize.width, aSize.height); + } + + static AspectRatio FromSize(nsIntSize aSize) { + return FromSize(aSize.width, aSize.height); + } + + explicit operator bool() const { return mRatio != 0.0f; } + + nscoord ApplyTo(nscoord aCoord) const { + MOZ_DIAGNOSTIC_ASSERT(*this); + return NSCoordSaturatingNonnegativeMultiply(aCoord, mRatio); + } + + float ApplyToFloat(float aFloat) const { + MOZ_DIAGNOSTIC_ASSERT(*this); + return mRatio * aFloat; + } + + // Inverts the ratio, in order to get the height / width ratio. + MOZ_MUST_USE AspectRatio Inverted() const { + if (!*this) { + return AspectRatio(); + } + // Clamp to a small epsilon, in case mRatio is absurdly large & produces + // 0.0f in the division here (so that valid ratios always generate other + // valid ratios when inverted). + return AspectRatio( + std::max(std::numeric_limits<float>::epsilon(), 1.0f / mRatio)); + } + + bool operator==(const AspectRatio& aOther) const { + return mRatio == aOther.mRatio; + } + + bool operator!=(const AspectRatio& aOther) const { + return !(*this == aOther); + } + + bool operator<(const AspectRatio& aOther) const { + return mRatio < aOther.mRatio; + } + + private: + // 0.0f represents no aspect ratio. + float mRatio; +}; + +} // namespace mozilla + +#endif // mozilla_AspectRatio_h diff --git a/layout/generic/crashtests/1633434.html b/layout/generic/crashtests/1633434.html new file mode 100644 index 000000000..8a60b2072 --- /dev/null +++ b/layout/generic/crashtests/1633434.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> +<head> + <script> + document.addEventListener('DOMContentLoaded', () => { + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg') + svg.setAttribute('height', '6') + svg.setAttribute('width', '1pc') + document.documentElement.appendChild(svg) + svg.style.setProperty('height', '5%', undefined) + svg.width.baseVal.valueInSpecifiedUnits = 1.988164037240853e+38 + }) + </script> +</head> +</html> diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index 1a597e51c..72872bfde 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -644,3 +644,4 @@ load 1304441.html load 1316649.html load 1381134.html load 1381134-2.html +load 1633434.html diff --git a/layout/generic/moz.build b/layout/generic/moz.build index ad186ef7a..b830470a3 100644 --- a/layout/generic/moz.build +++ b/layout/generic/moz.build @@ -109,6 +109,7 @@ EXPORTS += [ ] EXPORTS.mozilla += [ + 'AspectRatio.h', 'CSSAlignUtils.h', 'ReflowInput.h', 'ReflowOutput.h', diff --git a/layout/generic/nsFlexContainerFrame.cpp b/layout/generic/nsFlexContainerFrame.cpp index 69200117b..a03d777e7 100644 --- a/layout/generic/nsFlexContainerFrame.cpp +++ b/layout/generic/nsFlexContainerFrame.cpp @@ -557,8 +557,8 @@ public: return mFlexShrink * mFlexBaseSize; } - const nsSize& IntrinsicRatio() const { return mIntrinsicRatio; } - bool HasIntrinsicRatio() const { return mIntrinsicRatio != nsSize(); } + const AspectRatio IntrinsicRatio() const { return mIntrinsicRatio; } + bool HasIntrinsicRatio() const { return !!mIntrinsicRatio; } // Getters for margin: // =================== @@ -756,7 +756,7 @@ protected: const float mFlexGrow; const float mFlexShrink; - const nsSize mIntrinsicRatio; + const AspectRatio mIntrinsicRatio; const nsMargin mBorderPadding; nsMargin mMargin; // non-const because we need to resolve auto margins @@ -1520,22 +1520,20 @@ CrossSizeToUseWithRatio(const FlexItem& aFlexItem, } // Convenience function; returns a main-size, given a cross-size and an -// intrinsic ratio. The intrinsic ratio must not have 0 in its cross-axis -// component (or else we'll divide by 0). +// intrinsic ratio. The caller is responsible for ensuring that the passed-in +// intrinsic ratio is not zero. static nscoord MainSizeFromAspectRatio(nscoord aCrossSize, - const nsSize& aIntrinsicRatio, + const AspectRatio& aIntrinsicRatio, const FlexboxAxisTracker& aAxisTracker) { - MOZ_ASSERT(aAxisTracker.GetCrossComponent(aIntrinsicRatio) != 0, + MOZ_ASSERT(aIntrinsicRatio, "Invalid ratio; will divide by 0! Caller should've checked..."); + AspectRatio ratio = aAxisTracker.IsMainAxisHorizontal() ? + aIntrinsicRatio : + aIntrinsicRatio.Inverted(); - if (aAxisTracker.IsCrossAxisHorizontal()) { - // cross axis horiz --> aCrossSize is a width. Converting to height. - return NSCoordMulDiv(aCrossSize, aIntrinsicRatio.height, aIntrinsicRatio.width); - } - // cross axis vert --> aCrossSize is a height. Converting to width. - return NSCoordMulDiv(aCrossSize, aIntrinsicRatio.width, aIntrinsicRatio.height); + return ratio.ApplyTo(aCrossSize); } // Partially resolves "min-[width|height]:auto" and returns the resulting value. @@ -1584,7 +1582,7 @@ PartiallyResolveAutoMinSize(const FlexItem& aFlexItem, // * if the item has an intrinsic aspect ratio, the width (height) calculated // from the aspect ratio and any definite size constraints in the opposite // dimension. - if (aAxisTracker.GetCrossComponent(aFlexItem.IntrinsicRatio()) != 0) { + if (aFlexItem.IntrinsicRatio()) { // We have a usable aspect ratio. (not going to divide by 0) const bool useMinSizeIfCrossSizeIsIndefinite = true; nscoord crossSizeToUseWithRatio = @@ -1617,7 +1615,7 @@ ResolveAutoFlexBasisFromRatio(FlexItem& aFlexItem, // - a definite cross size // then the flex base size is calculated from its inner cross size and the // flex item’s intrinsic aspect ratio. - if (aAxisTracker.GetCrossComponent(aFlexItem.IntrinsicRatio()) != 0) { + if (aFlexItem.IntrinsicRatio()) { // We have a usable aspect ratio. (not going to divide by 0) const bool useMinSizeIfCrossSizeIsIndefinite = false; nscoord crossSizeToUseWithRatio = @@ -1693,8 +1691,7 @@ nsFlexContainerFrame:: // (We'll consider that later, if we need to.) resolvedMinSize = PartiallyResolveAutoMinSize(aFlexItem, aItemReflowInput, aAxisTracker); - if (resolvedMinSize > 0 && - aAxisTracker.GetCrossComponent(aFlexItem.IntrinsicRatio()) == 0) { + if (resolvedMinSize > 0 && !aFlexItem.IntrinsicRatio()) { // We don't have a usable aspect ratio, so we need to consider our // min-content size as another candidate min-size, which we'll have to // min() with the current resolvedMinSize. diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index dd7933b03..72923c4b7 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -4641,10 +4641,10 @@ nsFrame::GetIntrinsicSize() return IntrinsicSize(); // default is width/height set to eStyleUnit_None } -/* virtual */ nsSize +/* virtual */ AspectRatio nsFrame::GetIntrinsicRatio() { - return nsSize(0, 0); + return AspectRatio(); } /* virtual */ @@ -4658,7 +4658,7 @@ nsFrame::ComputeSize(nsRenderingContext* aRenderingContext, const LogicalSize& aPadding, ComputeSizeFlags aFlags) { - MOZ_ASSERT(GetIntrinsicRatio() == nsSize(0,0), + MOZ_ASSERT(!GetIntrinsicRatio(), "Please override this method and call " "nsFrame::ComputeSizeWithIntrinsicDimensions instead."); LogicalSize result = ComputeAutoSize(aRenderingContext, aWM, @@ -4914,13 +4914,15 @@ LogicalSize nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingContext, WritingMode aWM, const IntrinsicSize& aIntrinsicSize, - nsSize aIntrinsicRatio, + const AspectRatio& aIntrinsicRatio, const LogicalSize& aCBSize, const LogicalSize& aMargin, const LogicalSize& aBorder, const LogicalSize& aPadding, ComputeSizeFlags aFlags) { + auto logicalRatio = + aWM.IsVertical() ? aIntrinsicRatio.Inverted() : aIntrinsicRatio; const nsStylePosition* stylePos = StylePosition(); const nsStyleCoord* inlineStyleCoord = &stylePos->ISize(aWM); const nsStyleCoord* blockStyleCoord = &stylePos->BSize(aWM); @@ -5181,10 +5183,6 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte intrinsicBSize = 0; } - NS_ASSERTION(aIntrinsicRatio.width >= 0 && aIntrinsicRatio.height >= 0, - "Intrinsic ratio has a negative component!"); - LogicalSize logicalRatio(aWM, aIntrinsicRatio); - // Now calculate the used values for iSize and bSize: if (isAutoISize) { @@ -5198,9 +5196,9 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte if (hasIntrinsicISize) { tentISize = intrinsicISize; - } else if (hasIntrinsicBSize && logicalRatio.BSize(aWM) > 0) { - tentISize = NSCoordMulDiv(intrinsicBSize, logicalRatio.ISize(aWM), logicalRatio.BSize(aWM)); - } else if (logicalRatio.ISize(aWM) > 0) { + } else if (hasIntrinsicBSize && logicalRatio) { + tentISize = logicalRatio.ApplyTo(intrinsicBSize); + } else if (logicalRatio) { tentISize = aCBSize.ISize(aWM) - boxSizingToMarginEdgeISize; // XXX scrollbar? if (tentISize < 0) tentISize = 0; } else { @@ -5217,8 +5215,8 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte if (hasIntrinsicBSize) { tentBSize = intrinsicBSize; - } else if (logicalRatio.ISize(aWM) > 0) { - tentBSize = NSCoordMulDiv(tentISize, logicalRatio.BSize(aWM), logicalRatio.ISize(aWM)); + } else if (logicalRatio) { + tentBSize = logicalRatio.Inverted().ApplyTo(tentISize); } else { tentBSize = nsPresContext::CSSPixelsToAppUnits(150); } @@ -5229,46 +5227,39 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte stretchB = (stretchI == eStretch ? eStretch : eStretchPreservingRatio); } - if (aIntrinsicRatio != nsSize(0, 0)) { + if (logicalRatio) { if (stretchI == eStretch) { tentISize = iSize; // * / 'stretch' if (stretchB == eStretch) { tentBSize = bSize; // 'stretch' / 'stretch' - } else if (stretchB == eStretchPreservingRatio && logicalRatio.ISize(aWM) > 0) { + } else if (stretchB == eStretchPreservingRatio) { // 'normal' / 'stretch' - tentBSize = NSCoordMulDiv(iSize, logicalRatio.BSize(aWM), logicalRatio.ISize(aWM)); + tentBSize = logicalRatio.Inverted().ApplyTo(iSize); } } else if (stretchB == eStretch) { tentBSize = bSize; // 'stretch' / * (except 'stretch') - if (stretchI == eStretchPreservingRatio && logicalRatio.BSize(aWM) > 0) { + if (stretchI == eStretchPreservingRatio) { // 'stretch' / 'normal' - tentISize = NSCoordMulDiv(bSize, logicalRatio.ISize(aWM), logicalRatio.BSize(aWM)); + tentISize = logicalRatio.ApplyTo(bSize); } } else if (stretchI == eStretchPreservingRatio) { tentISize = iSize; // * (except 'stretch') / 'normal' - if (logicalRatio.ISize(aWM) > 0) { - tentBSize = NSCoordMulDiv(iSize, logicalRatio.BSize(aWM), logicalRatio.ISize(aWM)); - } + tentBSize = logicalRatio.Inverted().ApplyTo(iSize); if (stretchB == eStretchPreservingRatio && tentBSize > bSize) { // Stretch within the CB size with preserved intrinsic ratio. tentBSize = bSize; // 'normal' / 'normal' - if (logicalRatio.BSize(aWM) > 0) { - tentISize = NSCoordMulDiv(bSize, logicalRatio.ISize(aWM), logicalRatio.BSize(aWM)); - } + tentISize = logicalRatio.ApplyTo(bSize); } } else if (stretchB == eStretchPreservingRatio) { tentBSize = bSize; // 'normal' / * (except 'normal' and 'stretch') - if (logicalRatio.BSize(aWM) > 0) { - tentISize = NSCoordMulDiv(bSize, logicalRatio.ISize(aWM), logicalRatio.BSize(aWM)); - } + tentISize = logicalRatio.ApplyTo(bSize); } } // ComputeAutoSizeWithIntrinsicDimensions preserves the ratio when applying // the min/max-size. We don't want that when we have 'stretch' in either // axis because tentISize/tentBSize is likely not according to ratio now. - if (aIntrinsicRatio != nsSize(0, 0) && - stretchI != eStretch && stretchB != eStretch) { + if (logicalRatio && stretchI != eStretch && stretchB != eStretch) { nsSize autoSize = nsLayoutUtils:: ComputeAutoSizeWithIntrinsicDimensions(minISize, minBSize, maxISize, maxBSize, @@ -5289,8 +5280,8 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte // 'auto' iSize, non-'auto' bSize bSize = NS_CSS_MINMAX(bSize, minBSize, maxBSize); if (stretchI != eStretch) { - if (logicalRatio.BSize(aWM) > 0) { - iSize = NSCoordMulDiv(bSize, logicalRatio.ISize(aWM), logicalRatio.BSize(aWM)); + if (logicalRatio) { + iSize = logicalRatio.ApplyTo(bSize); } else if (hasIntrinsicISize) { if (!((aFlags & ComputeSizeFlags::eIClampMarginBoxMinSize) && intrinsicISize > iSize)) { @@ -5309,8 +5300,8 @@ nsFrame::ComputeSizeWithIntrinsicDimensions(nsRenderingContext* aRenderingConte // non-'auto' iSize, 'auto' bSize iSize = NS_CSS_MINMAX(iSize, minISize, maxISize); if (stretchB != eStretch) { - if (logicalRatio.ISize(aWM) > 0) { - bSize = NSCoordMulDiv(iSize, logicalRatio.BSize(aWM), logicalRatio.ISize(aWM)); + if (logicalRatio) { + bSize = logicalRatio.Inverted().ApplyTo(iSize); } else if (hasIntrinsicBSize) { if (!((aFlags & ComputeSizeFlags::eBClampMarginBoxMinSize) && intrinsicBSize > bSize)) { diff --git a/layout/generic/nsFrame.h b/layout/generic/nsFrame.h index 439e39856..d75555fec 100644 --- a/layout/generic/nsFrame.h +++ b/layout/generic/nsFrame.h @@ -264,7 +264,7 @@ public: IntrinsicISizeOffsetData IntrinsicISizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE) override; virtual mozilla::IntrinsicSize GetIntrinsicSize() override; - virtual nsSize GetIntrinsicRatio() override; + virtual mozilla::AspectRatio GetIntrinsicRatio() override; virtual mozilla::LogicalSize ComputeSize(nsRenderingContext* aRenderingContext, @@ -285,7 +285,7 @@ public: nsRenderingContext* aRenderingContext, mozilla::WritingMode aWM, const mozilla::IntrinsicSize& aIntrinsicSize, - nsSize aIntrinsicRatio, + const mozilla::AspectRatio& aIntrinsicRatio, const mozilla::LogicalSize& aCBSize, const mozilla::LogicalSize& aMargin, const mozilla::LogicalSize& aBorder, diff --git a/layout/generic/nsHTMLCanvasFrame.cpp b/layout/generic/nsHTMLCanvasFrame.cpp index f86ec1136..f40f799ba 100644 --- a/layout/generic/nsHTMLCanvasFrame.cpp +++ b/layout/generic/nsHTMLCanvasFrame.cpp @@ -44,21 +44,6 @@ IntrinsicSizeFromCanvasSize(const nsIntSize& aCanvasSizeInPx) return intrinsicSize; } -/* Helper for our nsIFrame::GetIntrinsicRatio() impl. Takes the result of - * "GetCanvasSize()" as a parameter, which may help avoid redundant - * indirect calls to GetCanvasSize(). - * - * @param aCanvasSizeInPx The canvas's size in CSS pixels, as returned - * by GetCanvasSize(). - * @return The canvas's intrinsic ratio, as a nsSize. - */ -static nsSize -IntrinsicRatioFromCanvasSize(const nsIntSize& aCanvasSizeInPx) -{ - return nsSize(nsPresContext::CSSPixelsToAppUnits(aCanvasSizeInPx.width), - nsPresContext::CSSPixelsToAppUnits(aCanvasSizeInPx.height)); -} - class nsDisplayCanvas : public nsDisplayItem { public: nsDisplayCanvas(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame) @@ -92,7 +77,7 @@ public: // Need intrinsic size & ratio, for ComputeObjectDestRect: nsIntSize canvasSize = f->GetCanvasSize(); IntrinsicSize intrinsicSize = IntrinsicSizeFromCanvasSize(canvasSize); - nsSize intrinsicRatio = IntrinsicRatioFromCanvasSize(canvasSize); + AspectRatio intrinsicRatio = AspectRatio::FromSize(canvasSize); const nsRect destRect = nsLayoutUtils::ComputeObjectDestRect(constraintRect, @@ -211,10 +196,16 @@ nsHTMLCanvasFrame::GetIntrinsicSize() return IntrinsicSizeFromCanvasSize(GetCanvasSize()); } -/* virtual */ nsSize +/* virtual */ AspectRatio nsHTMLCanvasFrame::GetIntrinsicRatio() { - return IntrinsicRatioFromCanvasSize(GetCanvasSize()); + // When 'contain: size' is implemented, make sure to check for it. +/* + if (StyleDisplay()->IsContainSize()) { + return AspectRatio(); + } + */ + return AspectRatio::FromSize(GetCanvasSize()); } /* virtual */ @@ -234,7 +225,7 @@ nsHTMLCanvasFrame::ComputeSize(nsRenderingContext *aRenderingContext, intrinsicSize.width.SetCoordValue(nsPresContext::CSSPixelsToAppUnits(size.width)); intrinsicSize.height.SetCoordValue(nsPresContext::CSSPixelsToAppUnits(size.height)); - nsSize intrinsicRatio = GetIntrinsicRatio(); // won't actually be used + AspectRatio intrinsicRatio = GetIntrinsicRatio(); return ComputeSizeWithIntrinsicDimensions(aRenderingContext, aWM, intrinsicSize, intrinsicRatio, @@ -340,7 +331,7 @@ nsHTMLCanvasFrame::BuildLayer(nsDisplayListBuilder* aBuilder, return nullptr; IntrinsicSize intrinsicSize = IntrinsicSizeFromCanvasSize(canvasSizeInPx); - nsSize intrinsicRatio = IntrinsicRatioFromCanvasSize(canvasSizeInPx); + AspectRatio intrinsicRatio = AspectRatio::FromSize(canvasSizeInPx); nsRect dest = nsLayoutUtils::ComputeObjectDestRect(area, intrinsicSize, intrinsicRatio, diff --git a/layout/generic/nsHTMLCanvasFrame.h b/layout/generic/nsHTMLCanvasFrame.h index b2d159627..8432ad224 100644 --- a/layout/generic/nsHTMLCanvasFrame.h +++ b/layout/generic/nsHTMLCanvasFrame.h @@ -58,7 +58,7 @@ public: virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; virtual mozilla::IntrinsicSize GetIntrinsicSize() override; - virtual nsSize GetIntrinsicRatio() override; + virtual mozilla::AspectRatio GetIntrinsicRatio() override; virtual mozilla::LogicalSize ComputeSize(nsRenderingContext *aRenderingContext, diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index dfe83bcbe..d54ddc2b5 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -27,6 +27,7 @@ #include "FrameProperties.h" #include "LayoutConstants.h" #include "mozilla/layout/FrameChildList.h" +#include "mozilla/AspectRatio.h" #include "mozilla/Maybe.h" #include "mozilla/WritingModes.h" #include "nsDirection.h" @@ -2063,15 +2064,14 @@ public: virtual mozilla::IntrinsicSize GetIntrinsicSize() = 0; /** - * Get the intrinsic ratio of this element, or nsSize(0,0) if it has - * no intrinsic ratio. The intrinsic ratio is the ratio of the - * height/width of a box with an intrinsic size or the intrinsic - * aspect ratio of a scalable vector image without an intrinsic size. + * Get the intrinsic ratio of this element, or a default-constructed + * AspectRatio if it has no intrinsic ratio. * - * Either one of the sides may be zero, indicating a zero or infinite - * ratio. + * The intrinsic ratio is the ratio of the width/height of a box with an + * intrinsic size or the intrinsic aspect ratio of a scalable vector image + * without an intrinsic size. */ - virtual nsSize GetIntrinsicRatio() = 0; + virtual mozilla::AspectRatio GetIntrinsicRatio() = 0; /** * Bit-flags to pass to ComputeSize in |aFlags| parameter. diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp index b96af66b5..d6f47f2e4 100644 --- a/layout/generic/nsImageFrame.cpp +++ b/layout/generic/nsImageFrame.cpp @@ -14,6 +14,7 @@ #include "mozilla/gfx/2D.h" #include "mozilla/gfx/Helpers.h" #include "mozilla/gfx/PathHelpers.h" +#include "mozilla/dom/HTMLImageElement.h" #include "mozilla/MouseEvents.h" #include "mozilla/Unused.h" @@ -138,7 +139,6 @@ NS_IMPL_FRAMEARENA_HELPERS(nsImageFrame) nsImageFrame::nsImageFrame(nsStyleContext* aContext) : nsAtomicContainerFrame(aContext), mComputedSize(0, 0), - mIntrinsicRatio(0, 0), mDisplayingIcon(false), mFirstFrameComplete(false), mReflowCallbackPosted(false), @@ -230,26 +230,26 @@ nsImageFrame::DidSetStyleContext(nsStyleContext* aOldStyleContext) { nsAtomicContainerFrame::DidSetStyleContext(aOldStyleContext); - if (!mImage) { - // We'll pick this change up whenever we do get an image. - return; - } - nsStyleImageOrientation newOrientation = StyleVisibility()->mImageOrientation; // We need to update our orientation either if we had no style context before // because this is the first time it's been set, or if the image-orientation // property changed from its previous value. bool shouldUpdateOrientation = - !aOldStyleContext || - aOldStyleContext->StyleVisibility()->mImageOrientation != newOrientation; + mImage && + (!aOldStyleContext || + aOldStyleContext->StyleVisibility()->mImageOrientation != newOrientation); if (shouldUpdateOrientation) { nsCOMPtr<imgIContainer> image(mImage->Unwrap()); mImage = nsLayoutUtils::OrientImage(image, newOrientation); - UpdateIntrinsicSize(mImage); - UpdateIntrinsicRatio(mImage); + UpdateIntrinsicSize(); + UpdateIntrinsicRatio(); + } else if (!aOldStyleContext || + aOldStyleContext->StylePosition()->mAspectRatio != + StylePosition()->mAspectRatio) { + UpdateIntrinsicRatio(); } } @@ -287,50 +287,110 @@ nsImageFrame::Init(nsIContent* aContent, p->AdjustPriority(-1); } -bool -nsImageFrame::UpdateIntrinsicSize(imgIContainer* aImage) +static IntrinsicSize +ComputeIntrinsicSize(imgIContainer* aImage, + bool aUseMappedRatio, + const nsImageFrame& aFrame) { - NS_PRECONDITION(aImage, "null image"); - if (!aImage) - return false; + // When 'contain: size' is implemented, make sure to check for it. +/* + const ComputedStyle& style = *aFrame.Style(); + if (style.StyleDisplay()->IsContainSize()) { + return AspectRatio(); + } + */ + nsSize size; + IntrinsicSize intrinsicSize; + if (aImage && NS_SUCCEEDED(aImage->GetIntrinsicSize(&size))) { + if (size.width != -1) + intrinsicSize.width.SetCoordValue(size.width); + if (size.height != -1) + intrinsicSize.height.SetCoordValue(size.height); + return intrinsicSize; + } - IntrinsicSize oldIntrinsicSize = mIntrinsicSize; - mIntrinsicSize = IntrinsicSize(); - - // Set intrinsic size to match aImage's reported intrinsic width & height. - nsSize intrinsicSize; - if (NS_SUCCEEDED(aImage->GetIntrinsicSize(&intrinsicSize))) { - // If the image has no intrinsic width, intrinsicSize.width will be -1, and - // we can leave mIntrinsicSize.width at its default value of eStyleUnit_None. - // Otherwise we use intrinsicSize.width. Height works the same way. - if (intrinsicSize.width != -1) - mIntrinsicSize.width.SetCoordValue(intrinsicSize.width); - if (intrinsicSize.height != -1) - mIntrinsicSize.height.SetCoordValue(intrinsicSize.height); - } else { - // Failure means that the image hasn't loaded enough to report a result. We - // treat this case as if the image's intrinsic size was 0x0. - mIntrinsicSize.width.SetCoordValue(0); - mIntrinsicSize.height.SetCoordValue(0); + // If broken images should ever lose their size + /* + if (aFrame.ShouldShowBrokenImageIcon()) { + nscoord edgeLengthToUse = nsPresContext::CSSPixelsToAppUnits( + ICON_SIZE + (2 * (ICON_PADDING + ALT_BORDER_WIDTH))); + intrinsicSize.width.SetCoordValue(edgeLengthToUse); + intrinsicSize.height.SetCoordValue(edgeLengthToUse); + return intrinsicSize; } + */ - return mIntrinsicSize != oldIntrinsicSize; + if (aUseMappedRatio && aFrame.StylePosition()->mAspectRatio != 0.0f) { + return IntrinsicSize(); + } + + intrinsicSize.width.SetCoordValue(0); + intrinsicSize.height.SetCoordValue(0); + return intrinsicSize; +} + +// For compat reasons, see bug 1602047, we don't use the intrinsic ratio from +// width="" and height="" for images with no src attribute (no request). +// +// If <img loading=lazy> ever gets implemented, this will need to check for it. +bool nsImageFrame::ShouldUseMappedAspectRatio() const { + nsCOMPtr<imgIRequest> currentRequest; + nsCOMPtr<nsIImageLoadingContent> imageLoader = do_QueryInterface(mContent); + if (imageLoader) { + imageLoader->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST, + getter_AddRefs(currentRequest)); + } + if (!!currentRequest) { + return true; + } + // TODO(emilio): Investigate the compat situation of the above check, maybe we + // can just check for empty src attribute or something... + auto* image = static_cast<HTMLImageElement*>(mContent); + return image && image->IsAwaitingLoad(); } bool -nsImageFrame::UpdateIntrinsicRatio(imgIContainer* aImage) +nsImageFrame::UpdateIntrinsicSize() { - NS_PRECONDITION(aImage, "null image"); - - if (!aImage) - return false; + IntrinsicSize oldIntrinsicSize = mIntrinsicSize; + mIntrinsicSize = ComputeIntrinsicSize(mImage, ShouldUseMappedAspectRatio(), *this); + return mIntrinsicSize != oldIntrinsicSize; +} - nsSize oldIntrinsicRatio = mIntrinsicRatio; +static AspectRatio +ComputeAspectRatio(imgIContainer* aImage, + bool aUseMappedRatio, + const nsImageFrame& aFrame) +{ + // When 'contain: size' is implemented, make sure to check for it. +/* + const ComputedStyle& style = *aFrame.Style(); + if (style.StyleDisplay()->IsContainSize()) { + return AspectRatio(); + } + */ + if (aImage) { + AspectRatio fromImage; + if (NS_SUCCEEDED(aImage->GetIntrinsicRatio(&fromImage))) { + return fromImage; + } + } + if (aUseMappedRatio && aFrame.StylePosition()->mAspectRatio != 0.0f) { + return AspectRatio(aFrame.StylePosition()->mAspectRatio); + } + if (aFrame.ShouldShowBrokenImageIcon()) { + return AspectRatio(1.0f); + } + return AspectRatio(); +} - // Set intrinsic ratio to match aImage's reported intrinsic ratio. - if (NS_FAILED(aImage->GetIntrinsicRatio(&mIntrinsicRatio))) - mIntrinsicRatio.SizeTo(0, 0); +bool +nsImageFrame::UpdateIntrinsicRatio() +{ + AspectRatio oldIntrinsicRatio = mIntrinsicRatio; + mIntrinsicRatio = + ComputeAspectRatio(mImage, ShouldUseMappedAspectRatio(), *this); return mIntrinsicRatio != oldIntrinsicRatio; } @@ -542,30 +602,38 @@ nsImageFrame::OnSizeAvailable(imgIRequest* aRequest, imgIContainer* aImage) return NS_OK; } - bool intrinsicSizeChanged = false; + UpdateImage(aRequest, aImage); + return NS_OK; +} + +void nsImageFrame::UpdateImage(imgIRequest* aRequest, imgIContainer* aImage) { + MOZ_ASSERT(aRequest); if (SizeIsAvailable(aRequest)) { // This is valid and for the current request, so update our stored image // container, orienting according to our style. - mImage = nsLayoutUtils::OrientImage(aImage, StyleVisibility()->mImageOrientation); - - intrinsicSizeChanged = UpdateIntrinsicSize(mImage); - intrinsicSizeChanged = UpdateIntrinsicRatio(mImage) || intrinsicSizeChanged; + mImage = nsLayoutUtils::OrientImage(aImage, + StyleVisibility()->mImageOrientation); + MOZ_ASSERT(mImage); } else { // We no longer have a valid image, so release our stored image container. mImage = mPrevImage = nullptr; - - // Have to size to 0,0 so that GetDesiredSize recalculates the size. - mIntrinsicSize.width.SetCoordValue(0); - mIntrinsicSize.height.SetCoordValue(0); - mIntrinsicRatio.SizeTo(0, 0); - intrinsicSizeChanged = true; + } + // NOTE(emilio): Intentionally using `|` instead of `||` to avoid + // short-circuiting. + bool intrinsicSizeChanged = + UpdateIntrinsicSize() | UpdateIntrinsicRatio(); + if (!(mState & IMAGE_GOTINITIALREFLOW)) { + return; } - if (intrinsicSizeChanged && (mState & IMAGE_GOTINITIALREFLOW)) { + // We're going to need to repaint now either way. + InvalidateFrame(); + + if (intrinsicSizeChanged) { // Now we need to reflow if we have an unconstrained size and have - // already gotten the initial reflow + // already gotten the initial reflow. if (!(mState & IMAGE_SIZECONSTRAINED)) { - nsIPresShell *presShell = presContext->GetPresShell(); + nsIPresShell *presShell = PresContext()->GetPresShell(); NS_ASSERTION(presShell, "No PresShell."); if (presShell) { presShell->FrameNeedsReflow(this, nsIPresShell::eStyleChange, @@ -579,8 +647,6 @@ nsImageFrame::OnSizeAvailable(imgIRequest* aRequest, imgIContainer* aImage) mPrevImage = nullptr; } - - return NS_OK; } nsresult @@ -655,45 +721,9 @@ nsImageFrame::NotifyNewCurrentRequest(imgIRequest *aRequest, { nsCOMPtr<imgIContainer> image; aRequest->GetImage(getter_AddRefs(image)); - NS_ASSERTION(image || NS_FAILED(aStatus), "Successful load with no container?"); - - // May have to switch sizes here! - bool intrinsicSizeChanged = true; - if (NS_SUCCEEDED(aStatus) && image && SizeIsAvailable(aRequest)) { - // Update our stored image container, orienting according to our style. - mImage = nsLayoutUtils::OrientImage(image, StyleVisibility()->mImageOrientation); - - intrinsicSizeChanged = UpdateIntrinsicSize(mImage); - intrinsicSizeChanged = UpdateIntrinsicRatio(mImage) || intrinsicSizeChanged; - } else { - // We no longer have a valid image, so release our stored image container. - mImage = mPrevImage = nullptr; - - // Have to size to 0,0 so that GetDesiredSize recalculates the size - mIntrinsicSize.width.SetCoordValue(0); - mIntrinsicSize.height.SetCoordValue(0); - mIntrinsicRatio.SizeTo(0, 0); - } - - if (mState & IMAGE_GOTINITIALREFLOW) { // do nothing if we haven't gotten the initial reflow yet - if (intrinsicSizeChanged) { - if (!(mState & IMAGE_SIZECONSTRAINED)) { - nsIPresShell *presShell = PresContext()->GetPresShell(); - if (presShell) { - presShell->FrameNeedsReflow(this, nsIPresShell::eStyleChange, - NS_FRAME_IS_DIRTY); - } - } else { - // We've already gotten the initial reflow, and our size hasn't changed, - // so we're ready to request a decode. - MaybeDecodeForPredictedSize(); - } - - mPrevImage = nullptr; - } - // Update border+content to account for image change - InvalidateFrame(); - } + NS_ASSERTION(image || NS_FAILED(aStatus), + "Successful load with no container?"); + UpdateImage(aRequest, image); } void @@ -787,32 +817,27 @@ bool nsImageFrame::ShouldShowBrokenImageIcon() const void nsImageFrame::EnsureIntrinsicSizeAndRatio() { + // When 'contain: size' is implemented, make sure to check for it. +/* + if (StyleDisplay()->IsContainSize()) { + // If we have 'contain:size', then our intrinsic size and ratio are 0,0 + // regardless of what our underlying image may think. + mIntrinsicSize = IntrinsicSize(0, 0); + mIntrinsicRatio = AspectRatio(); + return; + } + */ + // If mIntrinsicSize.width and height are 0, then we need to update from the // image container. - if (mIntrinsicSize.width.GetUnit() == eStyleUnit_Coord && + if (!(mIntrinsicSize.width.GetUnit() == eStyleUnit_Coord && mIntrinsicSize.width.GetCoordValue() == 0 && mIntrinsicSize.height.GetUnit() == eStyleUnit_Coord && - mIntrinsicSize.height.GetCoordValue() == 0) { - - if (mImage) { - UpdateIntrinsicSize(mImage); - UpdateIntrinsicRatio(mImage); - } else { - // Image request is null or image size not known. - if (!(GetStateBits() & NS_FRAME_GENERATED_CONTENT)) { - // Likely an invalid image. Check if we should display it as broken. - if (ShouldShowBrokenImageIcon()) { - // Invalid image specified. make the image big enough for the "broken" icon - nscoord edgeLengthToUse = - nsPresContext::CSSPixelsToAppUnits( - ICON_SIZE + (2 * (ICON_PADDING + ALT_BORDER_WIDTH))); - mIntrinsicSize.width.SetCoordValue(edgeLengthToUse); - mIntrinsicSize.height.SetCoordValue(edgeLengthToUse); - mIntrinsicRatio.SizeTo(1, 1); - } - } - } + mIntrinsicSize.height.GetCoordValue() == 0)) { + return; } + UpdateIntrinsicSize(); + UpdateIntrinsicRatio(); } /* virtual */ @@ -932,7 +957,7 @@ nsImageFrame::GetIntrinsicSize() return mIntrinsicSize; } -/* virtual */ nsSize +/* virtual */ AspectRatio nsImageFrame::GetIntrinsicRatio() { return mIntrinsicRatio; diff --git a/layout/generic/nsImageFrame.h b/layout/generic/nsImageFrame.h index 59af1be32..5e9b67274 100644 --- a/layout/generic/nsImageFrame.h +++ b/layout/generic/nsImageFrame.h @@ -86,7 +86,7 @@ public: virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; virtual mozilla::IntrinsicSize GetIntrinsicSize() override; - virtual nsSize GetIntrinsicRatio() override; + virtual mozilla::AspectRatio GetIntrinsicRatio() override; virtual void Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize, const ReflowInput& aReflowInput, @@ -273,21 +273,19 @@ private: void GetDocumentCharacterSet(nsACString& aCharset) const; bool ShouldDisplaySelection(); + // Whether the image frame should use the mapped aspect ratio from width="" + // and height="". + bool ShouldUseMappedAspectRatio() const; + /** * Recalculate mIntrinsicSize from the image. - * - * @return whether aImage's size did _not_ - * match our previous intrinsic size. */ - bool UpdateIntrinsicSize(imgIContainer* aImage); + bool UpdateIntrinsicSize(); /** * Recalculate mIntrinsicRatio from the image. - * - * @return whether aImage's ratio did _not_ - * match our previous intrinsic ratio. */ - bool UpdateIntrinsicRatio(imgIContainer* aImage); + bool UpdateIntrinsicRatio(); /** * This function calculates the transform for converting between @@ -308,6 +306,12 @@ private: bool IsPendingLoad(imgIRequest* aRequest) const; /** + * Updates mImage based on the current image request (cannot be null), and the + * image passed in (can be null), and invalidate layout and paint as needed. + */ + void UpdateImage(imgIRequest* aRequest, imgIContainer* aImage); + + /** * Function to convert a dirty rect in the source image to a dirty * rect for the image frame. */ @@ -333,7 +337,7 @@ private: nsCOMPtr<imgIContainer> mPrevImage; nsSize mComputedSize; mozilla::IntrinsicSize mIntrinsicSize; - nsSize mIntrinsicRatio; + mozilla::AspectRatio mIntrinsicRatio; bool mDisplayingIcon; bool mFirstFrameComplete; diff --git a/layout/generic/nsLineLayout.cpp b/layout/generic/nsLineLayout.cpp index 6a15a9cfa..60e4e8c96 100644 --- a/layout/generic/nsLineLayout.cpp +++ b/layout/generic/nsLineLayout.cpp @@ -784,7 +784,7 @@ IsPercentageAware(const nsIFrame* aFrame) // is calculated from the constraint equation used for // block-level, non-replaced elements in normal flow. nsIFrame *f = const_cast<nsIFrame*>(aFrame); - if (f->GetIntrinsicRatio() != nsSize(0, 0) && + if (f->GetIntrinsicRatio() && // Some percents are treated like 'auto', so check != coord pos->mHeight.GetUnit() != eStyleUnit_Coord) { const IntrinsicSize &intrinsicSize = f->GetIntrinsicSize(); diff --git a/layout/generic/nsSubDocumentFrame.cpp b/layout/generic/nsSubDocumentFrame.cpp index fd9a7d32c..31d04a335 100644 --- a/layout/generic/nsSubDocumentFrame.cpp +++ b/layout/generic/nsSubDocumentFrame.cpp @@ -671,7 +671,7 @@ nsSubDocumentFrame::GetIntrinsicSize() return nsAtomicContainerFrame::GetIntrinsicSize(); } -/* virtual */ nsSize +/* virtual */ AspectRatio nsSubDocumentFrame::GetIntrinsicRatio() { nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame(); @@ -771,7 +771,7 @@ nsSubDocumentFrame::Reflow(nsPresContext* aPresContext, // Size & position the view according to 'object-fit' & 'object-position'. nsIFrame* subDocRoot = ObtainIntrinsicSizeFrame(); IntrinsicSize intrinsSize; - nsSize intrinsRatio; + AspectRatio intrinsRatio; if (subDocRoot) { intrinsSize = subDocRoot->GetIntrinsicSize(); intrinsRatio = subDocRoot->GetIntrinsicRatio(); diff --git a/layout/generic/nsSubDocumentFrame.h b/layout/generic/nsSubDocumentFrame.h index 93d908dcc..907d33710 100644 --- a/layout/generic/nsSubDocumentFrame.h +++ b/layout/generic/nsSubDocumentFrame.h @@ -51,7 +51,7 @@ public: virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; virtual mozilla::IntrinsicSize GetIntrinsicSize() override; - virtual nsSize GetIntrinsicRatio() override; + virtual mozilla::AspectRatio GetIntrinsicRatio() override; virtual mozilla::LogicalSize ComputeAutoSize(nsRenderingContext* aRenderingContext, diff --git a/layout/generic/nsVideoFrame.cpp b/layout/generic/nsVideoFrame.cpp index cea209cb5..0472ebe62 100644 --- a/layout/generic/nsVideoFrame.cpp +++ b/layout/generic/nsVideoFrame.cpp @@ -217,12 +217,10 @@ nsVideoFrame::BuildLayer(nsDisplayListBuilder* aBuilder, // Convert video size from pixel units into app units, to get an aspect-ratio // (which has to be represented as a nsSize) and an IntrinsicSize that we // can pass to ComputeObjectRenderRect. - nsSize aspectRatio(nsPresContext::CSSPixelsToAppUnits(videoSizeInPx.width), - nsPresContext::CSSPixelsToAppUnits(videoSizeInPx.height)); + auto aspectRatio = AspectRatio::FromSize(videoSizeInPx); IntrinsicSize intrinsicSize; - intrinsicSize.width.SetCoordValue(aspectRatio.width); - intrinsicSize.height.SetCoordValue(aspectRatio.height); - + intrinsicSize.width.SetCoordValue(nsPresContext::CSSPixelsToAppUnits(videoSizeInPx.width)); + intrinsicSize.height.SetCoordValue(nsPresContext::CSSPixelsToAppUnits(videoSizeInPx.height)); nsRect dest = nsLayoutUtils::ComputeObjectDestRect(area, intrinsicSize, aspectRatio, @@ -533,7 +531,9 @@ nsVideoFrame::ComputeSize(nsRenderingContext *aRenderingContext, intrinsicSize.height.SetCoordValue(size.height); // Only video elements have an intrinsic ratio. - nsSize intrinsicRatio = HasVideoElement() ? size : nsSize(0, 0); + auto intrinsicRatio = HasVideoElement() ? + AspectRatio::FromSize(size) : + AspectRatio(); return ComputeSizeWithIntrinsicDimensions(aRenderingContext, aWM, intrinsicSize, intrinsicRatio, @@ -557,14 +557,14 @@ nscoord nsVideoFrame::GetPrefISize(nsRenderingContext *aRenderingContext) return result; } -nsSize nsVideoFrame::GetIntrinsicRatio() +AspectRatio nsVideoFrame::GetIntrinsicRatio() { if (!HasVideoElement()) { // Audio elements have no intrinsic ratio. - return nsSize(0, 0); + return AspectRatio(); } - return GetVideoIntrinsicSize(nullptr); + return AspectRatio::FromSize(GetVideoIntrinsicSize(nullptr)); } bool nsVideoFrame::ShouldDisplayPoster() diff --git a/layout/generic/nsVideoFrame.h b/layout/generic/nsVideoFrame.h index d624ae6b9..f52cd8277 100644 --- a/layout/generic/nsVideoFrame.h +++ b/layout/generic/nsVideoFrame.h @@ -56,7 +56,7 @@ public: /* get the size of the video's display */ nsSize GetVideoIntrinsicSize(nsRenderingContext *aRenderingContext); - virtual nsSize GetIntrinsicRatio() override; + virtual mozilla::AspectRatio GetIntrinsicRatio() override; virtual mozilla::LogicalSize ComputeSize(nsRenderingContext *aRenderingContext, mozilla::WritingMode aWritingMode, diff --git a/layout/style/nsCSSPropAliasList.h b/layout/style/nsCSSPropAliasList.h index f7938af9e..9ec71b2cf 100644 --- a/layout/style/nsCSSPropAliasList.h +++ b/layout/style/nsCSSPropAliasList.h @@ -264,6 +264,11 @@ CSS_PROP_ALIAS(-webkit-animation-timing-function, WebkitAnimationTimingFunction, WEBKIT_PREFIX_PREF) +CSS_PROP_ALIAS(-webkit-appearance, + appearance, + WebkitAppearance, + WEBKIT_PREFIX_PREF) + CSS_PROP_ALIAS(-webkit-filter, filter, WebkitFilter, diff --git a/layout/style/nsCSSPropList.h b/layout/style/nsCSSPropList.h index 411f982a4..44bd44cef 100644 --- a/layout/style/nsCSSPropList.h +++ b/layout/style/nsCSSPropList.h @@ -470,6 +470,17 @@ CSS_PROP_DISPLAY( kAppearanceKTable, CSS_PROP_NO_OFFSET, eStyleAnimType_Discrete) +CSS_PROP_POSITION( + aspect-ratio, + aspect_ratio, + AspectRatio, + CSS_PROPERTY_INTERNAL | + CSS_PROPERTY_PARSE_INACCESSIBLE, + "", + VARIANT_NUMBER, + nullptr, + offsetof(nsStylePosition, mAspectRatio), + eStyleAnimType_None) CSS_PROP_DISPLAY( backface-visibility, backface_visibility, diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index a0f65c069..1a451a2ef 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -8544,6 +8544,12 @@ nsRuleNode::ComputePositionData(void* aStartStruct, SETCOORD_UNSET_INITIAL, aContext, mPresContext, conditions); + // aspect-ratio: float, initial + SetFactor(*aRuleData->ValueForAspectRatio(), + pos->mAspectRatio, conditions, + parentPos->mAspectRatio, 0.0f, + SETFCT_UNSET_INITIAL | SETFCT_POSITIVE | SETFCT_NONE); + // box-sizing: enum, inherit, initial SetValue(*aRuleData->ValueForBoxSizing(), pos->mBoxSizing, conditions, diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index 200f934c5..3b19a4418 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -1408,6 +1408,7 @@ nsStylePosition::nsStylePosition(StyleStructContext aContext) , mGridAutoColumnsMax(eStyleUnit_Auto) , mGridAutoRowsMin(eStyleUnit_Auto) , mGridAutoRowsMax(eStyleUnit_Auto) + , mAspectRatio(0.0f) , mGridAutoFlow(NS_STYLE_GRID_AUTO_FLOW_ROW) , mBoxSizing(StyleBoxSizing::Content) , mAlignContent(NS_STYLE_ALIGN_NORMAL) @@ -1466,6 +1467,7 @@ nsStylePosition::nsStylePosition(const nsStylePosition& aSource) , mGridAutoColumnsMax(aSource.mGridAutoColumnsMax) , mGridAutoRowsMin(aSource.mGridAutoRowsMin) , mGridAutoRowsMax(aSource.mGridAutoRowsMax) + , mAspectRatio(aSource.mAspectRatio) , mGridAutoFlow(aSource.mGridAutoFlow) , mBoxSizing(aSource.mBoxSizing) , mAlignContent(aSource.mAlignContent) @@ -1636,6 +1638,11 @@ nsStylePosition::CalcDifference(const nsStylePosition& aNewData, if (isVertical ? heightChanged : widthChanged) { hint |= nsChangeHint_ReflowHintsForISizeChange; } + + if (mAspectRatio != aNewData.mAspectRatio) { + hint |= nsChangeHint_ReflowHintsForISizeChange | + nsChangeHint_ReflowHintsForBSizeChange; + } } else { if (widthChanged || heightChanged) { hint |= nsChangeHint_NeutralChange; @@ -2731,7 +2738,7 @@ nsStyleImageLayers::Size::DependsOnPositioningAreaSize(const nsStyleImage& aImag } if (imgContainer) { CSSIntSize imageSize; - nsSize imageRatio; + AspectRatio imageRatio; bool hasWidth, hasHeight; nsLayoutUtils::ComputeSizeForDrawing(imgContainer, imageSize, imageRatio, hasWidth, hasHeight); @@ -2744,7 +2751,7 @@ nsStyleImageLayers::Size::DependsOnPositioningAreaSize(const nsStyleImage& aImag // If the image has an intrinsic ratio, rendering will depend on frame // size when background-size is all auto. - if (imageRatio != nsSize(0, 0)) { + if (imageRatio) { return mWidthType == mHeightType; } diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index b257c6bb5..4bda817dd 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -1815,6 +1815,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStylePosition nsStyleCoord mGridAutoColumnsMax; // [reset] coord, percent, enum, calc, flex nsStyleCoord mGridAutoRowsMin; // [reset] coord, percent, enum, calc, flex nsStyleCoord mGridAutoRowsMax; // [reset] coord, percent, enum, calc, flex + float mAspectRatio; // [reset] float uint8_t mGridAutoFlow; // [reset] enumerated. See nsStyleConsts.h mozilla::StyleBoxSizing mBoxSizing; // [reset] see nsStyleConsts.h diff --git a/layout/style/test/ListCSSProperties.cpp b/layout/style/test/ListCSSProperties.cpp index 718032f61..9f727104b 100644 --- a/layout/style/test/ListCSSProperties.cpp +++ b/layout/style/test/ListCSSProperties.cpp @@ -106,6 +106,7 @@ const char *gInaccessibleProperties[] = { "-x-span", "-x-system-font", "-x-text-zoom", + "aspect-ratio", // for now. "-moz-control-character-visibility", "-moz-script-level", // parsed by UA sheets only "-moz-script-size-multiplier", diff --git a/layout/svg/nsSVGOuterSVGFrame.cpp b/layout/svg/nsSVGOuterSVGFrame.cpp index 16dfc2b37..3f68245e2 100644 --- a/layout/svg/nsSVGOuterSVGFrame.cpp +++ b/layout/svg/nsSVGOuterSVGFrame.cpp @@ -232,28 +232,30 @@ nsSVGOuterSVGFrame::GetIntrinsicSize() return intrinsicSize; } -/* virtual */ nsSize +/* virtual */ AspectRatio nsSVGOuterSVGFrame::GetIntrinsicRatio() -{ +{ + // When 'contain: size' is implemented, make sure to check for it. +/* + if (this->GetContent->GetParent() && this->StyleDisplay()->IsContainSize()) { + return AspectRatio(); + } + */ + // We only have an intrinsic size/ratio if our width and height attributes // are both specified and set to non-percentage values, or we have a viewBox // rect: http://www.w3.org/TR/SVGMobile12/coords.html#IntrinsicSizing + // Unfortunately we have to return the ratio as two nscoords whereas what + // we have are two floats. Using app units allows for some floating point + // values to work but really small or large numbers will fail. SVGSVGElement *content = static_cast<SVGSVGElement*>(mContent); nsSVGLength2 &width = content->mLengthAttributes[SVGSVGElement::ATTR_WIDTH]; nsSVGLength2 &height = content->mLengthAttributes[SVGSVGElement::ATTR_HEIGHT]; if (!width.IsPercentage() && !height.IsPercentage()) { - nsSize ratio( - nsPresContext::CSSPixelsToAppUnits(width.GetAnimValue(content)), - nsPresContext::CSSPixelsToAppUnits(height.GetAnimValue(content))); - if (ratio.width < 0) { - ratio.width = 0; - } - if (ratio.height < 0) { - ratio.height = 0; - } - return ratio; + return AspectRatio::FromSize(width.GetAnimValue(content), + height.GetAnimValue(content)); } SVGViewElement* viewElement = content->GetCurrentViewElement(); @@ -267,17 +269,7 @@ nsSVGOuterSVGFrame::GetIntrinsicRatio() } if (viewbox) { - float viewBoxWidth = viewbox->width; - float viewBoxHeight = viewbox->height; - - if (viewBoxWidth < 0.0f) { - viewBoxWidth = 0.0f; - } - if (viewBoxHeight < 0.0f) { - viewBoxHeight = 0.0f; - } - return nsSize(nsPresContext::CSSPixelsToAppUnits(viewBoxWidth), - nsPresContext::CSSPixelsToAppUnits(viewBoxHeight)); + return AspectRatio::FromSize(viewbox->width, viewbox->height); } return nsSVGDisplayContainerFrame::GetIntrinsicRatio(); diff --git a/layout/svg/nsSVGOuterSVGFrame.h b/layout/svg/nsSVGOuterSVGFrame.h index ee59b7d1c..4705b6ebe 100644 --- a/layout/svg/nsSVGOuterSVGFrame.h +++ b/layout/svg/nsSVGOuterSVGFrame.h @@ -42,7 +42,7 @@ public: virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; virtual mozilla::IntrinsicSize GetIntrinsicSize() override; - virtual nsSize GetIntrinsicRatio() override; + virtual mozilla::AspectRatio GetIntrinsicRatio() override; virtual mozilla::LogicalSize ComputeSize(nsRenderingContext *aRenderingContext, diff --git a/layout/xul/nsImageBoxFrame.cpp b/layout/xul/nsImageBoxFrame.cpp index e88b502ab..aa00c5174 100644 --- a/layout/xul/nsImageBoxFrame.cpp +++ b/layout/xul/nsImageBoxFrame.cpp @@ -402,12 +402,12 @@ nsImageBoxFrame::PaintImage(nsRenderingContext& aRenderingContext, // Determine dest rect based on intrinsic size & ratio, along with // 'object-fit' & 'object-position' properties: IntrinsicSize intrinsicSize; - nsSize intrinsicRatio; + AspectRatio intrinsicRatio; if (mIntrinsicSize.width > 0 && mIntrinsicSize.height > 0) { // Image has a valid size; use it as intrinsic size & ratio. intrinsicSize.width.SetCoordValue(mIntrinsicSize.width); intrinsicSize.height.SetCoordValue(mIntrinsicSize.height); - intrinsicRatio = mIntrinsicSize; + intrinsicRatio = AspectRatio::FromSize(mIntrinsicSize); } else { // Image doesn't have a (valid) intrinsic size. // Try to look up intrinsic ratio and use that at least. diff --git a/ldap/c-sdk/common.mozbuild b/ldap/c-sdk/common.mozbuild index 4377982c5..e335f230a 100644 --- a/ldap/c-sdk/common.mozbuild +++ b/ldap/c-sdk/common.mozbuild @@ -17,6 +17,8 @@ elif CONFIG['OS_TARGET'] in ('OpenBSD', 'FreeBSD', 'NetBSD'): DEFINES[CONFIG['OS_TARGET'].upper()] = True elif CONFIG['OS_ARCH'] == 'WINNT': DEFINES['_WINDOWS'] = True +elif CONFIG['OS_ARCH'] == 'SunOS': + DEFINES['__USE_DRAFT6_PROTOTYPES__'] = True DEFINES['_PR_PTHREADS'] = True DEFINES['NET_SSL'] = True diff --git a/ldap/c-sdk/include/portable.h b/ldap/c-sdk/include/portable.h index 52698867f..d61d8535f 100644 --- a/ldap/c-sdk/include/portable.h +++ b/ldap/c-sdk/include/portable.h @@ -59,7 +59,7 @@ */ #ifndef SYSV -#if defined( hpux ) || defined( SOLARIS ) || defined ( sgi ) || defined( SVR4 ) +#if defined( hpux ) || defined(XP_SOLARIS) || defined ( sgi ) || defined( SVR4 ) #define SYSV #endif #endif @@ -191,7 +191,7 @@ */ #if !defined(NSLDAPI_CONNECT_MUST_NOT_BE_INTERRUPTED) && \ ( defined(AIX) || defined(IRIX) || defined(HPUX) || defined(SUNOS4) \ - || defined(SOLARIS) || defined(OSF1) ||defined(freebsd)) + || defined(XP_SOLARIS) || defined(OSF1) ||defined(freebsd)) #define NSLDAPI_CONNECT_MUST_NOT_BE_INTERRUPTED #endif diff --git a/ldap/c-sdk/libldap/tmplout.c b/ldap/c-sdk/libldap/tmplout.c index 0dded6b4c..fae0b94d5 100644 --- a/ldap/c-sdk/libldap/tmplout.c +++ b/ldap/c-sdk/libldap/tmplout.c @@ -43,16 +43,11 @@ #include "ldap-int.h" #include "disptmpl.h" -#if defined(_WINDOWS) || defined(aix) || defined(SCOOS) || defined(OSF1) || defined(SOLARIS) +#if defined(_WINDOWS) || defined(aix) || defined(SCOOS) || defined(OSF1) || defined(XP_SOLARIS) #include <time.h> /* for struct tm and ctime */ #endif -/* This is totally lame, since it should be coming from time.h, but isn't. */ -#if defined(SOLARIS) -char *ctime_r(const time_t *, char *, int); -#endif - static int do_entry2text( LDAP *ld, char *buf, char *base, LDAPMessage *entry, struct ldap_disptmpl *tmpl, char **defattrs, char ***defvals, writeptype writeproc, void *writeparm, char *eol, int rdncount, diff --git a/mailnews/base/util/folderUtils.jsm b/mailnews/base/util/folderUtils.jsm index 62fb7700b..f549bf655 100644 --- a/mailnews/base/util/folderUtils.jsm +++ b/mailnews/base/util/folderUtils.jsm @@ -12,6 +12,7 @@ this.EXPORTED_SYMBOLS = ["getFolderProperties", "getSpecialFolderString", Components.utils.import("resource:///modules/mailServices.js"); Components.utils.import("resource:///modules/iteratorUtils.jsm"); +Components.utils.import("resource://gre/modules/Services.jsm"); /** * Returns a string representation of a folder's "special" type. @@ -169,8 +170,18 @@ function allAccountsSorted(aExcludeIMAccounts) { return a.incomingServer.type != "im"; }); } + + // Sort the accounts else will respect the order in mail.accountmanager.accounts + if (!Services.prefs.getBoolPref("mail.accountmanager.accounts.ordered", false)) { + accountList = accountList.sort(compareAccounts); + } + + // Set "Local Folders" as always the first displayed account + if (Services.prefs.getBoolPref("mail.accountmanager.localfolderfirst", false)) { + accountList.unshift(accountList.splice(accountList.findIndex(item => item.key === "account1"), 1)[0]); + } - return accountList.sort(compareAccounts); + return accountList; } /** diff --git a/mailnews/mailnews.js b/mailnews/mailnews.js index 7ebe2eaa7..49ac33827 100644 --- a/mailnews/mailnews.js +++ b/mailnews/mailnews.js @@ -431,6 +431,8 @@ pref("mail.default_sendlater_uri", "mailbox://nobody@Local%20Folders/Unsent%20Me pref("mail.smtpservers", ""); pref("mail.accountmanager.accounts", ""); +pref("mail.accountmanager.accounts.ordered", false); +pref("mail.accountmanager.localfolderfirst", false); // Last used account key value pref("mail.account.lastKey", 0); diff --git a/media/libyuv/build/mac/find_sdk_uxp.py b/media/libyuv/build/mac/find_sdk_uxp.py new file mode 100644 index 000000000..b81dba947 --- /dev/null +++ b/media/libyuv/build/mac/find_sdk_uxp.py @@ -0,0 +1,12 @@ +#!/usr/bin/env 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/. +import sys +import subprocess + +def main(): + return subprocess.call([sys.executable, "../webrtc/trunk/build/mac/find_sdk_uxp.py"] + sys.argv[1:]) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.c b/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.c index 6c07ae2a6..f08a20a1f 100644 --- a/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.c +++ b/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.c @@ -418,8 +418,7 @@ static int nr_ice_candidate_copy_for_triggered_check(nr_ice_cand_pair *pair) copy->nominated = pair->nominated; r_log(LOG_ICE,LOG_INFO,"CAND-PAIR(%s): Adding pair to check list and trigger check queue: %s",pair->codeword,pair->as_string); - if(r=nr_ice_candidate_pair_insert(&pair->remote->stream->check_list,copy)) - ABORT(r); + nr_ice_candidate_pair_insert(&pair->remote->stream->check_list,copy); nr_ice_candidate_pair_trigger_check_append(&pair->remote->stream->trigger_check_queue,copy); copy->triggered = 1; @@ -601,7 +600,7 @@ int nr_ice_candidate_pair_trigger_check_append(nr_ice_cand_pair_head *head,nr_ic return(0); } -int nr_ice_candidate_pair_insert(nr_ice_cand_pair_head *head,nr_ice_cand_pair *pair) +void nr_ice_candidate_pair_insert(nr_ice_cand_pair_head *head,nr_ice_cand_pair *pair) { nr_ice_cand_pair *c1; @@ -615,8 +614,6 @@ int nr_ice_candidate_pair_insert(nr_ice_cand_pair_head *head,nr_ice_cand_pair *p c1=TAILQ_NEXT(c1,check_queue_entry); } if(!c1) TAILQ_INSERT_TAIL(head,pair,check_queue_entry); - - return(0); } void nr_ice_candidate_pair_restart_stun_nominated_cb(NR_SOCKET s, int how, void *cb_arg) diff --git a/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.h b/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.h index 171ded4a0..cb3d61eca 100644 --- a/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.h +++ b/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.h @@ -82,7 +82,7 @@ int nr_ice_candidate_pair_dump_state(nr_ice_cand_pair *pair, FILE *out); int nr_ice_candidate_pair_cancel(nr_ice_peer_ctx *pctx,nr_ice_cand_pair *pair, int move_to_wait_state); int nr_ice_candidate_pair_select(nr_ice_cand_pair *pair); int nr_ice_candidate_pair_do_triggered_check(nr_ice_peer_ctx *pctx, nr_ice_cand_pair *pair); -int nr_ice_candidate_pair_insert(nr_ice_cand_pair_head *head,nr_ice_cand_pair *pair); +void nr_ice_candidate_pair_insert(nr_ice_cand_pair_head *head,nr_ice_cand_pair *pair); int nr_ice_candidate_pair_trigger_check_append(nr_ice_cand_pair_head *head,nr_ice_cand_pair *pair); void nr_ice_candidate_pair_restart_stun_nominated_cb(NR_SOCKET s, int how, void *cb_arg); int nr_ice_candidate_pair_destroy(nr_ice_cand_pair **pairp); diff --git a/media/mtransport/third_party/nICEr/src/ice/ice_component.c b/media/mtransport/third_party/nICEr/src/ice/ice_component.c index 11b4fcbc1..7a42eb208 100644 --- a/media/mtransport/third_party/nICEr/src/ice/ice_component.c +++ b/media/mtransport/third_party/nICEr/src/ice/ice_component.c @@ -1613,8 +1613,7 @@ int nr_ice_component_finalize(nr_ice_component *lcomp, nr_ice_component *rcomp) int nr_ice_component_insert_pair(nr_ice_component *pcomp, nr_ice_cand_pair *pair) { - int r,_status; - int pair_inserted=0; + int _status; /* Pairs for peer reflexive are marked SUCCEEDED immediately */ if (pair->state != NR_ICE_PAIR_STATE_FROZEN && @@ -1623,10 +1622,8 @@ int nr_ice_component_insert_pair(nr_ice_component *pcomp, nr_ice_cand_pair *pair ABORT(R_BAD_ARGS); } - if(r=nr_ice_candidate_pair_insert(&pair->remote->stream->check_list,pair)) - ABORT(r); - - pair_inserted=1; + /* We do not throw an error after this, because we've inserted the pair. */ + nr_ice_candidate_pair_insert(&pair->remote->stream->check_list,pair); /* Make sure the check timer is running, if the stream was previously * started. We will not start streams just because a pair was created, @@ -1638,13 +1635,12 @@ int nr_ice_component_insert_pair(nr_ice_component *pcomp, nr_ice_cand_pair *pair !pair->remote->stream->pctx->checks_started)){ if(nr_ice_media_stream_start_checks(pair->remote->stream->pctx, pair->remote->stream)) { r_log(LOG_ICE,LOG_WARNING,"ICE-PEER(%s)/CAND-PAIR(%s): Could not restart checks for new pair %s.",pair->remote->stream->pctx->label, pair->codeword, pair->as_string); - ABORT(R_INTERNAL); } } _status=0; abort: - if (_status && !pair_inserted) { + if (_status) { nr_ice_candidate_pair_destroy(&pair); } return(_status); diff --git a/media/webrtc/trunk/build/common.gypi b/media/webrtc/trunk/build/common.gypi index 68003ba06..47ad77de4 100644 --- a/media/webrtc/trunk/build/common.gypi +++ b/media/webrtc/trunk/build/common.gypi @@ -1176,7 +1176,7 @@ # Enable Keystone auto-update support. 'mac_keystone%': 1, }, { # else: branding!="Chrome" or buildtype!="Official" - 'mac_sdk%': '<!(<(PYTHON) <(DEPTH)/build/mac/find_sdk.py <(mac_sdk_min))', + 'mac_sdk%': '<!(<(PYTHON) <(DEPTH)/build/mac/find_sdk_uxp.py <(mac_sdk_path))', 'mac_breakpad_uploads%': 0, 'mac_breakpad%': 0, 'mac_keystone%': 0, diff --git a/media/webrtc/trunk/build/mac/find_sdk_uxp.py b/media/webrtc/trunk/build/mac/find_sdk_uxp.py new file mode 100644 index 000000000..3c419f1e4 --- /dev/null +++ b/media/webrtc/trunk/build/mac/find_sdk_uxp.py @@ -0,0 +1,38 @@ +#!/usr/bin/env 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/. + +from __future__ import print_function +import os +import re +import sys + +if sys.platform == 'darwin': + if len(sys.argv) <= 1: + print("find_sdk_uxp.py: error: Not enough arguments") + sys.exit(1) + else: + if os.path.isdir(sys.argv[1]): + SDK_PATH = sys.argv[1] + else: + print("find_sdk_uxp.py: error: Specified path does not exist or is not a directory") + sys.exit(1) + + KNOWN_SDK_VERSIONS = ["10.7", "10.8", "10.9", "10.10", + "10.11", "10.12", "10.13", "10.14", + "10.15"] + + REGEX = "^MacOSX(10\.\d+)\.sdk$" + SDK_VERSION = re.findall(REGEX, os.path.basename(SDK_PATH)) + + if not SDK_VERSION: + print("find_sdk_uxp.py: error: Could not determin the MacOS X SDK version") + sys.exit(1) + + if SDK_VERSION[0] in KNOWN_SDK_VERSIONS: + print(SDK_VERSION[0]) + else: + print("find_sdk_uxp.py: error: Unknown MacOS X SDK version") + +sys.exit(0) diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 766c00d39..d4b86731d 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -1265,8 +1265,14 @@ pref("javascript.options.unboxed_objects", false); pref("javascript.options.baselinejit", true); pref("javascript.options.ion", true); pref("javascript.options.asmjs", true); -pref("javascript.options.wasm", false); +pref("javascript.options.wasm", true); +// wasm jit crashes in 32bit builds because of 64bit casts so +// only enable it by default for 64bit builds +#ifdef HAVE_64BIT_BUILD +pref("javascript.options.wasm_baselinejit", true); +#else pref("javascript.options.wasm_baselinejit", false); +#endif pref("javascript.options.native_regexp", true); pref("javascript.options.parallel_parsing", true); // ayncstack is used for debugging promises in devtools. @@ -2483,7 +2489,7 @@ pref("layout.css.scroll-snap.prediction-max-velocity", 2000); pref("layout.css.scroll-snap.prediction-sensitivity", "0.750"); // Is support for basic shapes in clip-path enabled? -pref("layout.css.clip-path-shapes.enabled", false); +pref("layout.css.clip-path-shapes.enabled", true); // Is support for DOMPoint enabled? pref("layout.css.DOMPoint.enabled", true); @@ -2495,18 +2501,10 @@ pref("layout.css.DOMQuad.enabled", true); pref("layout.css.DOMMatrix.enabled", true); // Is support for GeometryUtils.getBoxQuads enabled? -#ifdef RELEASE_OR_BETA -pref("layout.css.getBoxQuads.enabled", false); -#else pref("layout.css.getBoxQuads.enabled", true); -#endif // Is support for GeometryUtils.convert*FromNode enabled? -#ifdef RELEASE_OR_BETA -pref("layout.css.convertFromNode.enabled", false); -#else pref("layout.css.convertFromNode.enabled", true); -#endif // Is support for CSS "text-align: unsafe X" enabled? pref("layout.css.text-align-unsafe-value.enabled", false); @@ -2516,11 +2514,7 @@ pref("layout.css.text-justify.enabled", true); // Is support for CSS "float: inline-{start,end}" and // "clear: inline-{start,end}" enabled? -#if !defined(RELEASE_OR_BETA) pref("layout.css.float-logical-values.enabled", true); -#else -pref("layout.css.float-logical-values.enabled", false); -#endif // Is support for the CSS4 image-orientation property enabled? pref("layout.css.image-orientation.enabled", true); @@ -4734,19 +4728,16 @@ pref("dom.vibrator.enabled", true); pref("dom.vibrator.max_vibrate_ms", 10000); pref("dom.vibrator.max_vibrate_list_len", 128); -// Battery API -// Disabled by default to reduce private data exposure. -pref("dom.battery.enabled", false); - // Abort API pref("dom.abortController.enabled", true); // Push - pref("dom.push.enabled", false); pref("dom.push.loglevel", "error"); +pref("dom.getRootNode.enabled", false); + pref("dom.push.serverURL", "wss://push.services.mozilla.com/"); pref("dom.push.userAgentID", ""); @@ -4820,6 +4811,12 @@ pref("media.ondevicechange.fakeDeviceChangeEvent.enabled", false); // those platforms we don't handle touch events anyway so it's conceptually // a no-op. pref("layout.css.touch_action.enabled", true); + +// WHATWG computed intrinsic aspect ratio for an img element +// https://html.spec.whatwg.org/multipage/rendering.html#attributes-for-embedded-content-and-images +// Are the width and height attributes on image-like elements mapped to the +// internal-for-now aspect-ratio property? +pref("layout.css.intrinsic-aspect-ratio.enabled", true); // Enables some assertions in nsStyleContext that are too expensive // for general use, but might be useful to enable for specific tests. diff --git a/netwerk/base/nsBaseChannel.cpp b/netwerk/base/nsBaseChannel.cpp index 2575fac04..51caa546e 100644 --- a/netwerk/base/nsBaseChannel.cpp +++ b/netwerk/base/nsBaseChannel.cpp @@ -579,6 +579,12 @@ NS_IMETHODIMP nsBaseChannel::SetContentDispositionFilename(const nsAString &aContentDispositionFilename) { mContentDispositionFilename = new nsString(aContentDispositionFilename); + + // For safety reasons ensure the filename doesn't contain null characters and + // replace them with underscores. We may later pass the extension to system + // MIME APIs that expect null terminated strings. + mContentDispositionFilename->ReplaceChar(char16_t(0), '_'); + return NS_OK; } diff --git a/netwerk/base/nsStandardURL.cpp b/netwerk/base/nsStandardURL.cpp index 81b485502..1866c1037 100644 --- a/netwerk/base/nsStandardURL.cpp +++ b/netwerk/base/nsStandardURL.cpp @@ -2747,12 +2747,16 @@ nsStandardURL::SetFilePath(const nsACString &input) return SetSpec(spec); } - else if (mPath.mLen > 1) { + + if (mPath.mLen > 1) { mSpec.Cut(mPath.mPos + 1, mFilepath.mLen - 1); // left shift query, and ref ShiftFromQuery(1 - mFilepath.mLen); + // One character for '/', and if we have a query or ref we add their
+ // length and one extra for each '?' or '#' characters
+ mPath.mLen = 1 + (mQuery.mLen >= 0 ? (mQuery.mLen + 1) : 0) + + (mRef.mLen >= 0 ? (mRef.mLen + 1) : 0); // these contain only a '/' - mPath.mLen = 1; mDirectory.mLen = 1; mFilepath.mLen = 1; // these are no longer defined diff --git a/netwerk/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp index a53022f71..bf8e17537 100644 --- a/netwerk/protocol/http/HttpBaseChannel.cpp +++ b/netwerk/protocol/http/HttpBaseChannel.cpp @@ -562,6 +562,12 @@ NS_IMETHODIMP HttpBaseChannel::SetContentDispositionFilename(const nsAString& aContentDispositionFilename) { mContentDispositionFilename = new nsString(aContentDispositionFilename); + + // For safety reasons ensure the filename doesn't contain null characters and + // replace them with underscores. We may later pass the extension to system + // MIME APIs that expect null terminated strings. + mContentDispositionFilename->ReplaceChar(char16_t(0), '_'); + return NS_OK; } diff --git a/netwerk/sctp/src/netinet/sctp_input.c b/netwerk/sctp/src/netinet/sctp_input.c index 1301b430c..f469e0f5c 100755 --- a/netwerk/sctp/src/netinet/sctp_input.c +++ b/netwerk/sctp/src/netinet/sctp_input.c @@ -2517,6 +2517,27 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, /* cookie too small */ return (NULL); } +#if defined(__Userspace__) + /* + * Recover the AF_CONN addresses within the cookie. + * This needs to be done in the buffer provided for later processing + * of the cookie and in the mbuf chain for HMAC validation. + */ + if ((cookie->addr_type == SCTP_CONN_ADDRESS) && (src->sa_family == AF_CONN)) { + struct sockaddr_conn *sconnp = (struct sockaddr_conn *)src; + + memcpy(cookie->address, &sconnp->sconn_addr , sizeof(void *)); + m_copyback(m, cookie_offset + offsetof(struct sctp_state_cookie, address), + (int)sizeof(void *), (caddr_t)&sconnp->sconn_addr); + } + if ((cookie->laddr_type == SCTP_CONN_ADDRESS) && (dst->sa_family == AF_CONN)) { + struct sockaddr_conn *sconnp = (struct sockaddr_conn *)dst; + + memcpy(cookie->laddress, &sconnp->sconn_addr , sizeof(void *)); + m_copyback(m, cookie_offset + offsetof(struct sctp_state_cookie, laddress), + (int)sizeof(void *), (caddr_t)&sconnp->sconn_addr); + } +#endif /* * split off the signature into its own mbuf (since it should not be * calculated in the sctp_hmac_m() call). diff --git a/netwerk/sctp/src/netinet/sctp_output.c b/netwerk/sctp/src/netinet/sctp_output.c index 49447fa9d..3f1a9525d 100755 --- a/netwerk/sctp/src/netinet/sctp_output.c +++ b/netwerk/sctp/src/netinet/sctp_output.c @@ -6492,6 +6492,27 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb, (uint8_t *)inp->sctp_ep.secret_key[(int)(inp->sctp_ep.current_secret_number)], SCTP_SECRET_SIZE, m_cookie, sizeof(struct sctp_paramhdr), (uint8_t *)signature, SCTP_SIGNATURE_SIZE); +#if defined(__Userspace__) + /* + * Don't put AF_CONN addresses on the wire, in case this is critical + * for the application. However, they are protected by the HMAC and + * need to be reconstructed before checking the HMAC. + * Clearing is only done in the mbuf chain, since the local stc is + * not used anymore. + */ + if (stc.addr_type == SCTP_CONN_ADDRESS) { + const void *p = NULL; + + m_copyback(m_cookie, sizeof(struct sctp_paramhdr) + offsetof(struct sctp_state_cookie, address), + (int)sizeof(void *), (caddr_t)&p); + } + if (stc.laddr_type == SCTP_CONN_ADDRESS) { + const void *p = NULL; + + m_copyback(m_cookie, sizeof(struct sctp_paramhdr) + offsetof(struct sctp_state_cookie, laddress), + (int)sizeof(void *), (caddr_t)&p); + } +#endif /* * We sifa 0 here to NOT set IP_DF if its IPv4, we ignore the return * here since the timer will drive a retranmission. diff --git a/netwerk/test/gtest/TestBase64Stream.cpp b/netwerk/test/gtest/TestBase64Stream.cpp new file mode 100644 index 000000000..37f5cb824 --- /dev/null +++ b/netwerk/test/gtest/TestBase64Stream.cpp @@ -0,0 +1,95 @@ +/* -*- 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 "gtest/gtest.h" +#include "mozilla/Base64.h" +#include "nsIInputStream.h" + +namespace mozilla { +namespace net { + +// An input stream whose ReadSegments method calls aWriter with writes of size +// aStep from the provided aInput in order to test edge-cases related to small +// buffers. +class TestStream final : public nsIInputStream { + public: + NS_DECL_ISUPPORTS; + + TestStream(const nsACString& aInput, uint32_t aStep) + : mInput(aInput), mStep(aStep) {} + + NS_IMETHOD Close() override { MOZ_CRASH("This should not be called"); } + + NS_IMETHOD Available(uint64_t* aLength) override { + *aLength = mInput.Length() - mPos; + return NS_OK; + } + + NS_IMETHOD Read(char* aBuffer, uint32_t aCount, + uint32_t* aReadCount) override { + MOZ_CRASH("This should not be called"); + } + + NS_IMETHOD ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, + uint32_t aCount, uint32_t* aResult) override { + *aResult = 0; + + if (mPos == mInput.Length()) { + return NS_OK; + } + + while (aCount > 0) { + uint32_t amt = std::min(mStep, (uint32_t)(mInput.Length() - mPos)); + + uint32_t read = 0; + nsresult rv = + aWriter(this, aClosure, mInput.get() + mPos, *aResult, amt, &read); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + *aResult += read; + aCount -= read; + mPos += read; + } + + return NS_OK; + } + + NS_IMETHOD IsNonBlocking(bool* aNonBlocking) override { + *aNonBlocking = true; + return NS_OK; + } + + private: + ~TestStream() = default; + + nsCString mInput; + const uint32_t mStep; + uint32_t mPos = 0; +}; + +NS_IMPL_ISUPPORTS(TestStream, nsIInputStream) + +// Test the base64 encoder with writer buffer sizes between 1 byte and the +// entire length of "Hello World!" in order to exercise various edge cases. +TEST(TestBase64Stream, Run) +{ + nsCString input; + input.AssignLiteral("Hello World!"); + + for (uint32_t step = 1; step <= input.Length(); ++step) { + RefPtr<TestStream> ts = new TestStream(input, step); + + nsAutoString encodedData; + nsresult rv = Base64EncodeInputStream(ts, encodedData, input.Length()); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + EXPECT_TRUE(encodedData.EqualsLiteral("SGVsbG8gV29ybGQh")); + } +} + +} // namespace net +} // namespace mozilla diff --git a/netwerk/test/gtest/moz.build b/netwerk/test/gtest/moz.build index 6e6c80152..e463feb65 100644 --- a/netwerk/test/gtest/moz.build +++ b/netwerk/test/gtest/moz.build @@ -5,6 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. UNIFIED_SOURCES += [ + 'TestBase64Stream.cpp', 'TestProtocolProxyService.cpp', 'TestStandardURL.cpp', ] diff --git a/old-configure.in b/old-configure.in index 2965f60b7..d34f72204 100644 --- a/old-configure.in +++ b/old-configure.in @@ -2756,7 +2756,6 @@ MOZ_ARG_ENABLE_BOOL(mailnews, MOZ_MAILNEWS=) if test -n "$MOZ_MAILNEWS"; then - MOZ_MAILNEWS_OAUTH2=1 MOZ_MORK=1 MOZ_LDAP_XPCOM=1 diff --git a/security/nss/coreconf/coreconf.dep b/security/nss/coreconf/coreconf.dep index 590d1bfae..5182f7555 100644 --- a/security/nss/coreconf/coreconf.dep +++ b/security/nss/coreconf/coreconf.dep @@ -10,4 +10,3 @@ */ #error "Do not include this header file." - diff --git a/security/nss/lib/freebl/mpi/mpi.c b/security/nss/lib/freebl/mpi/mpi.c index 7e96e51ff..1b7b171e7 100644 --- a/security/nss/lib/freebl/mpi/mpi.c +++ b/security/nss/lib/freebl/mpi/mpi.c @@ -8,6 +8,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mpi-priv.h" +#include "mplogic.h" #if defined(OSF1) #include <c_asm.h> #endif @@ -1688,98 +1689,112 @@ mp_iseven(const mp_int *a) /* {{{ mp_gcd(a, b, c) */ /* - Like the old mp_gcd() function, except computes the GCD using the - binary algorithm due to Josef Stein in 1961 (via Knuth). + Computes the GCD using the constant-time algorithm + by Bernstein and Yang (https://eprint.iacr.org/2019/266) + "Fast constant-time gcd computation and modular inversion" */ mp_err mp_gcd(mp_int *a, mp_int *b, mp_int *c) { mp_err res; - mp_int u, v, t; - mp_size k = 0; + mp_digit cond = 0, mask = 0; + mp_int g, temp, f; + int i, j, m, bit = 1, delta = 1, shifts = 0, last = -1; + mp_size top, flen, glen; + mp_int *clear[3]; ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); - - if (mp_cmp_z(a) == MP_EQ && mp_cmp_z(b) == MP_EQ) - return MP_RANGE; + /* + Early exit if either of the inputs is zero. + Caller is responsible for the proper handling of inputs. + */ if (mp_cmp_z(a) == MP_EQ) { - return mp_copy(b, c); + res = mp_copy(b, c); + SIGN(c) = ZPOS; + return res; } else if (mp_cmp_z(b) == MP_EQ) { - return mp_copy(a, c); - } - - if ((res = mp_init(&t)) != MP_OKAY) + res = mp_copy(a, c); + SIGN(c) = ZPOS; return res; - if ((res = mp_init_copy(&u, a)) != MP_OKAY) - goto U; - if ((res = mp_init_copy(&v, b)) != MP_OKAY) - goto V; - - SIGN(&u) = ZPOS; - SIGN(&v) = ZPOS; - - /* Divide out common factors of 2 until at least 1 of a, b is even */ - while (mp_iseven(&u) && mp_iseven(&v)) { - s_mp_div_2(&u); - s_mp_div_2(&v); - ++k; } - /* Initialize t */ - if (mp_isodd(&u)) { - if ((res = mp_copy(&v, &t)) != MP_OKAY) - goto CLEANUP; - - /* t = -v */ - if (SIGN(&v) == ZPOS) - SIGN(&t) = NEG; - else - SIGN(&t) = ZPOS; + MP_CHECKOK(mp_init(&temp)); + clear[++last] = &temp; + MP_CHECKOK(mp_init_copy(&g, a)); + clear[++last] = &g; + MP_CHECKOK(mp_init_copy(&f, b)); + clear[++last] = &f; - } else { - if ((res = mp_copy(&u, &t)) != MP_OKAY) - goto CLEANUP; + /* + For even case compute the number of + shared powers of 2 in f and g. + */ + for (i = 0; i < USED(&f) && i < USED(&g); i++) { + mask = ~(DIGIT(&f, i) | DIGIT(&g, i)); + for (j = 0; j < MP_DIGIT_BIT; j++) { + bit &= mask; + shifts += bit; + mask >>= 1; + } } + /* Reduce to the odd case by removing the powers of 2. */ + s_mp_div_2d(&f, shifts); + s_mp_div_2d(&g, shifts); - for (;;) { - while (mp_iseven(&t)) { - s_mp_div_2(&t); - } + /* Allocate to the size of largest mp_int. */ + top = (mp_size)1 + ((USED(&f) >= USED(&g)) ? USED(&f) : USED(&g)); + MP_CHECKOK(s_mp_grow(&f, top)); + MP_CHECKOK(s_mp_grow(&g, top)); + MP_CHECKOK(s_mp_grow(&temp, top)); - if (mp_cmp_z(&t) == MP_GT) { - if ((res = mp_copy(&t, &u)) != MP_OKAY) - goto CLEANUP; + /* Make sure f contains the odd value. */ + MP_CHECKOK(mp_cswap((~DIGIT(&f, 0) & 1), &f, &g, top)); - } else { - if ((res = mp_copy(&t, &v)) != MP_OKAY) - goto CLEANUP; + /* Upper bound for the total iterations. */ + flen = mpl_significant_bits(&f); + glen = mpl_significant_bits(&g); + m = 4 + 3 * ((flen >= glen) ? flen : glen); - /* v = -t */ - if (SIGN(&t) == ZPOS) - SIGN(&v) = NEG; - else - SIGN(&v) = ZPOS; - } +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4146) // Thanks MSVC, we know what we're negating an unsigned mp_digit +#endif - if ((res = mp_sub(&u, &v, &t)) != MP_OKAY) - goto CLEANUP; + for (i = 0; i < m; i++) { + /* Step 1: conditional swap. */ + /* Set cond if delta > 0 and g is odd. */ + cond = (-delta >> (8 * sizeof(delta) - 1)) & DIGIT(&g, 0) & 1; + /* If cond is set replace (delta,f) with (-delta,-f). */ + delta = (-cond & -delta) | ((cond - 1) & delta); + SIGN(&f) ^= cond; + /* If cond is set swap f with g. */ + MP_CHECKOK(mp_cswap(cond, &f, &g, top)); + + /* Step 2: elemination. */ + /* Update delta. */ + delta++; + /* If g is odd, right shift (g+f) else right shift g. */ + MP_CHECKOK(mp_add(&g, &f, &temp)); + MP_CHECKOK(mp_cswap((DIGIT(&g, 0) & 1), &g, &temp, top)); + s_mp_div_2(&g); + } + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif - if (s_mp_cmp_d(&t, 0) == MP_EQ) - break; - } + /* GCD is in f, take the absolute value. */ + SIGN(&f) = ZPOS; - s_mp_2expt(&v, k); /* v = 2^k */ - res = mp_mul(&u, &v, c); /* c = u * v */ + /* Add back the removed powers of 2. */ + MP_CHECKOK(s_mp_mul_2d(&f, shifts)); -CLEANUP: - mp_clear(&v); -V: - mp_clear(&u); -U: - mp_clear(&t); + MP_CHECKOK(mp_copy(&f, c)); +CLEANUP: + while (last >= 0) + mp_clear(clear[last--]); return res; - } /* end mp_gcd() */ /* }}} */ @@ -2131,42 +2146,114 @@ CLEANUP: return res; } -/* compute mod inverse using Schroeppel's method, only if m is odd */ +/* + Computes the modular inverse using the constant-time algorithm + by Bernstein and Yang (https://eprint.iacr.org/2019/266) + "Fast constant-time gcd computation and modular inversion" + */ mp_err s_mp_invmod_odd_m(const mp_int *a, const mp_int *m, mp_int *c) { - int k; mp_err res; - mp_int x; + mp_digit cond = 0; + mp_int g, f, v, r, temp; + int i, its, delta = 1, last = -1; + mp_size top, flen, glen; + mp_int *clear[6]; ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG); - - if (mp_cmp_z(a) == 0 || mp_cmp_z(m) == 0) + /* Check for invalid inputs. */ + if (mp_cmp_z(a) == MP_EQ || mp_cmp_d(m, 2) == MP_LT) return MP_RANGE; - if (mp_iseven(m)) + + if (a == m || mp_iseven(m)) return MP_UNDEF; - MP_DIGITS(&x) = 0; + MP_CHECKOK(mp_init(&temp)); + clear[++last] = &temp; + MP_CHECKOK(mp_init(&v)); + clear[++last] = &v; + MP_CHECKOK(mp_init(&r)); + clear[++last] = &r; + MP_CHECKOK(mp_init_copy(&g, a)); + clear[++last] = &g; + MP_CHECKOK(mp_init_copy(&f, m)); + clear[++last] = &f; + + mp_set(&v, 0); + mp_set(&r, 1); + + /* Allocate to the size of largest mp_int. */ + top = (mp_size)1 + ((USED(&f) >= USED(&g)) ? USED(&f) : USED(&g)); + MP_CHECKOK(s_mp_grow(&f, top)); + MP_CHECKOK(s_mp_grow(&g, top)); + MP_CHECKOK(s_mp_grow(&temp, top)); + MP_CHECKOK(s_mp_grow(&v, top)); + MP_CHECKOK(s_mp_grow(&r, top)); + + /* Upper bound for the total iterations. */ + flen = mpl_significant_bits(&f); + glen = mpl_significant_bits(&g); + its = 4 + 3 * ((flen >= glen) ? flen : glen); + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4146) // Thanks MSVC, we know what we're negating an unsigned mp_digit +#endif - if (a == c) { - if ((res = mp_init_copy(&x, a)) != MP_OKAY) - return res; - if (a == m) - m = &x; - a = &x; - } else if (m == c) { - if ((res = mp_init_copy(&x, m)) != MP_OKAY) - return res; - m = &x; - } else { - MP_DIGITS(&x) = 0; + for (i = 0; i < its; i++) { + /* Step 1: conditional swap. */ + /* Set cond if delta > 0 and g is odd. */ + cond = (-delta >> (8 * sizeof(delta) - 1)) & DIGIT(&g, 0) & 1; + /* If cond is set replace (delta,f,v) with (-delta,-f,-v). */ + delta = (-cond & -delta) | ((cond - 1) & delta); + SIGN(&f) ^= cond; + SIGN(&v) ^= cond; + /* If cond is set swap (f,v) with (g,r). */ + MP_CHECKOK(mp_cswap(cond, &f, &g, top)); + MP_CHECKOK(mp_cswap(cond, &v, &r, top)); + + /* Step 2: elemination. */ + /* Update delta */ + delta++; + /* If g is odd replace r with (r+v). */ + MP_CHECKOK(mp_add(&r, &v, &temp)); + MP_CHECKOK(mp_cswap((DIGIT(&g, 0) & 1), &r, &temp, top)); + /* If g is odd, right shift (g+f) else right shift g. */ + MP_CHECKOK(mp_add(&g, &f, &temp)); + MP_CHECKOK(mp_cswap((DIGIT(&g, 0) & 1), &g, &temp, top)); + s_mp_div_2(&g); + /* + If r is even, right shift it. + If r is odd, right shift (r+m) which is even because m is odd. + We want the result modulo m so adding in multiples of m here vanish. + */ + MP_CHECKOK(mp_add(&r, m, &temp)); + MP_CHECKOK(mp_cswap((DIGIT(&r, 0) & 1), &r, &temp, top)); + s_mp_div_2(&r); } - MP_CHECKOK(s_mp_almost_inverse(a, m, c)); - k = res; - MP_CHECKOK(s_mp_fixup_reciprocal(c, m, k, c)); +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + + /* We have the inverse in v, propagate sign from f. */ + SIGN(&v) ^= SIGN(&f); + /* GCD is in f, take the absolute value. */ + SIGN(&f) = ZPOS; + + /* If gcd != 1, not invertible. */ + if (mp_cmp_d(&f, 1) != MP_EQ) { + res = MP_UNDEF; + goto CLEANUP; + } + + /* Return inverse modulo m. */ + MP_CHECKOK(mp_mod(&v, m, c)); + CLEANUP: - mp_clear(&x); + while (last >= 0) + mp_clear(clear[last--]); return res; } @@ -2218,13 +2305,24 @@ s_mp_invmod_2d(const mp_int *a, mp_size k, mp_int *c) if (mp_iseven(a)) return MP_UNDEF; + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4146) // Thanks MSVC, we know what we're negating an unsigned mp_digit +#endif if (k <= MP_DIGIT_BIT) { mp_digit i = s_mp_invmod_radix(MP_DIGIT(a, 0)); + /* propagate the sign from mp_int */ + i = (i ^ -(mp_digit)SIGN(a)) + (mp_digit)SIGN(a); if (k < MP_DIGIT_BIT) i &= ((mp_digit)1 << k) - (mp_digit)1; mp_set(c, i); return MP_OKAY; } +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + MP_DIGITS(&t0) = 0; MP_DIGITS(&t1) = 0; MP_DIGITS(&val) = 0; @@ -2831,6 +2929,8 @@ s_mp_clamp(mp_int *mp) while (used > 1 && DIGIT(mp, used - 1) == 0) --used; MP_USED(mp) = used; + if (used == 1 && DIGIT(mp, 0) == 0) + MP_SIGN(mp) = ZPOS; } /* end s_mp_clamp() */ /* }}} */ @@ -2908,37 +3008,36 @@ mp_err s_mp_mul_2d(mp_int *mp, mp_digit d) { mp_err res; - mp_digit dshift, bshift; - mp_digit mask; + mp_digit dshift, rshift, mask, x, prev = 0; + mp_digit *pa = NULL; + int i; ARGCHK(mp != NULL, MP_BADARG); dshift = d / MP_DIGIT_BIT; - bshift = d % MP_DIGIT_BIT; + d %= MP_DIGIT_BIT; + /* mp_digit >> rshift is undefined behavior for rshift >= MP_DIGIT_BIT */ + /* mod and corresponding mask logic avoid that when d = 0 */ + rshift = MP_DIGIT_BIT - d; + rshift %= MP_DIGIT_BIT; + /* mask = (2**d - 1) * 2**(w-d) mod 2**w */ + mask = (DIGIT_MAX << rshift) + 1; + mask &= DIGIT_MAX - 1; /* bits to be shifted out of the top word */ - if (bshift) { - mask = (mp_digit)~0 << (MP_DIGIT_BIT - bshift); - mask &= MP_DIGIT(mp, MP_USED(mp) - 1); - } else { - mask = 0; - } + x = MP_DIGIT(mp, MP_USED(mp) - 1) & mask; - if (MP_OKAY != (res = s_mp_pad(mp, MP_USED(mp) + dshift + (mask != 0)))) + if (MP_OKAY != (res = s_mp_pad(mp, MP_USED(mp) + dshift + (x != 0)))) return res; if (dshift && MP_OKAY != (res = s_mp_lshd(mp, dshift))) return res; - if (bshift) { - mp_digit *pa = MP_DIGITS(mp); - mp_digit *alim = pa + MP_USED(mp); - mp_digit prev = 0; + pa = MP_DIGITS(mp) + dshift; - for (pa += dshift; pa < alim;) { - mp_digit x = *pa; - *pa++ = (x << bshift) | prev; - prev = x >> (DIGIT_BIT - bshift); - } + for (i = MP_USED(mp) - dshift; i > 0; i--) { + x = *pa; + *pa++ = (x << d) | prev; + prev = (x & mask) >> rshift; } s_mp_clamp(mp); @@ -3077,18 +3176,20 @@ void s_mp_div_2d(mp_int *mp, mp_digit d) { int ix; - mp_digit save, next, mask; + mp_digit save, next, mask, lshift; s_mp_rshd(mp, d / DIGIT_BIT); d %= DIGIT_BIT; - if (d) { - mask = ((mp_digit)1 << d) - 1; - save = 0; - for (ix = USED(mp) - 1; ix >= 0; ix--) { - next = DIGIT(mp, ix) & mask; - DIGIT(mp, ix) = (DIGIT(mp, ix) >> d) | (save << (DIGIT_BIT - d)); - save = next; - } + /* mp_digit << lshift is undefined behavior for lshift >= MP_DIGIT_BIT */ + /* mod and corresponding mask logic avoid that when d = 0 */ + lshift = DIGIT_BIT - d; + lshift %= DIGIT_BIT; + mask = ((mp_digit)1 << d) - 1; + save = 0; + for (ix = USED(mp) - 1; ix >= 0; ix--) { + next = DIGIT(mp, ix) & mask; + DIGIT(mp, ix) = (save << lshift) | (DIGIT(mp, ix) >> d); + save = next; } s_mp_clamp(mp); @@ -4841,5 +4942,44 @@ mp_to_fixlen_octets(const mp_int *mp, unsigned char *str, mp_size length) } /* end mp_to_fixlen_octets() */ /* }}} */ +/* {{{ mp_cswap(condition, a, b, numdigits) */ +/* performs a conditional swap between mp_int. */ +mp_err +mp_cswap(mp_digit condition, mp_int *a, mp_int *b, mp_size numdigits) +{ + mp_digit x; + unsigned int i; + mp_err res = 0; + + /* if pointers are equal return */ + if (a == b) + return res; + + if (MP_ALLOC(a) < numdigits || MP_ALLOC(b) < numdigits) { + MP_CHECKOK(s_mp_grow(a, numdigits)); + MP_CHECKOK(s_mp_grow(b, numdigits)); + } + + condition = ((~condition & ((condition - 1))) >> (MP_DIGIT_BIT - 1)) - 1; + + x = (USED(a) ^ USED(b)) & condition; + USED(a) ^= x; + USED(b) ^= x; + + x = (SIGN(a) ^ SIGN(b)) & condition; + SIGN(a) ^= x; + SIGN(b) ^= x; + + for (i = 0; i < numdigits; i++) { + x = (DIGIT(a, i) ^ DIGIT(b, i)) & condition; + DIGIT(a, i) ^= x; + DIGIT(b, i) ^= x; + } + +CLEANUP: + return res; +} /* end mp_cswap() */ +/* }}} */ + /*------------------------------------------------------------------------*/ /* HERE THERE BE DRAGONS */ diff --git a/security/nss/lib/freebl/mpi/mpi.h b/security/nss/lib/freebl/mpi/mpi.h index af608b43d..b1a07a61d 100644 --- a/security/nss/lib/freebl/mpi/mpi.h +++ b/security/nss/lib/freebl/mpi/mpi.h @@ -267,6 +267,7 @@ mp_size mp_trailing_zeros(const mp_int *mp); void freebl_cpuid(unsigned long op, unsigned long *eax, unsigned long *ebx, unsigned long *ecx, unsigned long *edx); +mp_err mp_cswap(mp_digit condition, mp_int *a, mp_int *b, mp_size numdigits); #define MP_CHECKOK(x) \ if (MP_OKAY > (res = (x))) \ diff --git a/security/nss/lib/freebl/mpi/mplogic.c b/security/nss/lib/freebl/mpi/mplogic.c index 89fd03ae8..23ddfec1a 100644 --- a/security/nss/lib/freebl/mpi/mplogic.c +++ b/security/nss/lib/freebl/mpi/mplogic.c @@ -409,35 +409,54 @@ mpl_get_bits(const mp_int *a, mp_size lsbNum, mp_size numBits) return (mp_err)mask; } +#define LZCNTLOOP(i) \ + do { \ + x = d >> (i); \ + mask = (0 - x); \ + mask = (0 - (mask >> (MP_DIGIT_BIT - 1))); \ + bits += (i)&mask; \ + d ^= (x ^ d) & mask; \ + } while (0) + /* mpl_significant_bits - returns number of significnant bits in abs(a). + returns number of significant bits in abs(a). + In other words: floor(lg(abs(a))) + 1. returns 1 if value is zero. */ mp_size mpl_significant_bits(const mp_int *a) { - mp_size bits = 0; + /* + start bits at 1. + lg(0) = 0 => bits = 1 by function semantics. + below does a binary search for the _position_ of the top bit set, + which is floor(lg(abs(a))) for a != 0. + */ + mp_size bits = 1; int ix; ARGCHK(a != NULL, MP_BADARG); for (ix = MP_USED(a); ix > 0;) { - mp_digit d; - d = MP_DIGIT(a, --ix); - if (d) { - while (d) { - ++bits; - d >>= 1; - } - break; - } + mp_digit d, x, mask; + if ((d = MP_DIGIT(a, --ix)) == 0) + continue; +#if !defined(MP_USE_UINT_DIGIT) + LZCNTLOOP(32); +#endif + LZCNTLOOP(16); + LZCNTLOOP(8); + LZCNTLOOP(4); + LZCNTLOOP(2); + LZCNTLOOP(1); + break; } bits += ix * MP_DIGIT_BIT; - if (!bits) - bits = 1; return bits; } +#undef LZCNTLOOP + /*------------------------------------------------------------------------*/ /* HERE THERE BE DRAGONS */ diff --git a/security/nss/lib/nss/nss.h b/security/nss/lib/nss/nss.h index 2701a1ea1..850e9306a 100644 --- a/security/nss/lib/nss/nss.h +++ b/security/nss/lib/nss/nss.h @@ -22,10 +22,10 @@ * The format of the version string should be * "<major version>.<minor version>[.<patch level>[.<build number>]][ <ECC>][ <Beta>]" */ -#define NSS_VERSION "3.48.2" _NSS_CUSTOMIZED +#define NSS_VERSION "3.48.3" _NSS_CUSTOMIZED #define NSS_VMAJOR 3 #define NSS_VMINOR 48 -#define NSS_VPATCH 2 +#define NSS_VPATCH 3 #define NSS_VBUILD 0 #define NSS_BETA PR_FALSE diff --git a/security/nss/lib/softoken/softkver.h b/security/nss/lib/softoken/softkver.h index a1c8f8c5c..d6c8087b5 100644 --- a/security/nss/lib/softoken/softkver.h +++ b/security/nss/lib/softoken/softkver.h @@ -17,10 +17,10 @@ * The format of the version string should be * "<major version>.<minor version>[.<patch level>[.<build number>]][ <ECC>][ <Beta>]" */ -#define SOFTOKEN_VERSION "3.48.2" SOFTOKEN_ECC_STRING +#define SOFTOKEN_VERSION "3.48.3" SOFTOKEN_ECC_STRING #define SOFTOKEN_VMAJOR 3 #define SOFTOKEN_VMINOR 48 -#define SOFTOKEN_VPATCH 2 +#define SOFTOKEN_VPATCH 3 #define SOFTOKEN_VBUILD 0 #define SOFTOKEN_BETA PR_FALSE diff --git a/security/nss/lib/util/nssutil.h b/security/nss/lib/util/nssutil.h index f067465c8..8a4378fe6 100644 --- a/security/nss/lib/util/nssutil.h +++ b/security/nss/lib/util/nssutil.h @@ -19,10 +19,10 @@ * The format of the version string should be * "<major version>.<minor version>[.<patch level>[.<build number>]][ <Beta>]" */ -#define NSSUTIL_VERSION "3.48.2" +#define NSSUTIL_VERSION "3.48.3" #define NSSUTIL_VMAJOR 3 #define NSSUTIL_VMINOR 48 -#define NSSUTIL_VPATCH 2 +#define NSSUTIL_VPATCH 3 #define NSSUTIL_VBUILD 0 #define NSSUTIL_BETA PR_FALSE diff --git a/testing/web-platform/tests/css-backgrounds/background-size-cover-003-ref.html b/testing/web-platform/tests/css-backgrounds/background-size-cover-003-ref.html new file mode 100644 index 000000000..bd965cfec --- /dev/null +++ b/testing/web-platform/tests/css-backgrounds/background-size-cover-003-ref.html @@ -0,0 +1,21 @@ +<!doctype html> +<title>CSS Test Reference</title> +<style> +body { margin: 0 } +.first { + width: 100px; + height: 50px; + background: lime; +} +.space { + height: 50px; +} +.second { + width: 100px; + height: 100px; + background: lime; +} +</style> +<div class="first"></div> +<div class="space"></div> +<div class="second"></div> diff --git a/testing/web-platform/tests/css-backgrounds/background-size-cover-003.html b/testing/web-platform/tests/css-backgrounds/background-size-cover-003.html new file mode 100644 index 000000000..4d2b6b125 --- /dev/null +++ b/testing/web-platform/tests/css-backgrounds/background-size-cover-003.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>CSS Test: background-size: cover with zero-sized background positioning area.</title> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#valdef-background-size-cover"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/4049"> +<link rel="help" href=" https://bugzilla.mozilla.org/show_bug.cgi?id=1559094"> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Ãlvarez"> +<link rel="author" href="https://mozilla.org" title="Mozilla"> +<link rel="match" href="background-size-cover-003-ref.html"> +<style> +body { margin: 0 } +div { + background-size: cover; + background-repeat: no-repeat; + background-position: top left; + background-origin: content-box; + background-image: url(/images/green-100x50.png); +} +#test1 { + height: 0; + width: 100px; + padding-bottom: 100px; +} + +#test2 { + height: 100px; + width: 0; + padding-right: 100px; +} +#test3 { + height: 0; + width: 0; + padding-right: 100px; + padding-bottom: 100px; +} +</style> +<div id="test1"></div> +<div id="test2"></div> +<div id="test3"></div> diff --git a/testing/web-platform/tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html b/testing/web-platform/tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html new file mode 100644 index 000000000..9ae87be9c --- /dev/null +++ b/testing/web-platform/tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html @@ -0,0 +1,60 @@ +<!doctype html> +<title>Image width and height attributes are used to infer aspect-ratio</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + img { + width: 100%; + max-width: 100px; + height: auto; + } +</style> +<img src="/images/green.png"> +<img src="/images/green.png" width=100 height=125> +<img src="" width=100 height=125> +<img src="error.png" width=100 height=125> +<img src="error.png"> +<script> +let t = async_test("Image width and height attributes are used to infer aspect-ratio"); +function assert_ratio(img, expected) { + let epsilon = 0.001; + assert_approx_equals(parseFloat(getComputedStyle(img).width, 10) / parseFloat(getComputedStyle(img).height, 10), expected, epsilon); +} +// Create and append a new image and immediately check the ratio. +// This is not racy because the spec requires the user agent to queue a task: +// https://html.spec.whatwg.org/multipage/images.html#updating-the-image-data +t.step(function() { + var img = new Image(); + img.width = 250; + img.height = 100; + img.src = "/images/blue.png"; + document.body.appendChild(img); + assert_ratio(img, 2.5); + + img = new Image(); + img.setAttribute("width", "0.8"); + img.setAttribute("height", "0.2"); + img.src = "/images/blue.png"; + document.body.appendChild(img); + // Decimals are apparently ignored? + assert_equals(getComputedStyle(img).height, "0px"); + + img = new Image(); + img.setAttribute("width", "50%"); + img.setAttribute("height", "25%"); + img.src = "/images/blue.png"; + document.body.appendChild(img); + // Percentages should be ignored. + assert_equals(getComputedStyle(img).height, "0px"); +}); + +onload = t.step_func_done(function() { + let images = document.querySelectorAll("img"); + assert_ratio(images[0], 2.0); // Loaded image's aspect ratio, at least by default, overrides width / height ratio. + assert_ratio(images[1], 2.0); // 2.0 is the original aspect ratio of green.png + assert_equals(getComputedStyle(images[2]).height, "0px"); // aspect-ratio doesn't override intrinsic size of images that don't have any src. + assert_equals(getComputedStyle(images[3]).height, "125px"); // what intrinsic size? + assert_equals(getComputedStyle(images[4]).height, "100px"); // what aspect ratio? + assert_ratio(images[5], 133/106); // The original aspect ratio of blue.png +}); +</script> diff --git a/testing/web-platform/tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/object_intrinsic_size_vertical.html b/testing/web-platform/tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/object_intrinsic_size_vertical.html new file mode 100644 index 000000000..0dca4c377 --- /dev/null +++ b/testing/web-platform/tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/object_intrinsic_size_vertical.html @@ -0,0 +1,57 @@ +<!doctype html>
+<title>Frame width and height attributes as they apply in a vertical writing mode</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #horiz
+ {
+ writing-mode: horizontal-tb;
+ display: inline-block;
+ }
+ #vert
+ {
+ writing-mode: vertical-rl;
+ display: inline-block;
+ }
+ object
+ {
+ border: 1px solid red;
+ margin: 5px;
+ }
+</style>
+<div id="horiz">
+<object data="/images/green.png" width=300></object>
+<object data="/images/green.png" height=50></object>
+</div>
+<div id="vert">
+<object data="/images/green.png" width=300></object>
+<object data="/images/green.png" height=50></object>
+</div>
+<script>
+let t = async_test("Frame width and height attributes as they apply in a vertical writing mode");
+function assert_dimensions(obj, expectedX, expectedY) {
+ assert_equals(getComputedStyle(obj).width, expectedX);
+ assert_equals(getComputedStyle(obj).height, expectedY);
+}
+t.step(function() {
+ var obj = document.createElement('object');
+ obj.width = 133;
+ obj.data = '/images/blue.png';
+ document.getElementById('horiz').appendChild(obj);
+
+ obj = document.createElement('object');
+ obj.width = 133;
+ obj.data = '/images/blue.png';
+ document.getElementById('vert').appendChild(obj);
+});
+
+onload = t.step_func_done(function() {
+ let objects = document.querySelectorAll("object");
+ assert_dimensions(objects[0], '300px', '150px');
+ assert_dimensions(objects[1], '100px', '50px');
+ assert_dimensions(objects[2], '133px', '106px');
+ assert_dimensions(objects[3], '300px', '150px');
+ assert_dimensions(objects[4], '100px', '50px');
+ assert_dimensions(objects[5], '133px', '106px');
+});
+</script>
diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm index a48e0034f..f69daa0eb 100644 --- a/toolkit/mozapps/extensions/AddonManager.jsm +++ b/toolkit/mozapps/extensions/AddonManager.jsm @@ -30,7 +30,6 @@ const PREF_EM_LAST_PLATFORM_VERSION = "extensions.lastPlatformVersion"; const PREF_EM_AUTOUPDATE_DEFAULT = "extensions.update.autoUpdateDefault"; const PREF_EM_STRICT_COMPATIBILITY = "extensions.strictCompatibility"; const PREF_EM_CHECK_UPDATE_SECURITY = "extensions.checkUpdateSecurity"; -const PREF_EM_UPDATE_BACKGROUND_URL = "extensions.update.background.url"; const PREF_APP_UPDATE_ENABLED = "app.update.enabled"; const PREF_APP_UPDATE_AUTO = "app.update.auto"; const PREF_MATCH_OS_LOCALE = "intl.locale.matchOS"; diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm index d12e1de59..f7d53812a 100644 --- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm @@ -74,7 +74,6 @@ const PREF_DSS_SWITCHPENDING = "extensions.dss.switchPending"; const PREF_DSS_SKIN_TO_SELECT = "extensions.lastSelectedSkin"; const PREF_GENERAL_SKINS_SELECTEDSKIN = "general.skins.selectedSkin"; const PREF_EM_UPDATE_URL = "extensions.update.url"; -const PREF_EM_UPDATE_BACKGROUND_URL = "extensions.update.background.url"; const PREF_EM_ENABLED_ADDONS = "extensions.enabledAddons"; const PREF_EM_EXTENSION_FORMAT = "extensions."; const PREF_EM_ENABLED_SCOPES = "extensions.enabledScopes"; @@ -6179,12 +6178,7 @@ function UpdateChecker(aAddon, aListener, aReason, aAppVersion, aPlatformVersion let updateURL = aAddon.updateURL; if (!updateURL) { - if (aReason == AddonManager.UPDATE_WHEN_PERIODIC_UPDATE && - Services.prefs.getPrefType(PREF_EM_UPDATE_BACKGROUND_URL) == Services.prefs.PREF_STRING) { - updateURL = Services.prefs.getCharPref(PREF_EM_UPDATE_BACKGROUND_URL); - } else { - updateURL = Services.prefs.getCharPref(PREF_EM_UPDATE_URL); - } + updateURL = Services.prefs.getCharPref(PREF_EM_UPDATE_URL); } const UPDATE_TYPE_COMPATIBILITY = 32; @@ -6477,8 +6471,12 @@ AddonInternal.prototype = { return false; #endif } - else if (app.id == TOOLKIT_ID) - version = aPlatformVersion + else if (app.id == TOOLKIT_ID) { +#ifdef MOZ_PHOENIX_EXTENSIONS + this.native = true; +#endif + version = aPlatformVersion; + } // Only extensions and dictionaries can be compatible by default; themes // and language packs always use strict compatibility checking. diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index 55072c474..a2f7b89b2 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -2615,6 +2615,7 @@ NS_VISIBILITY_DEFAULT PRBool nspr_use_zone_allocator = PR_FALSE; #ifdef CAIRO_HAS_DWRITE_FONT #include <dwrite.h> +#include "nsWindowsHelpers.h" #ifdef DEBUG_DWRITE_STARTUP @@ -2643,7 +2644,7 @@ static DWORD WINAPI InitDwriteBG(LPVOID lpdwThreadParam) { SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); LOGREGISTRY(L"loading dwrite.dll"); - HMODULE dwdll = LoadLibraryW(L"dwrite.dll"); + HMODULE dwdll = LoadLibrarySystem32(L"dwrite.dll"); if (dwdll) { decltype(DWriteCreateFactory)* createDWriteFactory = (decltype(DWriteCreateFactory)*) GetProcAddress(dwdll, "DWriteCreateFactory"); diff --git a/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp index 49a54ea5f..0ca3d7edf 100644 --- a/uriloader/exthandler/nsExternalHelperAppService.cpp +++ b/uriloader/exthandler/nsExternalHelperAppService.cpp @@ -1181,9 +1181,12 @@ nsExternalAppHandler::nsExternalAppHandler(nsIMIMEInfo * aMIMEInfo, mTempFileExtension = char16_t('.'); AppendUTF8toUTF16(aTempFileExtension, mTempFileExtension); - // replace platform specific path separator and illegal characters to avoid any confusion - mSuggestedFileName.ReplaceChar(KNOWN_PATH_SEPARATORS FILE_ILLEGAL_CHARACTERS, '_'); - mTempFileExtension.ReplaceChar(KNOWN_PATH_SEPARATORS FILE_ILLEGAL_CHARACTERS, '_'); + // Replace platform specific path separator and illegal characters to avoid any confusion + mSuggestedFileName.ReplaceChar(KNOWN_PATH_SEPARATORS, '_'); + mSuggestedFileName.ReplaceChar(FILE_ILLEGAL_CHARACTERS, ' '); + mSuggestedFileName.ReplaceChar(char16_t(0), '_'); + mTempFileExtension.ReplaceChar(KNOWN_PATH_SEPARATORS, '_'); + mTempFileExtension.ReplaceChar(FILE_ILLEGAL_CHARACTERS, ' '); // Remove unsafe bidi characters which might have spoofing implications (bug 511521). const char16_t unsafeBidiCharacters[] = { diff --git a/uriloader/prefetch/nsOfflineCacheUpdate.cpp b/uriloader/prefetch/nsOfflineCacheUpdate.cpp index 4b6cd4d0c..8a4183429 100644 --- a/uriloader/prefetch/nsOfflineCacheUpdate.cpp +++ b/uriloader/prefetch/nsOfflineCacheUpdate.cpp @@ -948,6 +948,14 @@ nsOfflineManifestItem::HandleManifestLine(const nsCString::const_iterator &aBegi mStrictFileOriginPolicy)) break; + // Check fallback path for disallowed encoded path separators
+ nsAutoCString path;
+ fallbackURI->GetFilePath(path);
+ if (path.Find("%2f") != kNotFound || path.Find("%2F") != kNotFound) {
+ LogToConsole("Offline cache manifest bad fallback path", this);
+ break;
+ }
+ mFallbackURIs.AppendObject(fallbackURI); AddNamespace(nsIApplicationCacheNamespace::NAMESPACE_FALLBACK, diff --git a/xpcom/io/Base64.cpp b/xpcom/io/Base64.cpp index 911c0595a..b9fa7baf8 100644 --- a/xpcom/io/Base64.cpp +++ b/xpcom/io/Base64.cpp @@ -108,30 +108,51 @@ EncodeInputStream_Encoder(nsIInputStream* aStream, EncodeInputStream_State<T>* state = static_cast<EncodeInputStream_State<T>*>(aClosure); + // We always consume all data. + *aWriteCount = aCount; + // If we have any data left from last time, encode it now. uint32_t countRemaining = aCount; const unsigned char* src = (const unsigned char*)aFromSegment; if (state->charsOnStack) { + MOZ_ASSERT(state->charsOnStack == 1 || state->charsOnStack == 2); + + // Not enough data to compose a triple. + if (state->charsOnStack == 1 && countRemaining == 1) { + state->charsOnStack = 2; + state->c[1] = src[0]; + return NS_OK; + } + + uint32_t consumed = 0; unsigned char firstSet[4]; if (state->charsOnStack == 1) { firstSet[0] = state->c[0]; firstSet[1] = src[0]; - firstSet[2] = (countRemaining > 1) ? src[1] : '\0'; + firstSet[2] = src[1]; firstSet[3] = '\0'; + consumed = 2; } else /* state->charsOnStack == 2 */ { firstSet[0] = state->c[0]; firstSet[1] = state->c[1]; firstSet[2] = src[0]; firstSet[3] = '\0'; + consumed = 1; } + Encode(firstSet, 3, state->buffer); state->buffer += 4; - countRemaining -= (3 - state->charsOnStack); - src += (3 - state->charsOnStack); + countRemaining -= consumed; + src += consumed; state->charsOnStack = 0; + + // Bail if there is nothing left. + if (!countRemaining) { + return NS_OK; + } } - // Encode the bulk of the + // Encode as many full triplets as possible. uint32_t encodeLength = countRemaining - countRemaining % 3; MOZ_ASSERT(encodeLength % 3 == 0, "Should have an exact number of triplets!"); @@ -140,9 +161,6 @@ EncodeInputStream_Encoder(nsIInputStream* aStream, src += encodeLength; countRemaining -= encodeLength; - // We must consume all data, so if there's some data left stash it - *aWriteCount = aCount; - if (countRemaining) { // We should never have a full triplet left at this point. MOZ_ASSERT(countRemaining < 3, "We should have encoded more!"); |