1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/* 2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. 3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without 5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions 6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met: 7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1. Redistributions of source code must retain the above copyright 9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * notice, this list of conditions and the following disclaimer. 10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2. Redistributions in binary form must reproduce the above copyright 11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * notice, this list of conditions and the following disclaimer in the 12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * documentation and/or other materials provided with the distribution. 13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * its contributors may be used to endorse or promote products derived 15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * from this software without specific prior written permission. 16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */ 28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "config.h" 30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "EditingDelegate.h" 31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "DumpRenderTree.h" 33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "LayoutTestController.h" 34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebKit/WebKit.h> 35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@interface DOMNode (dumpPath) 37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSString *)dumpPath; 38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@end 39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@implementation DOMNode (dumpPath) 41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSString *)dumpPath 42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark DOMNode *parent = [self parentNode]; 44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark NSString *str = [NSString stringWithFormat:@"%@", [self nodeName]]; 45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (parent != nil) { 46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark str = [str stringByAppendingString:@" > "]; 47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark str = [str stringByAppendingString:[parent dumpPath]]; 48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return str; 50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@end 52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@interface DOMRange (dump) 54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSString *)dump; 55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@end 56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@implementation DOMRange (dump) 58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSString *)dump 59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return [NSString stringWithFormat:@"range from %ld of %@ to %ld of %@", [self startOffset], [[self startContainer] dumpPath], [self endOffset], [[self endContainer] dumpPath]]; 61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@end 63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@implementation EditingDelegate 65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (id)init 67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark self = [super init]; 69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!self) 70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return nil; 71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark acceptsEditing = YES; 72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return self; 73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldBeginEditingInDOMRange:(DOMRange *)range 76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: shouldBeginEditingInDOMRange:%s\n", [[range dump] UTF8String]); 79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return acceptsEditing; 80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldEndEditingInDOMRange:(DOMRange *)range 83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: shouldEndEditingInDOMRange:%s\n", [[range dump] UTF8String]); 86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return acceptsEditing; 87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldInsertNode:(DOMNode *)node replacingDOMRange:(DOMRange *)range givenAction:(WebViewInsertAction)action 90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark static const char *insertactionstring[] = { 92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "WebViewInsertActionTyped", 93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "WebViewInsertActionPasted", 94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "WebViewInsertActionDropped", 95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark }; 96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: shouldInsertNode:%s replacingDOMRange:%s givenAction:%s\n", [[node dumpPath] UTF8String], [[range dump] UTF8String], insertactionstring[action]); 99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return acceptsEditing; 100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldInsertText:(NSString *)text replacingDOMRange:(DOMRange *)range givenAction:(WebViewInsertAction)action 103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark static const char *insertactionstring[] = { 105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "WebViewInsertActionTyped", 106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "WebViewInsertActionPasted", 107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "WebViewInsertActionDropped", 108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark }; 109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: shouldInsertText:%s replacingDOMRange:%s givenAction:%s\n", [[text description] UTF8String], [[range dump] UTF8String], insertactionstring[action]); 112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return acceptsEditing; 113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 115563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldDeleteDOMRange:(DOMRange *)range 116563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: shouldDeleteDOMRange:%s\n", [[range dump] UTF8String]); 119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return acceptsEditing; 120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldShowDeleteInterfaceForElement:(DOMHTMLElement *)element 123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return [[element className] isEqualToString:@"needsDeletionUI"]; 125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldChangeSelectedDOMRange:(DOMRange *)currentRange toDOMRange:(DOMRange *)proposedRange affinity:(NSSelectionAffinity)selectionAffinity stillSelecting:(BOOL)flag 128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark static const char *affinitystring[] = { 130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "NSSelectionAffinityUpstream", 131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "NSSelectionAffinityDownstream" 132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark }; 133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark static const char *boolstring[] = { 134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "FALSE", 135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark "TRUE" 136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark }; 137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 138563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: shouldChangeSelectedDOMRange:%s toDOMRange:%s affinity:%s stillSelecting:%s\n", [[currentRange dump] UTF8String], [[proposedRange dump] UTF8String], affinitystring[selectionAffinity], boolstring[flag]); 140563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return acceptsEditing; 141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 142563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 143563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldApplyStyle:(DOMCSSStyleDeclaration *)style toElementsInDOMRange:(DOMRange *)range 144563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: shouldApplyStyle:%s toElementsInDOMRange:%s\n", [[style description] UTF8String], [[range dump] UTF8String]); 147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return acceptsEditing; 148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)webView:(WebView *)webView shouldChangeTypingStyle:(DOMCSSStyleDeclaration *)currentStyle toStyle:(DOMCSSStyleDeclaration *)proposedStyle 151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: shouldChangeTypingStyle:%s toStyle:%s\n", [[currentStyle description] UTF8String], [[proposedStyle description] UTF8String]); 154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return acceptsEditing; 155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)webViewDidBeginEditing:(NSNotification *)notification 158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 160563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: webViewDidBeginEditing:%s\n", [[notification name] UTF8String]); 161563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 162563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 163563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)webViewDidChange:(NSNotification *)notification 164563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 165563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 166563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: webViewDidChange:%s\n", [[notification name] UTF8String]); 167563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 168563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 169563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)webViewDidEndEditing:(NSNotification *)notification 170563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: webViewDidEndEditing:%s\n", [[notification name] UTF8String]); 173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 174563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 175563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)webViewDidChangeTypingStyle:(NSNotification *)notification 176563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 177563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 178563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: webViewDidChangeTypingStyle:%s\n", [[notification name] UTF8String]); 179563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 180563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 181563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)webViewDidChangeSelection:(NSNotification *)notification 182563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 183563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!done && gLayoutTestController->dumpEditingCallbacks()) 184563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printf("EDITING DELEGATE: webViewDidChangeSelection:%s\n", [[notification name] UTF8String]); 185563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 186563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 187563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)setAcceptsEditing:(BOOL)newAcceptsEditing 188563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 189563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark acceptsEditing = newAcceptsEditing; 190563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 191563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 192563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@end 193