1/* 2 * Copyright (C) 2005, 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 "EditingDelegate.h" 31 32#import "DumpRenderTree.h" 33#import "LayoutTestController.h" 34#import <WebKit/WebKit.h> 35 36@interface DOMNode (dumpPath) 37- (NSString *)dumpPath; 38@end 39 40@implementation DOMNode (dumpPath) 41- (NSString *)dumpPath 42{ 43 DOMNode *parent = [self parentNode]; 44 NSString *str = [NSString stringWithFormat:@"%@", [self nodeName]]; 45 if (parent != nil) { 46 str = [str stringByAppendingString:@" > "]; 47 str = [str stringByAppendingString:[parent dumpPath]]; 48 } 49 return str; 50} 51@end 52 53@interface DOMRange (dump) 54- (NSString *)dump; 55@end 56 57@implementation DOMRange (dump) 58- (NSString *)dump 59{ 60 return [NSString stringWithFormat:@"range from %ld of %@ to %ld of %@", [self startOffset], [[self startContainer] dumpPath], [self endOffset], [[self endContainer] dumpPath]]; 61} 62@end 63 64@implementation EditingDelegate 65 66- (id)init 67{ 68 self = [super init]; 69 if (!self) 70 return nil; 71 acceptsEditing = YES; 72 return self; 73} 74 75- (BOOL)webView:(WebView *)webView shouldBeginEditingInDOMRange:(DOMRange *)range 76{ 77 if (!done && gLayoutTestController->dumpEditingCallbacks()) 78 printf("EDITING DELEGATE: shouldBeginEditingInDOMRange:%s\n", [[range dump] UTF8String]); 79 return acceptsEditing; 80} 81 82- (BOOL)webView:(WebView *)webView shouldEndEditingInDOMRange:(DOMRange *)range 83{ 84 if (!done && gLayoutTestController->dumpEditingCallbacks()) 85 printf("EDITING DELEGATE: shouldEndEditingInDOMRange:%s\n", [[range dump] UTF8String]); 86 return acceptsEditing; 87} 88 89- (BOOL)webView:(WebView *)webView shouldInsertNode:(DOMNode *)node replacingDOMRange:(DOMRange *)range givenAction:(WebViewInsertAction)action 90{ 91 static const char *insertactionstring[] = { 92 "WebViewInsertActionTyped", 93 "WebViewInsertActionPasted", 94 "WebViewInsertActionDropped", 95 }; 96 97 if (!done && gLayoutTestController->dumpEditingCallbacks()) 98 printf("EDITING DELEGATE: shouldInsertNode:%s replacingDOMRange:%s givenAction:%s\n", [[node dumpPath] UTF8String], [[range dump] UTF8String], insertactionstring[action]); 99 return acceptsEditing; 100} 101 102- (BOOL)webView:(WebView *)webView shouldInsertText:(NSString *)text replacingDOMRange:(DOMRange *)range givenAction:(WebViewInsertAction)action 103{ 104 static const char *insertactionstring[] = { 105 "WebViewInsertActionTyped", 106 "WebViewInsertActionPasted", 107 "WebViewInsertActionDropped", 108 }; 109 110 if (!done && gLayoutTestController->dumpEditingCallbacks()) 111 printf("EDITING DELEGATE: shouldInsertText:%s replacingDOMRange:%s givenAction:%s\n", [[text description] UTF8String], [[range dump] UTF8String], insertactionstring[action]); 112 return acceptsEditing; 113} 114 115- (BOOL)webView:(WebView *)webView shouldDeleteDOMRange:(DOMRange *)range 116{ 117 if (!done && gLayoutTestController->dumpEditingCallbacks()) 118 printf("EDITING DELEGATE: shouldDeleteDOMRange:%s\n", [[range dump] UTF8String]); 119 return acceptsEditing; 120} 121 122- (BOOL)webView:(WebView *)webView shouldShowDeleteInterfaceForElement:(DOMHTMLElement *)element 123{ 124 return [[element className] isEqualToString:@"needsDeletionUI"]; 125} 126 127- (BOOL)webView:(WebView *)webView shouldChangeSelectedDOMRange:(DOMRange *)currentRange toDOMRange:(DOMRange *)proposedRange affinity:(NSSelectionAffinity)selectionAffinity stillSelecting:(BOOL)flag 128{ 129 static const char *affinitystring[] = { 130 "NSSelectionAffinityUpstream", 131 "NSSelectionAffinityDownstream" 132 }; 133 static const char *boolstring[] = { 134 "FALSE", 135 "TRUE" 136 }; 137 138 if (!done && gLayoutTestController->dumpEditingCallbacks()) 139 printf("EDITING DELEGATE: shouldChangeSelectedDOMRange:%s toDOMRange:%s affinity:%s stillSelecting:%s\n", [[currentRange dump] UTF8String], [[proposedRange dump] UTF8String], affinitystring[selectionAffinity], boolstring[flag]); 140 return acceptsEditing; 141} 142 143- (BOOL)webView:(WebView *)webView shouldApplyStyle:(DOMCSSStyleDeclaration *)style toElementsInDOMRange:(DOMRange *)range 144{ 145 if (!done && gLayoutTestController->dumpEditingCallbacks()) 146 printf("EDITING DELEGATE: shouldApplyStyle:%s toElementsInDOMRange:%s\n", [[style description] UTF8String], [[range dump] UTF8String]); 147 return acceptsEditing; 148} 149 150- (BOOL)webView:(WebView *)webView shouldChangeTypingStyle:(DOMCSSStyleDeclaration *)currentStyle toStyle:(DOMCSSStyleDeclaration *)proposedStyle 151{ 152 if (!done && gLayoutTestController->dumpEditingCallbacks()) 153 printf("EDITING DELEGATE: shouldChangeTypingStyle:%s toStyle:%s\n", [[currentStyle description] UTF8String], [[proposedStyle description] UTF8String]); 154 return acceptsEditing; 155} 156 157- (void)webViewDidBeginEditing:(NSNotification *)notification 158{ 159 if (!done && gLayoutTestController->dumpEditingCallbacks()) 160 printf("EDITING DELEGATE: webViewDidBeginEditing:%s\n", [[notification name] UTF8String]); 161} 162 163- (void)webViewDidChange:(NSNotification *)notification 164{ 165 if (!done && gLayoutTestController->dumpEditingCallbacks()) 166 printf("EDITING DELEGATE: webViewDidChange:%s\n", [[notification name] UTF8String]); 167} 168 169- (void)webViewDidEndEditing:(NSNotification *)notification 170{ 171 if (!done && gLayoutTestController->dumpEditingCallbacks()) 172 printf("EDITING DELEGATE: webViewDidEndEditing:%s\n", [[notification name] UTF8String]); 173} 174 175- (void)webViewDidChangeTypingStyle:(NSNotification *)notification 176{ 177 if (!done && gLayoutTestController->dumpEditingCallbacks()) 178 printf("EDITING DELEGATE: webViewDidChangeTypingStyle:%s\n", [[notification name] UTF8String]); 179} 180 181- (void)webViewDidChangeSelection:(NSNotification *)notification 182{ 183 if (!done && gLayoutTestController->dumpEditingCallbacks()) 184 printf("EDITING DELEGATE: webViewDidChangeSelection:%s\n", [[notification name] UTF8String]); 185} 186 187- (void)setAcceptsEditing:(BOOL)newAcceptsEditing 188{ 189 acceptsEditing = newAcceptsEditing; 190} 191 192@end 193