Skip to content

Commit

Permalink
Content Script CSS overriding style attributes inconsistent.
Browse files Browse the repository at this point in the history
https://webkit.org/b/273122
rdar://problem/126916972

Reviewed by Antti Koivisto.

Change web extension content styles to be author level instead of user level by default.

To allow extensions to still use user level, added support for `cssOrigin` in the
`tabs.insertCSS()` options, as well as `origin` in the `scripting.insertCSS` options.
Accepted values are `user` and `author`.

In addition, this introduces `cssOrigin` in `scripting.registerContentScripts()` and
`css_origin` for the `content_scripts` entry in the manifest. These are new options
and are being discussed in the WECG at w3c/webextensions#414.

* Source/WebCore/en.lproj/Localizable.strings: Updated.
* Source/WebKit/Shared/Extensions/WebExtensionDynamicScripts.serialization.in:
* Source/WebKit/Shared/Extensions/WebExtensionRegisteredScriptParameters.h:
* Source/WebKit/Shared/Extensions/WebExtensionScriptInjectionParameters.h:
* Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIScriptingCocoa.mm:
(WebKit::WebExtensionContext::scriptingInsertCSS):
(WebKit::WebExtensionContext::createInjectedContentForScripts):
* Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPITabsCocoa.mm:
(WebKit::WebExtensionContext::tabsInsertCSS):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionCocoa.mm:
(WebKit::WebExtension::populateContentScriptPropertiesIfNeeded):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm:
(WebKit::WebExtensionContext::addInjectedContent):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionDynamicScriptsCocoa.mm:
(WebKit::WebExtensionDynamicScripts::injectStyleSheets):
* Source/WebKit/UIProcess/Extensions/WebExtension.h:
* Source/WebKit/UIProcess/Extensions/WebExtensionDynamicScripts.h:
* Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIScriptingCocoa.mm:
(WebKit::toWebAPI): Added origin.
(WebKit::WebExtensionAPIScripting::executeScript): Return early if outExceptionString is set.
(WebKit::WebExtensionAPIScripting::insertCSS): Ditto.
(WebKit::WebExtensionAPIScripting::removeCSS): Ditto.
(WebKit::WebExtensionAPIScripting::validateCSS): Added origin.
(WebKit::WebExtensionAPIScripting::validateRegisteredScripts): Ditto.
(WebKit::WebExtensionAPIScripting::parseCSSInjectionOptions): Ditto.
* Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPITabsCocoa.mm:
(WebKit::WebExtensionAPITabs::parseScriptOptions):
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtension.mm:
(TestWebKitAPI::TEST(WKWebExtension, ContentScriptsParsing)): Added new cases.
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionAPIScripting.mm:
(TestWebKitAPI::TEST(WKWebExtensionAPIScripting, ErrorsCSS)): Added new error case.
(TestWebKitAPI::TEST(WKWebExtensionAPIScripting, ErrorsRegisteredContentScript)): Ditto.
(TestWebKitAPI::TEST(WKWebExtensionAPIScripting, CSSUserOrigin)): Added.
(TestWebKitAPI::TEST(WKWebExtensionAPIScripting, CSSAuthorOrigin)): Added.
(TestWebKitAPI::TEST(WKWebExtensionAPIScripting, World)): Fixed test that was always passing.
(TestWebKitAPI::TEST(WKWebExtensionAPIScripting, RegisterContentScriptsWithCSSUserOrigin)): Added.
(TestWebKitAPI::TEST(WKWebExtensionAPIScripting, RegisterContentScriptsWithCSSAuthorOrigin)): Added.
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionAPITabs.mm:
(TestWebKitAPI::TEST(WKWebExtensionAPITabs, Errors)): Added new error case.
(TestWebKitAPI::TEST(WKWebExtensionAPITabs, CSSUserOrigin)): Added.
(TestWebKitAPI::TEST(WKWebExtensionAPITabs, CSSAuthorOrigin)): Added.
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionContext.mm:
(TestWebKitAPI::TEST(WKWebExtensionContext, ContentScriptsParsing)): Added new cases.
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionController.mm:
(TestWebKitAPI::TEST(WKWebExtensionController, CSSUserOrigin)): Added.
(TestWebKitAPI::TEST(WKWebExtensionController, CSSAuthorOrigin)): Added.

