diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-17 16:21:14 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-17 16:21:14 +0200 |
commit | 8995b83bcbfbb68245f779b64e5517627c6cc6ea (patch) | |
tree | 17985605dab9263cc2444bd4d45f189e142cca7c /Tools/TestWebKitAPI/Tests/WebKit2ObjC | |
parent | b9c9652036d5e9f1e29c574f40bc73a35c81ace6 (diff) | |
download | qtwebkit-8995b83bcbfbb68245f779b64e5517627c6cc6ea.tar.gz |
Imported WebKit commit cf4f8fc6f19b0629f51860cb2d4b25e139d07e00 (http://svn.webkit.org/repository/webkit/trunk@131592)
New snapshot that includes the build fixes for Mac OS X 10.6 and earlier as well
as the previously cherry-picked changes
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKit2ObjC')
-rw-r--r-- | Tools/TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm b/Tools/TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm new file mode 100644 index 000000000..d87ad5ed5 --- /dev/null +++ b/Tools/TestWebKitAPI/Tests/WebKit2ObjC/UserContentTest.mm @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "config.h" +#import "Test.h" + +#import "PlatformUtilities.h" +#import <JavaScriptCore/JSRetainPtr.h> +#import <JavaScriptCore/JavaScriptCore.h> +#import <WebKit2/WKSerializedScriptValue.h> +#import <WebKit2/WKViewPrivate.h> +#import <WebKit2/WebKit2.h> + + +static bool testFinished = false; +static NSString *htmlString = @"<body style='background-color: red'>"; +static NSString *userStyleSheet = @"body { background-color: green !important; }"; +static const char* backgroundColorScript = "window.getComputedStyle(document.body, null).getPropertyValue('background-color')"; +static const char* greenInRGB = "rgb(0, 128, 0)"; +static const char* redInRGB = "rgb(255, 0, 0)"; +static const char* userScriptTestProperty = "window._userScriptInstalled"; + +typedef void (^OnLoadBlock)(WKBrowsingContextController *); + +@interface UserContentTestLoadDelegate : NSObject <WKBrowsingContextLoadDelegate> +{ + OnLoadBlock _onLoadBlock; +} + +@property (nonatomic, copy) OnLoadBlock onLoadBlock; + +- (id)initWithBlockToRunOnLoad:(OnLoadBlock)block; + +@end + +@implementation UserContentTestLoadDelegate + +@synthesize onLoadBlock = _onLoadBlock; + +- (id)initWithBlockToRunOnLoad:(OnLoadBlock)block +{ + if (!(self = [super init])) + return nil; + + self.onLoadBlock = block; + return self; +} + +- (void)browsingContextControllerDidFinishLoad:(WKBrowsingContextController *)sender +{ + if (_onLoadBlock) + _onLoadBlock(sender); +} + +@end + +namespace { + class WebKit2UserContentTest : public ::testing::Test { + public: + WKProcessGroup *processGroup; + WKBrowsingContextGroup *browsingContextGroup; + + WebKit2UserContentTest() + : processGroup(nil) + , browsingContextGroup(nil) + { + } + + virtual void SetUp() + { + processGroup = [[WKProcessGroup alloc] init]; + browsingContextGroup = [[WKBrowsingContextGroup alloc] initWithIdentifier:@"UserContentIdentifier"]; + } + + virtual void TearDown() + { + [browsingContextGroup release]; + [processGroup release]; + } + }; +} // namespace + +static void expectScriptValueIsString(WKSerializedScriptValueRef serializedScriptValue, const char* expectedValue) +{ + JSGlobalContextRef scriptContext = JSGlobalContextCreate(0); + + JSValueRef scriptValue = WKSerializedScriptValueDeserialize(serializedScriptValue, scriptContext, 0); + EXPECT_TRUE(JSValueIsString(scriptContext, scriptValue)); + + JSRetainPtr<JSStringRef> scriptString(Adopt, JSValueToStringCopy(scriptContext, scriptValue, 0)); + EXPECT_TRUE(JSStringIsEqualToUTF8CString(scriptString.get(), expectedValue)); + + JSGlobalContextRelease(scriptContext); +} + +static void expectScriptValueIsBoolean(WKSerializedScriptValueRef serializedScriptValue, bool expectedValue) +{ + JSGlobalContextRef scriptContext = JSGlobalContextCreate(0); + + JSValueRef scriptValue = WKSerializedScriptValueDeserialize(serializedScriptValue, scriptContext, 0); + EXPECT_TRUE(JSValueIsBoolean(scriptContext, scriptValue)); + EXPECT_EQ(JSValueToBoolean(scriptContext, scriptValue), expectedValue); + + JSGlobalContextRelease(scriptContext); +} + +static void expectScriptValueIsUndefined(WKSerializedScriptValueRef serializedScriptValue) +{ + JSGlobalContextRef scriptContext = JSGlobalContextCreate(0); + + JSValueRef scriptValue = WKSerializedScriptValueDeserialize(serializedScriptValue, scriptContext, 0); + EXPECT_TRUE(JSValueIsUndefined(scriptContext, scriptValue)); + + JSGlobalContextRelease(scriptContext); +} + +TEST_F(WebKit2UserContentTest, AddUserStyleSheetBeforeCreatingView) +{ + testFinished = false; + [browsingContextGroup addUserStyleSheet:userStyleSheet baseURL:nil whitelistedURLPatterns:nil blacklistedURLPatterns:nil mainFrameOnly:YES]; + + WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup]; + WKStringRef backgroundColorQuery = WKStringCreateWithUTF8CString(backgroundColorScript); + wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) { + WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, backgroundColorQuery, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) { + expectScriptValueIsString(serializedScriptValue, greenInRGB); + testFinished = true; + WKRelease(backgroundColorQuery); + }); + }]; + + [wkView.browsingContextController loadHTMLString:htmlString baseURL:nil]; + + TestWebKitAPI::Util::run(&testFinished); +} + +TEST_F(WebKit2UserContentTest, AddUserStyleSheetAfterCreatingView) +{ + testFinished = false; + + WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup]; + WKStringRef backgroundColorQuery = WKStringCreateWithUTF8CString(backgroundColorScript); + wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) { + WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, backgroundColorQuery, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) { + expectScriptValueIsString(serializedScriptValue, greenInRGB); + testFinished = true; + WKRelease(backgroundColorQuery); + }); + }]; + + [browsingContextGroup addUserStyleSheet:userStyleSheet baseURL:nil whitelistedURLPatterns:nil blacklistedURLPatterns:nil mainFrameOnly:YES]; + + [wkView.browsingContextController loadHTMLString:htmlString baseURL:nil]; + + TestWebKitAPI::Util::run(&testFinished); +} + +TEST_F(WebKit2UserContentTest, RemoveAllUserStyleSheets) +{ + testFinished = false; + [browsingContextGroup addUserStyleSheet:userStyleSheet baseURL:nil whitelistedURLPatterns:nil blacklistedURLPatterns:nil mainFrameOnly:YES]; + + WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup]; + WKStringRef backgroundColorQuery = WKStringCreateWithUTF8CString(backgroundColorScript); + wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) { + WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, backgroundColorQuery, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) { + expectScriptValueIsString(serializedScriptValue, redInRGB); + testFinished = true; + WKRelease(backgroundColorQuery); + }); + }]; + + [browsingContextGroup removeAllUserStyleSheets]; + + [wkView.browsingContextController loadHTMLString:htmlString baseURL:nil]; + + TestWebKitAPI::Util::run(&testFinished); +} + +TEST_F(WebKit2UserContentTest, AddUserScriptBeforeCreatingView) +{ + testFinished = false; + [browsingContextGroup addUserScript:[NSString stringWithFormat:@"%s = true;", userScriptTestProperty] baseURL:nil whitelistedURLPatterns:nil blacklistedURLPatterns:nil injectionTime:kWKInjectAtDocumentStart mainFrameOnly:YES]; + + WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup]; + WKStringRef userScriptTestPropertyString = WKStringCreateWithUTF8CString(userScriptTestProperty); + wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) { + WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, userScriptTestPropertyString, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) { + expectScriptValueIsBoolean(serializedScriptValue, true); + testFinished = true; + WKRelease(userScriptTestPropertyString); + }); + }]; + + [wkView.browsingContextController loadHTMLString:@"" baseURL:nil]; + + TestWebKitAPI::Util::run(&testFinished); +} + +TEST_F(WebKit2UserContentTest, AddUserScriptAfterCreatingView) +{ + testFinished = false; + + WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup]; + WKStringRef userScriptTestPropertyString = WKStringCreateWithUTF8CString(userScriptTestProperty); + wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) { + WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, userScriptTestPropertyString, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) { + expectScriptValueIsBoolean(serializedScriptValue, true); + testFinished = true; + WKRelease(userScriptTestPropertyString); + }); + }]; + + [browsingContextGroup addUserScript:[NSString stringWithFormat:@"%s = true;", userScriptTestProperty] baseURL:nil whitelistedURLPatterns:nil blacklistedURLPatterns:nil injectionTime:kWKInjectAtDocumentStart mainFrameOnly:YES]; + + [wkView.browsingContextController loadHTMLString:@"" baseURL:nil]; + + TestWebKitAPI::Util::run(&testFinished); +} + +TEST_F(WebKit2UserContentTest, RemoveAllUserScripts) +{ + testFinished = false; + [browsingContextGroup addUserScript:[NSString stringWithFormat:@"%s = true;", userScriptTestProperty] baseURL:nil whitelistedURLPatterns:nil blacklistedURLPatterns:nil injectionTime:kWKInjectAtDocumentStart mainFrameOnly:YES]; + + WKView *wkView = [[WKView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) processGroup:processGroup browsingContextGroup:browsingContextGroup]; + WKStringRef userScriptTestPropertyString = WKStringCreateWithUTF8CString(userScriptTestProperty); + wkView.browsingContextController.loadDelegate = [[UserContentTestLoadDelegate alloc] initWithBlockToRunOnLoad:^(WKBrowsingContextController *sender) { + WKPageRunJavaScriptInMainFrame_b(wkView.pageRef, userScriptTestPropertyString, ^(WKSerializedScriptValueRef serializedScriptValue, WKErrorRef error) { + expectScriptValueIsUndefined(serializedScriptValue); + testFinished = true; + WKRelease(userScriptTestPropertyString); + }); + }]; + + [browsingContextGroup removeAllUserScripts]; + + [wkView.browsingContextController loadHTMLString:htmlString baseURL:nil]; + + TestWebKitAPI::Util::run(&testFinished); +} |