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