From 1ae6431766cb7d167aa3e24713c423ad36d8f221 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 24 Jul 2020 11:09:54 +0000 Subject: [PATCH 01/18] Issue #1587 Part 11 (followup 1): Implement multithreaded signals for workers. --- dom/cache/TypeUtils.cpp | 6 +- dom/fetch/Fetch.cpp | 45 +- dom/fetch/Fetch.h | 3 + dom/fetch/FetchConsumer.cpp | 1413 +++++++++++----------- dom/fetch/FetchConsumer.h | 6 + dom/fetch/Request.cpp | 34 +- dom/fetch/Request.h | 13 +- dom/fetch/Response.cpp | 11 +- dom/fetch/Response.h | 10 +- dom/webidl/Request.webidl | 4 + dom/workers/ScriptLoader.cpp | 2 +- dom/workers/ServiceWorkerPrivate.cpp | 2 +- dom/workers/ServiceWorkerScriptCache.cpp | 2 +- 13 files changed, 823 insertions(+), 728 deletions(-) diff --git a/dom/cache/TypeUtils.cpp b/dom/cache/TypeUtils.cpp index f8c5cd7be8..5c3661d666 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 error = InternalResponse::NetworkError(); - RefPtr r = new Response(GetGlobalObject(), error); + RefPtr r = new Response(GetGlobalObject(), error, nullptr); return r.forget(); } @@ -302,7 +302,7 @@ TypeUtils::ToResponse(const CacheResponse& aIn) } MOZ_DIAGNOSTIC_ASSERT(ir); - RefPtr ref = new Response(GetGlobalObject(), ir); + RefPtr ref = new Response(GetGlobalObject(), ir, nullptr); return ref.forget(); } already_AddRefed @@ -345,7 +345,7 @@ already_AddRefed TypeUtils::ToRequest(const CacheRequest& aIn) { RefPtr internalRequest = ToInternalRequest(aIn); - RefPtr request = new Request(GetGlobalObject(), internalRequest); + RefPtr request = new Request(GetGlobalObject(), internalRequest, nullptr); return request.forget(); } diff --git a/dom/fetch/Fetch.cpp b/dom/fetch/Fetch.cpp index 191f4cfc3e..f0350fbce6 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 mPromise; RefPtr mResponse; RefPtr mFetchObserver; + RefPtr mSignal; nsCOMPtr 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 signal = mResolver->GetAbortSignal(); + RefPtr 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 r = request->GetInternalRequest(); - RefPtr signal; - if (aInit.mSignal.WasPassed()) { - signal = &aInit.mSignal.Value(); - } + RefPtr 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 resolver = - new MainThreadFetchResolver(p, observer); + new MainThreadFetchResolver(p, observer, signal); RefPtr fetch = new FetchDriver(r, principal, loadGroup); fetch->SetDocument(doc); resolver->SetDocument(doc); @@ -416,7 +433,7 @@ MainThreadFetchResolver::OnResponseAvailableInternal(InternalResponse* aResponse } nsCOMPtr 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 global = aWorkerPrivate->GlobalScope(); - RefPtr response = new Response(global, mInternalResponse); + RefPtr response = new Response(global, mInternalResponse, mResolver->GetAbortSignalForTargetThread()); promise->MaybeResolve(response); } else { if (mResolver->mFetchObserver) { @@ -926,6 +943,12 @@ template already_AddRefed FetchBody::ConsumeBody(FetchConsumeType aType, ErrorResult& aRv) { + RefPtr signal = DerivedClass()->GetSignal(); + if (signal && signal->Aborted()) { + aRv.Throw(NS_ERROR_DOM_ABORT_ERR); + return nullptr; + } + if (BodyUsed()) { aRv.ThrowTypeError(); return nullptr; @@ -935,7 +958,7 @@ FetchBody::ConsumeBody(FetchConsumeType aType, ErrorResult& aRv) RefPtr promise = FetchBodyConsumer::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 fc50d3fda0..8420661528 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 e82e5ec517..581f014d94 100644 --- a/dom/fetch/FetchConsumer.cpp +++ b/dom/fetch/FetchConsumer.cpp @@ -1,699 +1,714 @@ -/* -*- 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 "Fetch.h" -#include "FetchConsumer.h" - -#include "nsIInputStreamPump.h" -#include "nsProxyRelease.h" -#include "WorkerPrivate.h" -#include "WorkerRunnable.h" -#include "WorkerScope.h" -#include "Workers.h" - -namespace mozilla { -namespace dom { - -using namespace workers; - -namespace { - -template -class FetchBodyWorkerHolder final : public workers::WorkerHolder -{ - RefPtr> mConsumer; - bool mWasNotified; - -public: - explicit FetchBodyWorkerHolder(FetchBodyConsumer* aConsumer) - : mConsumer(aConsumer) - , mWasNotified(false) - { - MOZ_ASSERT(aConsumer); - } - - ~FetchBodyWorkerHolder() = default; - - bool Notify(workers::Status aStatus) override - { - MOZ_ASSERT(aStatus > workers::Running); - if (!mWasNotified) { - mWasNotified = true; - mConsumer->ShutDownMainThreadConsuming(); - } - - return true; - } -}; - -template -class BeginConsumeBodyRunnable final : public Runnable -{ - RefPtr> mFetchBodyConsumer; - -public: - explicit BeginConsumeBodyRunnable(FetchBodyConsumer* aConsumer) - : mFetchBodyConsumer(aConsumer) - { } - - NS_IMETHOD - Run() override - { - mFetchBodyConsumer->BeginConsumeBodyMainThread(); - return NS_OK; - } -}; - -/* - * Called on successfully reading the complete stream. - */ -template -class ContinueConsumeBodyRunnable final : public MainThreadWorkerRunnable -{ - RefPtr> mFetchBodyConsumer; - nsresult mStatus; - uint32_t mLength; - uint8_t* mResult; - -public: - ContinueConsumeBodyRunnable(FetchBodyConsumer* aFetchBodyConsumer, - nsresult aStatus, uint32_t aLength, - uint8_t* aResult) - : MainThreadWorkerRunnable(aFetchBodyConsumer->GetWorkerPrivate()) - , mFetchBodyConsumer(aFetchBodyConsumer) - , mStatus(aStatus) - , mLength(aLength) - , mResult(aResult) - { - MOZ_ASSERT(NS_IsMainThread()); - } - - bool - WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override - { - mFetchBodyConsumer->ContinueConsumeBody(mStatus, mLength, mResult); - return true; - } -}; - -template -class FailConsumeBodyWorkerRunnable : public MainThreadWorkerControlRunnable -{ - RefPtr> mBodyConsumer; - -public: - explicit FailConsumeBodyWorkerRunnable(FetchBodyConsumer* aBodyConsumer) - : MainThreadWorkerControlRunnable(aBodyConsumer->GetWorkerPrivate()) - , mBodyConsumer(aBodyConsumer) - { - AssertIsOnMainThread(); - } - - bool - WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override - { - mBodyConsumer->ContinueConsumeBody(NS_ERROR_FAILURE, 0, nullptr); - return true; - } -}; - -/* - * In case of failure to create a stream pump or dispatch stream completion to - * worker, ensure we cleanup properly. Thread agnostic. - */ -template -class MOZ_STACK_CLASS AutoFailConsumeBody final -{ - RefPtr> mBodyConsumer; - -public: - explicit AutoFailConsumeBody(FetchBodyConsumer* aBodyConsumer) - : mBodyConsumer(aBodyConsumer) - {} - - ~AutoFailConsumeBody() - { - AssertIsOnMainThread(); - - if (mBodyConsumer) { - if (mBodyConsumer->GetWorkerPrivate()) { - RefPtr> r = - new FailConsumeBodyWorkerRunnable(mBodyConsumer); - if (!r->Dispatch()) { - MOZ_CRASH("We are going to leak"); - } - } else { - mBodyConsumer->ContinueConsumeBody(NS_ERROR_FAILURE, 0, nullptr); - } - } - } - - void - DontFail() - { - mBodyConsumer = nullptr; - } -}; - -/* - * Called on successfully reading the complete stream for Blob. - */ -template -class ContinueConsumeBlobBodyRunnable final : public MainThreadWorkerRunnable -{ - RefPtr> mFetchBodyConsumer; - RefPtr mBlobImpl; - -public: - ContinueConsumeBlobBodyRunnable(FetchBodyConsumer* aFetchBodyConsumer, - BlobImpl* aBlobImpl) - : MainThreadWorkerRunnable(aFetchBodyConsumer->GetWorkerPrivate()) - , mFetchBodyConsumer(aFetchBodyConsumer) - , mBlobImpl(aBlobImpl) - { - MOZ_ASSERT(NS_IsMainThread()); - MOZ_ASSERT(mBlobImpl); - } - - bool - WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override - { - mFetchBodyConsumer->ContinueConsumeBlobBody(mBlobImpl); - return true; - } -}; - -template -class ConsumeBodyDoneObserver : public nsIStreamLoaderObserver - , public MutableBlobStorageCallback -{ - RefPtr> mFetchBodyConsumer; - -public: - NS_DECL_THREADSAFE_ISUPPORTS - - explicit ConsumeBodyDoneObserver(FetchBodyConsumer* aFetchBodyConsumer) - : mFetchBodyConsumer(aFetchBodyConsumer) - { } - - NS_IMETHOD - OnStreamComplete(nsIStreamLoader* aLoader, - nsISupports* aCtxt, - nsresult aStatus, - uint32_t aResultLength, - const uint8_t* aResult) override - { - MOZ_ASSERT(NS_IsMainThread()); - - // The loading is completed. Let's nullify the pump before continuing the - // consuming of the body. - mFetchBodyConsumer->NullifyConsumeBodyPump(); - - uint8_t* nonconstResult = const_cast(aResult); - if (mFetchBodyConsumer->GetWorkerPrivate()) { - RefPtr> r = - new ContinueConsumeBodyRunnable(mFetchBodyConsumer, - aStatus, - aResultLength, - nonconstResult); - if (!r->Dispatch()) { - NS_WARNING("Could not dispatch ConsumeBodyRunnable"); - // Return failure so that aResult is freed. - return NS_ERROR_FAILURE; - } - } else { - mFetchBodyConsumer->ContinueConsumeBody(aStatus, aResultLength, - nonconstResult); - } - - // FetchBody is responsible for data. - return NS_SUCCESS_ADOPTED_DATA; - } - - virtual void BlobStoreCompleted(MutableBlobStorage* aBlobStorage, - Blob* aBlob, - nsresult aRv) override - { - // On error. - if (NS_FAILED(aRv)) { - OnStreamComplete(nullptr, nullptr, aRv, 0, nullptr); - return; - } - - // The loading is completed. Let's nullify the pump before continuing the - // consuming of the body. - mFetchBodyConsumer->NullifyConsumeBodyPump(); - - MOZ_ASSERT(aBlob); - - if (mFetchBodyConsumer->GetWorkerPrivate()) { - RefPtr> r = - new ContinueConsumeBlobBodyRunnable(mFetchBodyConsumer, - aBlob->Impl()); - - if (!r->Dispatch()) { - NS_WARNING("Could not dispatch ConsumeBlobBodyRunnable"); - return; - } - } else { - mFetchBodyConsumer->ContinueConsumeBlobBody(aBlob->Impl()); - } - } - -private: - virtual ~ConsumeBodyDoneObserver() - { } -}; - -template -NS_IMPL_ADDREF(ConsumeBodyDoneObserver) -template -NS_IMPL_RELEASE(ConsumeBodyDoneObserver) -template -NS_INTERFACE_MAP_BEGIN(ConsumeBodyDoneObserver) - NS_INTERFACE_MAP_ENTRY(nsIStreamLoaderObserver) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStreamLoaderObserver) -NS_INTERFACE_MAP_END - -} // anonymous - -template -/* static */ already_AddRefed -FetchBodyConsumer::Create(nsIGlobalObject* aGlobal, - FetchBody* aBody, - FetchConsumeType aType, - ErrorResult& aRv) -{ - MOZ_ASSERT(aBody); - - nsCOMPtr bodyStream; - aBody->DerivedClass()->GetBody(getter_AddRefs(bodyStream)); - if (!bodyStream) { - aRv = NS_NewCStringInputStream(getter_AddRefs(bodyStream), EmptyCString()); - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - } - - RefPtr promise = Promise::Create(aGlobal, aRv); - if (aRv.Failed()) { - return nullptr; - } - - WorkerPrivate* workerPrivate = nullptr; - if (!NS_IsMainThread()) { - workerPrivate = GetCurrentThreadWorkerPrivate(); - MOZ_ASSERT(workerPrivate); - } - - RefPtr> consumer = - new FetchBodyConsumer(aGlobal, workerPrivate, aBody, bodyStream, - promise, aType); - - if (!NS_IsMainThread()) { - MOZ_ASSERT(workerPrivate); - if (NS_WARN_IF(!consumer->RegisterWorkerHolder())) { - aRv.Throw(NS_ERROR_FAILURE); - return nullptr; - } - } else { - nsCOMPtr os = mozilla::services::GetObserverService(); - if (NS_WARN_IF(!os)) { - aRv.Throw(NS_ERROR_FAILURE); - return nullptr; - } - - aRv = os->AddObserver(consumer, DOM_WINDOW_DESTROYED_TOPIC, true); - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - - aRv = os->AddObserver(consumer, DOM_WINDOW_FROZEN_TOPIC, true); - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - } - - nsCOMPtr r = new BeginConsumeBodyRunnable(consumer); - - aRv = NS_DispatchToMainThread(r.forget()); - - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - - return promise.forget(); -} - -template -void -FetchBodyConsumer::ReleaseObject() -{ - AssertIsOnTargetThread(); - - if (NS_IsMainThread()) { - nsCOMPtr os = mozilla::services::GetObserverService(); - if (os) { - os->RemoveObserver(this, DOM_WINDOW_DESTROYED_TOPIC); - os->RemoveObserver(this, DOM_WINDOW_FROZEN_TOPIC); - } - } - - mGlobal = nullptr; - mWorkerHolder = nullptr; - -#ifdef DEBUG - mBody = nullptr; -#endif -} - -template -FetchBodyConsumer::FetchBodyConsumer(nsIGlobalObject* aGlobalObject, - WorkerPrivate* aWorkerPrivate, - FetchBody* aBody, - nsIInputStream* aBodyStream, - Promise* aPromise, - FetchConsumeType aType) - : mTargetThread(NS_GetCurrentThread()) -#ifdef DEBUG - , mBody(aBody) -#endif - , mBodyStream(aBodyStream) - , mBlobStorageType(MutableBlobStorage::eOnlyInMemory) - , mGlobal(aGlobalObject) - , mWorkerPrivate(aWorkerPrivate) - , mConsumeType(aType) - , mConsumePromise(aPromise) - , mBodyConsumed(false) - , mShuttingDown(false) -{ - MOZ_ASSERT(aBody); - MOZ_ASSERT(aBodyStream); - MOZ_ASSERT(aPromise); - - const mozilla::UniquePtr& principalInfo = - aBody->DerivedClass()->GetPrincipalInfo(); - // We support temporary file for blobs only if the principal is known and - // it's system or content not in private Browsing. - if (principalInfo && - (principalInfo->type() == mozilla::ipc::PrincipalInfo::TSystemPrincipalInfo || - (principalInfo->type() == mozilla::ipc::PrincipalInfo::TContentPrincipalInfo && - principalInfo->get_ContentPrincipalInfo().attrs().mPrivateBrowsingId == 0))) { - mBlobStorageType = MutableBlobStorage::eCouldBeInTemporaryFile; - } - - mBodyMimeType = aBody->MimeType(); -} - -template -FetchBodyConsumer::~FetchBodyConsumer() -{ -} - -template -void -FetchBodyConsumer::AssertIsOnTargetThread() const -{ - MOZ_ASSERT(NS_GetCurrentThread() == mTargetThread); -} - -template -bool -FetchBodyConsumer::RegisterWorkerHolder() -{ - MOZ_ASSERT(mWorkerPrivate); - mWorkerPrivate->AssertIsOnWorkerThread(); - - MOZ_ASSERT(!mWorkerHolder); - mWorkerHolder.reset(new FetchBodyWorkerHolder(this)); - - if (!mWorkerHolder->HoldWorker(mWorkerPrivate, Closing)) { - NS_WARNING("Failed to add workerHolder"); - mWorkerHolder = nullptr; - return false; - } - - return true; -} - -/* - * BeginConsumeBodyMainThread() will automatically reject the consume promise - * and clean up on any failures, so there is no need for callers to do so, - * reflected in a lack of error return code. - */ -template -void -FetchBodyConsumer::BeginConsumeBodyMainThread() -{ - AssertIsOnMainThread(); - - AutoFailConsumeBody autoReject(this); - - if (mShuttingDown) { - // We haven't started yet, but we have been terminated. AutoFailConsumeBody - // will dispatch a runnable to release resources. - return; - } - - nsCOMPtr pump; - nsresult rv = NS_NewInputStreamPump(getter_AddRefs(pump), - mBodyStream, -1, -1, 0, 0, false); - if (NS_WARN_IF(NS_FAILED(rv))) { - return; - } - - RefPtr> p = - new ConsumeBodyDoneObserver(this); - - nsCOMPtr listener; - if (mConsumeType == CONSUME_BLOB) { - listener = new MutableBlobStreamListener(mBlobStorageType, nullptr, - mBodyMimeType, p); - } else { - nsCOMPtr loader; - rv = NS_NewStreamLoader(getter_AddRefs(loader), p); - if (NS_WARN_IF(NS_FAILED(rv))) { - return; - } - - listener = loader; - } - - rv = pump->AsyncRead(listener, nullptr); - if (NS_WARN_IF(NS_FAILED(rv))) { - return; - } - - // Now that everything succeeded, we can assign the pump to a pointer that - // stays alive for the lifetime of the FetchConsumer. - mConsumeBodyPump = pump; - - // It is ok for retargeting to fail and reads to happen on the main thread. - autoReject.DontFail(); - - // Try to retarget, otherwise fall back to main thread. - nsCOMPtr rr = do_QueryInterface(pump); - if (rr) { - nsCOMPtr sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); - rv = rr->RetargetDeliveryTo(sts); - if (NS_WARN_IF(NS_FAILED(rv))) { - NS_WARNING("Retargeting failed"); - } - } -} - -template -void -FetchBodyConsumer::ContinueConsumeBody(nsresult aStatus, - uint32_t aResultLength, - uint8_t* aResult) -{ - AssertIsOnTargetThread(); - - if (mBodyConsumed) { - return; - } - mBodyConsumed = true; - - // Just a precaution to ensure ContinueConsumeBody is not called out of - // sync with a body read. - MOZ_ASSERT(mBody->BodyUsed()); - - auto autoFree = mozilla::MakeScopeExit([&] { - free(aResult); - }); - - MOZ_ASSERT(mConsumePromise); - RefPtr localPromise = mConsumePromise.forget(); - - RefPtr> self = this; - auto autoReleaseObject = mozilla::MakeScopeExit([&] { - self->ReleaseObject(); - }); - - if (NS_WARN_IF(NS_FAILED(aStatus))) { - localPromise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); - } - - // Don't warn here since we warned above. - if (NS_FAILED(aStatus)) { - return; - } - - // Finish successfully consuming body according to type. - MOZ_ASSERT(aResult); - - AutoJSAPI jsapi; - if (!jsapi.Init(mGlobal)) { - localPromise->MaybeReject(NS_ERROR_UNEXPECTED); - return; - } - - JSContext* cx = jsapi.cx(); - ErrorResult error; - - switch (mConsumeType) { - case CONSUME_ARRAYBUFFER: { - JS::Rooted arrayBuffer(cx); - BodyUtil::ConsumeArrayBuffer(cx, &arrayBuffer, aResultLength, aResult, - error); - - if (!error.Failed()) { - JS::Rooted val(cx); - val.setObjectOrNull(arrayBuffer); - - localPromise->MaybeResolve(cx, val); - // ArrayBuffer takes over ownership. - aResult = nullptr; - } - break; - } - case CONSUME_BLOB: { - MOZ_CRASH("This should not happen."); - break; - } - case CONSUME_FORMDATA: { - nsCString data; - data.Adopt(reinterpret_cast(aResult), aResultLength); - aResult = nullptr; - - RefPtr fd = - BodyUtil::ConsumeFormData(mGlobal, mBodyMimeType, data, error); - if (!error.Failed()) { - localPromise->MaybeResolve(fd); - } - break; - } - case CONSUME_TEXT: - // fall through handles early exit. - case CONSUME_JSON: { - nsString decoded; - if (NS_SUCCEEDED(BodyUtil::ConsumeText(aResultLength, aResult, decoded))) { - if (mConsumeType == CONSUME_TEXT) { - localPromise->MaybeResolve(decoded); - } else { - JS::Rooted json(cx); - BodyUtil::ConsumeJson(cx, &json, decoded, error); - if (!error.Failed()) { - localPromise->MaybeResolve(cx, json); - } - } - }; - break; - } - default: - NS_NOTREACHED("Unexpected consume body type"); - } - - error.WouldReportJSException(); - if (error.Failed()) { - localPromise->MaybeReject(error); - } -} - -template -void -FetchBodyConsumer::ContinueConsumeBlobBody(BlobImpl* aBlobImpl) -{ - AssertIsOnTargetThread(); - MOZ_ASSERT(mConsumeType == CONSUME_BLOB); - - if (mBodyConsumed) { - return; - } - mBodyConsumed = true; - - // Just a precaution to ensure ContinueConsumeBody is not called out of - // sync with a body read. - MOZ_ASSERT(mBody->BodyUsed()); - - MOZ_ASSERT(mConsumePromise); - RefPtr localPromise = mConsumePromise.forget(); - - RefPtr blob = dom::Blob::Create(mGlobal, aBlobImpl); - MOZ_ASSERT(blob); - - localPromise->MaybeResolve(blob); - - ReleaseObject(); -} - -template -void -FetchBodyConsumer::ShutDownMainThreadConsuming() -{ - if (!NS_IsMainThread()) { - RefPtr> self = this; - - nsCOMPtr r = NS_NewRunnableFunction( - [self] () { self->ShutDownMainThreadConsuming(); }); - - MOZ_ALWAYS_SUCCEEDS(NS_DispatchToMainThread(r.forget())); - return; - } - - // We need this because maybe, mConsumeBodyPump has not been created yet. We - // must be sure that we don't try to do it. - mShuttingDown = true; - - if (mConsumeBodyPump) { - mConsumeBodyPump->Cancel(NS_BINDING_ABORTED); - mConsumeBodyPump = nullptr; - } -} - -template -NS_IMETHODIMP -FetchBodyConsumer::Observe(nsISupports* aSubject, - const char* aTopic, - const char16_t* aData) -{ - AssertIsOnMainThread(); - - MOZ_ASSERT((strcmp(aTopic, DOM_WINDOW_FROZEN_TOPIC) == 0) || - (strcmp(aTopic, DOM_WINDOW_DESTROYED_TOPIC) == 0)); - - nsCOMPtr window = do_QueryInterface(mGlobal); - if (SameCOMIdentity(aSubject, window)) { - ContinueConsumeBody(NS_BINDING_ABORTED, 0, nullptr); - } - - return NS_OK; -} - -template -NS_IMPL_ADDREF(FetchBodyConsumer) - -template -NS_IMPL_RELEASE(FetchBodyConsumer) - -template -NS_IMPL_QUERY_INTERFACE(FetchBodyConsumer, - nsIObserver, - nsISupportsWeakReference) - -} // namespace dom -} // namespace mozilla +/* -*- 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 "Fetch.h" +#include "FetchConsumer.h" + +#include "nsIInputStreamPump.h" +#include "nsProxyRelease.h" +#include "WorkerPrivate.h" +#include "WorkerRunnable.h" +#include "WorkerScope.h" +#include "Workers.h" + +namespace mozilla { +namespace dom { + +using namespace workers; + +namespace { + +template +class FetchBodyWorkerHolder final : public workers::WorkerHolder +{ + RefPtr> mConsumer; + bool mWasNotified; + +public: + explicit FetchBodyWorkerHolder(FetchBodyConsumer* aConsumer) + : mConsumer(aConsumer) + , mWasNotified(false) + { + MOZ_ASSERT(aConsumer); + } + + ~FetchBodyWorkerHolder() = default; + + bool Notify(workers::Status aStatus) override + { + MOZ_ASSERT(aStatus > workers::Running); + if (!mWasNotified) { + mWasNotified = true; + mConsumer->ShutDownMainThreadConsuming(); + } + + return true; + } +}; + +template +class BeginConsumeBodyRunnable final : public Runnable +{ + RefPtr> mFetchBodyConsumer; + +public: + explicit BeginConsumeBodyRunnable(FetchBodyConsumer* aConsumer) + : mFetchBodyConsumer(aConsumer) + { } + + NS_IMETHOD + Run() override + { + mFetchBodyConsumer->BeginConsumeBodyMainThread(); + return NS_OK; + } +}; + +/* + * Called on successfully reading the complete stream. + */ +template +class ContinueConsumeBodyRunnable final : public MainThreadWorkerRunnable +{ + RefPtr> mFetchBodyConsumer; + nsresult mStatus; + uint32_t mLength; + uint8_t* mResult; + +public: + ContinueConsumeBodyRunnable(FetchBodyConsumer* aFetchBodyConsumer, + nsresult aStatus, uint32_t aLength, + uint8_t* aResult) + : MainThreadWorkerRunnable(aFetchBodyConsumer->GetWorkerPrivate()) + , mFetchBodyConsumer(aFetchBodyConsumer) + , mStatus(aStatus) + , mLength(aLength) + , mResult(aResult) + { + MOZ_ASSERT(NS_IsMainThread()); + } + + bool + WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override + { + mFetchBodyConsumer->ContinueConsumeBody(mStatus, mLength, mResult); + return true; + } +}; + +template +class FailConsumeBodyWorkerRunnable : public MainThreadWorkerControlRunnable +{ + RefPtr> mBodyConsumer; + +public: + explicit FailConsumeBodyWorkerRunnable(FetchBodyConsumer* aBodyConsumer) + : MainThreadWorkerControlRunnable(aBodyConsumer->GetWorkerPrivate()) + , mBodyConsumer(aBodyConsumer) + { + AssertIsOnMainThread(); + } + + bool + WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override + { + mBodyConsumer->ContinueConsumeBody(NS_ERROR_FAILURE, 0, nullptr); + return true; + } +}; + +/* + * In case of failure to create a stream pump or dispatch stream completion to + * worker, ensure we cleanup properly. Thread agnostic. + */ +template +class MOZ_STACK_CLASS AutoFailConsumeBody final +{ + RefPtr> mBodyConsumer; + +public: + explicit AutoFailConsumeBody(FetchBodyConsumer* aBodyConsumer) + : mBodyConsumer(aBodyConsumer) + {} + + ~AutoFailConsumeBody() + { + AssertIsOnMainThread(); + + if (mBodyConsumer) { + if (mBodyConsumer->GetWorkerPrivate()) { + RefPtr> r = + new FailConsumeBodyWorkerRunnable(mBodyConsumer); + if (!r->Dispatch()) { + MOZ_CRASH("We are going to leak"); + } + } else { + mBodyConsumer->ContinueConsumeBody(NS_ERROR_FAILURE, 0, nullptr); + } + } + } + + void + DontFail() + { + mBodyConsumer = nullptr; + } +}; + +/* + * Called on successfully reading the complete stream for Blob. + */ +template +class ContinueConsumeBlobBodyRunnable final : public MainThreadWorkerRunnable +{ + RefPtr> mFetchBodyConsumer; + RefPtr mBlobImpl; + +public: + ContinueConsumeBlobBodyRunnable(FetchBodyConsumer* aFetchBodyConsumer, + BlobImpl* aBlobImpl) + : MainThreadWorkerRunnable(aFetchBodyConsumer->GetWorkerPrivate()) + , mFetchBodyConsumer(aFetchBodyConsumer) + , mBlobImpl(aBlobImpl) + { + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(mBlobImpl); + } + + bool + WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override + { + mFetchBodyConsumer->ContinueConsumeBlobBody(mBlobImpl); + return true; + } +}; + +template +class ConsumeBodyDoneObserver : public nsIStreamLoaderObserver + , public MutableBlobStorageCallback +{ + RefPtr> mFetchBodyConsumer; + +public: + NS_DECL_THREADSAFE_ISUPPORTS + + explicit ConsumeBodyDoneObserver(FetchBodyConsumer* aFetchBodyConsumer) + : mFetchBodyConsumer(aFetchBodyConsumer) + { } + + NS_IMETHOD + OnStreamComplete(nsIStreamLoader* aLoader, + nsISupports* aCtxt, + nsresult aStatus, + uint32_t aResultLength, + const uint8_t* aResult) override + { + MOZ_ASSERT(NS_IsMainThread()); + + // The loading is completed. Let's nullify the pump before continuing the + // consuming of the body. + mFetchBodyConsumer->NullifyConsumeBodyPump(); + + uint8_t* nonconstResult = const_cast(aResult); + if (mFetchBodyConsumer->GetWorkerPrivate()) { + RefPtr> r = + new ContinueConsumeBodyRunnable(mFetchBodyConsumer, + aStatus, + aResultLength, + nonconstResult); + if (!r->Dispatch()) { + NS_WARNING("Could not dispatch ConsumeBodyRunnable"); + // Return failure so that aResult is freed. + return NS_ERROR_FAILURE; + } + } else { + mFetchBodyConsumer->ContinueConsumeBody(aStatus, aResultLength, + nonconstResult); + } + + // FetchBody is responsible for data. + return NS_SUCCESS_ADOPTED_DATA; + } + + virtual void BlobStoreCompleted(MutableBlobStorage* aBlobStorage, + Blob* aBlob, + nsresult aRv) override + { + // On error. + if (NS_FAILED(aRv)) { + OnStreamComplete(nullptr, nullptr, aRv, 0, nullptr); + return; + } + + // The loading is completed. Let's nullify the pump before continuing the + // consuming of the body. + mFetchBodyConsumer->NullifyConsumeBodyPump(); + + MOZ_ASSERT(aBlob); + + if (mFetchBodyConsumer->GetWorkerPrivate()) { + RefPtr> r = + new ContinueConsumeBlobBodyRunnable(mFetchBodyConsumer, + aBlob->Impl()); + + if (!r->Dispatch()) { + NS_WARNING("Could not dispatch ConsumeBlobBodyRunnable"); + return; + } + } else { + mFetchBodyConsumer->ContinueConsumeBlobBody(aBlob->Impl()); + } + } + +private: + virtual ~ConsumeBodyDoneObserver() + { } +}; + +template +NS_IMPL_ADDREF(ConsumeBodyDoneObserver) +template +NS_IMPL_RELEASE(ConsumeBodyDoneObserver) +template +NS_INTERFACE_MAP_BEGIN(ConsumeBodyDoneObserver) + NS_INTERFACE_MAP_ENTRY(nsIStreamLoaderObserver) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStreamLoaderObserver) +NS_INTERFACE_MAP_END + +} // anonymous + +template +/* static */ already_AddRefed +FetchBodyConsumer::Create(nsIGlobalObject* aGlobal, + FetchBody* aBody, + AbortSignal* aSignal, + FetchConsumeType aType, + ErrorResult& aRv) +{ + MOZ_ASSERT(aBody); + + nsCOMPtr bodyStream; + aBody->DerivedClass()->GetBody(getter_AddRefs(bodyStream)); + if (!bodyStream) { + aRv = NS_NewCStringInputStream(getter_AddRefs(bodyStream), EmptyCString()); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + } + + RefPtr promise = Promise::Create(aGlobal, aRv); + if (aRv.Failed()) { + return nullptr; + } + + WorkerPrivate* workerPrivate = nullptr; + if (!NS_IsMainThread()) { + workerPrivate = GetCurrentThreadWorkerPrivate(); + MOZ_ASSERT(workerPrivate); + } + + RefPtr> consumer = + new FetchBodyConsumer(aGlobal, workerPrivate, aBody, bodyStream, + promise, aType); + + if (!NS_IsMainThread()) { + MOZ_ASSERT(workerPrivate); + if (NS_WARN_IF(!consumer->RegisterWorkerHolder())) { + aRv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + } else { + nsCOMPtr os = mozilla::services::GetObserverService(); + if (NS_WARN_IF(!os)) { + aRv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + + aRv = os->AddObserver(consumer, DOM_WINDOW_DESTROYED_TOPIC, true); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + + aRv = os->AddObserver(consumer, DOM_WINDOW_FROZEN_TOPIC, true); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + } + + nsCOMPtr r = new BeginConsumeBodyRunnable(consumer); + + aRv = NS_DispatchToMainThread(r.forget()); + + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + + if (aSignal) { + consumer->Follow(aSignal); + } + + return promise.forget(); +} + +template +void +FetchBodyConsumer::ReleaseObject() +{ + AssertIsOnTargetThread(); + + if (NS_IsMainThread()) { + nsCOMPtr os = mozilla::services::GetObserverService(); + if (os) { + os->RemoveObserver(this, DOM_WINDOW_DESTROYED_TOPIC); + os->RemoveObserver(this, DOM_WINDOW_FROZEN_TOPIC); + } + } + + mGlobal = nullptr; + mWorkerHolder = nullptr; + +#ifdef DEBUG + mBody = nullptr; +#endif + + Unfollow(); +} + +template +FetchBodyConsumer::FetchBodyConsumer(nsIGlobalObject* aGlobalObject, + WorkerPrivate* aWorkerPrivate, + FetchBody* aBody, + nsIInputStream* aBodyStream, + Promise* aPromise, + FetchConsumeType aType) + : mTargetThread(NS_GetCurrentThread()) +#ifdef DEBUG + , mBody(aBody) +#endif + , mBodyStream(aBodyStream) + , mBlobStorageType(MutableBlobStorage::eOnlyInMemory) + , mGlobal(aGlobalObject) + , mWorkerPrivate(aWorkerPrivate) + , mConsumeType(aType) + , mConsumePromise(aPromise) + , mBodyConsumed(false) + , mShuttingDown(false) +{ + MOZ_ASSERT(aBody); + MOZ_ASSERT(aBodyStream); + MOZ_ASSERT(aPromise); + + const mozilla::UniquePtr& principalInfo = + aBody->DerivedClass()->GetPrincipalInfo(); + // We support temporary file for blobs only if the principal is known and + // it's system or content not in private Browsing. + if (principalInfo && + (principalInfo->type() == mozilla::ipc::PrincipalInfo::TSystemPrincipalInfo || + (principalInfo->type() == mozilla::ipc::PrincipalInfo::TContentPrincipalInfo && + principalInfo->get_ContentPrincipalInfo().attrs().mPrivateBrowsingId == 0))) { + mBlobStorageType = MutableBlobStorage::eCouldBeInTemporaryFile; + } + + mBodyMimeType = aBody->MimeType(); +} + +template +FetchBodyConsumer::~FetchBodyConsumer() +{ +} + +template +void +FetchBodyConsumer::AssertIsOnTargetThread() const +{ + MOZ_ASSERT(NS_GetCurrentThread() == mTargetThread); +} + +template +bool +FetchBodyConsumer::RegisterWorkerHolder() +{ + MOZ_ASSERT(mWorkerPrivate); + mWorkerPrivate->AssertIsOnWorkerThread(); + + MOZ_ASSERT(!mWorkerHolder); + mWorkerHolder.reset(new FetchBodyWorkerHolder(this)); + + if (!mWorkerHolder->HoldWorker(mWorkerPrivate, Closing)) { + NS_WARNING("Failed to add workerHolder"); + mWorkerHolder = nullptr; + return false; + } + + return true; +} + +/* + * BeginConsumeBodyMainThread() will automatically reject the consume promise + * and clean up on any failures, so there is no need for callers to do so, + * reflected in a lack of error return code. + */ +template +void +FetchBodyConsumer::BeginConsumeBodyMainThread() +{ + AssertIsOnMainThread(); + + AutoFailConsumeBody autoReject(this); + + if (mShuttingDown) { + // We haven't started yet, but we have been terminated. AutoFailConsumeBody + // will dispatch a runnable to release resources. + return; + } + + nsCOMPtr pump; + nsresult rv = NS_NewInputStreamPump(getter_AddRefs(pump), + mBodyStream, -1, -1, 0, 0, false); + if (NS_WARN_IF(NS_FAILED(rv))) { + return; + } + + RefPtr> p = + new ConsumeBodyDoneObserver(this); + + nsCOMPtr listener; + if (mConsumeType == CONSUME_BLOB) { + listener = new MutableBlobStreamListener(mBlobStorageType, nullptr, + mBodyMimeType, p); + } else { + nsCOMPtr loader; + rv = NS_NewStreamLoader(getter_AddRefs(loader), p); + if (NS_WARN_IF(NS_FAILED(rv))) { + return; + } + + listener = loader; + } + + rv = pump->AsyncRead(listener, nullptr); + if (NS_WARN_IF(NS_FAILED(rv))) { + return; + } + + // Now that everything succeeded, we can assign the pump to a pointer that + // stays alive for the lifetime of the FetchConsumer. + mConsumeBodyPump = pump; + + // It is ok for retargeting to fail and reads to happen on the main thread. + autoReject.DontFail(); + + // Try to retarget, otherwise fall back to main thread. + nsCOMPtr rr = do_QueryInterface(pump); + if (rr) { + nsCOMPtr sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); + rv = rr->RetargetDeliveryTo(sts); + if (NS_WARN_IF(NS_FAILED(rv))) { + NS_WARNING("Retargeting failed"); + } + } +} + +template +void +FetchBodyConsumer::ContinueConsumeBody(nsresult aStatus, + uint32_t aResultLength, + uint8_t* aResult) +{ + AssertIsOnTargetThread(); + + if (mBodyConsumed) { + return; + } + mBodyConsumed = true; + + // Just a precaution to ensure ContinueConsumeBody is not called out of + // sync with a body read. + MOZ_ASSERT(mBody->BodyUsed()); + + auto autoFree = mozilla::MakeScopeExit([&] { + free(aResult); + }); + + MOZ_ASSERT(mConsumePromise); + RefPtr localPromise = mConsumePromise.forget(); + + RefPtr> self = this; + auto autoReleaseObject = mozilla::MakeScopeExit([&] { + self->ReleaseObject(); + }); + + if (NS_WARN_IF(NS_FAILED(aStatus))) { + localPromise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); + } + + // Don't warn here since we warned above. + if (NS_FAILED(aStatus)) { + return; + } + + // Finish successfully consuming body according to type. + MOZ_ASSERT(aResult); + + AutoJSAPI jsapi; + if (!jsapi.Init(mGlobal)) { + localPromise->MaybeReject(NS_ERROR_UNEXPECTED); + return; + } + + JSContext* cx = jsapi.cx(); + ErrorResult error; + + switch (mConsumeType) { + case CONSUME_ARRAYBUFFER: { + JS::Rooted arrayBuffer(cx); + BodyUtil::ConsumeArrayBuffer(cx, &arrayBuffer, aResultLength, aResult, + error); + + if (!error.Failed()) { + JS::Rooted val(cx); + val.setObjectOrNull(arrayBuffer); + + localPromise->MaybeResolve(cx, val); + // ArrayBuffer takes over ownership. + aResult = nullptr; + } + break; + } + case CONSUME_BLOB: { + MOZ_CRASH("This should not happen."); + break; + } + case CONSUME_FORMDATA: { + nsCString data; + data.Adopt(reinterpret_cast(aResult), aResultLength); + aResult = nullptr; + + RefPtr fd = + BodyUtil::ConsumeFormData(mGlobal, mBodyMimeType, data, error); + if (!error.Failed()) { + localPromise->MaybeResolve(fd); + } + break; + } + case CONSUME_TEXT: + // fall through handles early exit. + case CONSUME_JSON: { + nsString decoded; + if (NS_SUCCEEDED(BodyUtil::ConsumeText(aResultLength, aResult, decoded))) { + if (mConsumeType == CONSUME_TEXT) { + localPromise->MaybeResolve(decoded); + } else { + JS::Rooted json(cx); + BodyUtil::ConsumeJson(cx, &json, decoded, error); + if (!error.Failed()) { + localPromise->MaybeResolve(cx, json); + } + } + }; + break; + } + default: + NS_NOTREACHED("Unexpected consume body type"); + } + + error.WouldReportJSException(); + if (error.Failed()) { + localPromise->MaybeReject(error); + } +} + +template +void +FetchBodyConsumer::ContinueConsumeBlobBody(BlobImpl* aBlobImpl) +{ + AssertIsOnTargetThread(); + MOZ_ASSERT(mConsumeType == CONSUME_BLOB); + + if (mBodyConsumed) { + return; + } + mBodyConsumed = true; + + // Just a precaution to ensure ContinueConsumeBody is not called out of + // sync with a body read. + MOZ_ASSERT(mBody->BodyUsed()); + + MOZ_ASSERT(mConsumePromise); + RefPtr localPromise = mConsumePromise.forget(); + + RefPtr blob = dom::Blob::Create(mGlobal, aBlobImpl); + MOZ_ASSERT(blob); + + localPromise->MaybeResolve(blob); + + ReleaseObject(); +} + +template +void +FetchBodyConsumer::ShutDownMainThreadConsuming() +{ + if (!NS_IsMainThread()) { + RefPtr> self = this; + + nsCOMPtr r = NS_NewRunnableFunction( + [self] () { self->ShutDownMainThreadConsuming(); }); + + MOZ_ALWAYS_SUCCEEDS(NS_DispatchToMainThread(r.forget())); + return; + } + + // We need this because maybe, mConsumeBodyPump has not been created yet. We + // must be sure that we don't try to do it. + mShuttingDown = true; + + if (mConsumeBodyPump) { + mConsumeBodyPump->Cancel(NS_BINDING_ABORTED); + mConsumeBodyPump = nullptr; + } +} + +template +NS_IMETHODIMP +FetchBodyConsumer::Observe(nsISupports* aSubject, + const char* aTopic, + const char16_t* aData) +{ + AssertIsOnMainThread(); + + MOZ_ASSERT((strcmp(aTopic, DOM_WINDOW_FROZEN_TOPIC) == 0) || + (strcmp(aTopic, DOM_WINDOW_DESTROYED_TOPIC) == 0)); + + nsCOMPtr window = do_QueryInterface(mGlobal); + if (SameCOMIdentity(aSubject, window)) { + ContinueConsumeBody(NS_BINDING_ABORTED, 0, nullptr); + } + + return NS_OK; +} + +template +void +FetchBodyConsumer::Aborted() +{ + AssertIsOnTargetThread(); + ContinueConsumeBody(NS_ERROR_DOM_ABORT_ERR, 0, nullptr); +} + +template +NS_IMPL_ADDREF(FetchBodyConsumer) + +template +NS_IMPL_RELEASE(FetchBodyConsumer) + +template +NS_IMPL_QUERY_INTERFACE(FetchBodyConsumer, + nsIObserver, + nsISupportsWeakReference) + +} // namespace dom +} // namespace mozilla diff --git a/dom/fetch/FetchConsumer.h b/dom/fetch/FetchConsumer.h index 2b57253420..77af09d9b5 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 FetchBody; template class FetchBodyConsumer final : public nsIObserver , public nsSupportsWeakReference + , public AbortSignal::Follower { public: NS_DECL_THREADSAFE_ISUPPORTS @@ -42,6 +44,7 @@ public: static already_AddRefed Create(nsIGlobalObject* aGlobal, FetchBody* 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/Request.cpp b/dom/fetch/Request.cpp index 6a7885b1aa..ba268d3310 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() , 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 request; nsCOMPtr global = do_QueryInterface(aGlobal.GetAsSupports()); + + RefPtr signal; if (aInput.IsRequest()) { RefPtr 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 window = do_QueryInterface(global); if (window) { @@ -579,7 +589,7 @@ Request::Constructor(const GlobalObject& aGlobal, } } - RefPtr domRequest = new Request(global, request); + RefPtr domRequest = new Request(global, request, signal); domRequest->SetMimeType(); if (aInput.IsRequest()) { @@ -595,7 +605,7 @@ Request::Constructor(const GlobalObject& aGlobal, } already_AddRefed -Request::Clone(ErrorResult& aRv) const +Request::Clone(ErrorResult& aRv) { if (BodyUsed()) { aRv.ThrowTypeError(); @@ -608,7 +618,7 @@ Request::Clone(ErrorResult& aRv) const return nullptr; } - RefPtr request = new Request(mOwner, ir); + RefPtr 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 f6fe9be7bd..34cbc52cf7 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 - Clone(ErrorResult& aRv) const; + Clone(ErrorResult& aRv); already_AddRefed GetInternalRequest(); @@ -153,13 +153,22 @@ public: return mRequest->GetPrincipalInfo(); } + AbortSignal* + GetOrCreateSignal(); + + // This can return a null AbortSignal. + AbortSignal* + GetSignal() const override; + private: ~Request(); nsCOMPtr mOwner; RefPtr mRequest; + // Lazily created. RefPtr mHeaders; + RefPtr mSignal; }; } // namespace dom diff --git a/dom/fetch/Response.cpp b/dom/fetch/Response.cpp index e35de0e12d..241614286b 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() , 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 global = do_QueryInterface(aGlobal.GetAsSupports()); RefPtr error = InternalResponse::NetworkError(); - RefPtr r = new Response(global, error); + RefPtr r = new Response(global, error, nullptr); return r.forget(); } @@ -173,7 +174,7 @@ Response::Constructor(const GlobalObject& aGlobal, internalResponse->InitChannelInfo(worker->GetChannelInfo()); } - RefPtr r = new Response(global, internalResponse); + RefPtr r = new Response(global, internalResponse, nullptr); if (aInit.mHeaders.WasPassed()) { internalResponse->Headers()->Clear(); @@ -236,7 +237,7 @@ Response::Clone(ErrorResult& aRv) const } RefPtr ir = mInternalResponse->Clone(); - RefPtr response = new Response(mOwner, ir); + RefPtr response = new Response(mOwner, ir, mSignal); return response.forget(); } @@ -250,7 +251,7 @@ Response::CloneUnfiltered(ErrorResult& aRv) const RefPtr clone = mInternalResponse->Clone(); RefPtr ir = clone->Unfiltered(); - RefPtr ref = new Response(mOwner, ir); + RefPtr ref = new Response(mOwner, ir, mSignal); return ref.forget(); } diff --git a/dom/fetch/Response.h b/dom/fetch/Response.h index de367bef68..ca86c3458e 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 GetInternalResponse() const; + AbortSignal* + GetSignal() const override + { + return mSignal; + } + private: ~Response(); nsCOMPtr mOwner; RefPtr mInternalResponse; + // Lazily created RefPtr mHeaders; + RefPtr mSignal; }; } // namespace dom diff --git a/dom/webidl/Request.webidl b/dom/webidl/Request.webidl index fe6a63ec0d..57bea5db61 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(); diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp index bcec94dcb4..80e1363843 100644 --- a/dom/workers/ScriptLoader.cpp +++ b/dom/workers/ScriptLoader.cpp @@ -694,7 +694,7 @@ private: ir->SetPrincipalInfo(Move(principalInfo)); RefPtr response = - new mozilla::dom::Response(mCacheCreator->Global(), ir); + new mozilla::dom::Response(mCacheCreator->Global(), ir, nullptr); mozilla::dom::RequestOrUSVString request; diff --git a/dom/workers/ServiceWorkerPrivate.cpp b/dom/workers/ServiceWorkerPrivate.cpp index 23ae3b3664..571ceca372 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 = new Request(global, internalReq); + RefPtr 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 707b689e8a..3db58e694a 100644 --- a/dom/workers/ServiceWorkerScriptCache.cpp +++ b/dom/workers/ServiceWorkerScriptCache.cpp @@ -554,7 +554,7 @@ private: ir->SetPrincipalInfo(Move(mPrincipalInfo)); } - RefPtr response = new Response(aCache->GetGlobalObject(), ir); + RefPtr response = new Response(aCache->GetGlobalObject(), ir, nullptr); RequestOrUSVString request; request.SetAsUSVString().Rebind(URL().Data(), URL().Length()); From 70bf74e9d304edbf07122c8307acf17df3fd3fd2 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sat, 25 Jul 2020 17:31:58 +0000 Subject: [PATCH 02/18] Issue #1587 Part 12 (followup 2): Allow clearing of signal by setting to null. --- dom/fetch/FetchDriver.cpp | 5 +++++ dom/fetch/Request.cpp | 2 +- dom/webidl/Request.webidl | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dom/fetch/FetchDriver.cpp b/dom/fetch/FetchDriver.cpp index 067e32db48..fd1e99a2b6 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 ba268d3310..76f3ce5c51 100644 --- a/dom/fetch/Request.cpp +++ b/dom/fetch/Request.cpp @@ -425,7 +425,7 @@ Request::Constructor(const GlobalObject& aGlobal, } if (aInit.mSignal.WasPassed()) { - signal = &aInit.mSignal.Value(); + signal = aInit.mSignal.Value(); } if (NS_IsMainThread()) { diff --git a/dom/webidl/Request.webidl b/dom/webidl/Request.webidl index 57bea5db61..9140543e7b 100644 --- a/dom/webidl/Request.webidl +++ b/dom/webidl/Request.webidl @@ -53,7 +53,7 @@ dictionary RequestInit { DOMString integrity; [Func="AbortController::IsEnabled"] - AbortSignal signal; + AbortSignal? signal; [Func="FetchObserver::IsEnabled"] ObserverCallback observe; From 078fea47aadc0f4dfa1f853b447e1c26e5159ae9 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Sat, 25 Jul 2020 17:37:05 +0000 Subject: [PATCH 03/18] Fix line endings. --- dom/fetch/FetchConsumer.cpp | 1428 +++++++++++++++++------------------ 1 file changed, 714 insertions(+), 714 deletions(-) diff --git a/dom/fetch/FetchConsumer.cpp b/dom/fetch/FetchConsumer.cpp index 581f014d94..d2d07eaa2b 100644 --- a/dom/fetch/FetchConsumer.cpp +++ b/dom/fetch/FetchConsumer.cpp @@ -1,714 +1,714 @@ -/* -*- 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 "Fetch.h" -#include "FetchConsumer.h" - -#include "nsIInputStreamPump.h" -#include "nsProxyRelease.h" -#include "WorkerPrivate.h" -#include "WorkerRunnable.h" -#include "WorkerScope.h" -#include "Workers.h" - -namespace mozilla { -namespace dom { - -using namespace workers; - -namespace { - -template -class FetchBodyWorkerHolder final : public workers::WorkerHolder -{ - RefPtr> mConsumer; - bool mWasNotified; - -public: - explicit FetchBodyWorkerHolder(FetchBodyConsumer* aConsumer) - : mConsumer(aConsumer) - , mWasNotified(false) - { - MOZ_ASSERT(aConsumer); - } - - ~FetchBodyWorkerHolder() = default; - - bool Notify(workers::Status aStatus) override - { - MOZ_ASSERT(aStatus > workers::Running); - if (!mWasNotified) { - mWasNotified = true; - mConsumer->ShutDownMainThreadConsuming(); - } - - return true; - } -}; - -template -class BeginConsumeBodyRunnable final : public Runnable -{ - RefPtr> mFetchBodyConsumer; - -public: - explicit BeginConsumeBodyRunnable(FetchBodyConsumer* aConsumer) - : mFetchBodyConsumer(aConsumer) - { } - - NS_IMETHOD - Run() override - { - mFetchBodyConsumer->BeginConsumeBodyMainThread(); - return NS_OK; - } -}; - -/* - * Called on successfully reading the complete stream. - */ -template -class ContinueConsumeBodyRunnable final : public MainThreadWorkerRunnable -{ - RefPtr> mFetchBodyConsumer; - nsresult mStatus; - uint32_t mLength; - uint8_t* mResult; - -public: - ContinueConsumeBodyRunnable(FetchBodyConsumer* aFetchBodyConsumer, - nsresult aStatus, uint32_t aLength, - uint8_t* aResult) - : MainThreadWorkerRunnable(aFetchBodyConsumer->GetWorkerPrivate()) - , mFetchBodyConsumer(aFetchBodyConsumer) - , mStatus(aStatus) - , mLength(aLength) - , mResult(aResult) - { - MOZ_ASSERT(NS_IsMainThread()); - } - - bool - WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override - { - mFetchBodyConsumer->ContinueConsumeBody(mStatus, mLength, mResult); - return true; - } -}; - -template -class FailConsumeBodyWorkerRunnable : public MainThreadWorkerControlRunnable -{ - RefPtr> mBodyConsumer; - -public: - explicit FailConsumeBodyWorkerRunnable(FetchBodyConsumer* aBodyConsumer) - : MainThreadWorkerControlRunnable(aBodyConsumer->GetWorkerPrivate()) - , mBodyConsumer(aBodyConsumer) - { - AssertIsOnMainThread(); - } - - bool - WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override - { - mBodyConsumer->ContinueConsumeBody(NS_ERROR_FAILURE, 0, nullptr); - return true; - } -}; - -/* - * In case of failure to create a stream pump or dispatch stream completion to - * worker, ensure we cleanup properly. Thread agnostic. - */ -template -class MOZ_STACK_CLASS AutoFailConsumeBody final -{ - RefPtr> mBodyConsumer; - -public: - explicit AutoFailConsumeBody(FetchBodyConsumer* aBodyConsumer) - : mBodyConsumer(aBodyConsumer) - {} - - ~AutoFailConsumeBody() - { - AssertIsOnMainThread(); - - if (mBodyConsumer) { - if (mBodyConsumer->GetWorkerPrivate()) { - RefPtr> r = - new FailConsumeBodyWorkerRunnable(mBodyConsumer); - if (!r->Dispatch()) { - MOZ_CRASH("We are going to leak"); - } - } else { - mBodyConsumer->ContinueConsumeBody(NS_ERROR_FAILURE, 0, nullptr); - } - } - } - - void - DontFail() - { - mBodyConsumer = nullptr; - } -}; - -/* - * Called on successfully reading the complete stream for Blob. - */ -template -class ContinueConsumeBlobBodyRunnable final : public MainThreadWorkerRunnable -{ - RefPtr> mFetchBodyConsumer; - RefPtr mBlobImpl; - -public: - ContinueConsumeBlobBodyRunnable(FetchBodyConsumer* aFetchBodyConsumer, - BlobImpl* aBlobImpl) - : MainThreadWorkerRunnable(aFetchBodyConsumer->GetWorkerPrivate()) - , mFetchBodyConsumer(aFetchBodyConsumer) - , mBlobImpl(aBlobImpl) - { - MOZ_ASSERT(NS_IsMainThread()); - MOZ_ASSERT(mBlobImpl); - } - - bool - WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override - { - mFetchBodyConsumer->ContinueConsumeBlobBody(mBlobImpl); - return true; - } -}; - -template -class ConsumeBodyDoneObserver : public nsIStreamLoaderObserver - , public MutableBlobStorageCallback -{ - RefPtr> mFetchBodyConsumer; - -public: - NS_DECL_THREADSAFE_ISUPPORTS - - explicit ConsumeBodyDoneObserver(FetchBodyConsumer* aFetchBodyConsumer) - : mFetchBodyConsumer(aFetchBodyConsumer) - { } - - NS_IMETHOD - OnStreamComplete(nsIStreamLoader* aLoader, - nsISupports* aCtxt, - nsresult aStatus, - uint32_t aResultLength, - const uint8_t* aResult) override - { - MOZ_ASSERT(NS_IsMainThread()); - - // The loading is completed. Let's nullify the pump before continuing the - // consuming of the body. - mFetchBodyConsumer->NullifyConsumeBodyPump(); - - uint8_t* nonconstResult = const_cast(aResult); - if (mFetchBodyConsumer->GetWorkerPrivate()) { - RefPtr> r = - new ContinueConsumeBodyRunnable(mFetchBodyConsumer, - aStatus, - aResultLength, - nonconstResult); - if (!r->Dispatch()) { - NS_WARNING("Could not dispatch ConsumeBodyRunnable"); - // Return failure so that aResult is freed. - return NS_ERROR_FAILURE; - } - } else { - mFetchBodyConsumer->ContinueConsumeBody(aStatus, aResultLength, - nonconstResult); - } - - // FetchBody is responsible for data. - return NS_SUCCESS_ADOPTED_DATA; - } - - virtual void BlobStoreCompleted(MutableBlobStorage* aBlobStorage, - Blob* aBlob, - nsresult aRv) override - { - // On error. - if (NS_FAILED(aRv)) { - OnStreamComplete(nullptr, nullptr, aRv, 0, nullptr); - return; - } - - // The loading is completed. Let's nullify the pump before continuing the - // consuming of the body. - mFetchBodyConsumer->NullifyConsumeBodyPump(); - - MOZ_ASSERT(aBlob); - - if (mFetchBodyConsumer->GetWorkerPrivate()) { - RefPtr> r = - new ContinueConsumeBlobBodyRunnable(mFetchBodyConsumer, - aBlob->Impl()); - - if (!r->Dispatch()) { - NS_WARNING("Could not dispatch ConsumeBlobBodyRunnable"); - return; - } - } else { - mFetchBodyConsumer->ContinueConsumeBlobBody(aBlob->Impl()); - } - } - -private: - virtual ~ConsumeBodyDoneObserver() - { } -}; - -template -NS_IMPL_ADDREF(ConsumeBodyDoneObserver) -template -NS_IMPL_RELEASE(ConsumeBodyDoneObserver) -template -NS_INTERFACE_MAP_BEGIN(ConsumeBodyDoneObserver) - NS_INTERFACE_MAP_ENTRY(nsIStreamLoaderObserver) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStreamLoaderObserver) -NS_INTERFACE_MAP_END - -} // anonymous - -template -/* static */ already_AddRefed -FetchBodyConsumer::Create(nsIGlobalObject* aGlobal, - FetchBody* aBody, - AbortSignal* aSignal, - FetchConsumeType aType, - ErrorResult& aRv) -{ - MOZ_ASSERT(aBody); - - nsCOMPtr bodyStream; - aBody->DerivedClass()->GetBody(getter_AddRefs(bodyStream)); - if (!bodyStream) { - aRv = NS_NewCStringInputStream(getter_AddRefs(bodyStream), EmptyCString()); - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - } - - RefPtr promise = Promise::Create(aGlobal, aRv); - if (aRv.Failed()) { - return nullptr; - } - - WorkerPrivate* workerPrivate = nullptr; - if (!NS_IsMainThread()) { - workerPrivate = GetCurrentThreadWorkerPrivate(); - MOZ_ASSERT(workerPrivate); - } - - RefPtr> consumer = - new FetchBodyConsumer(aGlobal, workerPrivate, aBody, bodyStream, - promise, aType); - - if (!NS_IsMainThread()) { - MOZ_ASSERT(workerPrivate); - if (NS_WARN_IF(!consumer->RegisterWorkerHolder())) { - aRv.Throw(NS_ERROR_FAILURE); - return nullptr; - } - } else { - nsCOMPtr os = mozilla::services::GetObserverService(); - if (NS_WARN_IF(!os)) { - aRv.Throw(NS_ERROR_FAILURE); - return nullptr; - } - - aRv = os->AddObserver(consumer, DOM_WINDOW_DESTROYED_TOPIC, true); - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - - aRv = os->AddObserver(consumer, DOM_WINDOW_FROZEN_TOPIC, true); - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - } - - nsCOMPtr r = new BeginConsumeBodyRunnable(consumer); - - aRv = NS_DispatchToMainThread(r.forget()); - - if (NS_WARN_IF(aRv.Failed())) { - return nullptr; - } - - if (aSignal) { - consumer->Follow(aSignal); - } - - return promise.forget(); -} - -template -void -FetchBodyConsumer::ReleaseObject() -{ - AssertIsOnTargetThread(); - - if (NS_IsMainThread()) { - nsCOMPtr os = mozilla::services::GetObserverService(); - if (os) { - os->RemoveObserver(this, DOM_WINDOW_DESTROYED_TOPIC); - os->RemoveObserver(this, DOM_WINDOW_FROZEN_TOPIC); - } - } - - mGlobal = nullptr; - mWorkerHolder = nullptr; - -#ifdef DEBUG - mBody = nullptr; -#endif - - Unfollow(); -} - -template -FetchBodyConsumer::FetchBodyConsumer(nsIGlobalObject* aGlobalObject, - WorkerPrivate* aWorkerPrivate, - FetchBody* aBody, - nsIInputStream* aBodyStream, - Promise* aPromise, - FetchConsumeType aType) - : mTargetThread(NS_GetCurrentThread()) -#ifdef DEBUG - , mBody(aBody) -#endif - , mBodyStream(aBodyStream) - , mBlobStorageType(MutableBlobStorage::eOnlyInMemory) - , mGlobal(aGlobalObject) - , mWorkerPrivate(aWorkerPrivate) - , mConsumeType(aType) - , mConsumePromise(aPromise) - , mBodyConsumed(false) - , mShuttingDown(false) -{ - MOZ_ASSERT(aBody); - MOZ_ASSERT(aBodyStream); - MOZ_ASSERT(aPromise); - - const mozilla::UniquePtr& principalInfo = - aBody->DerivedClass()->GetPrincipalInfo(); - // We support temporary file for blobs only if the principal is known and - // it's system or content not in private Browsing. - if (principalInfo && - (principalInfo->type() == mozilla::ipc::PrincipalInfo::TSystemPrincipalInfo || - (principalInfo->type() == mozilla::ipc::PrincipalInfo::TContentPrincipalInfo && - principalInfo->get_ContentPrincipalInfo().attrs().mPrivateBrowsingId == 0))) { - mBlobStorageType = MutableBlobStorage::eCouldBeInTemporaryFile; - } - - mBodyMimeType = aBody->MimeType(); -} - -template -FetchBodyConsumer::~FetchBodyConsumer() -{ -} - -template -void -FetchBodyConsumer::AssertIsOnTargetThread() const -{ - MOZ_ASSERT(NS_GetCurrentThread() == mTargetThread); -} - -template -bool -FetchBodyConsumer::RegisterWorkerHolder() -{ - MOZ_ASSERT(mWorkerPrivate); - mWorkerPrivate->AssertIsOnWorkerThread(); - - MOZ_ASSERT(!mWorkerHolder); - mWorkerHolder.reset(new FetchBodyWorkerHolder(this)); - - if (!mWorkerHolder->HoldWorker(mWorkerPrivate, Closing)) { - NS_WARNING("Failed to add workerHolder"); - mWorkerHolder = nullptr; - return false; - } - - return true; -} - -/* - * BeginConsumeBodyMainThread() will automatically reject the consume promise - * and clean up on any failures, so there is no need for callers to do so, - * reflected in a lack of error return code. - */ -template -void -FetchBodyConsumer::BeginConsumeBodyMainThread() -{ - AssertIsOnMainThread(); - - AutoFailConsumeBody autoReject(this); - - if (mShuttingDown) { - // We haven't started yet, but we have been terminated. AutoFailConsumeBody - // will dispatch a runnable to release resources. - return; - } - - nsCOMPtr pump; - nsresult rv = NS_NewInputStreamPump(getter_AddRefs(pump), - mBodyStream, -1, -1, 0, 0, false); - if (NS_WARN_IF(NS_FAILED(rv))) { - return; - } - - RefPtr> p = - new ConsumeBodyDoneObserver(this); - - nsCOMPtr listener; - if (mConsumeType == CONSUME_BLOB) { - listener = new MutableBlobStreamListener(mBlobStorageType, nullptr, - mBodyMimeType, p); - } else { - nsCOMPtr loader; - rv = NS_NewStreamLoader(getter_AddRefs(loader), p); - if (NS_WARN_IF(NS_FAILED(rv))) { - return; - } - - listener = loader; - } - - rv = pump->AsyncRead(listener, nullptr); - if (NS_WARN_IF(NS_FAILED(rv))) { - return; - } - - // Now that everything succeeded, we can assign the pump to a pointer that - // stays alive for the lifetime of the FetchConsumer. - mConsumeBodyPump = pump; - - // It is ok for retargeting to fail and reads to happen on the main thread. - autoReject.DontFail(); - - // Try to retarget, otherwise fall back to main thread. - nsCOMPtr rr = do_QueryInterface(pump); - if (rr) { - nsCOMPtr sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); - rv = rr->RetargetDeliveryTo(sts); - if (NS_WARN_IF(NS_FAILED(rv))) { - NS_WARNING("Retargeting failed"); - } - } -} - -template -void -FetchBodyConsumer::ContinueConsumeBody(nsresult aStatus, - uint32_t aResultLength, - uint8_t* aResult) -{ - AssertIsOnTargetThread(); - - if (mBodyConsumed) { - return; - } - mBodyConsumed = true; - - // Just a precaution to ensure ContinueConsumeBody is not called out of - // sync with a body read. - MOZ_ASSERT(mBody->BodyUsed()); - - auto autoFree = mozilla::MakeScopeExit([&] { - free(aResult); - }); - - MOZ_ASSERT(mConsumePromise); - RefPtr localPromise = mConsumePromise.forget(); - - RefPtr> self = this; - auto autoReleaseObject = mozilla::MakeScopeExit([&] { - self->ReleaseObject(); - }); - - if (NS_WARN_IF(NS_FAILED(aStatus))) { - localPromise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); - } - - // Don't warn here since we warned above. - if (NS_FAILED(aStatus)) { - return; - } - - // Finish successfully consuming body according to type. - MOZ_ASSERT(aResult); - - AutoJSAPI jsapi; - if (!jsapi.Init(mGlobal)) { - localPromise->MaybeReject(NS_ERROR_UNEXPECTED); - return; - } - - JSContext* cx = jsapi.cx(); - ErrorResult error; - - switch (mConsumeType) { - case CONSUME_ARRAYBUFFER: { - JS::Rooted arrayBuffer(cx); - BodyUtil::ConsumeArrayBuffer(cx, &arrayBuffer, aResultLength, aResult, - error); - - if (!error.Failed()) { - JS::Rooted val(cx); - val.setObjectOrNull(arrayBuffer); - - localPromise->MaybeResolve(cx, val); - // ArrayBuffer takes over ownership. - aResult = nullptr; - } - break; - } - case CONSUME_BLOB: { - MOZ_CRASH("This should not happen."); - break; - } - case CONSUME_FORMDATA: { - nsCString data; - data.Adopt(reinterpret_cast(aResult), aResultLength); - aResult = nullptr; - - RefPtr fd = - BodyUtil::ConsumeFormData(mGlobal, mBodyMimeType, data, error); - if (!error.Failed()) { - localPromise->MaybeResolve(fd); - } - break; - } - case CONSUME_TEXT: - // fall through handles early exit. - case CONSUME_JSON: { - nsString decoded; - if (NS_SUCCEEDED(BodyUtil::ConsumeText(aResultLength, aResult, decoded))) { - if (mConsumeType == CONSUME_TEXT) { - localPromise->MaybeResolve(decoded); - } else { - JS::Rooted json(cx); - BodyUtil::ConsumeJson(cx, &json, decoded, error); - if (!error.Failed()) { - localPromise->MaybeResolve(cx, json); - } - } - }; - break; - } - default: - NS_NOTREACHED("Unexpected consume body type"); - } - - error.WouldReportJSException(); - if (error.Failed()) { - localPromise->MaybeReject(error); - } -} - -template -void -FetchBodyConsumer::ContinueConsumeBlobBody(BlobImpl* aBlobImpl) -{ - AssertIsOnTargetThread(); - MOZ_ASSERT(mConsumeType == CONSUME_BLOB); - - if (mBodyConsumed) { - return; - } - mBodyConsumed = true; - - // Just a precaution to ensure ContinueConsumeBody is not called out of - // sync with a body read. - MOZ_ASSERT(mBody->BodyUsed()); - - MOZ_ASSERT(mConsumePromise); - RefPtr localPromise = mConsumePromise.forget(); - - RefPtr blob = dom::Blob::Create(mGlobal, aBlobImpl); - MOZ_ASSERT(blob); - - localPromise->MaybeResolve(blob); - - ReleaseObject(); -} - -template -void -FetchBodyConsumer::ShutDownMainThreadConsuming() -{ - if (!NS_IsMainThread()) { - RefPtr> self = this; - - nsCOMPtr r = NS_NewRunnableFunction( - [self] () { self->ShutDownMainThreadConsuming(); }); - - MOZ_ALWAYS_SUCCEEDS(NS_DispatchToMainThread(r.forget())); - return; - } - - // We need this because maybe, mConsumeBodyPump has not been created yet. We - // must be sure that we don't try to do it. - mShuttingDown = true; - - if (mConsumeBodyPump) { - mConsumeBodyPump->Cancel(NS_BINDING_ABORTED); - mConsumeBodyPump = nullptr; - } -} - -template -NS_IMETHODIMP -FetchBodyConsumer::Observe(nsISupports* aSubject, - const char* aTopic, - const char16_t* aData) -{ - AssertIsOnMainThread(); - - MOZ_ASSERT((strcmp(aTopic, DOM_WINDOW_FROZEN_TOPIC) == 0) || - (strcmp(aTopic, DOM_WINDOW_DESTROYED_TOPIC) == 0)); - - nsCOMPtr window = do_QueryInterface(mGlobal); - if (SameCOMIdentity(aSubject, window)) { - ContinueConsumeBody(NS_BINDING_ABORTED, 0, nullptr); - } - - return NS_OK; -} - -template -void -FetchBodyConsumer::Aborted() -{ - AssertIsOnTargetThread(); - ContinueConsumeBody(NS_ERROR_DOM_ABORT_ERR, 0, nullptr); -} - -template -NS_IMPL_ADDREF(FetchBodyConsumer) - -template -NS_IMPL_RELEASE(FetchBodyConsumer) - -template -NS_IMPL_QUERY_INTERFACE(FetchBodyConsumer, - nsIObserver, - nsISupportsWeakReference) - -} // namespace dom -} // namespace mozilla +/* -*- 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 "Fetch.h" +#include "FetchConsumer.h" + +#include "nsIInputStreamPump.h" +#include "nsProxyRelease.h" +#include "WorkerPrivate.h" +#include "WorkerRunnable.h" +#include "WorkerScope.h" +#include "Workers.h" + +namespace mozilla { +namespace dom { + +using namespace workers; + +namespace { + +template +class FetchBodyWorkerHolder final : public workers::WorkerHolder +{ + RefPtr> mConsumer; + bool mWasNotified; + +public: + explicit FetchBodyWorkerHolder(FetchBodyConsumer* aConsumer) + : mConsumer(aConsumer) + , mWasNotified(false) + { + MOZ_ASSERT(aConsumer); + } + + ~FetchBodyWorkerHolder() = default; + + bool Notify(workers::Status aStatus) override + { + MOZ_ASSERT(aStatus > workers::Running); + if (!mWasNotified) { + mWasNotified = true; + mConsumer->ShutDownMainThreadConsuming(); + } + + return true; + } +}; + +template +class BeginConsumeBodyRunnable final : public Runnable +{ + RefPtr> mFetchBodyConsumer; + +public: + explicit BeginConsumeBodyRunnable(FetchBodyConsumer* aConsumer) + : mFetchBodyConsumer(aConsumer) + { } + + NS_IMETHOD + Run() override + { + mFetchBodyConsumer->BeginConsumeBodyMainThread(); + return NS_OK; + } +}; + +/* + * Called on successfully reading the complete stream. + */ +template +class ContinueConsumeBodyRunnable final : public MainThreadWorkerRunnable +{ + RefPtr> mFetchBodyConsumer; + nsresult mStatus; + uint32_t mLength; + uint8_t* mResult; + +public: + ContinueConsumeBodyRunnable(FetchBodyConsumer* aFetchBodyConsumer, + nsresult aStatus, uint32_t aLength, + uint8_t* aResult) + : MainThreadWorkerRunnable(aFetchBodyConsumer->GetWorkerPrivate()) + , mFetchBodyConsumer(aFetchBodyConsumer) + , mStatus(aStatus) + , mLength(aLength) + , mResult(aResult) + { + MOZ_ASSERT(NS_IsMainThread()); + } + + bool + WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override + { + mFetchBodyConsumer->ContinueConsumeBody(mStatus, mLength, mResult); + return true; + } +}; + +template +class FailConsumeBodyWorkerRunnable : public MainThreadWorkerControlRunnable +{ + RefPtr> mBodyConsumer; + +public: + explicit FailConsumeBodyWorkerRunnable(FetchBodyConsumer* aBodyConsumer) + : MainThreadWorkerControlRunnable(aBodyConsumer->GetWorkerPrivate()) + , mBodyConsumer(aBodyConsumer) + { + AssertIsOnMainThread(); + } + + bool + WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override + { + mBodyConsumer->ContinueConsumeBody(NS_ERROR_FAILURE, 0, nullptr); + return true; + } +}; + +/* + * In case of failure to create a stream pump or dispatch stream completion to + * worker, ensure we cleanup properly. Thread agnostic. + */ +template +class MOZ_STACK_CLASS AutoFailConsumeBody final +{ + RefPtr> mBodyConsumer; + +public: + explicit AutoFailConsumeBody(FetchBodyConsumer* aBodyConsumer) + : mBodyConsumer(aBodyConsumer) + {} + + ~AutoFailConsumeBody() + { + AssertIsOnMainThread(); + + if (mBodyConsumer) { + if (mBodyConsumer->GetWorkerPrivate()) { + RefPtr> r = + new FailConsumeBodyWorkerRunnable(mBodyConsumer); + if (!r->Dispatch()) { + MOZ_CRASH("We are going to leak"); + } + } else { + mBodyConsumer->ContinueConsumeBody(NS_ERROR_FAILURE, 0, nullptr); + } + } + } + + void + DontFail() + { + mBodyConsumer = nullptr; + } +}; + +/* + * Called on successfully reading the complete stream for Blob. + */ +template +class ContinueConsumeBlobBodyRunnable final : public MainThreadWorkerRunnable +{ + RefPtr> mFetchBodyConsumer; + RefPtr mBlobImpl; + +public: + ContinueConsumeBlobBodyRunnable(FetchBodyConsumer* aFetchBodyConsumer, + BlobImpl* aBlobImpl) + : MainThreadWorkerRunnable(aFetchBodyConsumer->GetWorkerPrivate()) + , mFetchBodyConsumer(aFetchBodyConsumer) + , mBlobImpl(aBlobImpl) + { + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(mBlobImpl); + } + + bool + WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override + { + mFetchBodyConsumer->ContinueConsumeBlobBody(mBlobImpl); + return true; + } +}; + +template +class ConsumeBodyDoneObserver : public nsIStreamLoaderObserver + , public MutableBlobStorageCallback +{ + RefPtr> mFetchBodyConsumer; + +public: + NS_DECL_THREADSAFE_ISUPPORTS + + explicit ConsumeBodyDoneObserver(FetchBodyConsumer* aFetchBodyConsumer) + : mFetchBodyConsumer(aFetchBodyConsumer) + { } + + NS_IMETHOD + OnStreamComplete(nsIStreamLoader* aLoader, + nsISupports* aCtxt, + nsresult aStatus, + uint32_t aResultLength, + const uint8_t* aResult) override + { + MOZ_ASSERT(NS_IsMainThread()); + + // The loading is completed. Let's nullify the pump before continuing the + // consuming of the body. + mFetchBodyConsumer->NullifyConsumeBodyPump(); + + uint8_t* nonconstResult = const_cast(aResult); + if (mFetchBodyConsumer->GetWorkerPrivate()) { + RefPtr> r = + new ContinueConsumeBodyRunnable(mFetchBodyConsumer, + aStatus, + aResultLength, + nonconstResult); + if (!r->Dispatch()) { + NS_WARNING("Could not dispatch ConsumeBodyRunnable"); + // Return failure so that aResult is freed. + return NS_ERROR_FAILURE; + } + } else { + mFetchBodyConsumer->ContinueConsumeBody(aStatus, aResultLength, + nonconstResult); + } + + // FetchBody is responsible for data. + return NS_SUCCESS_ADOPTED_DATA; + } + + virtual void BlobStoreCompleted(MutableBlobStorage* aBlobStorage, + Blob* aBlob, + nsresult aRv) override + { + // On error. + if (NS_FAILED(aRv)) { + OnStreamComplete(nullptr, nullptr, aRv, 0, nullptr); + return; + } + + // The loading is completed. Let's nullify the pump before continuing the + // consuming of the body. + mFetchBodyConsumer->NullifyConsumeBodyPump(); + + MOZ_ASSERT(aBlob); + + if (mFetchBodyConsumer->GetWorkerPrivate()) { + RefPtr> r = + new ContinueConsumeBlobBodyRunnable(mFetchBodyConsumer, + aBlob->Impl()); + + if (!r->Dispatch()) { + NS_WARNING("Could not dispatch ConsumeBlobBodyRunnable"); + return; + } + } else { + mFetchBodyConsumer->ContinueConsumeBlobBody(aBlob->Impl()); + } + } + +private: + virtual ~ConsumeBodyDoneObserver() + { } +}; + +template +NS_IMPL_ADDREF(ConsumeBodyDoneObserver) +template +NS_IMPL_RELEASE(ConsumeBodyDoneObserver) +template +NS_INTERFACE_MAP_BEGIN(ConsumeBodyDoneObserver) + NS_INTERFACE_MAP_ENTRY(nsIStreamLoaderObserver) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStreamLoaderObserver) +NS_INTERFACE_MAP_END + +} // anonymous + +template +/* static */ already_AddRefed +FetchBodyConsumer::Create(nsIGlobalObject* aGlobal, + FetchBody* aBody, + AbortSignal* aSignal, + FetchConsumeType aType, + ErrorResult& aRv) +{ + MOZ_ASSERT(aBody); + + nsCOMPtr bodyStream; + aBody->DerivedClass()->GetBody(getter_AddRefs(bodyStream)); + if (!bodyStream) { + aRv = NS_NewCStringInputStream(getter_AddRefs(bodyStream), EmptyCString()); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + } + + RefPtr promise = Promise::Create(aGlobal, aRv); + if (aRv.Failed()) { + return nullptr; + } + + WorkerPrivate* workerPrivate = nullptr; + if (!NS_IsMainThread()) { + workerPrivate = GetCurrentThreadWorkerPrivate(); + MOZ_ASSERT(workerPrivate); + } + + RefPtr> consumer = + new FetchBodyConsumer(aGlobal, workerPrivate, aBody, bodyStream, + promise, aType); + + if (!NS_IsMainThread()) { + MOZ_ASSERT(workerPrivate); + if (NS_WARN_IF(!consumer->RegisterWorkerHolder())) { + aRv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + } else { + nsCOMPtr os = mozilla::services::GetObserverService(); + if (NS_WARN_IF(!os)) { + aRv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + + aRv = os->AddObserver(consumer, DOM_WINDOW_DESTROYED_TOPIC, true); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + + aRv = os->AddObserver(consumer, DOM_WINDOW_FROZEN_TOPIC, true); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + } + + nsCOMPtr r = new BeginConsumeBodyRunnable(consumer); + + aRv = NS_DispatchToMainThread(r.forget()); + + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + + if (aSignal) { + consumer->Follow(aSignal); + } + + return promise.forget(); +} + +template +void +FetchBodyConsumer::ReleaseObject() +{ + AssertIsOnTargetThread(); + + if (NS_IsMainThread()) { + nsCOMPtr os = mozilla::services::GetObserverService(); + if (os) { + os->RemoveObserver(this, DOM_WINDOW_DESTROYED_TOPIC); + os->RemoveObserver(this, DOM_WINDOW_FROZEN_TOPIC); + } + } + + mGlobal = nullptr; + mWorkerHolder = nullptr; + +#ifdef DEBUG + mBody = nullptr; +#endif + + Unfollow(); +} + +template +FetchBodyConsumer::FetchBodyConsumer(nsIGlobalObject* aGlobalObject, + WorkerPrivate* aWorkerPrivate, + FetchBody* aBody, + nsIInputStream* aBodyStream, + Promise* aPromise, + FetchConsumeType aType) + : mTargetThread(NS_GetCurrentThread()) +#ifdef DEBUG + , mBody(aBody) +#endif + , mBodyStream(aBodyStream) + , mBlobStorageType(MutableBlobStorage::eOnlyInMemory) + , mGlobal(aGlobalObject) + , mWorkerPrivate(aWorkerPrivate) + , mConsumeType(aType) + , mConsumePromise(aPromise) + , mBodyConsumed(false) + , mShuttingDown(false) +{ + MOZ_ASSERT(aBody); + MOZ_ASSERT(aBodyStream); + MOZ_ASSERT(aPromise); + + const mozilla::UniquePtr& principalInfo = + aBody->DerivedClass()->GetPrincipalInfo(); + // We support temporary file for blobs only if the principal is known and + // it's system or content not in private Browsing. + if (principalInfo && + (principalInfo->type() == mozilla::ipc::PrincipalInfo::TSystemPrincipalInfo || + (principalInfo->type() == mozilla::ipc::PrincipalInfo::TContentPrincipalInfo && + principalInfo->get_ContentPrincipalInfo().attrs().mPrivateBrowsingId == 0))) { + mBlobStorageType = MutableBlobStorage::eCouldBeInTemporaryFile; + } + + mBodyMimeType = aBody->MimeType(); +} + +template +FetchBodyConsumer::~FetchBodyConsumer() +{ +} + +template +void +FetchBodyConsumer::AssertIsOnTargetThread() const +{ + MOZ_ASSERT(NS_GetCurrentThread() == mTargetThread); +} + +template +bool +FetchBodyConsumer::RegisterWorkerHolder() +{ + MOZ_ASSERT(mWorkerPrivate); + mWorkerPrivate->AssertIsOnWorkerThread(); + + MOZ_ASSERT(!mWorkerHolder); + mWorkerHolder.reset(new FetchBodyWorkerHolder(this)); + + if (!mWorkerHolder->HoldWorker(mWorkerPrivate, Closing)) { + NS_WARNING("Failed to add workerHolder"); + mWorkerHolder = nullptr; + return false; + } + + return true; +} + +/* + * BeginConsumeBodyMainThread() will automatically reject the consume promise + * and clean up on any failures, so there is no need for callers to do so, + * reflected in a lack of error return code. + */ +template +void +FetchBodyConsumer::BeginConsumeBodyMainThread() +{ + AssertIsOnMainThread(); + + AutoFailConsumeBody autoReject(this); + + if (mShuttingDown) { + // We haven't started yet, but we have been terminated. AutoFailConsumeBody + // will dispatch a runnable to release resources. + return; + } + + nsCOMPtr pump; + nsresult rv = NS_NewInputStreamPump(getter_AddRefs(pump), + mBodyStream, -1, -1, 0, 0, false); + if (NS_WARN_IF(NS_FAILED(rv))) { + return; + } + + RefPtr> p = + new ConsumeBodyDoneObserver(this); + + nsCOMPtr listener; + if (mConsumeType == CONSUME_BLOB) { + listener = new MutableBlobStreamListener(mBlobStorageType, nullptr, + mBodyMimeType, p); + } else { + nsCOMPtr loader; + rv = NS_NewStreamLoader(getter_AddRefs(loader), p); + if (NS_WARN_IF(NS_FAILED(rv))) { + return; + } + + listener = loader; + } + + rv = pump->AsyncRead(listener, nullptr); + if (NS_WARN_IF(NS_FAILED(rv))) { + return; + } + + // Now that everything succeeded, we can assign the pump to a pointer that + // stays alive for the lifetime of the FetchConsumer. + mConsumeBodyPump = pump; + + // It is ok for retargeting to fail and reads to happen on the main thread. + autoReject.DontFail(); + + // Try to retarget, otherwise fall back to main thread. + nsCOMPtr rr = do_QueryInterface(pump); + if (rr) { + nsCOMPtr sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); + rv = rr->RetargetDeliveryTo(sts); + if (NS_WARN_IF(NS_FAILED(rv))) { + NS_WARNING("Retargeting failed"); + } + } +} + +template +void +FetchBodyConsumer::ContinueConsumeBody(nsresult aStatus, + uint32_t aResultLength, + uint8_t* aResult) +{ + AssertIsOnTargetThread(); + + if (mBodyConsumed) { + return; + } + mBodyConsumed = true; + + // Just a precaution to ensure ContinueConsumeBody is not called out of + // sync with a body read. + MOZ_ASSERT(mBody->BodyUsed()); + + auto autoFree = mozilla::MakeScopeExit([&] { + free(aResult); + }); + + MOZ_ASSERT(mConsumePromise); + RefPtr localPromise = mConsumePromise.forget(); + + RefPtr> self = this; + auto autoReleaseObject = mozilla::MakeScopeExit([&] { + self->ReleaseObject(); + }); + + if (NS_WARN_IF(NS_FAILED(aStatus))) { + localPromise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); + } + + // Don't warn here since we warned above. + if (NS_FAILED(aStatus)) { + return; + } + + // Finish successfully consuming body according to type. + MOZ_ASSERT(aResult); + + AutoJSAPI jsapi; + if (!jsapi.Init(mGlobal)) { + localPromise->MaybeReject(NS_ERROR_UNEXPECTED); + return; + } + + JSContext* cx = jsapi.cx(); + ErrorResult error; + + switch (mConsumeType) { + case CONSUME_ARRAYBUFFER: { + JS::Rooted arrayBuffer(cx); + BodyUtil::ConsumeArrayBuffer(cx, &arrayBuffer, aResultLength, aResult, + error); + + if (!error.Failed()) { + JS::Rooted val(cx); + val.setObjectOrNull(arrayBuffer); + + localPromise->MaybeResolve(cx, val); + // ArrayBuffer takes over ownership. + aResult = nullptr; + } + break; + } + case CONSUME_BLOB: { + MOZ_CRASH("This should not happen."); + break; + } + case CONSUME_FORMDATA: { + nsCString data; + data.Adopt(reinterpret_cast(aResult), aResultLength); + aResult = nullptr; + + RefPtr fd = + BodyUtil::ConsumeFormData(mGlobal, mBodyMimeType, data, error); + if (!error.Failed()) { + localPromise->MaybeResolve(fd); + } + break; + } + case CONSUME_TEXT: + // fall through handles early exit. + case CONSUME_JSON: { + nsString decoded; + if (NS_SUCCEEDED(BodyUtil::ConsumeText(aResultLength, aResult, decoded))) { + if (mConsumeType == CONSUME_TEXT) { + localPromise->MaybeResolve(decoded); + } else { + JS::Rooted json(cx); + BodyUtil::ConsumeJson(cx, &json, decoded, error); + if (!error.Failed()) { + localPromise->MaybeResolve(cx, json); + } + } + }; + break; + } + default: + NS_NOTREACHED("Unexpected consume body type"); + } + + error.WouldReportJSException(); + if (error.Failed()) { + localPromise->MaybeReject(error); + } +} + +template +void +FetchBodyConsumer::ContinueConsumeBlobBody(BlobImpl* aBlobImpl) +{ + AssertIsOnTargetThread(); + MOZ_ASSERT(mConsumeType == CONSUME_BLOB); + + if (mBodyConsumed) { + return; + } + mBodyConsumed = true; + + // Just a precaution to ensure ContinueConsumeBody is not called out of + // sync with a body read. + MOZ_ASSERT(mBody->BodyUsed()); + + MOZ_ASSERT(mConsumePromise); + RefPtr localPromise = mConsumePromise.forget(); + + RefPtr blob = dom::Blob::Create(mGlobal, aBlobImpl); + MOZ_ASSERT(blob); + + localPromise->MaybeResolve(blob); + + ReleaseObject(); +} + +template +void +FetchBodyConsumer::ShutDownMainThreadConsuming() +{ + if (!NS_IsMainThread()) { + RefPtr> self = this; + + nsCOMPtr r = NS_NewRunnableFunction( + [self] () { self->ShutDownMainThreadConsuming(); }); + + MOZ_ALWAYS_SUCCEEDS(NS_DispatchToMainThread(r.forget())); + return; + } + + // We need this because maybe, mConsumeBodyPump has not been created yet. We + // must be sure that we don't try to do it. + mShuttingDown = true; + + if (mConsumeBodyPump) { + mConsumeBodyPump->Cancel(NS_BINDING_ABORTED); + mConsumeBodyPump = nullptr; + } +} + +template +NS_IMETHODIMP +FetchBodyConsumer::Observe(nsISupports* aSubject, + const char* aTopic, + const char16_t* aData) +{ + AssertIsOnMainThread(); + + MOZ_ASSERT((strcmp(aTopic, DOM_WINDOW_FROZEN_TOPIC) == 0) || + (strcmp(aTopic, DOM_WINDOW_DESTROYED_TOPIC) == 0)); + + nsCOMPtr window = do_QueryInterface(mGlobal); + if (SameCOMIdentity(aSubject, window)) { + ContinueConsumeBody(NS_BINDING_ABORTED, 0, nullptr); + } + + return NS_OK; +} + +template +void +FetchBodyConsumer::Aborted() +{ + AssertIsOnTargetThread(); + ContinueConsumeBody(NS_ERROR_DOM_ABORT_ERR, 0, nullptr); +} + +template +NS_IMPL_ADDREF(FetchBodyConsumer) + +template +NS_IMPL_RELEASE(FetchBodyConsumer) + +template +NS_IMPL_QUERY_INTERFACE(FetchBodyConsumer, + nsIObserver, + nsISupportsWeakReference) + +} // namespace dom +} // namespace mozilla From 8d9b34816c41fbc6ebd24ecb6579c34437f5a55c Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Mon, 27 Jul 2020 19:17:14 -0400 Subject: [PATCH 04/18] [MailNews] Allow ordering of accounts to respect mail.accountmanager.accounts --- mailnews/base/util/folderUtils.jsm | 9 ++++++++- mailnews/mailnews.js | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/mailnews/base/util/folderUtils.jsm b/mailnews/base/util/folderUtils.jsm index 62fb7700b4..9d2918a7a9 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,14 @@ 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", true)) { + accountList = accountList.sort(compareAccounts); + } - return accountList.sort(compareAccounts); + + return accountList; } /** diff --git a/mailnews/mailnews.js b/mailnews/mailnews.js index 7ebe2eaa7f..7aa83c6257 100644 --- a/mailnews/mailnews.js +++ b/mailnews/mailnews.js @@ -431,6 +431,7 @@ pref("mail.default_sendlater_uri", "mailbox://nobody@Local%20Folders/Unsent%20Me pref("mail.smtpservers", ""); pref("mail.accountmanager.accounts", ""); +pref("mail.accountmanager.accounts.ordered", true); // Last used account key value pref("mail.account.lastKey", 0); From b72d30186a8152ec0b414399a1b03d79264eba3c Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Mon, 27 Jul 2020 19:18:35 -0400 Subject: [PATCH 05/18] [MailNews] Allow setting "Local Folders" as always the first displayed account --- mailnews/base/util/folderUtils.jsm | 4 ++++ mailnews/mailnews.js | 1 + 2 files changed, 5 insertions(+) diff --git a/mailnews/base/util/folderUtils.jsm b/mailnews/base/util/folderUtils.jsm index 9d2918a7a9..06e8e4bf2b 100644 --- a/mailnews/base/util/folderUtils.jsm +++ b/mailnews/base/util/folderUtils.jsm @@ -176,6 +176,10 @@ function allAccountsSorted(aExcludeIMAccounts) { 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; } diff --git a/mailnews/mailnews.js b/mailnews/mailnews.js index 7aa83c6257..afb5ac7f20 100644 --- a/mailnews/mailnews.js +++ b/mailnews/mailnews.js @@ -432,6 +432,7 @@ pref("mail.default_sendlater_uri", "mailbox://nobody@Local%20Folders/Unsent%20Me pref("mail.smtpservers", ""); pref("mail.accountmanager.accounts", ""); pref("mail.accountmanager.accounts.ordered", true); +pref("mail.accountmanager.localfolderfirst", false); // Last used account key value pref("mail.account.lastKey", 0); From d97bcfb97abb35883494c01cf5b85d5fadd77780 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Mon, 27 Jul 2020 20:36:11 -0400 Subject: [PATCH 06/18] Follow up to 39be34c06 - The check sound be if not ordered FINE! I'll go to bed already... --- mailnews/base/util/folderUtils.jsm | 2 +- mailnews/mailnews.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mailnews/base/util/folderUtils.jsm b/mailnews/base/util/folderUtils.jsm index 06e8e4bf2b..f549bf6551 100644 --- a/mailnews/base/util/folderUtils.jsm +++ b/mailnews/base/util/folderUtils.jsm @@ -172,7 +172,7 @@ function allAccountsSorted(aExcludeIMAccounts) { } // Sort the accounts else will respect the order in mail.accountmanager.accounts - if (Services.prefs.getBoolPref("mail.accountmanager.accounts.ordered", true)) { + if (!Services.prefs.getBoolPref("mail.accountmanager.accounts.ordered", false)) { accountList = accountList.sort(compareAccounts); } diff --git a/mailnews/mailnews.js b/mailnews/mailnews.js index afb5ac7f20..49ac33827e 100644 --- a/mailnews/mailnews.js +++ b/mailnews/mailnews.js @@ -431,7 +431,7 @@ pref("mail.default_sendlater_uri", "mailbox://nobody@Local%20Folders/Unsent%20Me pref("mail.smtpservers", ""); pref("mail.accountmanager.accounts", ""); -pref("mail.accountmanager.accounts.ordered", true); +pref("mail.accountmanager.accounts.ordered", false); pref("mail.accountmanager.localfolderfirst", false); // Last used account key value From b33e80b18637d5b112b1ad70d8c3ca1f3b88cce0 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Tue, 28 Jul 2020 15:46:41 +0000 Subject: [PATCH 07/18] Issue #1391 - Remove the DOM battery API --- dom/base/Navigator.cpp | 43 -- dom/base/Navigator.h | 7 - dom/base/moz.build | 1 - dom/battery/BatteryManager.cpp | 212 -------- dom/battery/BatteryManager.h | 84 --- dom/battery/Constants.h | 27 - dom/battery/Types.h | 23 - dom/battery/moz.build | 21 - dom/battery/test/chrome.ini | 3 - dom/battery/test/mochitest.ini | 1 - dom/battery/test/test_battery_basics.html | 39 -- dom/battery/test/test_battery_charging.html | 35 -- .../test/test_battery_discharging.html | 35 -- .../test/test_battery_unprivileged.html | 24 - dom/bindings/moz.build | 1 - dom/moz.build | 1 - dom/quota/QuotaManagerService.cpp | 24 - dom/webidl/BatteryManager.webidl | 23 - dom/webidl/Navigator.webidl | 8 - dom/webidl/moz.build | 1 - hal/Hal.cpp | 53 -- hal/Hal.h | 24 - hal/cocoa/CocoaBattery.cpp | 325 ----------- hal/fallback/FallbackBattery.cpp | 30 -- hal/linux/UPowerClient.cpp | 508 ------------------ hal/moz.build | 22 - hal/sandbox/PHal.ipdl | 12 - hal/sandbox/SandboxHal.cpp | 51 -- hal/windows/WindowsBattery.cpp | 190 ------- modules/libpref/init/all.js | 5 - 30 files changed, 1833 deletions(-) delete mode 100644 dom/battery/BatteryManager.cpp delete mode 100644 dom/battery/BatteryManager.h delete mode 100644 dom/battery/Constants.h delete mode 100644 dom/battery/Types.h delete mode 100644 dom/battery/moz.build delete mode 100644 dom/battery/test/chrome.ini delete mode 100644 dom/battery/test/mochitest.ini delete mode 100644 dom/battery/test/test_battery_basics.html delete mode 100644 dom/battery/test/test_battery_charging.html delete mode 100644 dom/battery/test/test_battery_discharging.html delete mode 100644 dom/battery/test/test_battery_unprivileged.html delete mode 100644 dom/webidl/BatteryManager.webidl delete mode 100644 hal/cocoa/CocoaBattery.cpp delete mode 100644 hal/fallback/FallbackBattery.cpp delete mode 100644 hal/linux/UPowerClient.cpp delete mode 100644 hal/windows/WindowsBattery.cpp diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp index a544f23c10..53ce2b30fb 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 go = do_QueryInterface(mWindow); - RefPtr 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 4ddaaabab4..bcc67589e9 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 mPermissions; RefPtr mGeolocation; RefPtr mNotification; - RefPtr mBatteryManager; - RefPtr mBatteryPromise; RefPtr mPowerManager; RefPtr mConnection; #ifdef MOZ_AUDIO_CHANNEL_MANAGER diff --git a/dom/base/moz.build b/dom/base/moz.build index ded203c505..fe65453fe9 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/battery/BatteryManager.cpp b/dom/battery/BatteryManager.cpp deleted file mode 100644 index 271fa373d6..0000000000 --- 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 -#include -#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 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::infinity(); - } - if (Preferences::GetBool("dom.battery.test.discharging", false)) { - return 42.0; - } - - if (Charging() || mRemainingTime == kUnknownRemainingTime) { - return std::numeric_limits::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::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 4094c40d47..0000000000 --- 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 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 f642e2a46c..0000000000 --- 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 ee55a26d3f..0000000000 --- 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 Observer; - -typedef Observer 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 e3743c40b4..0000000000 --- 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 ced199bffe..0000000000 --- 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 4d8307930e..0000000000 --- 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 96f7f33685..0000000000 --- a/dom/battery/test/test_battery_basics.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - Test for Battery API - - - - -

