WebCore:
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 7 Sep 2004 00:25:38 +0000 (00:25 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 7 Sep 2004 00:25:38 +0000 (00:25 +0000)
commitde219887441aa61d484d6bfb55c34629e484562f
tree082eebd9f5a44603af4e5af47a147f71f082d8d5
parentf326bd4ea30287dc95c3dadbd48ab8c28b53ff0f
WebCore:

        Reviewed by John.

        - fixed <rdar://problem/3512066> REGRESSION (Mail): Select All highlights only part of the content, though all is copied
        - fixed <rdar://problem/3157025> REGRESSION (Mail): Should select paragraph instead of line on triple-click
        - fixed <rdar://problem/3735048> REGRESSION (Mail): HTML editing must select newline on triple click
        - fixed <rdar://problem/3788872> REGRESSION (Mail): ctrl-a emacs key binding does not work (move to start of paragraph)
        - fixed <rdar://problem/3788881> REGRESSION (Mail): ctrl-e emacs key binding does not work (move to end of paragraph)
        - fixed <rdar://problem/3789931> REGRESSION (Mail): typing style lost when you backspace
        - added code to select inserted text to help WebKit implement yankAndSelect:
        - did some clean-up on editing commands code

        * khtml/khtml_part.cpp:
        (KHTMLPart::handleMousePressEventTripleClick): Expand to a paragraph, not a line.
        (KHTMLPart::selectAll): Remove a lot of unneeded code and just expand to document using Selection.
        (KHTMLPart::selectionHasStyle): Remove check that limited us to only HTML elements, and add
        a check for nil. Together, these two changes fix a few cases I ran into during testing.

        * khtml/rendering/render_canvas.cpp: (RenderCanvas::setSelection): Fix test that was checking if
        the old selection spanned multiple objects when it really should have checked whether the new
        new selection spans multiple objects. This caused the select all redraw bug.

        * khtml/editing/htmlediting.h: Fixed indenting. Remove command IDs, replacing them with a couple
        of specific type checking methods, and SharedCommandImpl, using EditCommandImpl directly instead.
        Got rid of virtual functions, since the command objects have no data members other than the ones
        inherited from SharedPtr. Removed explicit copy constructors and destructors. Removed unneeded
        empty constructors. Removed inline directives that were having no effect. Added some boolean
        selectInsertedText parameter to some commands. Made almost all member functions const, because
        the const here applies to the command object which is a smart pointer, not the pointed-to
        command implementation object.
        * khtml/editing/htmlediting.cpp:
        (khtml::EditCommand::EditCommand): Changed since SharedPtr is now a pointer to EditCommandImpl.
        (khtml::EditCommand::operator=): Added. By defining this explicitly, we don't need the class
        that we are pointing to defined in the header, which lets us get rid of SharedCommandImpl.
        (khtml::EditCommand::isInputTextCommand): Added.
        (khtml::EditCommand::isTypingCommand): Added.
        (khtml::EditCommand::setParent): Updated since EditCommandImpl.setParent takes an impl pointer now.
        (khtml::EditCommand::handle): Removed, since it's identical to get().
        (khtml::InputTextCommand::input): Added selectInsertedText parameter.
        (khtml::TypingCommand::TypingCommand): Ditto.
        (khtml::TypingCommand::insertText): Ditto.
        (khtml::TypingCommand::isOpenForMoreTypingCommand): Use isTypingCommand instead of commandID.
        (khtml::TypingCommand::closeTyping): Change parameter type to const reference.

        * khtml/editing/htmlediting_impl.h: Made StyleChange functions be const member functions.
        Changed parent() and setParent() to take and return EditCommandImpl pointers and be inlined.
        Added virtual isInputTextCommand, isTypingCommand, and preservesTypingStyle functions.
        Removed commandID functions and unneeded explicit destructors. Removed unneeded doApply
        function declaration in CompositeEditCommandImpl. Changed type of applyTypingStyle to return
        a node, not necessarily an element. Removed private execute function from InputTextCommandImpl.
        Added selectInsertedText to InputTextCommandImpl's input function and TypingCommandImpl's constructor
        and insertText function.
        * khtml/editing/htmlediting_impl.cpp:
        (khtml::StyleChange::StyleChange): Don't bother initializing the booleans since init handles that.
        (khtml::StyleChange::init): Added code to strip whitespace, and tweaked how the function does its job.
        (khtml::StyleChange::currentlyHasStyle): Added a check for null value, which can happen for properties
        where we don't have computed style implemented yet.
        (khtml::EditCommandImpl::EditCommandImpl): Updated since there is no SharedCommandImpl any more.
        (khtml::EditCommandImpl::apply): Call new preservesTypingStyle function rather than checking
        the command ID. This preserves typing style when deleting with the keyboard.
        (khtml::EditCommandImpl::setStartingSelection): Changed since parent is now a EditCommandImpl.
        Also rewrote to use for loop so it's simpler-looking.
        (khtml::EditCommandImpl::setEndingSelection): Ditto.
        (khtml::EditCommandImpl::setTypingStyle): Ditto.
        (khtml::EditCommandImpl::preservesTypingStyle): Added. Returns false.
        (khtml::EditCommandImpl::isInputTextCommand): Added. Returns false.
        (khtml::EditCommandImpl::isTypingCommand): Added. Returns false.
        (khtml::CompositeEditCommandImpl::applyTypingStyle): Changed this function to return a node rather
        than an element. Also change it so it returns the child as-is if the style change has nothing in it.
        (khtml::AppendNodeCommandImpl::~AppendNodeCommandImpl): Removed unneeded null checks.
        (khtml::DeleteSelectionCommandImpl::preservesTypingStyle): Added. Returns true.
        (khtml::DeleteTextCommandImpl::~DeleteTextCommandImpl): Removed unneeded null checks.
        (khtml::InputTextCommandImpl::input): Renamed execute function to input and got rid of the additional
        level of indirection, since it was the only caller. Added selectInsertedText parameter and changed
        the code so it will respect it.
        (khtml::InputTextCommandImpl::isInputTextCommand): Added. Returns true.
        (khtml::InsertNodeBeforeCommandImpl::~InsertNodeBeforeCommandImpl): Removed unneeded null checks.
        (khtml::JoinTextNodesCommandImpl::~JoinTextNodesCommandImpl): Ditto.
        (khtml::MoveSelectionCommandImpl::MoveSelectionCommandImpl): Hold a reference to the fragment
        while the command exists.
        (khtml::MoveSelectionCommandImpl::~MoveSelectionCommandImpl): Release the fragment.
        (khtml::RemoveNodeCommandImpl::~RemoveNodeCommandImpl): Remove unneeded null checks.
        (khtml::RemoveNodeCommandImpl::doUnapply): Take advantage of defined behavior of insertBefore when
        the node to insert before is 0 (means the same thing as appendChild).
        (khtml::RemoveNodePreservingChildrenCommandImpl::~RemoveNodePreservingChildrenCommandImpl):
        Remove unneeded null check.
        (khtml::ReplaceSelectionCommandImpl::ReplaceSelectionCommandImpl): Hold a reference to the fragment
        while the command exists.
        (khtml::ReplaceSelectionCommandImpl::~ReplaceSelectionCommandImpl): Release the fragment.
        (khtml::SetNodeAttributeCommandImpl::~SetNodeAttributeCommandImpl): Remove unneeded null check.
        (khtml::SplitTextNodeCommandImpl::~SplitTextNodeCommandImpl): Remove unneeded null check.
        (khtml::TypingCommandImpl::TypingCommandImpl): Added selectInsertedText parameter.
        (khtml::TypingCommandImpl::doApply): Pass along selectInsertedText parameter.
        (khtml::TypingCommandImpl::insertText): Ditto.
        (khtml::TypingCommandImpl::preservesTypingStyle): Added. Returns true for DeleteKey.
        (khtml::TypingCommandImpl::isTypingCommand): Added. Returns true.

        * khtml/editing/jsediting.cpp: Add a cut at implementing the underline command. May not work
        perfectly yet because text-decoration is not inherited the way, say, font-weight is.

        * khtml/xml/dom_selection.h: Removed some unneeded friend declarations for comparison operators
        that use only public members. Added PARAGRAPH_BOUNDARY.
        * khtml/xml/dom_selection.cpp:
        (DOM::Selection::modifyExtendingRightForward): Implemented paragraph boundary case, simplified line
        boundary case (by changing parameter types and function names, not the algorithm), and made
        paragraph case fall into line case for now.
        (DOM::Selection::modifyMovingRightForward): Ditto.
        (DOM::Selection::modifyExtendingLeftBackward): Ditto.
        (DOM::Selection::modifyMovingLeftBackward): Ditto.
        (DOM::Selection::validate): Implemented paragraph case and paragraph boundary case, simplified the
        line case as above and also fixed the document case.
        (DOM::startOfFirstRunAt): Changed to use DOM::Position instead of node
        offset pairs. Also renamed and got rid of separate bool to indicate "not found".
        (DOM::endOfLastRunAt): Ditto.
        (DOM::selectionForLine): Ditto.

        * khtml/xml/dom_position.h: Added startParagraphBoundary and endParagraphBoundary.
        Also used enums instead of bools in a couple of places. Removed some unneeded friend
        declarations for comparison operators that use only public members.
        * khtml/xml/dom_position.cpp:
        (DOM::Position::Position): Coding style tweak.
        (DOM::Position::startParagraphBoundary): Added.
        (DOM::Position::endParagraphBoundary): Added.
        (DOM::Position::upstream): Use enum parameter instead of bool.
        (DOM::Position::downstream): Ditto.
        (DOM::Position::rendersOnSameLine): Removed unused function. Noticed some backwards logic
        here, and removed it rather than fixing it.

        * khtml/xml/dom_nodeimpl.h: Added traversePreviousNodePostOrder.
        * khtml/xml/dom_nodeimpl.cpp:
        (NodeImpl::traversePreviousNodePostOrder): Added. For some uses, this function is more analogous
        to traverseNextNode in reverse than traversePreviousNode, which does a backwards pre-order traversal.

        * kwq/WebCoreBridge.h: Replaced fontForCurrentPosition method with fontForSelection:, added
        selectInsertedText parameter to insertText method, and added selectionStartHasStyle: method.
        Add WebSelectToParagraphBoundary.
        * kwq/WebCoreBridge.mm:
        (-[WebCoreBridge setSelectedDOMRange:affinity:]): Added workaround for bug where isRenderedContent
        returns false for <br> elements at the ends of lines.
        (-[WebCoreBridge insertText:selectInsertedText:]): Added selectInsertedText parameter, passing it
        along to TypingCommand::insertText.
        (-[WebCoreBridge selectionStartHasStyle:]): Added. Calls code in the part that does the real work.
        (-[WebCoreBridge fontForSelection:]): Ditto.

        * kwq/KWQKHTMLPart.h: Renamed fontForCurrentPosition to fontForSelection, and added a feature
        where it tells us whether there are multiple fonts in the selection or not.
        * kwq/KWQKHTMLPart.mm:
        (KWQKHTMLPart::fontForSelection): Rewrote this to be a bit simpler, and added code to detect
        whether there are multiple fonts in the selection.
        (KWQKHTMLPart::didTellBridgeAboutLoad): Use a global character rather than a bad pointer here.
        Better not to rely on undefined behavior.
        (KWQKHTMLPart::documentFragmentWithText): Use lowercase HTML. I believe this works better when
        the document is XML, and we should probably visit all callers and change them.
        (KWQKHTMLPart::registerCommandForUndo): Call get() instead of handle().
        (KWQKHTMLPart::registerCommandForRedo): Call get() instead of handle().

        * khtml/misc/shared.h: Added a private, non-implemented copy constructor and assignment
        operator to Shared<> and TreeShared<> to prevent copying reference counts by accident.
        * khtml/rendering/render_style.h: Get rid of Shared<BorderData>, since it's not used that way.
        This makes BorderData smaller, and allows it to compile with the change to Shared<>.
        * khtml/xml/dom_docimpl.h: Remove unneeded copy constructor on DocumentFragmentImpl,
        which ran afoul of the change to Shared<> and was unused.
        * khtml/xml/dom_docimpl.cpp: Ditto.
        * khtml/xml/dom_stringimpl.cpp:
        (DOM::DOMStringImpl::empty): Changed code around so it doesn't run afoul of the change to
        Shared<>. The old code was copying a DOMStringImpl.
        (DOM::DOMStringImpl::ascii): Added code to null-terminate the string buffer.

WebKit:

        Reviewed by John.

        - fixed <rdar://problem/3696542> REGRESSION (Mail): Editable WebKit doesn't support underline yet (in the iChat profile window, at least)
        - fixed <rdar://problem/3780249> REGRESSION (Mail): copy style/paste style doesn't work in HTML editing in Mail
        - fixed <rdar://problem/3788857> REGRESSION (Mail): Home and End keys don't work in message composer
        - fixed <rdar://problem/3788884> REGRESSION (Mail): ctrl-d emacs key binding does not work (delete forward)
        - fixed <rdar://problem/3788890> REGRESSION (Mail): ctrl-k emacs key binding does not work (delete to end of paragraph)
        - fixed <rdar://problem/3788899> REGRESSION (Mail): ctrl-y emacs key binding does not work (yank)
        - fixed <rdar://problem/3788901> REGRESSION (Mail): ctrl-o emacs key binding does not work (insert newline in front of insertion point)
        - fixed <rdar://problem/3788908> REGRESSION (Mail): ctrl-left-arrow emacs key binding does not work (move to beginning of line)
        - fixed <rdar://problem/3788913> REGRESSION (Mail): ctrl-right-arrow emacs key binding does not work (move to end of line)
        - implemented a first cut at other attribute changes from Text Panel besides underline (bugs?)
        - dealt with a couple of FIXMEs in WebHTMLView.m
        - updated list of not-yet-implemented methods in WebHTMLView.m
        - fixed many deletion operations to call the correct editing delegate methods

        * WebView.subproj/WebFrameViewPrivate.h: Remove _scrollToTopLeft and _scrollToBottomLeft.
        No one was calling them anyway, so they should really have been marked internal and not private.
        * WebView.subproj/WebFrameView.m:
        (-[WebFrameView scrollToBeginningOfDocument:]): Renamed _scrollToTopLeft to this, so the home key
        would start working with the key bindings machinery.
        (-[WebFrameView scrollToEndOfDocument:]): Same thing, for end key.
        (-[WebFrameView keyDown:]): Update for name changes, and also make sure we don't try to grab
        control-arrow keys here (probably not necessary, but good anyway).

        * WebView.subproj/WebHTMLViewInternal.h: Added keyDownEvent field, and startNewKillRingSequence
        and nextResponderDisabledOnce flags.
        * WebView.subproj/WebHTMLView.m:
        Rearrange declarations at the top of the file so that external things are up with
        the #import directives and things inside this file are declared below.
        (-[WebHTMLView _shouldReplaceSelectionWithText:givenAction:]): Ditto.
        (-[WebHTMLView _calculatePrintHeight]): Moved up into the "internal to file" category.
        (-[WebHTMLView _updateTextSizeMultiplier]): Ditto.
        (-[WebHTMLView _selectedRange]): Added.
        (-[WebHTMLView _openLinkFromMenu:]): Left this method lying around even though I deleted the
        other APPKIT_CODE_FOR_REFERENCE in case this shows up in the context menu we are now sharing
        with the AppKit. Chris will look at this later, and he can delete it then.
        (+[WebHTMLView initialize]): Call _NSInitializeKillRing.
        (-[WebHTMLView _documentRange]): Added.
        (-[WebHTMLView string]): Call the bridge to get the plain text rather than making an attributed
        string and then getting the text from there.
        (-[WebHTMLView becomeFirstResponder]): Set startNewKillRingSequence flag, so that new deletions
        will create a new kill ring entry.
        (-[WebHTMLView moveToBeginningOfDocument:]): Use backward direction instead of left direction.
        (-[WebHTMLView moveToBeginningOfDocumentAndModifySelection:]): Ditto.
        (-[WebHTMLView moveToBeginningOfLine:]): Ditto.
        (-[WebHTMLView moveToBeginningOfLineAndModifySelection:]): Ditto.
        (-[WebHTMLView moveToBeginningOfParagraph:]): Ditto, also use WebSelectToParagraphBoundary.
        (-[WebHTMLView moveToBeginningOfParagraphAndModifySelection:]): Ditto.
        (-[WebHTMLView moveToEndOfDocument:]): Use forward direction instead of right direction.
        (-[WebHTMLView moveToEndOfDocumentAndModifySelection:]): Ditto.
        (-[WebHTMLView moveToEndOfLine:]): Ditto.
        (-[WebHTMLView moveToEndOfLineAndModifySelection:]): Ditto.
        (-[WebHTMLView moveToEndOfParagraph:]): Ditto, also use WebSelectToParagraphBoundary.
        (-[WebHTMLView moveToEndOfParagraphAndModifySelection:]): Ditto.
        (-[WebHTMLView _shouldDeleteRange:]): Added.
        (-[WebHTMLView _deleteRange:preflight:killRing:prepend:]): Added.
        (-[WebHTMLView delete:]): Changed to call new _deleteRange method.
        (-[WebHTMLView cut:]): Changed to preflight property and call new _deleteRange method.
        (-[WebHTMLView _selectionFontAttributes]): Added.
        (-[WebHTMLView _selectionFontAttributesAsRTF]): Added.
        (-[WebHTMLView _fontAttributesFromFontPasteboard]): Added.
        (-[WebHTMLView _emptyStyle]): Added.
        (-[WebHTMLView _styleFromFontAttributes:]): Added.
        (-[WebHTMLView _applyStyleToSelection:]): Added.
        (-[WebHTMLView copyFont:]): Implemented.
        (-[WebHTMLView pasteFont:]): Implemented.
        (-[WebHTMLView _originalFontA]): Added.
        (-[WebHTMLView _originalFontB]): Added.
        (-[WebHTMLView _addToStyle:fontA:fontB:]): Added. Has code from the method that figures out
        what the font manager is doing for changeFont:, now needed for changeAttribute: too.
        (-[WebHTMLView _styleFromFontManagerOperation]): Renamed and now calls shared methods.
        (-[WebHTMLView changeFont:]): Call shared method, still does the same thing.
        (-[WebHTMLView _colorAsString:]): Added. Has code from the method we were using with the
        color panel before.
        (-[WebHTMLView _shadowAsString:]): Added.
        (-[WebHTMLView _styleForAttributeChange:]): Added.
        (-[WebHTMLView changeAttributes:]): Implemented.
        (-[WebHTMLView _styleFromColorPanelWithSelector:]): Renamed and now calls shared methods.
        (-[WebHTMLView _changeCSSColorUsingSelector:inRange:]): Call method by new name.
        (-[WebHTMLView changeDocumentBackgroundColor:]): Call method by new name.
        (-[WebHTMLView changeColor:]): Changed around a bit; still doesn't work yet.
        (-[WebHTMLView _alignSelectionUsingCSSValue:]): Call shared methods.
        (-[WebHTMLView indent:]): Removed, since NSTextView doesn't implement this method. Added to list
        of methods to possibly implement later in the file.
        (-[WebHTMLView insertTab:]): Call insertText: to save code and so we get WebViewInsertActionTyped
        instead of WebViewInsertActionPasted.
        (-[WebHTMLView changeCaseOfLetter:]): Removed, since NSTextView doesn't implement this method.
        Added to list of methods to possibly implement later in the file.
        (-[WebHTMLView _deleteWithDirection:granularity:killRing:]): Added.
        (-[WebHTMLView deleteForward:]): Implemented. This makes Control-D work.
        (-[WebHTMLView deleteBackwardByDecomposingPreviousCharacter:]): Implemented by just calling
        deleteBackward for now; probably better than doing nothing.
        (-[WebHTMLView deleteWordForward:]): Changed to call new _delete method above. Fixes things
        so that we delete the selection if there is one, get the appropriate delegate calls, handle
        the kill ring properly, and don't do any selection if we can't delete.
        (-[WebHTMLView deleteWordBackward:]): Ditto.
        (-[WebHTMLView deleteToBeginningOfLine:]): Ditto.
        (-[WebHTMLView deleteToEndOfLine:]): Ditto.
        (-[WebHTMLView deleteToBeginningOfParagraph:]): Ditto.
        (-[WebHTMLView deleteToEndOfParagraph:]): Ditto. Added additional behavior needed since this
        is bound to Control-K, so it's not really just delete to end of paragraph.
        (-[WebHTMLView insertNewlineIgnoringFieldEditor:]): Added. Calls insertNewline:.
        (-[WebHTMLView insertTabIgnoringFieldEditor:]): Added. Calls insertTab:.
        (-[WebHTMLView subscript:]): Added.
        (-[WebHTMLView superscript:]): Added.
        (-[WebHTMLView unscript:]): Added.
        (-[WebHTMLView underline:]): Added.
        (-[WebHTMLView yank:]): Added.
        (-[WebHTMLView yankAndSelect:]): Added. Calls _insertText.
        (-[WebHTMLView _arrowKeyDownEventSelectorIfPreprocessing:]): Added. Part of workaround for
        control-arrow key trouble.
        (-[WebHTMLView respondsToSelector:]): Added. More of workaround.
        (-[WebHTMLView nextResponder:]): Added. More of workaround.
        (-[WebHTMLView _selectionChanged]): Set startNewKillRingSequence flag, so that new deletions
        will create a new kill ring entry.
        (-[WebHTMLView _updateFontPanel]): Remove a bunch of code here that wasn't working very well
        because it walked a DOM range incorrectly, and instead use the new method that does all the
        right stuff on the other side of the bridge.
        (-[WebHTMLView _insertText:selectInsertedText:]): Added new helper method for use by both
        insertText and yankAndSelect, with most of the guts of insertText and one additional parameter.
        (-[WebHTMLView insertText:]): Call the new _insertText.

        * WebView.subproj/WebView.m: Use macros to make the forwarding from WebView more terse.
        Updated the list to include a few methods it didn't before.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7464 268f45cc-cd09-0410-ab3c-d52691b4dbfc
34 files changed:
WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/SelectionController.cpp
WebCore/khtml/editing/SelectionController.h
WebCore/khtml/editing/htmlediting.cpp
WebCore/khtml/editing/htmlediting.h
WebCore/khtml/editing/htmlediting_impl.cpp
WebCore/khtml/editing/htmlediting_impl.h
WebCore/khtml/editing/jsediting.cpp
WebCore/khtml/editing/selection.cpp
WebCore/khtml/editing/selection.h
WebCore/khtml/khtml_part.cpp
WebCore/khtml/misc/shared.h
WebCore/khtml/rendering/render_canvas.cpp
WebCore/khtml/rendering/render_style.h
WebCore/khtml/xml/dom_docimpl.cpp
WebCore/khtml/xml/dom_docimpl.h
WebCore/khtml/xml/dom_nodeimpl.cpp
WebCore/khtml/xml/dom_nodeimpl.h
WebCore/khtml/xml/dom_position.cpp
WebCore/khtml/xml/dom_position.h
WebCore/khtml/xml/dom_selection.cpp
WebCore/khtml/xml/dom_selection.h
WebCore/khtml/xml/dom_stringimpl.cpp
WebCore/kwq/KWQKHTMLPart.h
WebCore/kwq/KWQKHTMLPart.mm
WebCore/kwq/WebCoreBridge.h
WebCore/kwq/WebCoreBridge.mm
WebKit/ChangeLog
WebKit/WebView.subproj/WebFrameView.m
WebKit/WebView.subproj/WebFrameViewInternal.h
WebKit/WebView.subproj/WebFrameViewPrivate.h
WebKit/WebView.subproj/WebHTMLView.m
WebKit/WebView.subproj/WebHTMLViewInternal.h
WebKit/WebView.subproj/WebView.m