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