blob: 92588e1f71ca1cba8f7d7fcff450273bbf105247 [file] [log] [blame]
/*
* Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
* Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "config.h"
#import "DOMDocumentFragmentInternal.h"
#import "DOMExtensions.h"
#import "DOMHTMLCollectionInternal.h"
#import "DOMHTMLDocumentInternal.h"
#import "DOMHTMLInputElementInternal.h"
#import "DOMHTMLSelectElementInternal.h"
#import "DOMHTMLTextAreaElementInternal.h"
#import "DOMNodeInternal.h"
#import "DOMPrivate.h"
#import "DocumentFragment.h"
#import "FrameView.h"
#import "HTMLCollection.h"
#import "HTMLDocument.h"
#import "HTMLInputElement.h"
#import "HTMLParserIdioms.h"
#import "HTMLSelectElement.h"
#import "HTMLTextAreaElement.h"
#import "Page.h"
#import "Range.h"
#import "RenderTextControl.h"
#import "Settings.h"
#import "markup.h"
//------------------------------------------------------------------------------------------
// DOMHTMLDocument
@implementation DOMHTMLDocument (DOMHTMLDocumentExtensions)
- (DOMDocumentFragment *)createDocumentFragmentWithMarkupString:(NSString *)markupString baseURL:(NSURL *)baseURL
{
return kit(createFragmentFromMarkup(core(self), markupString, [baseURL absoluteString]).get());
}
- (DOMDocumentFragment *)createDocumentFragmentWithText:(NSString *)text
{
// FIXME: Since this is not a contextual fragment, it won't handle whitespace properly.
return kit(createFragmentFromText(core(self)->createRange().get(), text).get());
}
@end
@implementation DOMHTMLDocument (WebPrivate)
- (DOMDocumentFragment *)_createDocumentFragmentWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString
{
NSURL *baseURL = core(self)->completeURL(WebCore::stripLeadingAndTrailingHTMLSpaces(baseURLString));
return [self createDocumentFragmentWithMarkupString:markupString baseURL:baseURL];
}
- (DOMDocumentFragment *)_createDocumentFragmentWithText:(NSString *)text
{
return [self createDocumentFragmentWithText:text];
}
@end
#ifdef BUILDING_ON_TIGER
@implementation DOMHTMLDocument (DOMHTMLDocumentOverrides)
- (DOMNode *)firstChild
{
WebCore::HTMLDocument* coreHTMLDocument = core(self);
if (!coreHTMLDocument->page() || !coreHTMLDocument->page()->settings()->needsTigerMailQuirks())
return kit(coreHTMLDocument->firstChild());
WebCore::Node* child = coreHTMLDocument->firstChild();
while (child && child->nodeType() == WebCore::Node::DOCUMENT_TYPE_NODE)
child = child->nextSibling();
return kit(child);
}
@end
#endif
@implementation DOMHTMLInputElement (FormAutoFillTransition)
- (BOOL)_isTextField
{
return core(self)->isTextField();
}
- (NSRect)_rectOnScreen
{
// Returns bounding rect of text field, in screen coordinates.
NSRect result = [self boundingBox];
if (!core(self)->document()->view())
return result;
NSView* view = core(self)->document()->view()->documentView();
result = [view convertRect:result toView:nil];
result.origin = [[view window] convertBaseToScreen:result.origin];
return result;
}
- (void)_replaceCharactersInRange:(NSRange)targetRange withString:(NSString *)replacementString selectingFromIndex:(int)index
{
WebCore::HTMLInputElement* inputElement = core(self);
if (inputElement) {
WTF::String newValue = inputElement->value();
newValue.replace(targetRange.location, targetRange.length, replacementString);
inputElement->setValue(newValue);
inputElement->setSelectionRange(index, newValue.length());
}
}
- (NSRange)_selectedRange
{
WebCore::HTMLInputElement* inputElement = core(self);
if (inputElement) {
int start = inputElement->selectionStart();
int end = inputElement->selectionEnd();
return NSMakeRange(start, end - start);
}
return NSMakeRange(NSNotFound, 0);
}
- (BOOL)_isAutofilled
{
return core(self)->isAutofilled();
}
- (void)_setAutofilled:(BOOL)filled
{
// This notifies the input element that the content has been autofilled
// This allows WebKit to obey the -webkit-autofill pseudo style, which
// changes the background color.
core(self)->setAutofilled(filled);
}
@end
@implementation DOMHTMLSelectElement (FormAutoFillTransition)
- (void)_activateItemAtIndex:(int)index
{
// Use the setSelectedIndexByUser function so a change event will be fired. <rdar://problem/6760590>
if (WebCore::HTMLSelectElement* select = core(self))
select->setSelectedIndexByUser(index, true, true);
}
- (void)_activateItemAtIndex:(int)index allowMultipleSelection:(BOOL)allowMultipleSelection
{
// Use the setSelectedIndexByUser function so a change event will be fired. <rdar://problem/6760590>
// If this is a <select multiple> the allowMultipleSelection flag will allow setting multiple
// selections without clearing the other selections.
if (WebCore::HTMLSelectElement* select = core(self))
select->setSelectedIndexByUser(index, true, true, allowMultipleSelection);
}
@end
@implementation DOMHTMLInputElement (FormPromptAdditions)
- (BOOL)_isEdited
{
return core(self)->lastChangeWasUserEdit();
}
@end
@implementation DOMHTMLTextAreaElement (FormPromptAdditions)
- (BOOL)_isEdited
{
return core(self)->lastChangeWasUserEdit();
}
@end
Class kitClass(WebCore::HTMLCollection* collection)
{
if (collection->type() == WebCore::SelectOptions)
return [DOMHTMLOptionsCollection class];
return [DOMHTMLCollection class];
}