gecko-dev/layout/style/nsFontFaceLoader.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

74 строки
2.3 KiB
C
Исходник Обычный вид История

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
2012-05-21 15:12:37 +04:00
/* 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/. */
2008-10-01 07:04:10 +04:00
/* code for loading in @font-face defined font data */
#ifndef nsFontFaceLoader_h_
#define nsFontFaceLoader_h_
#include "mozilla/Attributes.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/dom/FontFaceSet.h"
#include "nsCOMPtr.h"
#include "nsIFontLoadCompleteCallback.h"
#include "nsIStreamLoader.h"
#include "nsIChannel.h"
#include "nsIRequestObserver.h"
2008-10-01 07:04:10 +04:00
#include "gfxUserFontSet.h"
#include "nsHashKeys.h"
#include "nsTHashtable.h"
2008-10-01 07:04:10 +04:00
class nsIPrincipal;
2008-10-01 07:04:10 +04:00
class nsFontFaceLoader final : public nsIStreamLoaderObserver,
public nsIRequestObserver,
public nsIFontLoadCompleteCallback {
2008-10-01 07:04:10 +04:00
public:
Bug 1694123 - Pass userfont source index to font loader and decoder tasks, to avoid potential race with the field in the gfxUserFontEntry being reset on the main thread. r=layout-reviewers,emilio This is a preliminary step that is needed in order for the following patch to be safe. (It's mostly just plumbing, although the patch looks big because we need to pass the index through so many functions.) The issue is that loading a font resource involves a couple of tasks that happen asynchronously - fetching the data from the network, and decoding/sanitizing the font data. We have an implicit assumption that once a font load has been initiated, the state of the associated gfxUserFontEntry will not change; in particular, we depend on mSrcIndex remaining constant, because we may use it to index into the mSrcList array and access the gfxFontFaceSrc record again in the various completion tasks that are executed after the async steps finish. But the following patch breaks this assumption, because it may reset mSrcIndex at arbitrary times when we discover that we need to re-resolve the @font-face to potentially recognize a src:local() resource that was earlier in the list, but was previously unavailable. If this happens while a font-load is doing its off-main-thread work, then when it completes, it will end up accessing the wrong gfxFontFaceSrc record, which would result at least in incorrect behavior, but can also result in a crash (e.g. if the record is of the wrong type altogether, such as trying to use the principal or URI fields from a record of type src:local). To avoid this problem, we should pass the source index at the time the font load is initiated through to the OMT tasks and back to their main-thread completion routines, so that we do not depend on the field in the gfxUserFontEntry remaining frozen. This makes the loading process safe even if the source index in the entry gets reset while loading tasks are in progress. Differential Revision: https://phabricator.services.mozilla.com/D110911
2021-04-06 19:23:17 +03:00
nsFontFaceLoader(gfxUserFontEntry* aUserFontEntry, uint32_t aSrcIndex,
mozilla::dom::FontFaceSet* aFontFaceSet,
nsIChannel* aChannel);
2008-10-01 07:04:10 +04:00
NS_DECL_ISUPPORTS
NS_DECL_NSISTREAMLOADEROBSERVER
NS_DECL_NSIREQUESTOBSERVER
2008-10-01 07:04:10 +04:00
// cancel the load and remove its reference to mFontFaceSet
void Cancel();
2008-10-01 07:04:10 +04:00
void DropChannel() { mChannel = nullptr; }
void StartedLoading(nsIStreamLoader* aStreamLoader);
static void LoadTimerCallback(nsITimer* aTimer, void* aClosure);
gfxUserFontEntry* GetUserFontEntry() const { return mUserFontEntry; }
// Called by the gfxUserFontEntry once it has finished the platform font
// loading.
NS_IMETHODIMP FontLoadComplete() final;
protected:
virtual ~nsFontFaceLoader();
// helper method for determining the font-display value
mozilla::StyleFontDisplay GetFontDisplay();
private:
Bug 1207245 - part 6 - rename nsRefPtr<T> to RefPtr<T>; r=ehsan; a=Tomcat The bulk of this commit was generated with a script, executed at the top level of a typical source code checkout. The only non-machine-generated part was modifying MFBT's moz.build to reflect the new naming. CLOSED TREE makes big refactorings like this a piece of cake. # The main substitution. find . -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.mm' -o -name '*.idl'| \ xargs perl -p -i -e ' s/nsRefPtr\.h/RefPtr\.h/g; # handle includes s/nsRefPtr ?</RefPtr</g; # handle declarations and variables ' # Handle a special friend declaration in gfx/layers/AtomicRefCountedWithFinalize.h. perl -p -i -e 's/::nsRefPtr;/::RefPtr;/' gfx/layers/AtomicRefCountedWithFinalize.h # Handle nsRefPtr.h itself, a couple places that define constructors # from nsRefPtr, and code generators specially. We do this here, rather # than indiscriminantly s/nsRefPtr/RefPtr/, because that would rename # things like nsRefPtrHashtable. perl -p -i -e 's/nsRefPtr/RefPtr/g' \ mfbt/nsRefPtr.h \ xpcom/glue/nsCOMPtr.h \ xpcom/base/OwningNonNull.h \ ipc/ipdl/ipdl/lower.py \ ipc/ipdl/ipdl/builtin.py \ dom/bindings/Codegen.py \ python/lldbutils/lldbutils/utils.py # In our indiscriminate substitution above, we renamed # nsRefPtrGetterAddRefs, the class behind getter_AddRefs. Fix that up. find . -name '*.cpp' -o -name '*.h' -o -name '*.idl' | \ xargs perl -p -i -e 's/nsRefPtrGetterAddRefs/RefPtrGetterAddRefs/g' if [ -d .git ]; then git mv mfbt/nsRefPtr.h mfbt/RefPtr.h else hg mv mfbt/nsRefPtr.h mfbt/RefPtr.h fi --HG-- rename : mfbt/nsRefPtr.h => mfbt/RefPtr.h
2015-10-18 08:24:48 +03:00
RefPtr<gfxUserFontEntry> mUserFontEntry;
nsCOMPtr<nsIURI> mFontURI;
// Cleared in FontFaceSet::~FontFaceSet, and on cancelation and such too.
mozilla::dom::FontFaceSet* MOZ_NON_OWNING_REF mFontFaceSet;
nsCOMPtr<nsIChannel> mChannel;
nsCOMPtr<nsITimer> mLoadTimer;
mozilla::TimeStamp mStartTime;
nsIStreamLoader* mStreamLoader;
Bug 1694123 - Pass userfont source index to font loader and decoder tasks, to avoid potential race with the field in the gfxUserFontEntry being reset on the main thread. r=layout-reviewers,emilio This is a preliminary step that is needed in order for the following patch to be safe. (It's mostly just plumbing, although the patch looks big because we need to pass the index through so many functions.) The issue is that loading a font resource involves a couple of tasks that happen asynchronously - fetching the data from the network, and decoding/sanitizing the font data. We have an implicit assumption that once a font load has been initiated, the state of the associated gfxUserFontEntry will not change; in particular, we depend on mSrcIndex remaining constant, because we may use it to index into the mSrcList array and access the gfxFontFaceSrc record again in the various completion tasks that are executed after the async steps finish. But the following patch breaks this assumption, because it may reset mSrcIndex at arbitrary times when we discover that we need to re-resolve the @font-face to potentially recognize a src:local() resource that was earlier in the list, but was previously unavailable. If this happens while a font-load is doing its off-main-thread work, then when it completes, it will end up accessing the wrong gfxFontFaceSrc record, which would result at least in incorrect behavior, but can also result in a crash (e.g. if the record is of the wrong type altogether, such as trying to use the principal or URI fields from a record of type src:local). To avoid this problem, we should pass the source index at the time the font load is initiated through to the OMT tasks and back to their main-thread completion routines, so that we do not depend on the field in the gfxUserFontEntry remaining frozen. This makes the loading process safe even if the source index in the entry gets reset while loading tasks are in progress. Differential Revision: https://phabricator.services.mozilla.com/D110911
2021-04-06 19:23:17 +03:00
uint32_t mSrcIndex;
bool mInStreamComplete = false;
bool mInLoadTimerCallback = false;
2008-10-01 07:04:10 +04:00
};
#endif /* !defined(nsFontFaceLoader_h_) */