1/* 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#import "config.h" 27#import "WKBrowsingContextGroupInternal.h" 28#import "WKBrowsingContextGroupPrivate.h" 29 30#if WK_API_ENABLED 31 32#import "APIArray.h" 33#import "APIString.h" 34#import "WKArray.h" 35#import "WKPageGroup.h" 36#import "WKPreferences.h" 37#import "WKRetainPtr.h" 38#import "WKSharedAPICast.h" 39#import "WKStringCF.h" 40#import "WKURL.h" 41#import "WKURLCF.h" 42#import <wtf/Vector.h> 43 44using namespace WebKit; 45 46@implementation WKBrowsingContextGroup { 47 API::ObjectStorage<WebPageGroup> _pageGroup; 48} 49 50- (void)dealloc 51{ 52 _pageGroup->~WebPageGroup(); 53 54 [super dealloc]; 55} 56 57- (id)initWithIdentifier:(NSString *)identifier 58{ 59 self = [super init]; 60 if (!self) 61 return nil; 62 63 API::Object::constructInWrapper<WebPageGroup>(self, identifier); 64 65 // Give the WKBrowsingContextGroup a identifier-less preferences, so that they 66 // don't get automatically written to the disk. The automatic writing has proven 67 // confusing to users of the API. 68 WKRetainPtr<WKPreferencesRef> preferences = adoptWK(WKPreferencesCreate()); 69 WKPageGroupSetPreferences(toAPI(_pageGroup.get()), preferences.get()); 70 71 return self; 72} 73 74- (BOOL)allowsJavaScript 75{ 76 return WKPreferencesGetJavaScriptEnabled(WKPageGroupGetPreferences(toAPI(_pageGroup.get()))); 77} 78 79- (void)setAllowsJavaScript:(BOOL)allowsJavaScript 80{ 81 WKPreferencesSetJavaScriptEnabled(WKPageGroupGetPreferences(toAPI(_pageGroup.get())), allowsJavaScript); 82} 83 84- (BOOL)allowsJavaScriptMarkup 85{ 86 return WKPreferencesGetJavaScriptMarkupEnabled(WKPageGroupGetPreferences(toAPI(_pageGroup.get()))); 87} 88 89- (void)setAllowsJavaScriptMarkup:(BOOL)allowsJavaScriptMarkup 90{ 91 WKPreferencesSetJavaScriptMarkupEnabled(WKPageGroupGetPreferences(toAPI(_pageGroup.get())), allowsJavaScriptMarkup); 92} 93 94- (BOOL)allowsPlugIns 95{ 96 return WKPreferencesGetPluginsEnabled(WKPageGroupGetPreferences(toAPI(_pageGroup.get()))); 97} 98 99- (void)setAllowsPlugIns:(BOOL)allowsPlugIns 100{ 101 WKPreferencesSetPluginsEnabled(WKPageGroupGetPreferences(toAPI(_pageGroup.get())), allowsPlugIns); 102} 103 104- (BOOL)privateBrowsingEnabled 105{ 106 return WKPreferencesGetPrivateBrowsingEnabled(WKPageGroupGetPreferences(toAPI(_pageGroup.get()))); 107} 108 109- (void)setPrivateBrowsingEnabled:(BOOL)enablePrivateBrowsing 110{ 111 WKPreferencesSetPrivateBrowsingEnabled(WKPageGroupGetPreferences(toAPI(_pageGroup.get())), enablePrivateBrowsing); 112} 113 114static WKRetainPtr<WKArrayRef> createWKArray(NSArray *array) 115{ 116 NSUInteger count = [array count]; 117 118 if (!count) 119 return nullptr; 120 121 Vector<RefPtr<API::Object>> strings; 122 strings.reserveInitialCapacity(count); 123 124 for (id entry in array) { 125 if ([entry isKindOfClass:[NSString class]]) 126 strings.uncheckedAppend(adoptRef(toImpl(WKStringCreateWithCFString((CFStringRef)entry)))); 127 } 128 129 return toAPI(API::Array::create(WTF::move(strings)).leakRef()); 130} 131 132-(void)addUserStyleSheet:(NSString *)source baseURL:(NSURL *)baseURL whitelistedURLPatterns:(NSArray *)whitelist blacklistedURLPatterns:(NSArray *)blacklist mainFrameOnly:(BOOL)mainFrameOnly 133{ 134 if (!source) 135 CRASH(); 136 137 WKRetainPtr<WKStringRef> wkSource = adoptWK(WKStringCreateWithCFString((CFStringRef)source)); 138 WKRetainPtr<WKURLRef> wkBaseURL = adoptWK(WKURLCreateWithCFURL((CFURLRef)baseURL)); 139 auto wkWhitelist = createWKArray(whitelist); 140 auto wkBlacklist = createWKArray(blacklist); 141 WKUserContentInjectedFrames injectedFrames = mainFrameOnly ? kWKInjectInTopFrameOnly : kWKInjectInAllFrames; 142 143 WKPageGroupAddUserStyleSheet(toAPI(_pageGroup.get()), wkSource.get(), wkBaseURL.get(), wkWhitelist.get(), wkBlacklist.get(), injectedFrames); 144} 145 146- (void)removeAllUserStyleSheets 147{ 148 WKPageGroupRemoveAllUserStyleSheets(toAPI(_pageGroup.get())); 149} 150 151- (void)addUserScript:(NSString *)source baseURL:(NSURL *)baseURL whitelistedURLPatterns:(NSArray *)whitelist blacklistedURLPatterns:(NSArray *)blacklist injectionTime:(_WKUserScriptInjectionTime)injectionTime mainFrameOnly:(BOOL)mainFrameOnly 152{ 153 if (!source) 154 CRASH(); 155 156 WKRetainPtr<WKStringRef> wkSource = adoptWK(WKStringCreateWithCFString((CFStringRef)source)); 157 WKRetainPtr<WKURLRef> wkBaseURL = adoptWK(WKURLCreateWithCFURL((CFURLRef)baseURL)); 158 auto wkWhitelist = createWKArray(whitelist); 159 auto wkBlacklist = createWKArray(blacklist); 160 WKUserContentInjectedFrames injectedFrames = mainFrameOnly ? kWKInjectInTopFrameOnly : kWKInjectInAllFrames; 161 162 WKPageGroupAddUserScript(toAPI(_pageGroup.get()), wkSource.get(), wkBaseURL.get(), wkWhitelist.get(), wkBlacklist.get(), injectedFrames, injectionTime); 163} 164 165- (void)removeAllUserScripts 166{ 167 WKPageGroupRemoveAllUserScripts(toAPI(_pageGroup.get())); 168} 169 170#pragma mark WKObject protocol implementation 171 172- (API::Object&)_apiObject 173{ 174 return *_pageGroup; 175} 176 177@end 178 179@implementation WKBrowsingContextGroup (Private) 180 181- (WKPageGroupRef)_pageGroupRef 182{ 183 return toAPI(_pageGroup.get()); 184} 185 186@end 187 188#endif // WK_API_ENABLED 189