Reviewed by Maciej
[WebKit-https.git] / WebKitTools / DumpRenderTree / NavigationController.m
1 /*
2  * Copyright (C) 2006 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 <WebKit/WebFrame.h>
30 #import <WebKit/WebScriptObject.h>
31 #import "NavigationController.h"
32
33 @implementation NavigationController
34 + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
35 {
36     if (selector == @selector(evaluateWebScript:afterBackForwardNavigation:))
37         return NO;
38     return YES;
39 }
40
41 + (NSString *)webScriptNameForSelector:(SEL)selector
42 {
43     if (selector == @selector(evaluateWebScript:afterBackForwardNavigation:))
44         return @"evalAfterBackForwardNavigation";
45     return nil;
46 }
47
48 - (void)setPendingScript:(NSString *)script
49 {
50     if (script != pendingScript) {
51         [pendingScript release];
52         pendingScript = [script copy];
53     }
54 }
55
56 - (void)setPendingRequest:(NSURLRequest *)request
57 {
58     if (request != pendingRequest) {
59         [pendingRequest release];
60         pendingRequest = [request copy];
61     }
62 }
63
64 - (void)evaluateWebScript:(NSString *)script afterBackForwardNavigation:(NSString *)navigation
65 {
66     // Allow both arguments to be optional
67     if (![script isKindOfClass:[NSString class]])
68         script = @"";
69     if (![navigation isKindOfClass:[NSString class]])
70         navigation = @"about:blank";
71     
72     [self setPendingScript:script];
73     [self setPendingRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:navigation]]];
74     pendingAction = Load;
75 }
76
77 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
78 {
79     if (frame == [[frame webView] mainFrame]) {
80         switch (pendingAction) {
81             case Load:
82                 pendingAction = GoBack;
83                 [frame loadRequest:pendingRequest];
84                 [self setPendingRequest:nil];
85                 break;
86             case GoBack:
87                 pendingAction = ExecuteScript;
88                 [[frame webView] goBack];
89                 break;
90             case ExecuteScript:
91                 pendingAction = None;
92                 [[[frame webView] windowScriptObject] evaluateWebScript:pendingScript];
93                 [self setPendingScript:nil];
94                 break;
95             case None:
96             default:
97                 break;
98         }
99     }
100 }
101
102 - (void)dealloc
103 {
104     [self setPendingScript:nil];
105     [self setPendingRequest:nil];
106     [super dealloc];
107 }
108 @end
109