AX: Implement word related text marker functions using TextIterator
[WebKit-https.git] / Tools / WebEditingTester / WK2WebDocumentController.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 "WK2WebDocumentController.h"
27
28 #import <WebKit/WKFrameInfo.h>
29 #import <WebKit/WKNavigationDelegate.h>
30 #import <WebKit/WKPreferencesPrivate.h>
31 #import <WebKit/WKUIDelegate.h>
32 #import <WebKit/WKWebView.h>
33 #import <WebKit/WKWebViewConfigurationPrivate.h>
34 #import <WebKit/WKWebViewPrivate.h>
35 #import <WebKit/_WKWebsiteDataStore.h>
36
37 @interface WK2WebDocumentController () <WKUIDelegate, NSTextFinderBarContainer>
38 @property (nonatomic, strong) WKWebView *webView;
39 @end
40
41 @implementation WK2WebDocumentController {
42     NSTextFinder *_textFinder;
43     NSView *_textFindBarView;
44     BOOL _findBarVisible;
45 }
46
47 static WKWebViewConfiguration *defaultConfiguration()
48 {
49     static WKWebViewConfiguration *configuration;
50
51     if (!configuration) {
52         configuration = [[WKWebViewConfiguration alloc] init];
53         configuration.preferences._fullScreenEnabled = YES;
54         configuration.preferences._developerExtrasEnabled = YES;
55     }
56
57     return configuration;
58 }
59
60 - (IBAction)pasteAsMarkup:(id)sender
61 {
62     NSLog(@"To be implemented");
63 }
64
65 - (void)awakeFromNib
66 {
67     self.webView = [[WKWebView alloc] initWithFrame:[containerView bounds] configuration:defaultConfiguration()];
68     _webView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
69     _webView._editable = YES;
70     _webView.UIDelegate = self;
71     
72     [containerView addSubview:_webView];
73     self.window.title = @"WebEditor [WK2]";
74
75     _textFinder = [[NSTextFinder alloc] init];
76     _textFinder.incrementalSearchingEnabled = YES;
77     _textFinder.incrementalSearchingShouldDimContentView = YES;
78     _textFinder.client = _webView;
79     _textFinder.findBarContainer = self;
80 }
81
82 - (void)loadHTMLString:(NSString *)content
83 {
84     NSStringEncoding encoding = NSUnicodeStringEncoding;
85
86     NSData *data = [content dataUsingEncoding:encoding];
87     CFStringEncoding cfEncoding = CFStringConvertNSStringEncodingToEncoding(encoding);
88     NSString *textEncodingName = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(cfEncoding);
89
90     [_webView _loadData:data MIMEType:@"text/html" characterEncodingName:textEncodingName baseURL:[NSURL URLWithString:@"x-webdoc:/klsadfgjlfsdj/"] userData:nil];
91 }
92
93 - (void)performTextFinderAction:(id)sender
94 {
95     [_textFinder performAction:[sender tag]];
96 }
97
98 - (NSView *)findBarView
99 {
100     return _textFindBarView;
101 }
102
103 - (void)setFindBarView:(NSView *)findBarView
104 {
105     if (_textFindBarView)
106         [_textFindBarView removeFromSuperview];
107     _textFindBarView = findBarView;
108     _findBarVisible = YES;
109     [containerView addSubview:_textFindBarView];
110     [self layout];
111 }
112
113 - (NSView *)contentView
114 {
115     return _webView;
116 }
117
118 - (BOOL)isFindBarVisible
119 {
120     return _findBarVisible;
121 }
122
123 - (void)setFindBarVisible:(BOOL)findBarVisible
124 {
125     _findBarVisible = findBarVisible;
126     if (findBarVisible)
127         [containerView addSubview:_textFindBarView];
128     else
129         [_textFindBarView removeFromSuperview];
130
131     [self layout];
132 }
133
134 - (void)findBarViewDidChangeHeight
135 {
136     [self layout];
137 }
138
139 - (void)layout
140 {
141     CGRect containerBounds = [containerView bounds];
142
143     if (!_findBarVisible) {
144         _webView.frame = containerBounds;
145     } else {
146         _textFindBarView.frame = CGRectMake(containerBounds.origin.x, containerBounds.origin.y + containerBounds.size.height - _textFindBarView.frame.size.height, containerBounds.size.width, _textFindBarView.frame.size.height);
147         _webView.frame = CGRectMake(containerBounds.origin.x, containerBounds.origin.y, containerBounds.size.width, containerBounds.size.height - _textFindBarView.frame.size.height);
148     }
149 }
150
151 @end