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