Canonical link: https://commits.webkit.org/278387@main
  • Loading branch information
xeenon committed May 5, 2024
1 parent ab7b68f commit f4d3ac2
Show file tree
Hide file tree
Showing 18 changed files with 501 additions and 17 deletions.
3 changes: 3 additions & 0 deletions Source/WebCore/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -961,6 +961,9 @@
/* WKWebExtensionErrorInvalidContentScripts description for missing matches entry */
"Manifest `content_scripts` entry has no specified `matches` entry." = "Manifest `content_scripts` entry has no specified `matches` entry.";

/* WKWebExtensionErrorInvalidContentScripts description for unknown 'css_origin' value */
"Manifest `content_scripts` entry has unknown `css_origin` value." = "Manifest `content_scripts` entry has unknown `css_origin` value.";

/* WKWebExtensionErrorInvalidContentScripts description for unknown 'run_at' value */
"Manifest `content_scripts` entry has unknown `run_at` value." = "Manifest `content_scripts` entry has unknown `run_at` value.";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ struct WebKit::WebExtensionScriptInjectionParameters {
std::optional<String> function;

WebKit::WebExtensionContentWorldType world;
WebCore::UserStyleLevel styleLevel;
}

struct WebKit::WebExtensionScriptInjectionResultParameters {
Expand All @@ -59,6 +60,7 @@ struct WebKit::WebExtensionRegisteredScriptParameters {
std::optional<bool> persistent;

std::optional<WebKit::WebExtensionContentWorldType> world;
std::optional<WebCore::UserStyleLevel> styleLevel;
}

[Nested] enum class WebKit::WebExtension::InjectionTime : uint8_t {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

#if ENABLE(WK_WEB_EXTENSIONS)

#include <WebCore/UserStyleSheetTypes.h>
#include <wtf/Forward.h>

namespace WebKit {
Expand All @@ -46,6 +47,7 @@ struct WebExtensionRegisteredScriptParameters {
std::optional<bool> persistent;

std::optional<WebExtensionContentWorldType> world;
std::optional<WebCore::UserStyleLevel> styleLevel;
};

} // namespace WebKit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#if ENABLE(WK_WEB_EXTENSIONS)

#include "APIData.h"
#include <WebCore/UserStyleSheetTypes.h>
#include <wtf/Forward.h>

namespace WebKit {
Expand All @@ -44,6 +45,7 @@ struct WebExtensionScriptInjectionParameters {
std::optional<String> function;

WebExtensionContentWorldType world { WebExtensionContentWorldType::ContentScript };
WebCore::UserStyleLevel styleLevel { WebCore::UserStyleLevel::Author };
};

} // namespace WebKit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@
auto injectedFrames = parameters.frameIDs ? WebCore::UserContentInjectedFrames::InjectInTopFrameOnly : WebCore::UserContentInjectedFrames::InjectInAllFrames;

auto styleSheetPairs = getSourcePairsForParameters(parameters, m_extension);
injectStyleSheets(styleSheetPairs, webView, *m_contentScriptWorld, injectedFrames, *this);
injectStyleSheets(styleSheetPairs, webView, *m_contentScriptWorld, parameters.styleLevel, injectedFrames, *this);

completionHandler({ });
});
Expand Down Expand Up @@ -418,6 +418,7 @@
injectedContentData.injectionTime = parameters.injectionTime.value_or(WebExtension::InjectionTime::DocumentIdle);
injectedContentData.injectsIntoAllFrames = parameters.allFrames.value_or(false);
injectedContentData.contentWorldType = parameters.world.value_or(WebExtensionContentWorldType::ContentScript);
injectedContentData.styleLevel = parameters.styleLevel.value_or(WebCore::UserStyleLevel::Author);
injectedContentData.scriptPaths = scriptPaths;
injectedContentData.styleSheetPaths = styleSheetPaths;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,7 @@ static inline String toMIMEType(WebExtensionTab::ImageFormat format)
auto injectedFrames = parameters.frameIDs ? WebCore::UserContentInjectedFrames::InjectInTopFrameOnly : WebCore::UserContentInjectedFrames::InjectInAllFrames;

