5295b93f267ba41d65bd367ebed7637c93969bd1
[WebKit-https.git] / Tools / WebEditingTester / AppDelegate.m
1 /*
2  * Copyright (C) 2015 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 "AppDelegate.h"
27
28 #import "EditingOperations.h"
29 #import "WK1WebDocumentController.h"
30 #import "WK2WebDocumentController.h"
31 #import <WebKit/WKPreferencesPrivate.h>
32 #import <WebKit/WKWebViewConfigurationPrivate.h>
33 #import <WebKit/WebKit.h>
34 #import <WebKit/_WKWebsiteDataStore.h>
35
36 static NSString * const UseWebKit2ByDefaultPreferenceKey = @"UseWebKit2ByDefault";
37
38 @implementation WebEditingAppDelegate
39 - (id)init
40 {
41     self = [super init];
42     if (self)
43         _webDocuments = [[NSMutableSet alloc] init];
44     
45     return self;
46 }
47
48 static WKWebViewConfiguration *defaultConfiguration()
49 {
50     static WKWebViewConfiguration *configuration;
51     
52     if (!configuration) {
53         configuration = [[WKWebViewConfiguration alloc] init];
54         configuration.preferences._fullScreenEnabled = YES;
55         configuration.preferences._developerExtrasEnabled = YES;
56     }
57     
58     return configuration;
59 }
60
61
62 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
63 {
64     [self newEditor:self];
65 }
66
67 - (void)applicationWillTerminate:(NSNotification *)aNotification
68 {
69     for (WebDocumentController *documents in _webDocuments)
70         [documents applicationTerminating];
71 }
72
73 - (IBAction)newEditor:(id)sender
74 {
75     BOOL useWebKit2 = NO;
76
77     if (sender == self)
78         useWebKit2 = [self useWebKit2ByDefault];
79     else if (sender == _newWK2EditorItem)
80         useWebKit2 = YES;
81     
82     WebDocumentController *controller = nil;
83     if (useWebKit2)
84         controller = [[WK2WebDocumentController alloc] initWithConfiguration:defaultConfiguration()];
85     else
86         controller = [[WK1WebDocumentController alloc] initWithWindowNibName:@"WebDocument"];
87     
88     [[controller window] makeKeyAndOrderFront:sender];
89     [_webDocuments addObject:controller];
90     [controller loadContent];
91 }
92
93 - (IBAction)showOperations:(id)sender
94 {
95     static BOOL initialized = NO;
96
97     if (!initialized) {
98         NSFont *font = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSMiniControlSize]];
99         NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
100         NSArray *operations = editingOperations();
101         
102         float maxWidth = 0;
103         for (NSString *operationName in operations)
104             maxWidth = MAX(maxWidth, [operationName sizeWithAttributes:attributes].width);
105
106         maxWidth += 24;
107         
108         unsigned long columnHeight = (operations.count + 2) / 3;
109         
110         NSView *superview = [_operationsPanel contentView];
111         
112         [_operationsPanel setContentSize:NSMakeSize(3 * maxWidth, columnHeight * 16 + 1)];
113         
114         float firstY = NSMaxY([superview frame]) - 1;
115         float y = firstY;
116         float x = 0;
117         for (NSString *operationName in operations) {
118             y -= 16;
119             if (y < 0) {
120                 y = firstY - 16;
121                 x += maxWidth;
122             }
123             NSButton *button = [[NSButton alloc] initWithFrame:NSMakeRect(x, y, maxWidth, 16)];
124             [button setBezelStyle:NSRoundedBezelStyle];
125             [button.cell setControlSize:NSMiniControlSize];
126             [button setFont:font];
127             [button setTitle:operationName];
128             [button setAction:NSSelectorFromString(operationName)];
129             [superview addSubview:button];
130         }
131         
132         [_operationsPanel center];
133         [_operationsPanel setFloatingPanel:YES];
134         [_operationsPanel setBecomesKeyOnlyIfNeeded:YES];
135         initialized = YES;
136     }
137
138     [_operationsPanel orderFront:nil];
139 }
140
141 - (BOOL)useWebKit2ByDefault
142 {
143     return [[NSUserDefaults standardUserDefaults] boolForKey:UseWebKit2ByDefaultPreferenceKey];
144 }
145
146 - (IBAction)toggleUseWK2ByDefault:(id)sender
147 {
148     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
149     [defaults setBool:![defaults boolForKey:UseWebKit2ByDefaultPreferenceKey] forKey:UseWebKit2ByDefaultPreferenceKey];
150 }
151
152 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
153 {
154     SEL action = [menuItem action];
155     
156     if (action == @selector(toggleUseWK2ByDefault:))
157         [menuItem setState:[self useWebKit2ByDefault] ? NSOnState : NSOffState];
158     
159     return YES;
160 }
161
162 @end