diff options
author | pinkerton@google.com <pinkerton@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-08 17:25:24 +0000 |
---|---|---|
committer | pinkerton@google.com <pinkerton@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-08 17:25:24 +0000 |
commit | db8d02d65496004718bcd0416fcb35326eb08cd5 (patch) | |
tree | 1e5851cdb35c13c48317c2b40c22ea9a74dd19f7 /webkit/pending | |
parent | 4b636fa73856bc6b58abc850e1d1095d6592581d (diff) | |
download | chromium_src-db8d02d65496004718bcd0416fcb35326eb08cd5.zip chromium_src-db8d02d65496004718bcd0416fcb35326eb08cd5.tar.gz chromium_src-db8d02d65496004718bcd0416fcb35326eb08cd5.tar.bz2 |
Remove references to WebCoreFrameBridge which is no longer in webkit
Review URL: http://codereview.chromium.org/6346
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@3016 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/pending')
-rw-r--r-- | webkit/pending/WebCoreFrameBridge.h | 257 | ||||
-rw-r--r-- | webkit/pending/WebCoreFrameBridge.mm | 1275 |
2 files changed, 0 insertions, 1532 deletions
diff --git a/webkit/pending/WebCoreFrameBridge.h b/webkit/pending/WebCoreFrameBridge.h deleted file mode 100644 index fab3b79..0000000 --- a/webkit/pending/WebCoreFrameBridge.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. - * - * 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 <Cocoa/Cocoa.h> -#import <JavaVM/jni.h> -#import <WebCore/WebCoreKeyboardUIMode.h> -#import <WebCore/EditAction.h> -#import <WebCore/FrameLoaderTypes.h> -#import <WebCore/SelectionController.h> -#import <WebCore/TextAffinity.h> -#import <WebCore/TextGranularity.h> - -#if USE(NPOBJECT) -#import <JavaScriptCore/npruntime.h> -#endif - -namespace WebCore { - class Frame; - class HTMLFrameOwnerElement; - class Page; - class String; - class AccessibilityObject; -} - -@class DOMCSSStyleDeclaration; -@class DOMDocument; -@class DOMDocumentFragment; -@class DOMElement; -@class DOMHTMLInputElement; -@class DOMHTMLTextAreaElement; -@class DOMNode; -@class DOMRange; -@class NSMenu; - -@protocol WebCoreRenderTreeCopier; - -enum WebCoreDeviceType { - WebCoreDeviceScreen, - WebCoreDevicePrinter -}; - -enum WebScrollDirection { - WebScrollUp, - WebScrollDown, - WebScrollLeft, - WebScrollRight -}; - -enum WebScrollGranularity { - WebScrollLine, - WebScrollPage, - WebScrollDocument, - WebScrollWheel -}; - -@protocol WebCoreOpenPanelResultListener <NSObject> -- (void)chooseFilename:(NSString *)fileName; -- (void)cancel; -@end - -// WebCoreFrameBridge objects are used by WebCore to abstract away operations that need -// to be implemented by library clients, for example WebKit. The objects are also -// used in the opposite direction, for simple access to WebCore functions without dealing -// directly with the KHTML C++ classes. - -// A WebCoreFrameBridge creates and holds a reference to a Frame. - -// The WebCoreFrameBridge interface contains methods for use by the non-WebCore side of the bridge. - -@interface WebCoreFrameBridge : NSObject -{ -@public - WebCore::Frame* m_frame; - BOOL _shouldCreateRenderers; - BOOL _closed; -} - -- (WebCore::Frame*)_frame; // underscore to prevent conflict with -[NSView frame] - -+ (WebCoreFrameBridge *)bridgeForDOMDocument:(DOMDocument *)document; - -- (id)init; -- (void)close; - -- (void)clearFrame; - -- (NSURL *)baseURL; - -- (void)installInFrame:(NSView *)view; - -- (BOOL)scrollOverflowInDirection:(WebScrollDirection)direction granularity:(WebScrollGranularity)granularity; - -- (void)createFrameViewWithNSView:(NSView *)view marginWidth:(int)mw marginHeight:(int)mh; - -- (void)reapplyStylesForDeviceType:(WebCoreDeviceType)deviceType; -- (void)forceLayoutAdjustingViewSize:(BOOL)adjustSizeFlag; -- (void)forceLayoutWithMinimumPageWidth:(float)minPageWidth maximumPageWidth:(float)maxPageWidth adjustingViewSize:(BOOL)adjustSizeFlag; -- (void)sendScrollEvent; -- (BOOL)needsLayout; -- (void)drawRect:(NSRect)rect; -- (void)adjustPageHeightNew:(float *)newBottom top:(float)oldTop bottom:(float)oldBottom limit:(float)bottomLimit; -- (NSArray*)computePageRectsWithPrintWidthScaleFactor:(float)printWidthScaleFactor printHeight:(float)printHeight; - -- (NSObject *)copyRenderTree:(id <WebCoreRenderTreeCopier>)copier; -- (NSString *)renderTreeAsExternalRepresentation; - -- (NSURL *)URLWithAttributeString:(NSString *)string; - -- (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form; -- (BOOL)elementDoesAutoComplete:(DOMElement *)element; -- (BOOL)elementIsPassword:(DOMElement *)element; -- (DOMElement *)formForElement:(DOMElement *)element; -- (DOMElement *)currentForm; -- (NSArray *)controlsInForm:(DOMElement *)form; -- (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element; -- (NSString *)matchLabels:(NSArray *)labels againstElement:(DOMElement *)element; - -- (BOOL)searchFor:(NSString *)string direction:(BOOL)forward caseSensitive:(BOOL)caseFlag wrap:(BOOL)wrapFlag startInSelection:(BOOL)startInSelection; -- (unsigned)markAllMatchesForText:(NSString *)string caseSensitive:(BOOL)caseFlag limit:(unsigned)limit; -- (BOOL)markedTextMatchesAreHighlighted; -- (void)setMarkedTextMatchesAreHighlighted:(BOOL)doHighlight; -- (void)unmarkAllTextMatches; -- (NSArray *)rectsForTextMatches; - -- (void)setTextSizeMultiplier:(float)multiplier; - -- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)string; -- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)string forceUserGesture:(BOOL)forceUserGesture; -- (NSAppleEventDescriptor *)aeDescByEvaluatingJavaScriptFromString:(NSString *)string; - -- (NSString *)selectedString; - -- (NSString *)stringForRange:(DOMRange *)range; - -- (NSString *)markupStringFromNode:(DOMNode *)node nodes:(NSArray **)nodes; -- (NSString *)markupStringFromRange:(DOMRange *)range nodes:(NSArray **)nodes; - -- (NSRect)caretRectAtNode:(DOMNode *)node offset:(int)offset affinity:(NSSelectionAffinity)affinity; -- (NSRect)firstRectForDOMRange:(DOMRange *)range; -- (void)scrollDOMRangeToVisible:(DOMRange *)range; - -- (NSFont *)fontForSelection:(BOOL *)hasMultipleFonts; - -- (NSString *)stringWithData:(NSData *)data; // using the encoding of the frame's main resource -+ (NSString *)stringWithData:(NSData *)data textEncodingName:(NSString *)textEncodingName; // nil for textEncodingName means Latin-1 - -- (void)setShouldCreateRenderers:(BOOL)shouldCreateRenderers; - -- (void)setBaseBackgroundColor:(NSColor *)backgroundColor; -- (void)setDrawsBackground:(BOOL)drawsBackround; - -- (WebCore::AccessibilityObject)accessibilityTree; - -- (DOMRange *)rangeByAlteringCurrentSelection:(WebCore::SelectionController::EAlteration)alteration direction:(WebCore::SelectionController::EDirection)direction granularity:(WebCore::TextGranularity)granularity; -- (WebCore::TextGranularity)selectionGranularity; -- (void)smartInsertForString:(NSString *)pasteString replacingRange:(DOMRange *)charRangeToReplace beforeString:(NSString **)beforeString afterString:(NSString **)afterString; -- (void)selectNSRange:(NSRange)range; -- (NSRange)selectedNSRange; -- (NSRange)markedTextNSRange; -- (DOMRange *)convertNSRangeToDOMRange:(NSRange)range; -- (NSRange)convertDOMRangeToNSRange:(DOMRange *)range; - -- (DOMDocumentFragment *)documentFragmentWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString; -- (DOMDocumentFragment *)documentFragmentWithText:(NSString *)text inContext:(DOMRange *)context; -- (DOMDocumentFragment *)documentFragmentWithNodesAsParagraphs:(NSArray *)nodes; - -- (void)replaceSelectionWithFragment:(DOMDocumentFragment *)fragment selectReplacement:(BOOL)selectReplacement smartReplace:(BOOL)smartReplace matchStyle:(BOOL)matchStyle; -- (void)replaceSelectionWithNode:(DOMNode *)node selectReplacement:(BOOL)selectReplacement smartReplace:(BOOL)smartReplace matchStyle:(BOOL)matchStyle; -- (void)replaceSelectionWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString selectReplacement:(BOOL)selectReplacement smartReplace:(BOOL)smartReplace; -- (void)replaceSelectionWithText:(NSString *)text selectReplacement:(BOOL)selectReplacement smartReplace:(BOOL)smartReplace; - -- (void)insertParagraphSeparatorInQuotedContent; - -- (DOMRange *)characterRangeAtPoint:(NSPoint)point; - -- (DOMCSSStyleDeclaration *)typingStyle; -- (void)setTypingStyle:(DOMCSSStyleDeclaration *)style withUndoAction:(WebCore::EditAction)undoAction; - -- (void)dragSourceMovedTo:(NSPoint)windowLoc; -- (void)dragSourceEndedAt:(NSPoint)windowLoc operation:(NSDragOperation)operation; - -- (BOOL)getData:(NSData **)data andResponse:(NSURLResponse **)response forURL:(NSString *)URL; -- (void)getAllResourceDatas:(NSArray **)datas andResponses:(NSArray **)responses; - -- (BOOL)canProvideDocumentSource; -- (BOOL)canSaveAsWebArchive; - -- (void)receivedData:(NSData *)data textEncodingName:(NSString *)textEncodingName; - -@end - -// The WebCoreFrameBridge protocol contains methods for use by the WebCore side of the bridge. - -@protocol WebCoreFrameBridge - -- (NSWindow *)window; - -- (NSResponder *)firstResponder; -- (void)makeFirstResponder:(NSResponder *)responder; - -- (void)runOpenPanelForFileButtonWithResultListener:(id <WebCoreOpenPanelResultListener>)resultListener; - -- (jobject)getAppletInView:(NSView *)view; - -// Deprecated, use getAppletInView: instead. -- (jobject)pollForAppletInView:(NSView *)view; - -- (void)issuePasteCommand; - -- (void)setIsSelected:(BOOL)isSelected forView:(NSView *)view; - -- (void)dashboardRegionsChanged:(NSMutableDictionary *)regions; -- (void)willPopupMenu:(NSMenu *)menu; - -- (NSRect)customHighlightRect:(NSString*)type forLine:(NSRect)lineRect representedNode:(WebCore::Node *)node; -- (void)paintCustomHighlight:(NSString*)type forBox:(NSRect)boxRect onLine:(NSRect)lineRect behindText:(BOOL)text entireLine:(BOOL)line representedNode:(WebCore::Node *)node; - -- (WebCore::KeyboardUIMode)keyboardUIMode; - -- (NSString*)imageTitleForFilename:(NSString*)filename size:(NSSize)size; - -@end - -// This interface definition allows those who hold a WebCoreFrameBridge * to call all the methods -// in the WebCoreFrameBridge protocol without requiring the base implementation to supply the methods. -// This idiom is appropriate because WebCoreFrameBridge is an abstract class. - -@interface WebCoreFrameBridge (SubclassResponsibility) <WebCoreFrameBridge> -@end - -// Protocols that make up part of the interfaces above. - -@protocol WebCoreRenderTreeCopier <NSObject> -- (NSObject *)nodeWithName:(NSString *)name position:(NSPoint)p rect:(NSRect)rect view:(NSView *)view children:(NSArray *)children; -@end diff --git a/webkit/pending/WebCoreFrameBridge.mm b/webkit/pending/WebCoreFrameBridge.mm deleted file mode 100644 index 084b7fc..0000000 --- a/webkit/pending/WebCoreFrameBridge.mm +++ /dev/null @@ -1,1275 +0,0 @@ -/* - * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. - * Copyright (C) 2005, 2006 Alexey Proskuryakov (ap@nypop.com) - * Copyright (C) 2006 David Smith (catfish.man@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 "WebCoreFrameBridge.h" - -#import "AXObjectCache.h" -#import "CSSHelper.h" -#import "Cache.h" -#import "ClipboardMac.h" -#import "ColorMac.h" -#import "DOMImplementation.h" -#import "DOMInternal.h" -#import "DOMWindow.h" -#import "DeleteSelectionCommand.h" -#import "DocLoader.h" -#import "DocumentFragment.h" -#import "DocumentLoader.h" -#import "DocumentType.h" -#import "Editor.h" -#import "EditorClient.h" -#import "EventHandler.h" -#import "FloatRect.h" -#import "FormDataStreamMac.h" -#import "Frame.h" -#import "FrameLoader.h" -#import "FrameLoaderClient.h" -#import "FrameTree.h" -#import "FrameView.h" -#import "GraphicsContext.h" -#import "HTMLDocument.h" -#import "HTMLFormElement.h" -#import "HTMLInputElement.h" -#import "HTMLNames.h" -#import "HitTestResult.h" -#import "Image.h" -#import "LoaderNSURLExtras.h" -#import "MoveSelectionCommand.h" -#import "Page.h" -#import "PlatformMouseEvent.h" -#import "PlatformScreen.h" -#import "PluginInfoStore.h" -#import "RenderImage.h" -#import "RenderPart.h" -#import "RenderTreeAsText.h" -#import "RenderView.h" -#import "RenderWidget.h" -#import "ReplaceSelectionCommand.h" -#import "ResourceRequest.h" -#import "SelectionController.h" -#import "SimpleFontData.h" -#import "SmartReplace.h" -#import "SubresourceLoader.h" -#import "SystemTime.h" -#import "Text.h" -#import "TextEncoding.h" -#import "TextIterator.h" -#import "TextResourceDecoder.h" -#import "TypingCommand.h" -#import "WebCoreSystemInterface.h" -#import "WebCoreViewFactory.h" -#import "XMLTokenizer.h" -#import "htmlediting.h" -#import "markup.h" -#import "visible_units.h" -#import <OpenScripting/ASRegistry.h> -#if USE(V8_BINDING) -#error Write V8 code -#else -#import "kjs_proxy.h" -#import "kjs_window.h" -#import <JavaScriptCore/array_instance.h> -#import <JavaScriptCore/date_object.h> -#import <JavaScriptCore/runtime_root.h> -#endif -#import <wtf/RetainPtr.h> - -#include "JSBridge.h" - -@class NSView; - -using namespace std; -using namespace WebCore; -using namespace HTMLNames; - -#if USE(V8_BINDING) -#error Write V8 code -#else -using KJS::ArrayInstance; -using KJS::BooleanType; -using KJS::DateInstance; -using KJS::ExecState; -using KJS::GetterSetterType; -using KJS::JSImmediate; -using KJS::JSLock; -using KJS::JSObject; -using KJS::JSValue; -using KJS::NullType; -using KJS::NumberType; -using KJS::ObjectType; -using KJS::SavedBuiltins; -using KJS::SavedProperties; -using KJS::StringType; -using KJS::UndefinedType; -using KJS::UnspecifiedType; -using KJS::Window; - -using KJS::Bindings::RootObject; -#endif - -static PassRefPtr<RootObject> createRootObject(void* nativeHandle) -{ - NSView *view = (NSView *)nativeHandle; - WebCoreFrameBridge *bridge = [[WebCoreViewFactory sharedFactory] bridgeForView:view]; - if (!bridge) - return 0; - - Frame* frame = [bridge _frame]; - return frame->createRootObject(nativeHandle, frame->scriptProxy()->globalObject()); -} - -static pthread_t mainThread = 0; - -static void updateRenderingForBindings(ExecState* exec, JSObject* rootObject) -{ - if (pthread_self() != mainThread) - return; - - if (!rootObject) - return; - - Window* window = static_cast<Window*>(rootObject); - if (!window) - return; - - if (Frame* frame = window->impl()->frame()) - if (Document* doc = frame->document()) - doc->updateRendering(); -} - -static NSAppleEventDescriptor* aeDescFromJSValue(ExecState* exec, JSValue* jsValue) -{ - NSAppleEventDescriptor* aeDesc = 0; - switch (jsValue->type()) { - case BooleanType: - aeDesc = [NSAppleEventDescriptor descriptorWithBoolean:jsValue->getBoolean()]; - break; - case StringType: - aeDesc = [NSAppleEventDescriptor descriptorWithString:String(jsValue->getString())]; - break; - case NumberType: { - double value = jsValue->getNumber(); - int intValue = (int)value; - if (value == intValue) - aeDesc = [NSAppleEventDescriptor descriptorWithDescriptorType:typeSInt32 bytes:&intValue length:sizeof(intValue)]; - else - aeDesc = [NSAppleEventDescriptor descriptorWithDescriptorType:typeIEEE64BitFloatingPoint bytes:&value length:sizeof(value)]; - break; - } - case ObjectType: { - JSObject* object = jsValue->getObject(); - if (object->inherits(&DateInstance::info)) { - DateInstance* date = static_cast<DateInstance*>(object); - double ms = 0; - int tzOffset = 0; - if (date->getTime(ms, tzOffset)) { - CFAbsoluteTime utcSeconds = ms / 1000 - kCFAbsoluteTimeIntervalSince1970; - LongDateTime ldt; - if (noErr == UCConvertCFAbsoluteTimeToLongDateTime(utcSeconds, &ldt)) - aeDesc = [NSAppleEventDescriptor descriptorWithDescriptorType:typeLongDateTime bytes:&ldt length:sizeof(ldt)]; - } - } - else if (object->inherits(&ArrayInstance::info)) { - static HashSet<JSObject*> visitedElems; - if (!visitedElems.contains(object)) { - visitedElems.add(object); - - ArrayInstance* array = static_cast<ArrayInstance*>(object); - aeDesc = [NSAppleEventDescriptor listDescriptor]; - unsigned numItems = array->getLength(); - for (unsigned i = 0; i < numItems; ++i) - [aeDesc insertDescriptor:aeDescFromJSValue(exec, array->getItem(i)) atIndex:0]; - - visitedElems.remove(object); - } - } - if (!aeDesc) { - JSValue* primitive = object->toPrimitive(exec); - if (exec->hadException()) { - exec->clearException(); - return [NSAppleEventDescriptor nullDescriptor]; - } - return aeDescFromJSValue(exec, primitive); - } - break; - } - case UndefinedType: - aeDesc = [NSAppleEventDescriptor descriptorWithTypeCode:cMissingValue]; - break; - default: - LOG_ERROR("Unknown JavaScript type: %d", jsValue->type()); - // no break; - case UnspecifiedType: - case NullType: - case GetterSetterType: - aeDesc = [NSAppleEventDescriptor nullDescriptor]; - break; - } - - return aeDesc; -} - -@implementation WebCoreFrameBridge - -static inline WebCoreFrameBridge *bridge(Frame *frame) -{ - if (!frame) - return nil; - return frame->bridge(); -} - -- (NSString *)domain -{ - Document *doc = m_frame->document(); - if (doc) - return doc->domain(); - return nil; -} - -+ (WebCoreFrameBridge *)bridgeForDOMDocument:(DOMDocument *)document -{ - return bridge([document _document]->frame()); -} - -- (id)init -{ - static bool initializedKJS; - if (!initializedKJS) { - initializedKJS = true; - - mainThread = pthread_self(); - RootObject::setCreateRootObject(createRootObject); - KJS::Bindings::Instance::setDidExecuteFunction(updateRenderingForBindings); - } - - if (!(self = [super init])) - return nil; - - _shouldCreateRenderers = YES; - return self; -} - -- (void)dealloc -{ - ASSERT(_closed); - [super dealloc]; -} - -- (void)finalize -{ - ASSERT(_closed); - [super finalize]; -} - -- (void)close -{ - [self clearFrame]; - _closed = YES; -} - -- (void)addData:(NSData *)data -{ - Document *doc = m_frame->document(); - - // Document may be nil if the part is about to redirect - // as a result of JS executing during load, i.e. one frame - // changing another's location before the frame's document - // has been created. - if (doc) { - doc->setShouldCreateRenderers(_shouldCreateRenderers); - m_frame->loader()->addData((const char *)[data bytes], [data length]); - } -} - -- (BOOL)scrollOverflowInDirection:(WebScrollDirection)direction granularity:(WebScrollGranularity)granularity -{ - if (!m_frame) - return NO; - return m_frame->eventHandler()->scrollOverflow((ScrollDirection)direction, (ScrollGranularity)granularity); -} - -- (void)clearFrame -{ - m_frame = 0; -} - -- (void)createFrameViewWithNSView:(NSView *)view marginWidth:(int)mw marginHeight:(int)mh -{ - // If we own the view, delete the old one - otherwise the render m_frame will take care of deleting the view. - if (m_frame) - m_frame->setView(0); - - FrameView* frameView = new FrameView(m_frame); - m_frame->setView(frameView); - frameView->deref(); - - frameView->setView(view); - if (mw >= 0) - frameView->setMarginWidth(mw); - if (mh >= 0) - frameView->setMarginHeight(mh); -} - -- (NSString *)_stringWithDocumentTypeStringAndMarkupString:(NSString *)markupString -{ - return m_frame->documentTypeString() + markupString; -} - -- (NSArray *)nodesFromList:(Vector<Node*> *)nodesVector -{ - size_t size = nodesVector->size(); - NSMutableArray *nodes = [NSMutableArray arrayWithCapacity:size]; - for (size_t i = 0; i < size; ++i) - [nodes addObject:[DOMNode _wrapNode:(*nodesVector)[i]]]; - return nodes; -} - -- (NSString *)markupStringFromNode:(DOMNode *)node nodes:(NSArray **)nodes -{ - // FIXME: This is never "for interchange". Is that right? See the next method. - Vector<Node*> nodeList; - NSString *markupString = createMarkup([node _node], IncludeNode, nodes ? &nodeList : 0); - if (nodes) - *nodes = [self nodesFromList:&nodeList]; - - return [self _stringWithDocumentTypeStringAndMarkupString:markupString]; -} - -- (NSString *)markupStringFromRange:(DOMRange *)range nodes:(NSArray **)nodes -{ - // FIXME: This is always "for interchange". Is that right? See the previous method. - Vector<Node*> nodeList; - NSString *markupString = createMarkup([range _range], nodes ? &nodeList : 0, AnnotateForInterchange); - if (nodes) - *nodes = [self nodesFromList:&nodeList]; - - return [self _stringWithDocumentTypeStringAndMarkupString:markupString]; -} - -- (NSString *)selectedString -{ - String text = m_frame->selectedText(); - text.replace('\\', m_frame->backslashAsCurrencySymbol()); - return text; -} - -- (NSString *)stringForRange:(DOMRange *)range -{ - // This will give a system malloc'd buffer that can be turned directly into an NSString - unsigned length; - UChar* buf = plainTextToMallocAllocatedBuffer([range _range], length); - - if (!buf) - return [NSString string]; - - UChar backslashAsCurrencySymbol = m_frame->backslashAsCurrencySymbol(); - if (backslashAsCurrencySymbol != '\\') - for (unsigned n = 0; n < length; n++) - if (buf[n] == '\\') - buf[n] = backslashAsCurrencySymbol; - - // Transfer buffer ownership to NSString - return [[[NSString alloc] initWithCharactersNoCopy:buf length:length freeWhenDone:YES] autorelease]; -} - -- (void)reapplyStylesForDeviceType:(WebCoreDeviceType)deviceType -{ - if (m_frame->view()) - m_frame->view()->setMediaType(deviceType == WebCoreDeviceScreen ? "screen" : "print"); - Document *doc = m_frame->document(); - if (doc) - doc->setPrinting(deviceType == WebCoreDevicePrinter); - m_frame->reapplyStyles(); -} - -- (void)forceLayoutAdjustingViewSize:(BOOL)flag -{ - m_frame->forceLayout(!flag); - if (flag) - m_frame->view()->adjustViewSize(); -} - -- (void)forceLayoutWithMinimumPageWidth:(float)minPageWidth maximumPageWidth:(float)maxPageWidth adjustingViewSize:(BOOL)flag -{ - m_frame->forceLayoutWithPageWidthRange(minPageWidth, maxPageWidth, flag); -} - -- (void)sendScrollEvent -{ - m_frame->sendScrollEvent(); -} - -- (void)drawRect:(NSRect)rect -{ - PlatformGraphicsContext* platformContext = static_cast<PlatformGraphicsContext*>([[NSGraphicsContext currentContext] graphicsPort]); - ASSERT([[NSGraphicsContext currentContext] isFlipped]); - GraphicsContext context(platformContext); - - m_frame->paint(&context, enclosingIntRect(rect)); -} - -// Used by pagination code called from AppKit when a standalone web page is printed. -- (NSArray*)computePageRectsWithPrintWidthScaleFactor:(float)printWidthScaleFactor printHeight:(float)printHeight -{ - NSMutableArray* pages = [NSMutableArray arrayWithCapacity:5]; - if (printWidthScaleFactor <= 0) { - LOG_ERROR("printWidthScaleFactor has bad value %.2f", printWidthScaleFactor); - return pages; - } - - if (printHeight <= 0) { - LOG_ERROR("printHeight has bad value %.2f", printHeight); - return pages; - } - - if (!m_frame || !m_frame->document() || !m_frame->view()) return pages; - RenderView* root = static_cast<RenderView *>(m_frame->document()->renderer()); - if (!root) return pages; - - FrameView* view = m_frame->view(); - if (!view) - return pages; - - NSView* documentView = view->getDocumentView(); - if (!documentView) - return pages; - - float currPageHeight = printHeight; - float docHeight = root->layer()->height(); - float docWidth = root->layer()->width(); - float printWidth = docWidth/printWidthScaleFactor; - - // We need to give the part the opportunity to adjust the page height at each step. - for (float i = 0; i < docHeight; i += currPageHeight) { - float proposedBottom = min(docHeight, i + printHeight); - m_frame->adjustPageHeight(&proposedBottom, i, proposedBottom, i); - currPageHeight = max(1.0f, proposedBottom - i); - for (float j = 0; j < docWidth; j += printWidth) { - NSValue* val = [NSValue valueWithRect: NSMakeRect(j, i, printWidth, currPageHeight)]; - [pages addObject: val]; - } - } - - return pages; -} - -// This is to support the case where a webview is embedded in the view that's being printed -- (void)adjustPageHeightNew:(float *)newBottom top:(float)oldTop bottom:(float)oldBottom limit:(float)bottomLimit -{ - m_frame->adjustPageHeight(newBottom, oldTop, oldBottom, bottomLimit); -} - -- (NSObject *)copyRenderNode:(RenderObject *)node copier:(id <WebCoreRenderTreeCopier>)copier -{ - NSMutableArray *children = [[NSMutableArray alloc] init]; - for (RenderObject *child = node->firstChild(); child; child = child->nextSibling()) { - [children addObject:[self copyRenderNode:child copier:copier]]; - } - - NSString *name = [[NSString alloc] initWithUTF8String:node->renderName()]; - - RenderWidget* renderWidget = node->isWidget() ? static_cast<RenderWidget*>(node) : 0; - Widget* widget = renderWidget ? renderWidget->widget() : 0; - NSView *view = widget ? widget->getView() : nil; - - int nx, ny; - node->absolutePosition(nx, ny); - NSObject *copiedNode = [copier nodeWithName:name - position:NSMakePoint(nx,ny) - rect:NSMakeRect(node->xPos(), node->yPos(), node->width(), node->height()) - view:view - children:children]; - - [name release]; - [children release]; - - return copiedNode; -} - -- (NSObject *)copyRenderTree:(id <WebCoreRenderTreeCopier>)copier -{ - RenderObject *renderer = m_frame->renderer(); - if (!renderer) { - return nil; - } - return [self copyRenderNode:renderer copier:copier]; -} - -- (void)installInFrame:(NSView *)view -{ - // If this isn't the main frame, it must have a render m_frame set, or it - // won't ever get installed in the view hierarchy. - ASSERT(m_frame == m_frame->page()->mainFrame() || m_frame->ownerElement()); - - m_frame->view()->setView(view); - // FIXME: frame tries to do this too, is it needed? - if (m_frame->ownerRenderer()) { - m_frame->ownerRenderer()->setWidget(m_frame->view()); - // Now the render part owns the view, so we don't any more. - } - - m_frame->view()->initScrollbars(); -} - -static HTMLInputElement* inputElementFromDOMElement(DOMElement* element) -{ - Node* node = [element _node]; - if (node->hasTagName(inputTag)) - return static_cast<HTMLInputElement*>(node); - return nil; -} - -static HTMLFormElement *formElementFromDOMElement(DOMElement *element) -{ - Node *node = [element _node]; - // This should not be necessary, but an XSL file on - // maps.google.com crashes otherwise because it is an xslt file - // that contains <form> elements that aren't in any namespace, so - // they come out as generic CML elements - if (node && node->hasTagName(formTag)) { - return static_cast<HTMLFormElement *>(node); - } - return nil; -} - -- (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form -{ - HTMLFormElement *formElement = formElementFromDOMElement(form); - if (formElement) { - Vector<HTMLGenericFormElement*>& elements = formElement->formElements; - AtomicString targetName = name; - for (unsigned int i = 0; i < elements.size(); i++) { - HTMLGenericFormElement *elt = elements[i]; - // Skip option elements, other duds - if (elt->name() == targetName) - return [DOMElement _wrapElement:elt]; - } - } - return nil; -} - -- (BOOL)elementDoesAutoComplete:(DOMElement *)element -{ - HTMLInputElement *inputElement = inputElementFromDOMElement(element); - return inputElement != nil - && inputElement->inputType() == HTMLInputElement::TEXT - && inputElement->autoComplete(); -} - -- (BOOL)elementIsPassword:(DOMElement *)element -{ - HTMLInputElement *inputElement = inputElementFromDOMElement(element); - return inputElement != nil - && inputElement->inputType() == HTMLInputElement::PASSWORD; -} - -- (DOMElement *)formForElement:(DOMElement *)element; -{ - HTMLInputElement *inputElement = inputElementFromDOMElement(element); - if (inputElement) { - HTMLFormElement *formElement = inputElement->form(); - if (formElement) { - return [DOMElement _wrapElement:formElement]; - } - } - return nil; -} - -- (DOMElement *)currentForm -{ - return [DOMElement _wrapElement:m_frame->currentForm()]; -} - -- (NSArray *)controlsInForm:(DOMElement *)form -{ - NSMutableArray *results = nil; - HTMLFormElement *formElement = formElementFromDOMElement(form); - if (formElement) { - Vector<HTMLGenericFormElement*>& elements = formElement->formElements; - for (unsigned int i = 0; i < elements.size(); i++) { - if (elements.at(i)->isEnumeratable()) { // Skip option elements, other duds - DOMElement *de = [DOMElement _wrapElement:elements.at(i)]; - if (!results) { - results = [NSMutableArray arrayWithObject:de]; - } else { - [results addObject:de]; - } - } - } - } - return results; -} - -- (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element -{ - return m_frame->searchForLabelsBeforeElement(labels, [element _element]); -} - -- (NSString *)matchLabels:(NSArray *)labels againstElement:(DOMElement *)element -{ - return m_frame->matchLabelsAgainstElement(labels, [element _element]); -} - -- (NSURL *)URLWithAttributeString:(NSString *)string -{ - Document *doc = m_frame->document(); - if (!doc) - return nil; - // FIXME: is parseURL appropriate here? - DeprecatedString rel = parseURL(string).deprecatedString(); - return KURL(doc->completeURL(rel)).getNSURL(); -} - -- (BOOL)searchFor:(NSString *)string direction:(BOOL)forward caseSensitive:(BOOL)caseFlag wrap:(BOOL)wrapFlag startInSelection:(BOOL)startInSelection -{ - return m_frame->findString(string, forward, caseFlag, wrapFlag, startInSelection); -} - -- (unsigned)markAllMatchesForText:(NSString *)string caseSensitive:(BOOL)caseFlag limit:(unsigned)limit -{ - return m_frame->markAllMatchesForText(string, caseFlag, limit); -} - -- (BOOL)markedTextMatchesAreHighlighted -{ - return m_frame->markedTextMatchesAreHighlighted(); -} - -- (void)setMarkedTextMatchesAreHighlighted:(BOOL)doHighlight -{ - m_frame->setMarkedTextMatchesAreHighlighted(doHighlight); -} - -- (void)unmarkAllTextMatches -{ - Document *doc = m_frame->document(); - if (!doc) { - return; - } - doc->removeMarkers(DocumentMarker::TextMatch); -} - -- (NSArray *)rectsForTextMatches -{ - Document *doc = m_frame->document(); - if (!doc) - return [NSArray array]; - - NSMutableArray *result = [NSMutableArray array]; - Vector<IntRect> rects = doc->renderedRectsForMarkers(DocumentMarker::TextMatch); - unsigned count = rects.size(); - for (unsigned index = 0; index < count; ++index) - [result addObject:[NSValue valueWithRect:rects[index]]]; - - return result; -} - -- (void)setTextSizeMultiplier:(float)multiplier -{ - int newZoomFactor = (int)rint(multiplier * 100); - if (m_frame->zoomFactor() == newZoomFactor) { - return; - } - m_frame->setZoomFactor(newZoomFactor); -} - -- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)string -{ - return [self stringByEvaluatingJavaScriptFromString:string forceUserGesture:true]; -} - -- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)string forceUserGesture:(BOOL)forceUserGesture -{ - ASSERT(m_frame->document()); - - bool success; - String url = forceUserGesture ? String() : m_frame->loader()->url().string(); - NSString* result = m_frame->scriptBridge()->evaluate(url, 0, string, 0, &success); - - if (!m_frame) // In case the script removed our frame from the page. - return @""; - - // NOTE: This has slightly different semantics than WebKit for Safari 2.0 in - // that it doesn't return an empty string if the result is neither a - // boolean, string, or number. I don't believe this will be a problem. - - if (success) - return result; - else - return @""; -} - -- (NSAppleEventDescriptor *)aeDescByEvaluatingJavaScriptFromString:(NSString *)string -{ - ASSERT(m_frame->document()); - ASSERT(m_frame == m_frame->page()->mainFrame()); - JSResult result = m_frame->scriptBridge()->evaluate(String(), 0, string, 0); - -#if USE(V8_BINDING) - bool failure = result.IsEmpty(); -#else - bool failure = !result; -#endif - - if (failure) // FIXME: pass errors - return 0; - - NSAppleEventDescriptor* aeResult; - { -#if USE(V8_BINDING) -#error Write V8 code -#else - JSLock lock; - aeResult = aeDescFromJSValue(m_frame->scriptProxy()->globalObject()->globalExec(), result); -#endif - } - - m_frame->scriptBridge()->disposeJSResult(result); - - return aeResult; -} - -- (NSRect)caretRectAtNode:(DOMNode *)node offset:(int)offset affinity:(NSSelectionAffinity)affinity -{ - return [node _node]->renderer()->caretRect(offset, static_cast<EAffinity>(affinity)); -} - -- (NSRect)firstRectForDOMRange:(DOMRange *)range -{ - return m_frame->firstRectForRange([range _range]); -} - -- (void)scrollDOMRangeToVisible:(DOMRange *)range -{ - NSRect rangeRect = [self firstRectForDOMRange:range]; - Node *startNode = [[range startContainer] _node]; - - if (startNode && startNode->renderer()) { - RenderLayer *layer = startNode->renderer()->enclosingLayer(); - if (layer) - layer->scrollRectToVisible(enclosingIntRect(rangeRect), RenderLayer::gAlignToEdgeIfNeeded, RenderLayer::gAlignToEdgeIfNeeded); - } -} - -- (NSURL *)baseURL -{ - return m_frame->loader()->completeURL(m_frame->document()->baseURL()).getNSURL(); -} - -- (NSString *)stringWithData:(NSData *)data -{ - Document* doc = m_frame->document(); - if (!doc) - return nil; - TextResourceDecoder* decoder = doc->decoder(); - if (!decoder) - return nil; - return decoder->encoding().decode(reinterpret_cast<const char*>([data bytes]), [data length]); -} - -+ (NSString *)stringWithData:(NSData *)data textEncodingName:(NSString *)textEncodingName -{ - WebCore::TextEncoding encoding(textEncodingName); - if (!encoding.isValid()) - encoding = WindowsLatin1Encoding(); - return encoding.decode(reinterpret_cast<const char*>([data bytes]), [data length]); -} - -- (BOOL)needsLayout -{ - return m_frame->view() ? m_frame->view()->needsLayout() : false; -} - -- (NSString *)renderTreeAsExternalRepresentation -{ - return externalRepresentation(m_frame->renderer()).getNSString(); -} - -- (void)setShouldCreateRenderers:(BOOL)f -{ - _shouldCreateRenderers = f; -} - -- (id)accessibilityTree -{ - AXObjectCache::enableAccessibility(); - if (!m_frame || !m_frame->document()) - return nil; - RenderView* root = static_cast<RenderView *>(m_frame->document()->renderer()); - if (!root) - return nil; - return m_frame->document()->axObjectCache()->get(root); -} - -- (void)setBaseBackgroundColor:(NSColor *)backgroundColor -{ - if (m_frame && m_frame->view()) { - Color color = colorFromNSColor([backgroundColor colorUsingColorSpaceName:NSDeviceRGBColorSpace]); - m_frame->view()->setBaseBackgroundColor(color); - } -} - -- (void)setDrawsBackground:(BOOL)drawsBackground -{ - if (m_frame && m_frame->view()) - m_frame->view()->setTransparent(!drawsBackground); -} - -- (DOMRange *)rangeByAlteringCurrentSelection:(SelectionController::EAlteration)alteration direction:(SelectionController::EDirection)direction granularity:(TextGranularity)granularity -{ - if (m_frame->selectionController()->isNone()) - return nil; - - SelectionController selectionController; - selectionController.setSelection(m_frame->selectionController()->selection()); - selectionController.modify(alteration, direction, granularity); - return [DOMRange _wrapRange:selectionController.toRange().get()]; -} - -- (TextGranularity)selectionGranularity -{ - return m_frame->selectionGranularity(); -} - -- (NSRange)convertToNSRange:(Range *)range -{ - int exception = 0; - - if (!range || range->isDetached()) - return NSMakeRange(NSNotFound, 0); - - Element* selectionRoot = m_frame->selectionController()->rootEditableElement(); - Element* scope = selectionRoot ? selectionRoot : m_frame->document()->documentElement(); - - // Mouse events may cause TSM to attempt to create an NSRange for a portion of the view - // that is not inside the current editable region. These checks ensure we don't produce - // potentially invalid data when responding to such requests. - if (range->startContainer(exception) != scope && !range->startContainer(exception)->isDescendantOf(scope)) - return NSMakeRange(NSNotFound, 0); - if(range->endContainer(exception) != scope && !range->endContainer(exception)->isDescendantOf(scope)) - return NSMakeRange(NSNotFound, 0); - - RefPtr<Range> testRange = new Range(scope->document(), scope, 0, range->startContainer(exception), range->startOffset(exception)); - ASSERT(testRange->startContainer(exception) == scope); - int startPosition = TextIterator::rangeLength(testRange.get()); - - testRange->setEnd(range->endContainer(exception), range->endOffset(exception), exception); - ASSERT(testRange->startContainer(exception) == scope); - int endPosition = TextIterator::rangeLength(testRange.get()); - - return NSMakeRange(startPosition, endPosition - startPosition); -} - -- (PassRefPtr<Range>)convertToDOMRange:(NSRange)nsrange -{ - if (nsrange.location > INT_MAX) - return 0; - if (nsrange.length > INT_MAX || nsrange.location + nsrange.length > INT_MAX) - nsrange.length = INT_MAX - nsrange.location; - - // our critical assumption is that we are only called by input methods that - // concentrate on a given area containing the selection - // We have to do this because of text fields and textareas. The DOM for those is not - // directly in the document DOM, so serialization is problematic. Our solution is - // to use the root editable element of the selection start as the positional base. - // That fits with AppKit's idea of an input context. - Element* selectionRoot = m_frame->selectionController()->rootEditableElement(); - Element* scope = selectionRoot ? selectionRoot : m_frame->document()->documentElement(); - return TextIterator::rangeFromLocationAndLength(scope, nsrange.location, nsrange.length); -} - -- (DOMRange *)convertNSRangeToDOMRange:(NSRange)nsrange -{ - return [DOMRange _wrapRange:[self convertToDOMRange:nsrange].get()]; -} - -- (NSRange)convertDOMRangeToNSRange:(DOMRange *)range -{ - return [self convertToNSRange:[range _range]]; -} - -- (void)selectNSRange:(NSRange)range -{ - RefPtr<Range> domRange = [self convertToDOMRange:range]; - if (domRange) - m_frame->selectionController()->setSelection(Selection(domRange.get(), SEL_DEFAULT_AFFINITY)); -} - -- (NSRange)selectedNSRange -{ - return [self convertToNSRange:m_frame->selectionController()->toRange().get()]; -} - -- (DOMRange *)markDOMRange -{ - return [DOMRange _wrapRange:m_frame->mark().toRange().get()]; -} - -- (NSRange)markedTextNSRange -{ - return [self convertToNSRange:m_frame->editor()->compositionRange().get()]; -} - -// Given proposedRange, returns an extended range that includes adjacent whitespace that should -// be deleted along with the proposed range in order to preserve proper spacing and punctuation of -// the text surrounding the deletion. -- (DOMRange *)smartDeleteRangeForProposedRange:(DOMRange *)proposedRange -{ - Node *startContainer = [[proposedRange startContainer] _node]; - Node *endContainer = [[proposedRange endContainer] _node]; - if (startContainer == nil || endContainer == nil) - return nil; - - ASSERT(startContainer->document() == endContainer->document()); - - m_frame->document()->updateLayoutIgnorePendingStylesheets(); - - Position start(startContainer, [proposedRange startOffset]); - Position end(endContainer, [proposedRange endOffset]); - Position newStart = start.upstream().leadingWhitespacePosition(DOWNSTREAM, true); - if (newStart.isNull()) - newStart = start; - Position newEnd = end.downstream().trailingWhitespacePosition(DOWNSTREAM, true); - if (newEnd.isNull()) - newEnd = end; - - newStart = rangeCompliantEquivalent(newStart); - newEnd = rangeCompliantEquivalent(newEnd); - - RefPtr<Range> range = m_frame->document()->createRange(); - int exception = 0; - range->setStart(newStart.node(), newStart.offset(), exception); - range->setEnd(newStart.node(), newStart.offset(), exception); - return [DOMRange _wrapRange:range.get()]; -} - -// Determines whether whitespace needs to be added around aString to preserve proper spacing and -// punctuation when it’s inserted into the receiver’s text over charRange. Returns by reference -// in beforeString and afterString any whitespace that should be added, unless either or both are -// nil. Both are returned as nil if aString is nil or if smart insertion and deletion are disabled. -- (void)smartInsertForString:(NSString *)pasteString replacingRange:(DOMRange *)rangeToReplace beforeString:(NSString **)beforeString afterString:(NSString **)afterString -{ - // give back nil pointers in case of early returns - if (beforeString) - *beforeString = nil; - if (afterString) - *afterString = nil; - - // inspect destination - Node *startContainer = [[rangeToReplace startContainer] _node]; - Node *endContainer = [[rangeToReplace endContainer] _node]; - - Position startPos(startContainer, [rangeToReplace startOffset]); - Position endPos(endContainer, [rangeToReplace endOffset]); - - VisiblePosition startVisiblePos = VisiblePosition(startPos, VP_DEFAULT_AFFINITY); - VisiblePosition endVisiblePos = VisiblePosition(endPos, VP_DEFAULT_AFFINITY); - - // this check also ensures startContainer, startPos, endContainer, and endPos are non-null - if (startVisiblePos.isNull() || endVisiblePos.isNull()) - return; - - bool addLeadingSpace = startPos.leadingWhitespacePosition(VP_DEFAULT_AFFINITY, true).isNull() && !isStartOfParagraph(startVisiblePos); - if (addLeadingSpace) - if (UChar previousChar = startVisiblePos.previous().characterAfter()) - addLeadingSpace = !isCharacterSmartReplaceExempt(previousChar, true); - - bool addTrailingSpace = endPos.trailingWhitespacePosition(VP_DEFAULT_AFFINITY, true).isNull() && !isEndOfParagraph(endVisiblePos); - if (addTrailingSpace) - if (UChar thisChar = endVisiblePos.characterAfter()) - addTrailingSpace = !isCharacterSmartReplaceExempt(thisChar, false); - - // inspect source - bool hasWhitespaceAtStart = false; - bool hasWhitespaceAtEnd = false; - unsigned pasteLength = [pasteString length]; - if (pasteLength > 0) { - NSCharacterSet *whiteSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; - - if ([whiteSet characterIsMember:[pasteString characterAtIndex:0]]) { - hasWhitespaceAtStart = YES; - } - if ([whiteSet characterIsMember:[pasteString characterAtIndex:(pasteLength - 1)]]) { - hasWhitespaceAtEnd = YES; - } - } - - // issue the verdict - if (beforeString && addLeadingSpace && !hasWhitespaceAtStart) - *beforeString = @" "; - if (afterString && addTrailingSpace && !hasWhitespaceAtEnd) - *afterString = @" "; -} - -- (DOMDocumentFragment *)documentFragmentWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString -{ - if (!m_frame || !m_frame->document()) - return 0; - - return [DOMDocumentFragment _wrapDocumentFragment:createFragmentFromMarkup(m_frame->document(), markupString, baseURLString).get()]; -} - -- (DOMDocumentFragment *)documentFragmentWithText:(NSString *)text inContext:(DOMRange *)context -{ - return [DOMDocumentFragment _wrapDocumentFragment:createFragmentFromText([context _range], text).get()]; -} - -- (DOMDocumentFragment *)documentFragmentWithNodesAsParagraphs:(NSArray *)nodes -{ - if (!m_frame || !m_frame->document()) - return 0; - - NSEnumerator *nodeEnum = [nodes objectEnumerator]; - Vector<Node*> nodesVector; - DOMNode *node; - while ((node = [nodeEnum nextObject])) - nodesVector.append([node _node]); - - return [DOMDocumentFragment _wrapDocumentFragment:createFragmentFromNodes(m_frame->document(), nodesVector).get()]; -} - -- (void)replaceSelectionWithFragment:(DOMDocumentFragment *)fragment selectReplacement:(BOOL)selectReplacement smartReplace:(BOOL)smartReplace matchStyle:(BOOL)matchStyle -{ - if (m_frame->selectionController()->isNone() || !fragment) - return; - - applyCommand(new ReplaceSelectionCommand(m_frame->document(), [fragment _documentFragment], selectReplacement, smartReplace, matchStyle)); - m_frame->revealSelection(RenderLayer::gAlignToEdgeIfNeeded); -} - -- (void)replaceSelectionWithNode:(DOMNode *)node selectReplacement:(BOOL)selectReplacement smartReplace:(BOOL)smartReplace matchStyle:(BOOL)matchStyle -{ - DOMDocumentFragment *fragment = [DOMDocumentFragment _wrapDocumentFragment:m_frame->document()->createDocumentFragment().get()]; - [fragment appendChild:node]; - [self replaceSelectionWithFragment:fragment selectReplacement:selectReplacement smartReplace:smartReplace matchStyle:matchStyle]; -} - -- (void)replaceSelectionWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString selectReplacement:(BOOL)selectReplacement smartReplace:(BOOL)smartReplace -{ - DOMDocumentFragment *fragment = [self documentFragmentWithMarkupString:markupString baseURLString:baseURLString]; - [self replaceSelectionWithFragment:fragment selectReplacement:selectReplacement smartReplace:smartReplace matchStyle:NO]; -} - -- (void)replaceSelectionWithText:(NSString *)text selectReplacement:(BOOL)selectReplacement smartReplace:(BOOL)smartReplace -{ - [self replaceSelectionWithFragment:[self documentFragmentWithText:text - inContext:[DOMRange _wrapRange:m_frame->selectionController()->toRange().get()]] - selectReplacement:selectReplacement smartReplace:smartReplace matchStyle:YES]; -} - -- (void)insertParagraphSeparatorInQuotedContent -{ - if (m_frame->selectionController()->isNone()) - return; - - TypingCommand::insertParagraphSeparatorInQuotedContent(m_frame->document()); - m_frame->revealSelection(RenderLayer::gAlignToEdgeIfNeeded); -} - -- (VisiblePosition)_visiblePositionForPoint:(NSPoint)point -{ - IntPoint outerPoint(point); - HitTestResult result = m_frame->eventHandler()->hitTestResultAtPoint(outerPoint, true); - Node* node = result.innerNode(); - if (!node) - return VisiblePosition(); - RenderObject* renderer = node->renderer(); - if (!renderer) - return VisiblePosition(); - VisiblePosition visiblePos = renderer->positionForCoordinates(result.localPoint().x(), result.localPoint().y()); - if (visiblePos.isNull()) - visiblePos = VisiblePosition(Position(node, 0)); - return visiblePos; -} - -- (DOMRange *)characterRangeAtPoint:(NSPoint)point -{ - VisiblePosition position = [self _visiblePositionForPoint:point]; - if (position.isNull()) - return nil; - - VisiblePosition previous = position.previous(); - if (previous.isNotNull()) { - DOMRange *previousCharacterRange = [DOMRange _wrapRange:makeRange(previous, position).get()]; - NSRect rect = [self firstRectForDOMRange:previousCharacterRange]; - if (NSPointInRect(point, rect)) - return previousCharacterRange; - } - - VisiblePosition next = position.next(); - if (next.isNotNull()) { - DOMRange *nextCharacterRange = [DOMRange _wrapRange:makeRange(position, next).get()]; - NSRect rect = [self firstRectForDOMRange:nextCharacterRange]; - if (NSPointInRect(point, rect)) - return nextCharacterRange; - } - - return nil; -} - -- (DOMCSSStyleDeclaration *)typingStyle -{ - if (!m_frame || !m_frame->typingStyle()) - return nil; - return [DOMCSSStyleDeclaration _wrapCSSStyleDeclaration:m_frame->typingStyle()->copy().get()]; -} - -- (void)setTypingStyle:(DOMCSSStyleDeclaration *)style withUndoAction:(EditAction)undoAction -{ - if (!m_frame) - return; - m_frame->computeAndSetTypingStyle([style _CSSStyleDeclaration], undoAction); -} - -- (NSFont *)fontForSelection:(BOOL *)hasMultipleFonts -{ - bool multipleFonts = false; - NSFont *font = nil; - if (m_frame) { - const SimpleFontData* fd = m_frame->editor()->fontForSelection(multipleFonts); - if (fd) - font = fd->getNSFont(); - } - - if (hasMultipleFonts) - *hasMultipleFonts = multipleFonts; - return font; -} - -- (void)dragSourceMovedTo:(NSPoint)windowLoc -{ - if (m_frame) { - // FIXME: Fake modifier keys here. - PlatformMouseEvent event(IntPoint(windowLoc), globalPoint(windowLoc, [self window]), - LeftButton, MouseEventMoved, 0, false, false, false, false, currentTime()); - m_frame->eventHandler()->dragSourceMovedTo(event); - } -} - -- (void)dragSourceEndedAt:(NSPoint)windowLoc operation:(NSDragOperation)operation -{ - if (m_frame) { - // FIXME: Fake modifier keys here. - PlatformMouseEvent event(IntPoint(windowLoc), globalPoint(windowLoc, [self window]), - LeftButton, MouseEventMoved, 0, false, false, false, false, currentTime()); - m_frame->eventHandler()->dragSourceEndedAt(event, (DragOperation)operation); - } -} - -- (BOOL)getData:(NSData **)data andResponse:(NSURLResponse **)response forURL:(NSString *)url -{ - Document* doc = m_frame->document(); - if (!doc) - return NO; - - CachedResource* resource = doc->docLoader()->cachedResource(url); - if (!resource) - return NO; - - SharedBuffer* buffer = resource->data(); - if (buffer) - *data = [buffer->createNSData() autorelease]; - else - *data = nil; - - *response = resource->response().nsURLResponse(); - return YES; -} - -- (void)getAllResourceDatas:(NSArray **)datas andResponses:(NSArray **)responses -{ - Document* doc = m_frame->document(); - if (!doc) { - NSArray* emptyArray = [NSArray array]; - *datas = emptyArray; - *responses = emptyArray; - return; - } - - const HashMap<String, CachedResource*>& allResources = doc->docLoader()->allCachedResources(); - - NSMutableArray *d = [[NSMutableArray alloc] initWithCapacity:allResources.size()]; - NSMutableArray *r = [[NSMutableArray alloc] initWithCapacity:allResources.size()]; - - HashMap<String, CachedResource*>::const_iterator end = allResources.end(); - for (HashMap<String, CachedResource*>::const_iterator it = allResources.begin(); it != end; ++it) { - SharedBuffer* buffer = it->second->data(); - NSData *data; - if (buffer) - data = buffer->createNSData(); - else - data = [[NSData alloc] init]; - [d addObject:data]; - [data release]; - [r addObject:it->second->response().nsURLResponse()]; - } - - *datas = [d autorelease]; - *responses = [r autorelease]; -} - -- (BOOL)canProvideDocumentSource -{ - String mimeType = m_frame->loader()->responseMIMEType(); - - if (WebCore::DOMImplementation::isTextMIMEType(mimeType) || - Image::supportsType(mimeType) || - PluginInfoStore::supportsMIMEType(mimeType)) - return NO; - - return YES; -} - -- (BOOL)canSaveAsWebArchive -{ - // Currently, all documents that we can view source for - // (HTML and XML documents) can also be saved as web archives - return [self canProvideDocumentSource]; -} - -- (void)receivedData:(NSData *)data textEncodingName:(NSString *)textEncodingName -{ - // Set the encoding. This only needs to be done once, but it's harmless to do it again later. - String encoding; - if (m_frame) - encoding = m_frame->loader()->documentLoader()->overrideEncoding(); - bool userChosen = !encoding.isNull(); - if (encoding.isNull()) - encoding = textEncodingName; - m_frame->loader()->setEncoding(encoding, userChosen); - [self addData:data]; -} - -// ------------------- - -- (Frame*)_frame -{ - return m_frame; -} - -@end |