auto styleSheetPairs = getSourcePairsForParameters(parameters, m_extension);
injectStyleSheets(styleSheetPairs, webView, *m_contentScriptWorld, injectedFrames, *this);
injectStyleSheets(styleSheetPairs, webView, *m_contentScriptWorld, parameters.styleLevel, injectedFrames, *this);

completionHandler({ });
});
Expand Down
13 changes: 13 additions & 0 deletions Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionCocoa.mm
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,9 @@
static NSString * const contentScriptsWorldManifestKey = @"world";
static NSString * const contentScriptsIsolatedManifestKey = @"ISOLATED";
static NSString * const contentScriptsMainManifestKey = @"MAIN";
static NSString * const contentScriptsCSSOriginManifestKey = @"css_origin";
static NSString * const contentScriptsAuthorManifestKey = @"author";
static NSString * const contentScriptsUserManifestKey = @"user";

static NSString * const permissionsManifestKey = @"permissions";
static NSString * const optionalPermissionsManifestKey = @"optional_permissions";
Expand Down Expand Up @@ -2057,13 +2060,23 @@ static bool parseCommandShortcut(const String& shortcut, OptionSet<ModifierFlags
else
recordError(createError(Error::InvalidContentScripts, WEB_UI_STRING("Manifest `content_scripts` entry has unknown `world` value.", "WKWebExtensionErrorInvalidContentScripts description for unknown 'world' value")));

auto styleLevel = WebCore::UserStyleLevel::Author;
auto *cssOriginString = objectForKey<NSString>(dictionary, contentScriptsCSSOriginManifestKey).lowercaseString;
if (!cssOriginString || [cssOriginString isEqualToString:contentScriptsAuthorManifestKey])
styleLevel = WebCore::UserStyleLevel::Author;
else if ([cssOriginString isEqualToString:contentScriptsUserManifestKey])
styleLevel = WebCore::UserStyleLevel::User;
else
recordError(createError(Error::InvalidContentScripts, WEB_UI_STRING("Manifest `content_scripts` entry has unknown `css_origin` value.", "WKWebExtensionErrorInvalidContentScripts description for unknown 'css_origin' value")));

InjectedContentData injectedContentData;
injectedContentData.includeMatchPatterns = WTFMove(includeMatchPatterns);
injectedContentData.excludeMatchPatterns = WTFMove(excludeMatchPatterns);
injectedContentData.injectionTime = injectionTime;
injectedContentData.matchesAboutBlank = matchesAboutBlank;
injectedContentData.injectsIntoAllFrames = injectsIntoAllFrames;
injectedContentData.contentWorldType = contentWorldType;
injectedContentData.styleLevel = styleLevel;
injectedContentData.scriptPaths = scriptPaths;
injectedContentData.styleSheetPaths = styleSheetPaths;
injectedContentData.includeGlobPatternStrings = includeGlobPatternStrings;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4015,6 +4015,7 @@ void effectiveAppearanceDidChange(Inspector::ExtensionAppearance appearance) ove
auto injectionTime = toImpl(injectedContentData.injectionTime);
auto waitForNotification = WebCore::WaitForNotificationBeforeInjecting::No;
Ref executionWorld = toContentWorld(injectedContentData.contentWorldType);
auto styleLevel = injectedContentData.styleLevel;

auto scriptID = injectedContentData.identifier;
bool isRegisteredScript = !scriptID.isEmpty();
Expand Down Expand Up @@ -4045,7 +4046,7 @@ void effectiveAppearanceDidChange(Inspector::ExtensionAppearance appearance) ove
if (!styleSheetString)
continue;

auto userStyleSheet = API::UserStyleSheet::create(WebCore::UserStyleSheet { styleSheetString, URL { m_baseURL, styleSheetPath }, makeVector<String>(includeMatchPatterns), makeVector<String>(excludeMatchPatterns), injectedFrames, WebCore::UserStyleLevel::User, std::nullopt }, executionWorld);
auto userStyleSheet = API::UserStyleSheet::create(WebCore::UserStyleSheet { styleSheetString, URL { m_baseURL, styleSheetPath }, makeVector<String>(includeMatchPatterns), makeVector<String>(excludeMatchPatterns), injectedFrames, styleLevel, std::nullopt }, executionWorld);
originInjectedStyleSheets.append(userStyleSheet);

for (auto& userContentController : userContentControllers)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ void executeScript(std::optional<SourcePairs> scriptPairs, WKWebView *webView, A
}).get()];
}

