* DumpRenderTree/DumpRenderTree.m: (dumpRenderTree): Add more auto-release...
[WebKit-https.git] / WebKitTools / DumpRenderTree / DumpRenderTree.m
1 /*
2  * Copyright (C) 2005 Apple Computer, 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import <Foundation/NSURLRequest.h>
30 #import <Foundation/NSError.h>
31
32 #import <WebKit/DOMExtensions.h>
33 #import <WebKit/WebCoreStatistics.h>
34 #import <WebKit/WebDataSource.h>
35 #import <WebKit/WebFrame.h>
36 #import <WebKit/WebFrameLoadDelegate.h>
37 #import <WebKit/WebFrameView.h>
38 #import <WebKit/WebPreferences.h>
39 #import <WebKit/WebView.h>
40
41 @interface WaitUntilDoneDelegate : NSObject
42 @end
43
44 @interface LayoutTestController : NSObject
45 @end
46
47 static void dumpRenderTree(const char *filename);
48
49 static volatile BOOL done;
50 static WebFrame *frame;
51 static BOOL waitLayoutTest;
52 static BOOL dumpAsText;
53
54 int main(int argc, const char *argv[])
55 {
56     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
57
58     WebPreferences *preferences = [WebPreferences standardPreferences];
59     
60     NSString *standardFontFamily = [preferences standardFontFamily];
61     NSString *fixedFontFamily = [preferences fixedFontFamily];
62     NSString *serifFontFamily = [preferences serifFontFamily];
63     NSString *sansSerifFontFamily = [preferences sansSerifFontFamily];
64     NSString *cursiveFontFamily = [preferences cursiveFontFamily];
65     NSString *fantasyFontFamily = [preferences fantasyFontFamily];
66     int defaultFontSize = [preferences defaultFontSize];
67     int defaultFixedFontSize = [preferences defaultFixedFontSize];
68     int minimumFontSize = [preferences minimumFontSize];
69     
70     [preferences setStandardFontFamily:@"Times"];
71     [preferences setFixedFontFamily:@"Courier"];
72     [preferences setSerifFontFamily:@"Times"];
73     [preferences setSansSerifFontFamily:@"Helvetica"];
74     [preferences setCursiveFontFamily:@"Apple Chancery"];
75     [preferences setFantasyFontFamily:@"Papyrus"];
76     [preferences setDefaultFontSize:16];
77     [preferences setDefaultFixedFontSize:13];
78     [preferences setMinimumFontSize:9];
79
80     WebView *webView = [[WebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)];
81     WaitUntilDoneDelegate *delegate = [[WaitUntilDoneDelegate alloc] init];
82     [webView setFrameLoadDelegate:delegate];
83     [webView setUIDelegate:delegate];
84     frame = [webView mainFrame];
85     
86     if (argc == 2 && strcmp(argv[1], "-") == 0) {
87         char filenameBuffer[2048];
88         while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) {
89             char *newLineCharacter = strchr(filenameBuffer, '\n');
90             if (newLineCharacter) {
91                 *newLineCharacter = '\0';
92             }
93             dumpRenderTree(filenameBuffer);
94             puts("#EOF");
95             fflush(stdout);
96         }
97     } else {
98         int i;
99         for (i = 1; i != argc; ++i) {
100             dumpRenderTree(argv[i]);
101         }
102     }
103     
104     [preferences setStandardFontFamily:standardFontFamily];
105     [preferences setFixedFontFamily:fixedFontFamily];
106     [preferences setSerifFontFamily:serifFontFamily];
107     [preferences setSansSerifFontFamily:sansSerifFontFamily];
108     [preferences setCursiveFontFamily:cursiveFontFamily];
109     [preferences setFantasyFontFamily:fantasyFontFamily];
110     [preferences setDefaultFontSize:defaultFontSize];
111     [preferences setDefaultFixedFontSize:defaultFixedFontSize];
112     [preferences setMinimumFontSize:minimumFontSize];
113
114     [pool release];
115     return 0;
116 }
117
118 static void dump(void)
119 {
120     NSString *result = nil;
121     if (dumpAsText) {
122         DOMDocument *document = [frame DOMDocument];
123         if ([document isKindOfClass:[DOMHTMLDocument class]]) {
124             result = [[[(DOMHTMLDocument *)document body] innerText] stringByAppendingString:@"\n"];
125         }
126     } else {
127         result = [frame renderTreeAsExternalRepresentation];
128     }
129     if (!result) {
130         puts("error");
131     } else {
132         fputs([result UTF8String], stdout);
133     }
134     done = YES;
135 }
136
137 @implementation WaitUntilDoneDelegate
138
139 - (void)webView:(WebView *)c locationChangeDone:(NSError *)error forDataSource:(WebDataSource *)dataSource
140 {
141     if (!waitLayoutTest && [dataSource webFrame] == frame) {
142         dump();
143     }
144 }
145
146 - (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame
147 {
148     [self webView:sender locationChangeDone:error forDataSource:[frame provisionalDataSource]];
149 }
150
151 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
152 {
153     [self webView:sender locationChangeDone:nil forDataSource:[frame dataSource]];
154 }
155
156 - (void)webView:(WebView *)sender didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame
157 {
158     [self webView:sender locationChangeDone:error forDataSource:[frame dataSource]];
159 }
160
161 - (void)webView:(WebView *)sender windowScriptObjectAvailable:(WebScriptObject *)obj 
162
163     LayoutTestController *ltc = [[LayoutTestController alloc] init];
164     [(id)obj setValue:ltc forKey:@"layoutTestController"];
165     [ltc release];
166
167 }
168
169 - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message
170 {
171     printf("ALERT: %s\n", [message UTF8String]);
172 }
173
174 @end
175
176 @implementation LayoutTestController
177
178 + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
179 {
180     if (aSelector == @selector(waitUntilDone) || aSelector == @selector(notifyDone) || aSelector == @selector(dumpAsText))
181         return NO;
182     return YES;
183 }
184
185 - (void)waitUntilDone 
186 {
187     waitLayoutTest = YES;
188 }
189
190 - (void)notifyDone
191 {
192     dump();
193     waitLayoutTest = NO;
194 }
195
196 - (void)dumpAsText
197 {
198     dumpAsText = YES;
199 }
200
201 @end
202
203 static void dumpRenderTree(const char *filename)
204 {
205     CFStringRef filenameString = CFStringCreateWithCString(NULL, filename, kCFStringEncodingUTF8);
206     if (filenameString == NULL) {
207         fprintf(stderr, "can't parse filename as UTF-8\n");
208         return;
209     }
210     CFURLRef URL = CFURLCreateWithFileSystemPath(NULL, filenameString, kCFURLPOSIXPathStyle, FALSE);
211     if (URL == NULL) {
212         fprintf(stderr, "can't turn %s into a CFURL\n", filename);
213         return;
214     }
215
216     done = NO;
217     dumpAsText = NO;
218     waitLayoutTest = NO;
219
220     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
221     [frame loadRequest:[NSURLRequest requestWithURL:(NSURL *)URL]];
222     [pool release];
223     while (!done) {
224         pool = [[NSAutoreleasePool alloc] init];
225         [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
226         [pool release];
227     }
228 }