@@ -97,52 +97,7 @@ already_AddRefed<StyleSheet> StyleSheet::Constructor(
9797 return nullptr ;
9898 }
9999
100- // 1. Construct a sheet and set its properties (see spec).
101- auto sheet =
102- MakeRefPtr<StyleSheet>(css::SheetParsingMode::eAuthorSheetFeatures,
103- CORSMode::CORS_NONE, dom::SRIMetadata ());
104-
105- // baseURL not yet in the spec. Implemented based on the following discussion:
106- // https://github.com/WICG/construct-stylesheets/issues/95#issuecomment-594217180
107- RefPtr<nsIURI> baseURI;
108- if (!aOptions.mBaseURL .WasPassed ()) {
109- baseURI = constructorDocument->GetBaseURI ();
110- } else {
111- nsresult rv = NS_NewURI(getter_AddRefs (baseURI), aOptions.mBaseURL .Value (),
112- nullptr , constructorDocument->GetBaseURI ());
113- if (NS_FAILED(rv)) {
114- aRv.ThrowNotAllowedError (
115- " Constructed style sheets must have a valid base URL" );
116- return nullptr ;
117- }
118- }
119-
120- nsIURI* sheetURI = constructorDocument->GetDocumentURI ();
121- nsIURI* originalURI = nullptr ;
122- sheet->SetURIs (sheetURI, originalURI, baseURI);
123-
124- sheet->SetPrincipal (constructorDocument->NodePrincipal ());
125- auto referrerInfo = MakeRefPtr<ReferrerInfo>(*constructorDocument);
126- sheet->SetReferrerInfo (referrerInfo);
127- sheet->mConstructorDocument = constructorDocument;
128-
129- // 2. Set the sheet's media according to aOptions.
130- if (aOptions.mMedia .IsUTF8String ()) {
131- sheet->SetMedia (MediaList::Create (aOptions.mMedia .GetAsUTF8String ()));
132- } else {
133- sheet->SetMedia (aOptions.mMedia .GetAsMediaList ()->Clone ());
134- }
135-
136- // 3. Set the sheet's disabled flag according to aOptions.
137- sheet->SetDisabled (aOptions.mDisabled );
138- sheet->SetURLExtraData ();
139- sheet->SetComplete ();
140-
141- sheet->ReplaceSync (" " _ns, aRv);
142- MOZ_ASSERT (!aRv.Failed ());
143-
144- // 4. Return sheet.
145- return sheet.forget ();
100+ return CreateConstructedSheet (*constructorDocument, constructorDocument->GetBaseURI (), aOptions, aRv);
146101}
147102
148103StyleSheet::~StyleSheet () {
@@ -1196,6 +1151,60 @@ void StyleSheet::FixUpAfterInnerClone() {
11961151 }
11971152}
11981153
1154+ /* static */
1155+ // https://wicg.github.io/construct-stylesheets/#dom-cssstylesheet-cssstylesheet
1156+ already_AddRefed<StyleSheet> StyleSheet::CreateConstructedSheet (
1157+ dom::Document& aConstructorDocument, nsIURI* aBaseURI, const dom::CSSStyleSheetInit& aOptions,
1158+ ErrorResult& aRv) {
1159+
1160+ // 1. Construct a sheet and set its properties (see spec).
1161+ auto sheet =
1162+ MakeRefPtr<StyleSheet>(css::SheetParsingMode::eAuthorSheetFeatures,
1163+ CORSMode::CORS_NONE, dom::SRIMetadata ());
1164+
1165+ // baseURL not yet in the spec. Implemented based on the following discussion:
1166+ // https://github.com/WICG/construct-stylesheets/issues/95#issuecomment-594217180
1167+ RefPtr<nsIURI> baseURI;
1168+ if (!aOptions.mBaseURL .WasPassed ()) {
1169+ baseURI = aBaseURI;
1170+ } else {
1171+ nsresult rv = NS_NewURI(getter_AddRefs (baseURI), aOptions.mBaseURL .Value (),
1172+ nullptr , aConstructorDocument.GetBaseURI ());
1173+ if (NS_FAILED(rv)) {
1174+ aRv.ThrowNotAllowedError (
1175+ " Constructed style sheets must have a valid base URL" );
1176+ return nullptr ;
1177+ }
1178+ }
1179+
1180+ nsIURI* sheetURI = aConstructorDocument.GetDocumentURI ();
1181+ nsIURI* originalURI = nullptr ;
1182+ sheet->SetURIs (sheetURI, originalURI, baseURI);
1183+
1184+ sheet->SetPrincipal (aConstructorDocument.NodePrincipal ());
1185+ auto referrerInfo = MakeRefPtr<ReferrerInfo>(aConstructorDocument);
1186+ sheet->SetReferrerInfo (referrerInfo);
1187+ sheet->mConstructorDocument = &aConstructorDocument;
1188+
1189+ // 2. Set the sheet's media according to aOptions.
1190+ if (aOptions.mMedia .IsUTF8String ()) {
1191+ sheet->SetMedia (MediaList::Create (aOptions.mMedia .GetAsUTF8String ()));
1192+ } else {
1193+ sheet->SetMedia (aOptions.mMedia .GetAsMediaList ()->Clone ());
1194+ }
1195+
1196+ // 3. Set the sheet's disabled flag according to aOptions.
1197+ sheet->SetDisabled (aOptions.mDisabled );
1198+ sheet->SetURLExtraData ();
1199+ sheet->SetComplete ();
1200+
1201+ sheet->ReplaceSync (" " _ns, aRv);
1202+ MOZ_ASSERT (!aRv.Failed ());
1203+
1204+ // 4. Return sheet.
1205+ return sheet.forget ();
1206+ }
1207+
11991208already_AddRefed<StyleSheet> StyleSheet::CreateEmptyChildSheet (
12001209 already_AddRefed<dom::MediaList> aMediaList) const {
12011210 auto child =
0 commit comments