summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2020-08-13 12:10:54 +0000
committerMoonchild <moonchild@palemoon.org>2020-08-13 12:10:54 +0000
commit11285cd0d6ef7de80d22187b99376602ed547214 (patch)
tree034c72eea2e7838b08abd00f37acf8e3c9e97949
parente1e535c1c6372f95b4a14b6a00b6d6e7be400c3b (diff)
parentd3383327a749ddb5c0626146c6f83bdfa3ea9936 (diff)
downloadUXP-11285cd0d6ef7de80d22187b99376602ed547214.tar
UXP-11285cd0d6ef7de80d22187b99376602ed547214.tar.gz
UXP-11285cd0d6ef7de80d22187b99376602ed547214.tar.lz
UXP-11285cd0d6ef7de80d22187b99376602ed547214.tar.xz
UXP-11285cd0d6ef7de80d22187b99376602ed547214.zip
Merge branch 'master' into es-modules-work
-rw-r--r--CLOBBER2
-rw-r--r--dom/base/Navigator.cpp43
-rw-r--r--dom/base/Navigator.h7
-rwxr-xr-xdom/base/moz.build1
-rw-r--r--dom/base/nsContentUtils.cpp8
-rw-r--r--dom/battery/BatteryManager.cpp212
-rw-r--r--dom/battery/BatteryManager.h84
-rw-r--r--dom/battery/Constants.h27
-rw-r--r--dom/battery/Types.h23
-rw-r--r--dom/battery/moz.build21
-rw-r--r--dom/battery/test/chrome.ini3
-rw-r--r--dom/battery/test/mochitest.ini1
-rw-r--r--dom/battery/test/test_battery_basics.html39
-rw-r--r--dom/battery/test/test_battery_charging.html35
-rw-r--r--dom/battery/test/test_battery_discharging.html35
-rw-r--r--dom/battery/test/test_battery_unprivileged.html24
-rw-r--r--dom/bindings/moz.build1
-rw-r--r--dom/cache/TypeUtils.cpp6
-rw-r--r--dom/fetch/Fetch.cpp45
-rw-r--r--dom/fetch/Fetch.h3
-rw-r--r--dom/fetch/FetchConsumer.cpp15
-rw-r--r--dom/fetch/FetchConsumer.h6
-rw-r--r--dom/fetch/FetchDriver.cpp5
-rw-r--r--dom/fetch/Request.cpp34
-rw-r--r--dom/fetch/Request.h13
-rw-r--r--dom/fetch/Response.cpp11
-rw-r--r--dom/fetch/Response.h10
-rw-r--r--dom/html/HTMLImageElement.cpp2
-rw-r--r--dom/html/HTMLImageElement.h5
-rw-r--r--dom/html/nsGenericHTMLElement.cpp58
-rw-r--r--dom/html/nsGenericHTMLElement.h4
-rw-r--r--dom/moz.build1
-rw-r--r--dom/quota/QuotaManagerService.cpp24
-rw-r--r--dom/webidl/BatteryManager.webidl23
-rw-r--r--dom/webidl/Navigator.webidl8
-rw-r--r--dom/webidl/Node.webidl2
-rw-r--r--dom/webidl/Request.webidl6
-rw-r--r--dom/webidl/moz.build1
-rw-r--r--dom/workers/ScriptLoader.cpp18
-rw-r--r--dom/workers/ServiceWorkerPrivate.cpp2
-rw-r--r--dom/workers/ServiceWorkerScriptCache.cpp2
-rw-r--r--editor/libeditor/CSSEditUtils.cpp259
-rw-r--r--editor/libeditor/CSSEditUtils.h65
-rw-r--r--editor/libeditor/EditorBase.cpp89
-rw-r--r--editor/libeditor/EditorBase.h13
-rw-r--r--editor/libeditor/HTMLEditRules.cpp83
-rw-r--r--editor/libeditor/HTMLEditor.cpp130
-rw-r--r--editor/libeditor/HTMLEditor.h18
-rw-r--r--editor/libeditor/HTMLEditorObjectResizer.cpp29
-rw-r--r--editor/libeditor/HTMLStyleEditor.cpp30
-rw-r--r--editor/libeditor/TextEditRules.cpp38
-rw-r--r--editor/libeditor/TextEditor.cpp12
-rw-r--r--editor/libeditor/TextEditor.h19
-rw-r--r--extensions/spellcheck/locales/en-US/hunspell/README_en_US.txt10
-rw-r--r--extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/5-mozilla-added774
-rw-r--r--extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/README_en_US-custom.txt10
-rw-r--r--extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/orig/en_US-custom.dic633
-rw-r--r--extensions/spellcheck/locales/en-US/hunspell/en-US.dic1161
-rw-r--r--gfx/2d/DrawTargetD2D1.cpp3
-rw-r--r--hal/Hal.cpp53
-rw-r--r--hal/Hal.h24
-rw-r--r--hal/cocoa/CocoaBattery.cpp325
-rw-r--r--hal/fallback/FallbackBattery.cpp30
-rw-r--r--hal/linux/UPowerClient.cpp508
-rw-r--r--hal/moz.build22
-rw-r--r--hal/sandbox/PHal.ipdl12
-rw-r--r--hal/sandbox/SandboxHal.cpp51
-rw-r--r--hal/windows/WindowsBattery.cpp127
-rw-r--r--image/ClippedImage.cpp4
-rw-r--r--image/ClippedImage.h2
-rw-r--r--image/DynamicImage.cpp6
-rw-r--r--image/ImageWrapper.cpp4
-rw-r--r--image/OrientedImage.cpp4
-rw-r--r--image/OrientedImage.h2
-rw-r--r--image/RasterImage.cpp5
-rw-r--r--image/VectorImage.cpp2
-rw-r--r--image/encoders/jpeg/nsJPEGEncoder.cpp11
-rw-r--r--image/imgIContainer.idl4
-rw-r--r--js/src/jit/IonBuilder.cpp8
-rw-r--r--js/src/jit/Sink.cpp6
-rwxr-xr-xjs/src/jsdate.cpp19
-rw-r--r--js/src/vm/NativeObject.h5
-rw-r--r--layout/base/nsCSSRendering.cpp88
-rw-r--r--layout/base/nsCSSRendering.h22
-rw-r--r--layout/base/nsLayoutUtils.cpp64
-rw-r--r--layout/base/nsLayoutUtils.h6
-rw-r--r--layout/generic/AspectRatio.h81
-rw-r--r--layout/generic/crashtests/1633434.html15
-rw-r--r--layout/generic/crashtests/crashtests.list1
-rw-r--r--layout/generic/moz.build1
-rw-r--r--layout/generic/nsFlexContainerFrame.cpp31
-rw-r--r--layout/generic/nsFrame.cpp57
-rw-r--r--layout/generic/nsFrame.h4
-rw-r--r--layout/generic/nsHTMLCanvasFrame.cpp31
-rw-r--r--layout/generic/nsHTMLCanvasFrame.h2
-rw-r--r--layout/generic/nsIFrame.h14
-rw-r--r--layout/generic/nsImageFrame.cpp265
-rw-r--r--layout/generic/nsImageFrame.h24
-rw-r--r--layout/generic/nsLineLayout.cpp2
-rw-r--r--layout/generic/nsSubDocumentFrame.cpp4
-rw-r--r--layout/generic/nsSubDocumentFrame.h2
-rw-r--r--layout/generic/nsVideoFrame.cpp18
-rw-r--r--layout/generic/nsVideoFrame.h2
-rw-r--r--layout/style/nsCSSPropAliasList.h5
-rw-r--r--layout/style/nsCSSPropList.h11
-rw-r--r--layout/style/nsRuleNode.cpp6
-rw-r--r--layout/style/nsStyleStruct.cpp11
-rw-r--r--layout/style/nsStyleStruct.h1
-rw-r--r--layout/style/test/ListCSSProperties.cpp1
-rw-r--r--layout/svg/nsSVGOuterSVGFrame.cpp38
-rw-r--r--layout/svg/nsSVGOuterSVGFrame.h2
-rw-r--r--layout/xul/nsImageBoxFrame.cpp4
-rw-r--r--ldap/c-sdk/common.mozbuild2
-rw-r--r--ldap/c-sdk/include/portable.h4
-rw-r--r--ldap/c-sdk/libldap/tmplout.c7
-rw-r--r--mailnews/base/util/folderUtils.jsm13
-rw-r--r--mailnews/mailnews.js2
-rw-r--r--media/libyuv/build/mac/find_sdk_uxp.py12
-rw-r--r--media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.c7
-rw-r--r--media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.h2
-rw-r--r--media/mtransport/third_party/nICEr/src/ice/ice_component.c12
-rw-r--r--media/webrtc/trunk/build/common.gypi2
-rw-r--r--media/webrtc/trunk/build/mac/find_sdk_uxp.py38
-rw-r--r--modules/libpref/init/all.js35
-rw-r--r--netwerk/base/nsBaseChannel.cpp6
-rw-r--r--netwerk/base/nsStandardURL.cpp8
-rw-r--r--netwerk/protocol/http/HttpBaseChannel.cpp6
-rwxr-xr-xnetwerk/sctp/src/netinet/sctp_input.c21
-rwxr-xr-xnetwerk/sctp/src/netinet/sctp_output.c21
-rw-r--r--netwerk/test/gtest/TestBase64Stream.cpp95
-rw-r--r--netwerk/test/gtest/moz.build1
-rw-r--r--old-configure.in1
-rw-r--r--security/nss/coreconf/coreconf.dep1
-rw-r--r--security/nss/lib/freebl/mpi/mpi.c378
-rw-r--r--security/nss/lib/freebl/mpi/mpi.h1
-rw-r--r--security/nss/lib/freebl/mpi/mplogic.c45
-rw-r--r--security/nss/lib/nss/nss.h4
-rw-r--r--security/nss/lib/softoken/softkver.h4
-rw-r--r--security/nss/lib/util/nssutil.h4
-rw-r--r--testing/web-platform/tests/css-backgrounds/background-size-cover-003-ref.html21
-rw-r--r--testing/web-platform/tests/css-backgrounds/background-size-cover-003.html38
-rw-r--r--testing/web-platform/tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html60
-rw-r--r--testing/web-platform/tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/object_intrinsic_size_vertical.html57
-rw-r--r--toolkit/mozapps/extensions/AddonManager.jsm1
-rw-r--r--toolkit/mozapps/extensions/internal/XPIProvider.jsm16
-rw-r--r--toolkit/xre/nsAppRunner.cpp3
-rw-r--r--uriloader/exthandler/nsExternalHelperAppService.cpp9
-rw-r--r--uriloader/prefetch/nsOfflineCacheUpdate.cpp8
-rw-r--r--xpcom/io/Base64.cpp32
149 files changed, 4289 insertions, 2981 deletions
diff --git a/CLOBBER b/CLOBBER
index 3b6110bb2..1f24ed9cd 100644
--- a/CLOBBER
+++ b/CLOBBER
@@ -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();
diff --git a/hal/Hal.h b/hal/Hal.h
index 5411b387a..53c9e68bb 100644
--- a/hal/Hal.h
+++ b/hal/Hal.h
@@ -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, &currentCapacity);
-
- // 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(&currentInfo);
-
- 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!");