forked from Floorp-Projects/Floorp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnsFontFaceLoader.h
134 lines (101 loc) · 4.5 KB
/
nsFontFaceLoader.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
// vim:cindent:ts=2:et:sw=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/. */
/* code for loading in @font-face defined font data */
#ifndef nsFontFaceLoader_h_
#define nsFontFaceLoader_h_
#include "nsCOMPtr.h"
#include "nsIStreamLoader.h"
#include "nsIChannel.h"
#include "gfxUserFontSet.h"
#include "nsHashKeys.h"
#include "nsTHashtable.h"
#include "nsCSSRules.h"
class nsPresContext;
class nsIPrincipal;
class nsFontFaceLoader;
// nsUserFontSet - defines the loading mechanism for downloadable fonts
class nsUserFontSet : public gfxUserFontSet
{
public:
nsUserFontSet(nsPresContext* aContext);
~nsUserFontSet();
// Called when this font set is no longer associated with a presentation.
void Destroy();
// starts loading process, creating and initializing a nsFontFaceLoader obj
// returns whether load process successfully started or not
nsresult StartLoad(gfxMixedFontFamily* aFamily,
gfxProxyFontEntry* aFontToLoad,
const gfxFontFaceSrc* aFontFaceSrc);
// Called by nsFontFaceLoader when the loader has completed normally.
// It's removed from the mLoaders set.
void RemoveLoader(nsFontFaceLoader* aLoader);
bool UpdateRules(const nsTArray<nsFontFaceRuleContainer>& aRules);
nsPresContext* GetPresContext() { return mPresContext; }
virtual void ReplaceFontEntry(gfxMixedFontFamily* aFamily,
gfxProxyFontEntry* aProxy,
gfxFontEntry* aFontEntry);
nsCSSFontFaceRule* FindRuleForEntry(gfxFontEntry* aFontEntry);
protected:
// The font-set keeps track of the collection of rules, and their
// corresponding font entries (whether proxies or real entries),
// so that we can update the set without having to throw away
// all the existing fonts.
struct FontFaceRuleRecord {
nsRefPtr<gfxFontEntry> mFontEntry;
nsFontFaceRuleContainer mContainer;
};
void InsertRule(nsCSSFontFaceRule* aRule, uint8_t aSheetType,
nsTArray<FontFaceRuleRecord>& oldRules,
bool& aFontSetModified);
virtual nsresult LogMessage(gfxMixedFontFamily* aFamily,
gfxProxyFontEntry* aProxy,
const char* aMessage,
uint32_t aFlags = nsIScriptError::errorFlag,
nsresult aStatus = NS_OK);
virtual nsresult CheckFontLoad(const gfxFontFaceSrc* aFontFaceSrc,
nsIPrincipal** aPrincipal,
bool* aBypassCache);
virtual nsresult SyncLoadFontData(gfxProxyFontEntry* aFontToLoad,
const gfxFontFaceSrc* aFontFaceSrc,
uint8_t*& aBuffer,
uint32_t& aBufferLength);
virtual bool GetPrivateBrowsing() MOZ_OVERRIDE;
nsPresContext* mPresContext; // weak reference
// Set of all loaders pointing to us. These are not strong pointers,
// but that's OK because nsFontFaceLoader always calls RemoveLoader on
// us before it dies (unless we die first).
nsTHashtable< nsPtrHashKey<nsFontFaceLoader> > mLoaders;
nsTArray<FontFaceRuleRecord> mRules;
};
class nsFontFaceLoader : public nsIStreamLoaderObserver
{
public:
nsFontFaceLoader(gfxMixedFontFamily* aFontFamily,
gfxProxyFontEntry* aFontToLoad, nsIURI* aFontURI,
nsUserFontSet* aFontSet, nsIChannel* aChannel);
virtual ~nsFontFaceLoader();
NS_DECL_ISUPPORTS
NS_DECL_NSISTREAMLOADEROBSERVER
// initiate the load
nsresult Init();
// cancel the load and remove its reference to mFontSet
void Cancel();
void DropChannel() { mChannel = nullptr; }
void StartedLoading(nsIStreamLoader* aStreamLoader);
static void LoadTimerCallback(nsITimer* aTimer, void* aClosure);
static nsresult CheckLoadAllowed(nsIPrincipal* aSourcePrincipal,
nsIURI* aTargetURI,
nsISupports* aContext);
private:
nsRefPtr<gfxMixedFontFamily> mFontFamily;
nsRefPtr<gfxProxyFontEntry> mFontEntry;
nsCOMPtr<nsIURI> mFontURI;
nsRefPtr<nsUserFontSet> mFontSet;
nsCOMPtr<nsIChannel> mChannel;
nsCOMPtr<nsITimer> mLoadTimer;
nsIStreamLoader* mStreamLoader;
};
#endif /* !defined(nsFontFaceLoader_h_) */