void injectStyleSheets(SourcePairs styleSheetPairs, WKWebView *webView, API::ContentWorld& executionWorld, WebCore::UserContentInjectedFrames injectedFrames, WebExtensionContext& context)
void injectStyleSheets(SourcePairs styleSheetPairs, WKWebView *webView, API::ContentWorld& executionWorld, WebCore::UserStyleLevel styleLevel, WebCore::UserContentInjectedFrames injectedFrames, WebExtensionContext& context)
{
auto page = webView._page;
auto pageID = page->webPageID();
Expand All @@ -165,7 +165,7 @@ void injectStyleSheets(SourcePairs styleSheetPairs, WKWebView *webView, API::Con
if (!styleSheet)
continue;

auto userStyleSheet = API::UserStyleSheet::create(WebCore::UserStyleSheet { styleSheet.value().first, styleSheet.value().second.value_or(URL { }), Vector<String> { }, Vector<String> { }, injectedFrames, WebCore::UserStyleLevel::User, pageID }, executionWorld);
auto userStyleSheet = API::UserStyleSheet::create(WebCore::UserStyleSheet { styleSheet.value().first, styleSheet.value().second.value_or(URL { }), Vector<String> { }, Vector<String> { }, injectedFrames, styleLevel, pageID }, executionWorld);

auto& controller = page.get()->userContentController();
controller.addUserStyleSheet(userStyleSheet);
Expand Down
2 changes: 2 additions & 0 deletions Source/WebKit/UIProcess/Extensions/WebExtension.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "CocoaImage.h"
#include "WebExtensionContentWorldType.h"
#include "WebExtensionMatchPattern.h"
#include <WebCore/UserStyleSheetTypes.h>
#include <wtf/Forward.h>
#include <wtf/HashSet.h>
#include <wtf/RetainPtr.h>
Expand Down Expand Up @@ -158,6 +159,7 @@ class WebExtension : public API::ObjectImpl<API::Object::Type::WebExtension>, pu
bool matchesAboutBlank { false };
bool injectsIntoAllFrames { false };
WebExtensionContentWorldType contentWorldType { WebExtensionContentWorldType::ContentScript };
WebCore::UserStyleLevel styleLevel { WebCore::UserStyleLevel::Author };

RetainPtr<NSArray> scriptPaths;
RetainPtr<NSArray> styleSheetPaths;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ SourcePairs getSourcePairsForParameters(const WebExtensionScriptInjectionParamet
Vector<RetainPtr<_WKFrameTreeNode>> getFrames(_WKFrameTreeNode *, std::optional<Vector<WebExtensionFrameIdentifier>>);

void executeScript(std::optional<SourcePairs>, WKWebView *, API::ContentWorld&, WebExtensionTab*, const WebExtensionScriptInjectionParameters&, WebExtensionContext&, CompletionHandler<void(InjectionResults&&)>&&);
void injectStyleSheets(SourcePairs, WKWebView *, API::ContentWorld&, WebCore::UserContentInjectedFrames, WebExtensionContext&);
void injectStyleSheets(SourcePairs, WKWebView *, API::ContentWorld&, WebCore::UserStyleLevel, WebCore::UserContentInjectedFrames, WebExtensionContext&);
void removeStyleSheets(SourcePairs, WKWebView *, WebCore::UserContentInjectedFrames, WebExtensionContext&);

WebExtensionScriptInjectionResultParameters toInjectionResultParameters(id resultOfExecution, WKFrameInfo *, NSString *errorMessage);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,12 @@
static NSString * const argsKey = @"args";
static NSString * const argumentsKey = @"arguments";
static NSString * const cssKey = @"css";
static NSString * const cssOriginKey = @"cssOrigin";
static NSString * const filesKey = @"files";
static NSString * const frameIDsKey = @"frameIds";
static NSString * const funcKey = @"func";
static NSString * const functionKey = @"function";
static NSString * const originKey = @"origin";
static NSString * const tabIDKey = @"tabId";
static NSString * const targetKey = @"target";
static NSString * const worldKey = @"world";
Expand All @@ -73,11 +75,13 @@
static NSString * const mainWorld = @"MAIN";
static NSString * const isolatedWorld = @"ISOLATED";

static NSString * const authorValue = @"author";
static NSString * const userValue = @"user";

static NSString * const documentEnd = @"document_end";
static NSString * const documentIdle = @"document_idle";
static NSString * const documentStart = @"document_start";

// FIXME: <https://webkit.org/b/261765> Consider adding support for cssOrigin.
// FIXME: <https://webkit.org/b/261765> Consider adding support for injectImmediately.
// FIXME: <https://webkit.org/b/264829> Add support for matchOriginAsFallback.

Expand Down Expand Up @@ -144,6 +148,9 @@
if (parameters.excludeMatchPatterns)
result[excludeMatchesKey] = createNSArray(parameters.excludeMatchPatterns.value()).get();

if (parameters.styleLevel)
result[cssOriginKey] = parameters.styleLevel.value() == WebCore::UserStyleLevel::User ? userValue : authorValue;

return [result copy];
}

Expand Down Expand Up @@ -180,6 +187,9 @@
parseTargetInjectionOptions(script[targetKey], parameters, outExceptionString);
parseScriptInjectionOptions(script, parameters, outExceptionString);

if (*outExceptionString)
return;

WebProcess::singleton().sendWithAsyncReply(Messages::WebExtensionContext::ScriptingExecuteScript(WTFMove(parameters)), [protectedThis = Ref { *this }, callback = WTFMove(callback)](Expected<Vector<WebKit::WebExtensionScriptInjectionResultParameters>, WebExtensionError>&& result) {
if (!result)
callback->reportError(result.error());
Expand All @@ -199,6 +209,9 @@
parseTargetInjectionOptions(cssInfo[targetKey], parameters, outExceptionString);
parseCSSInjectionOptions(cssInfo, parameters);

if (*outExceptionString)
return;

WebProcess::singleton().sendWithAsyncReply(Messages::WebExtensionContext::ScriptingInsertCSS(WTFMove(parameters)), [protectedThis = Ref { *this }, callback = WTFMove(callback)](Expected<void, WebExtensionError>&& result) {
if (!result)
callback->reportError(result.error());
Expand All @@ -218,6 +231,9 @@
parseTargetInjectionOptions(cssInfo[targetKey], parameters, outExceptionString);
parseCSSInjectionOptions(cssInfo, parameters);

if (*outExceptionString)
return;

WebProcess::singleton().sendWithAsyncReply(Messages::WebExtensionContext::ScriptingRemoveCSS(WTFMove(parameters)), [protectedThis = Ref { *this }, callback = WTFMove(callback)](Expected<void, WebExtensionError>&& result) {
if (!result)
callback->reportError(result.error());
Expand Down Expand Up @@ -410,6 +426,7 @@
static NSDictionary<NSString *, id> *keyTypes = @{
cssKey: NSString.class,
filesKey: @[ NSString.class ],
originKey: NSString.class,
targetKey: NSDictionary.class,
};

Expand All @@ -429,6 +446,13 @@
return false;
}

if (NSString *origin = objectForKey<NSString>(cssInfo, originKey).lowercaseString) {
if (![origin isEqualToString:userValue] && ![origin isEqualToString:authorValue]) {
*outExceptionString = toErrorString(nil, originKey, @"it must specify either 'AUTHOR' or 'USER'");
return false;
}
}

return true;
}

Expand All @@ -448,6 +472,7 @@
persistAcrossSessionsKey: @YES.class,
runAtKey: NSString.class,
worldKey: NSString.class,
cssOriginKey: NSString.class,
};

if (![scripts isKindOfClass:NSArray.class]) {
Expand Down Expand Up @@ -490,7 +515,14 @@

if (NSString *injectionTime = script[runAtKey]) {
if (![injectionTime isEqualToString:documentIdle] && ![injectionTime isEqualToString:documentStart] && ![injectionTime isEqualToString:documentEnd]) {
*outExceptionString = toErrorString(nil, runAtKey, @"it must be one of the following: 'document_end', 'document_idle', or 'document_start'");
*outExceptionString = toErrorString(nil, runAtKey, @"it must specify either 'document_start', 'document_end', or 'document_idle'");
return false;
}
}

if (NSString *cssOrigin = objectForKey<NSString>(script, cssOriginKey).lowercaseString) {
if (![cssOrigin isEqualToString:userValue] && ![cssOrigin isEqualToString:authorValue]) {
*outExceptionString = toErrorString(nil, cssOriginKey, @"it must specify either 'author' or 'user'");
return false;
}
}
Expand Down Expand Up @@ -572,6 +604,9 @@

if (NSArray *files = cssInfo[filesKey])
parameters.files = makeVector<String>(files);

if (NSString *origin = objectForKey<NSString>(cssInfo, originKey).lowercaseString)
parameters.styleLevel = [origin isEqualToString:userValue] ? WebCore::UserStyleLevel::User : WebCore::UserStyleLevel::Author;
}

void WebExtensionAPIScripting::parseRegisteredContentScripts(NSArray *scripts, FirstTimeRegistration firstTimeRegistration, Vector<WebExtensionRegisteredScriptParameters>& parametersVector)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@
static NSString * const allFramesKey = @"allFrames";
static NSString * const codeKey = @"code";
static NSString * const fileKey = @"file";
static NSString * const cssOriginKey = @"cssOrigin";

static NSString * const authorValue = @"author";
static NSString * const userValue = @"user";

static NSString * const emptyURLValue = @"";
static NSString * const emptyTitleValue = @"";
Expand Down Expand Up @@ -526,6 +530,17 @@
if (!boolForKey(options, allFramesKey, false))
parameters.frameIDs = { WebExtensionFrameConstants::MainFrameIdentifier };

if (NSString *origin = options[cssOriginKey]) {
if ([origin isEqualToString:userValue])
parameters.styleLevel = WebCore::UserStyleLevel::User;
else if ([origin isEqualToString:authorValue])
parameters.styleLevel = WebCore::UserStyleLevel::Author;
else {
*outExceptionString = toErrorString(nil, cssOriginKey, @"it must specify either 'author' or 'user'");
return false;
}
}

return true;
}

Expand Down
19 changes: 19 additions & 0 deletions Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtension.mm
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,18 @@
EXPECT_NS_EQUAL(testExtension.errors, @[ ]);
EXPECT_TRUE(testExtension.hasInjectedContent);

testManifestDictionary[@"content_scripts"] = @[ @{ @"css": @[ @NO, @"test.css", @"" ], @"css_origin": @"user", @"matches": @[ @"*://*.example.com/" ] } ];
testExtension = [[_WKWebExtension alloc] _initWithManifestDictionary:testManifestDictionary];

EXPECT_NS_EQUAL(testExtension.errors, @[ ]);
EXPECT_TRUE(testExtension.hasInjectedContent);

testManifestDictionary[@"content_scripts"] = @[ @{ @"css": @[ @NO, @"test.css", @"" ], @"css_origin": @"author", @"matches": @[ @"*://*.example.com/" ] } ];
testExtension = [[_WKWebExtension alloc] _initWithManifestDictionary:testManifestDictionary];

EXPECT_NS_EQUAL(testExtension.errors, @[ ]);
EXPECT_TRUE(testExtension.hasInjectedContent);

// Invalid cases

testManifestDictionary[@"content_scripts"] = @[ ];
Expand Down Expand Up @@ -271,6 +283,13 @@
EXPECT_NE(testExtension.errors.count, 0ul);
EXPECT_NOT_NULL(matchingError(testExtension.errors, _WKWebExtensionErrorInvalidManifestEntry));
EXPECT_TRUE(testExtension.hasInjectedContent);

testManifestDictionary[@"content_scripts"] = @[ @{ @"css": @[ @NO, @"test.css", @"" ], @"css_origin": @"bad", @"matches": @[ @"*://*.example.com/" ] } ];
testExtension = [[_WKWebExtension alloc] _initWithManifestDictionary:testManifestDictionary];

EXPECT_NE(testExtension.errors.count, 0ul);
EXPECT_NOT_NULL(matchingError(testExtension.errors, _WKWebExtensionErrorInvalidManifestEntry));
EXPECT_TRUE(testExtension.hasInjectedContent);
}

TEST(WKWebExtension, PermissionsParsing)
Expand Down
Loading

0 comments on commit f4d3ac2

Please sign in to comment.