- -
-
-
- - diff --git a/dom/battery/test/test_battery_charging.html b/dom/battery/test/test_battery_charging.html deleted file mode 100644 index 5d1e832848..0000000000 --- a/dom/battery/test/test_battery_charging.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - Test for Battery API - - - - -

- -
-
-
- - diff --git a/dom/battery/test/test_battery_discharging.html b/dom/battery/test/test_battery_discharging.html deleted file mode 100644 index 26a0359d3b..0000000000 --- a/dom/battery/test/test_battery_discharging.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - Test for Battery API - - - - -

- -
-
-
- - diff --git a/dom/battery/test/test_battery_unprivileged.html b/dom/battery/test/test_battery_unprivileged.html deleted file mode 100644 index e56db8ac7f..0000000000 --- a/dom/battery/test/test_battery_unprivileged.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - Test for Battery API - - - - -

- -
-
-
- - diff --git a/dom/bindings/moz.build b/dom/bindings/moz.build index fae0fd15a9..14abc6d882 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/moz.build b/dom/moz.build index 7888ccd69f..e232f34438 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 bd811dc9b3..22b5d17b16 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 a964f3b0b0..0000000000 --- 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 4536d7d25f..f34429de75 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 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/moz.build b/dom/webidl/moz.build index 4d0ba78349..15c8fb4429 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/hal/Hal.cpp b/hal/Hal.cpp index 67930c3558..981f491251 100644 --- a/hal/Hal.cpp +++ b/hal/Hal.cpp @@ -264,30 +264,6 @@ private: bool mHasValidCache; }; -class BatteryObserversManager : public CachingObserversManager -{ -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 { 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 5411b387aa..53c9e68bbf 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" @@ -87,29 +86,6 @@ void Vibrate(const nsTArray& pattern, 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. */ diff --git a/hal/cocoa/CocoaBattery.cpp b/hal/cocoa/CocoaBattery.cpp deleted file mode 100644 index 6f1b7b1dca..0000000000 --- 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 -#import -#import - -#include -#include -#include - -#include -#include - -#include - -#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 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(aContext); - - CFTypeRef data = ::IOPSCopyPowerSourcesInfo(); - if (!data) { - ::CFRelease(data); - return; - } - - // Get the list of power sources. - CFArrayRef list = ::IOPSCopyPowerSourcesList(data); - if (!list) { - ::CFRelease(list); - return; - } - - // Default values. These will be used if there are 0 sources or we can't find - // better information. - double level = kDefaultLevel; - double charging = kDefaultCharging; - double remainingTime = kDefaultRemainingTime; - - // Look for the first battery power source to give us the information we need. - // Usually there's only 1 available, depending on current power source. - for (CFIndex i = 0; i < ::CFArrayGetCount(list); ++i) { - CFTypeRef source = ::CFArrayGetValueAtIndex(list, i); - CFDictionaryRef currPowerSourceDesc = ::IOPSGetPowerSourceDescription(data, source); - if (!currPowerSourceDesc) { - continue; - } - - // Get a battery level estimate. This key is required. - int currentCapacity = 0; - const void* cfRef = ::CFDictionaryGetValue(currPowerSourceDesc, CFSTR(kIOPSCurrentCapacityKey)); - ::CFNumberGetValue((CFNumberRef)cfRef, kCFNumberSInt32Type, ¤tCapacity); - - // This key is also required. - int maxCapacity = 0; - cfRef = ::CFDictionaryGetValue(currPowerSourceDesc, CFSTR(kIOPSMaxCapacityKey)); - ::CFNumberGetValue((CFNumberRef)cfRef, kCFNumberSInt32Type, &maxCapacity); - - if (maxCapacity > 0) { - level = static_cast(currentCapacity)/static_cast(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 3e5e71574a..0000000000 --- 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 9f6e04379e..0000000000 --- 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 -#include -#include -#include -#include "nsAutoRef.h" -#include - -/* - * Helper that manages the destruction of glib objects as soon as they leave - * the current scope. - * - * We are specializing nsAutoRef class. - */ - -template <> -class nsAutoRefTraits : public nsPointerRefTraits -{ -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; ilen; ++i) { - gchar* devicePath = static_cast(g_ptr_array_index(devices, i)); - - DBusGProxy* proxy = dbus_g_proxy_new_from_proxy(mUPowerProxy, - "org.freedesktop.DBus.Properties", - devicePath); - - nsAutoRef hashTable(GetDevicePropertiesSync(proxy)); - - if (g_value_get_uint(static_cast(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(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(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(g_hash_table_lookup(aHashTable, "Percentage"))))*0.01; - } - - if (isFull) { - mRemainingTime = 0; - } else { - mRemainingTime = mCharging ? g_value_get_int64(static_cast(g_hash_table_lookup(aHashTable, "TimeToFull"))) - : g_value_get_int64(static_cast(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 a1acfa320d..d817e4a017 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 1af550aff4..8701e1219f 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 aeaeb724ed..579f3b472b 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" @@ -69,24 +68,6 @@ CancelVibrate(const WindowIdentifier &id) Hal()->SendCancelVibrate(newID.AsArray(), TabChild::GetFrom(newID.GetWindow())); } -void -EnableBatteryNotifications() -{ - Hal()->SendEnableBatteryNotifications(); -} - -void -DisableBatteryNotifications() -{ - Hal()->SendDisableBatteryNotifications(); -} - -void -GetCurrentBatteryInformation(BatteryInformation* aBatteryInfo) -{ - Hal()->SendGetCurrentBatteryInformation(aBatteryInfo); -} - void EnableNetworkNotifications() { @@ -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)) { @@ -431,30 +410,6 @@ public: return true; } - 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. @@ -768,12 +723,6 @@ public: sHalChildDestroyed = true; } - virtual bool - RecvNotifyBatteryChange(const BatteryInformation& aBatteryInfo) override { - hal::NotifyBatteryChange(aBatteryInfo); - return true; - } - virtual bool RecvNotifySensorChange(const hal::SensorData &aSensorData) override; diff --git a/hal/windows/WindowsBattery.cpp b/hal/windows/WindowsBattery.cpp deleted file mode 100644 index c1b9a31e61..0000000000 --- a/hal/windows/WindowsBattery.cpp +++ /dev/null @@ -1,190 +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 "nsITimer.h" -#include "mozilla/Preferences.h" -#include "mozilla/dom/battery/Constants.h" -#include "nsComponentManagerUtils.h" - -#include -#include "mozilla/WindowsVersion.h" - -using namespace mozilla::dom::battery; - -namespace mozilla { -namespace hal_impl { - -static nsCOMPtr sUpdateTimer; - -/* Power Event API is Vista or later */ -static decltype(RegisterPowerSettingNotification)* sRegisterPowerSettingNotification = nullptr; -static decltype(UnregisterPowerSettingNotification)* sUnregisterPowerSettingNotification = nullptr; -static HPOWERNOTIFY sPowerHandle = nullptr; -static HPOWERNOTIFY sCapacityHandle = nullptr; -static HWND sHWnd = nullptr; - -static void -UpdateHandler(nsITimer* aTimer, void* aClosure) { - NS_ASSERTION(!IsVistaOrLater(), - "We shouldn't call this function for Vista or later version!"); - - static hal::BatteryInformation sLastInfo; - hal::BatteryInformation currentInfo; - - hal_impl::GetCurrentBatteryInformation(¤tInfo); - if (sLastInfo.level() != currentInfo.level() || - sLastInfo.charging() != currentInfo.charging() || - sLastInfo.remainingTime() != currentInfo.remainingTime()) { - hal::NotifyBatteryChange(currentInfo); - sLastInfo = currentInfo; - } -} - -static -LRESULT CALLBACK -BatteryWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - if (msg != WM_POWERBROADCAST || wParam != PBT_POWERSETTINGCHANGE) { - return DefWindowProc(hwnd, msg, wParam, lParam); - } - - hal::BatteryInformation currentInfo; - - // Since we need update remainingTime, we cannot use LPARAM. - hal_impl::GetCurrentBatteryInformation(¤tInfo); - - hal::NotifyBatteryChange(currentInfo); - return TRUE; -} - -void -EnableBatteryNotifications() -{ - if (IsVistaOrLater()) { - // RegisterPowerSettingNotification is from Vista or later. - // Use this API if available. - HMODULE hUser32 = GetModuleHandleW(L"USER32.DLL"); - if (!sRegisterPowerSettingNotification) - sRegisterPowerSettingNotification = (decltype(RegisterPowerSettingNotification)*) - GetProcAddress(hUser32, "RegisterPowerSettingNotification"); - if (!sUnregisterPowerSettingNotification) - sUnregisterPowerSettingNotification = (decltype(UnregisterPowerSettingNotification)*) - GetProcAddress(hUser32, "UnregisterPowerSettingNotification"); - - if (!sRegisterPowerSettingNotification || - !sUnregisterPowerSettingNotification) { - NS_ASSERTION(false, "Canot find PowerSettingNotification functions."); - return; - } - - // 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 = - sRegisterPowerSettingNotification(sHWnd, - &GUID_ACDC_POWER_SOURCE, - DEVICE_NOTIFY_WINDOW_HANDLE); - sCapacityHandle = - sRegisterPowerSettingNotification(sHWnd, - &GUID_BATTERY_PERCENTAGE_REMAINING, - DEVICE_NOTIFY_WINDOW_HANDLE); - } else - { - // for Windows XP. If we remove Windows XP support, - // we should remove timer-based power notification - sUpdateTimer = do_CreateInstance(NS_TIMER_CONTRACTID); - if (sUpdateTimer) { - sUpdateTimer->InitWithFuncCallback(UpdateHandler, - nullptr, - Preferences::GetInt("dom.battery.timer", - 30000 /* 30s */), - nsITimer::TYPE_REPEATING_SLACK); - } - } -} - -void -DisableBatteryNotifications() -{ - if (IsVistaOrLater()) { - if (sPowerHandle) { - sUnregisterPowerSettingNotification(sPowerHandle); - sPowerHandle = nullptr; - } - - if (sCapacityHandle) { - sUnregisterPowerSettingNotification(sCapacityHandle); - sCapacityHandle = nullptr; - } - - if (sHWnd) { - DestroyWindow(sHWnd); - sHWnd = nullptr; - } - } else - { - if (sUpdateTimer) { - sUpdateTimer->Cancel(); - sUpdateTimer = 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/modules/libpref/init/all.js b/modules/libpref/init/all.js index c41d1d4ad0..ed3d9e1712 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -4736,15 +4736,10 @@ 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"); From 52c03190ee63cc3f58078c3397d98e5080dadd58 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 29 Jul 2020 01:21:13 +0000 Subject: [PATCH 08/18] [network/dom] Improve sanitization of download filenames. --- dom/base/nsContentUtils.cpp | 8 ++++++++ netwerk/base/nsBaseChannel.cpp | 6 ++++++ netwerk/protocol/http/HttpBaseChannel.cpp | 6 ++++++ uriloader/exthandler/nsExternalHelperAppService.cpp | 9 ++++++--- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index 61d10e0223..3568ced90d 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/netwerk/base/nsBaseChannel.cpp b/netwerk/base/nsBaseChannel.cpp index 2575fac046..51caa546eb 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/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp index a53022f71f..bf8e17537a 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/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp index 49a54ea5f4..0ca3d7edf3 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[] = { From 51d75f257d1b2164529565962eeaf8d0fca6e567 Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Wed, 29 Jul 2020 10:36:00 +0000 Subject: [PATCH 09/18] [js] Fix Sink to check for non-recoverable operands. --- js/src/jit/Sink.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/js/src/jit/Sink.cpp b/js/src/jit/Sink.cpp index b2c36fae5a..2764fc1cb2 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()) From 7a37234be22465344fff70980b2df5a3d6193cc5 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 29 Jul 2020 10:52:30 +0000 Subject: [PATCH 10/18] [xpcom] Make Base64 compatible with ReadSegments() with small buffers. --- netwerk/test/gtest/TestBase64Stream.cpp | 95 +++++++++++++++++++++++++ netwerk/test/gtest/moz.build | 1 + xpcom/io/Base64.cpp | 32 +++++++-- 3 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 netwerk/test/gtest/TestBase64Stream.cpp diff --git a/netwerk/test/gtest/TestBase64Stream.cpp b/netwerk/test/gtest/TestBase64Stream.cpp new file mode 100644 index 0000000000..37f5cb824e --- /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 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 6e6c801521..e463feb651 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/xpcom/io/Base64.cpp b/xpcom/io/Base64.cpp index 911c0595ac..b9fa7baf83 100644 --- a/xpcom/io/Base64.cpp +++ b/xpcom/io/Base64.cpp @@ -108,30 +108,51 @@ EncodeInputStream_Encoder(nsIInputStream* aStream, EncodeInputStream_State* state = static_cast*>(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!"); From ecf4aecd2141f6c34d2a1dbef0c430c5104d2cf6 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 29 Jul 2020 11:22:30 +0000 Subject: [PATCH 11/18] [js] Don't improve TypeSets containing the magic-args type. JIT optimizations involving the Javascript 'arguments' object could potentially confuse later optimizations, so we simply disable these optimizations as a DiD measure. --- js/src/jit/IonBuilder.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/src/jit/IonBuilder.cpp b/js/src/jit/IonBuilder.cpp index f08baf8657..3d0b73f049 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. From 9dc426514194e1b322171a85c88413b30f42199a Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 29 Jul 2020 11:55:30 +0000 Subject: [PATCH 12/18] [dom] Fix a spec compliance issue with the HTML LS regarding script loading. This fixes a spec compliance issue with section 8.1.4.2 Fetching scripts. --- dom/workers/ScriptLoader.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp index 80e1363843..8f20236096 100644 --- a/dom/workers/ScriptLoader.cpp +++ b/dom/workers/ScriptLoader.cpp @@ -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 chanLoadInfo = channel->GetLoadInfo(); From 5ec7dd76e61f9b684f1a2be3a128ed3369b75dc1 Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Wed, 29 Jul 2020 13:36:37 +0000 Subject: [PATCH 13/18] [WebRTC] Stop putting addresses in the cookie chunk. When using AF_CONN addresses, don't put these in the COOKIE chunk. For these addresses it is possible to reconstruct them locally. Conceptually, addresses are something to be shared with the peer, but in the case of AF_CONN this might not be the case. Therefore, zero then out. Thanks to Natalie Silvanovich of Google Project Zero for finding and reporting the issue. --- netwerk/sctp/src/netinet/sctp_input.c | 21 +++++++++++++++++++++ netwerk/sctp/src/netinet/sctp_output.c | 21 +++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/netwerk/sctp/src/netinet/sctp_input.c b/netwerk/sctp/src/netinet/sctp_input.c index 1301b430c8..f469e0f5ce 100644 --- 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 49447fa9da..3f1a9525d7 100644 --- 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. From 5f85ec0cd881f06309131d6b47201d6f18dbd3df Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 29 Jul 2020 14:13:33 +0000 Subject: [PATCH 14/18] Improve dll loading on Windows. --- gfx/2d/DrawTargetD2D1.cpp | 3 ++- toolkit/xre/nsAppRunner.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gfx/2d/DrawTargetD2D1.cpp b/gfx/2d/DrawTargetD2D1.cpp index d9deb4c104..a2e8541078 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/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index 729ec89c3d..f986f48fc1 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -2616,6 +2616,7 @@ NS_VISIBILITY_DEFAULT PRBool nspr_use_zone_allocator = PR_FALSE; #ifdef CAIRO_HAS_DWRITE_FONT #include +#include "nsWindowsHelpers.h" #ifdef DEBUG_DWRITE_STARTUP @@ -2644,7 +2645,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"); From a9478b09e1d4262c1e163953ab1070c955767922 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Wed, 29 Jul 2020 14:27:42 -0400 Subject: [PATCH 15/18] Issue #1614 - Update en-US Dictionary --- .../locales/en-US/hunspell/README_en_US.txt | 10 +- .../dictionary-sources/5-mozilla-added | 774 ++++++++++- .../orig/README_en_US-custom.txt | 10 +- .../dictionary-sources/orig/en_US-custom.dic | 633 ++++++++- .../locales/en-US/hunspell/en-US.dic | 1161 +++++++++++++++-- 5 files changed, 2358 insertions(+), 230 deletions(-) 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 6a3813d34c..aac24438ba 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 6cb38be647..becb8c0d3f 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 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 0d725dadb7..a0cb8582f5 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 53e1bb406e..8f5bb763a4 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 429c95198c..cd9fe99646 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 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 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 From f08ee332d79019b85e598d0d037759a4cf57e1a3 Mon Sep 17 00:00:00 2001 From: athenian200 Date: Wed, 29 Jul 2020 18:52:42 -0500 Subject: [PATCH 16/18] Issue #1615 - SunOS LDAP cleanup. I meant to do this a long time ago, but basically it accounts for the new XP_SOLARIS build flag that never made it into the MailNews code. Additionally, it enables a compatibility flag for Solaris 11.4 that allows us to use the three-argument implementation of ctime_r still used by Solaris 11.3 and illumos (which also appears equivalent to the NSLDAPI_CTIME implementation used by libldap internally). Also, the ctime_r function has been added to the time.h header library for a while now, not sure why Mozilla thought we didn't have a ctime_r implementation. --- ldap/c-sdk/common.mozbuild | 2 ++ ldap/c-sdk/include/portable.h | 4 ++-- ldap/c-sdk/libldap/tmplout.c | 7 +------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/ldap/c-sdk/common.mozbuild b/ldap/c-sdk/common.mozbuild index 4377982c5a..e335f230a0 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 52698867f6..d61d8535f2 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 0dded6b4c5..fae0b94d51 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 /* 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, From ce9a763cdbda1f133dd96ad5a024637384f5d2e6 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Tue, 28 Jul 2020 10:06:32 +0000 Subject: [PATCH 17/18] [Pale-Moon] Issue #1772 - Follow-up: properly reference restoreOnDemand (oops!) --- application/palemoon/components/sessionstore/SessionStore.jsm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/palemoon/components/sessionstore/SessionStore.jsm b/application/palemoon/components/sessionstore/SessionStore.jsm index 23fdac3f81..0c3e8f134c 100644 --- a/application/palemoon/components/sessionstore/SessionStore.jsm +++ b/application/palemoon/components/sessionstore/SessionStore.jsm @@ -3240,7 +3240,7 @@ var SessionStoreInternal = { // but only if restoring on demand, to prevent request flooding (since // reloading will override the max tabs to restore concurrently mechanism). // See Issue #1772 - if (restoreOnDemand) { + if (TabRestoreQueue.prefs.restoreOnDemand) { let flags = Ci.nsIWebNavigation.LOAD_FLAGS_NONE; switch (this._cacheBehavior) { case 2: // hard refresh From ffa78473f61f035c0c6088fe3280c399fdd2cd64 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 29 Jul 2020 19:31:21 +0000 Subject: [PATCH 18/18] [Pale-Moon] Clear user prefs for AbortController on migration to reset it for users who have disabled it for web compat in the meantime. --- application/palemoon/components/nsBrowserGlue.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/application/palemoon/components/nsBrowserGlue.js b/application/palemoon/components/nsBrowserGlue.js index 8b1cc94680..18f43c0293 100644 --- a/application/palemoon/components/nsBrowserGlue.js +++ b/application/palemoon/components/nsBrowserGlue.js @@ -1285,7 +1285,7 @@ BrowserGlue.prototype = { }, _migrateUI: function() { - const UI_VERSION = 23; + const UI_VERSION = 24; const BROWSER_DOCURL = "chrome://browser/content/browser.xul#"; let currentUIVersion = 0; try { @@ -1552,6 +1552,13 @@ BrowserGlue.prototype = { Services.prefs.clearUserPref("layers.acceleration.disabled"); Services.prefs.clearUserPref("layers.acceleration.force-enabled"); } + + if (currentUIVersion < 24) { + // AbortController's worker signalling was fixed so reset user prefs that + // might have been set as workaround for web compat issues in the meantime. + Services.prefs.clearUserPref("dom.abortController.enabled"); + } + // Clear out dirty storage if (this._dirty) {