Reviewed by Maciej.
authorharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Mar 2005 01:31:03 +0000 (01:31 +0000)
committerharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Mar 2005 01:31:03 +0000 (01:31 +0000)
        <rdar://problem/4048506> Deleting from beginning of editable div deletes other document elements

        Also changed WebKit.

        * khtml/editing/visible_units.h:
        * khtml/editing/visible_units.cpp:
        (khtml::startOfEditableContent):
        (khtml::endOfEditableContent):
        (khtml::inSameEditableContent):
        (khtml::isStartOfEditableContent):
        (khtml::isEndOfEditableContent):
        New.

        * kwq/WebCoreBridge.h:
        * kwq/WebCoreBridge.mm:
        (-[WebCoreBridge canDeleteRange:]):
        New.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8905 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/visible_units.cpp
WebCore/khtml/editing/visible_units.h
WebCore/kwq/WebCoreBridge.h
WebCore/kwq/WebCoreBridge.mm

index 5c72c088bdddd1ab9bee1b8414465361f46a7990..22ce225713dfb5b4dde992522d5f7c612e55a2da 100644 (file)
@@ -1,3 +1,25 @@
+2005-03-16  David Harrison  <harrison@apple.com>
+
+        Reviewed by Maciej.
+
+        <rdar://problem/4048506> Deleting from beginning of editable div deletes other document elements
+        
+        Also changed WebKit.
+        
+        * khtml/editing/visible_units.h:
+        * khtml/editing/visible_units.cpp:
+        (khtml::startOfEditableContent):
+        (khtml::endOfEditableContent):
+        (khtml::inSameEditableContent):
+        (khtml::isStartOfEditableContent):
+        (khtml::isEndOfEditableContent):
+        New.
+        
+        * kwq/WebCoreBridge.h:
+        * kwq/WebCoreBridge.mm:
+        (-[WebCoreBridge canDeleteRange:]):
+        New.
+
 2005-03-16  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Darin
index 7500742be06556a6dc1f005dd62c305b21a107a7..62ffa6cf23445fb0584fd883b63a789a522b50ef 100644 (file)
@@ -812,4 +812,64 @@ bool isEndOfDocument(const VisiblePosition &p)
     return p.isNotNull() && p.next().isNull();
 }
 
+// ---------
+
+VisiblePosition startOfEditableContent(const VisiblePosition &c)
+{
+    Position p = c.deepEquivalent();
+    NodeImpl *node = p.node();
+    if (!node)
+        return VisiblePosition();
+
+    if (!node->isContentEditable())
+        return VisiblePosition();
+
+    return VisiblePosition(node->rootEditableElement(), 0, DOWNSTREAM);
+}
+
+VisiblePosition endOfEditableContent(const VisiblePosition &c)
+{
+    Position p = c.deepEquivalent();
+    NodeImpl *node = p.node();
+    if (!node)
+        return VisiblePosition();
+
+    if (!node->isContentEditable())
+        return VisiblePosition();
+
+    node = node->rootEditableElement();
+    if (!node)
+        return VisiblePosition();
+
+    return VisiblePosition(node, node->childNodeCount(), DOWNSTREAM);
+}
+
+bool inSameEditableContent(const VisiblePosition &a, const VisiblePosition &b)
+{
+    Position ap = a.deepEquivalent();
+    NodeImpl *an = ap.node();
+    if (!an)
+        return false;
+        
+    Position bp = b.deepEquivalent();
+    NodeImpl *bn = bp.node();
+    if (!bn)
+        return false;
+    
+    if (!an->isContentEditable() || !bn->isContentEditable())
+        return false;
+
+    return an->rootEditableElement() == bn->rootEditableElement();
+}
+
+bool isStartOfEditableContent(const VisiblePosition &p)
+{
+    return inSameEditableContent(p, p.previous());
+}
+
+bool isEndOfEditableContent(const VisiblePosition &p)
+{
+    return inSameEditableContent(p, p.next());
+}
+
 } // namespace khtml
index 404b2468bf087e4755922b71e06c3cc9cf34dc1a..d3161ae7e505367a864fff0a039ae38877654776 100644 (file)
@@ -79,6 +79,13 @@ bool inSameDocument(const VisiblePosition &, const VisiblePosition &);
 bool isStartOfDocument(const VisiblePosition &);
 bool isEndOfDocument(const VisiblePosition &);
 
+// editable content
+VisiblePosition startOfEditableContent(const VisiblePosition &);
+VisiblePosition endOfEditableContent(const VisiblePosition &);
+bool inSameEditableContent(const VisiblePosition &, const VisiblePosition &);
+bool isStartOfEditableContent(const VisiblePosition &);
+bool isEndOfEditableContent(const VisiblePosition &);
+
 } // namespace DOM
 
 #endif // KHTML_EDITING_VISIBLE_POSITION_H
index 24d6aa1f988352302144e6f5323a666198ebe4b9..473ee4d4063f44015a9ddb3d061145dde8ff6cd5 100644 (file)
@@ -373,6 +373,7 @@ typedef enum {
 - (WebSelectionGranularity)selectionGranularity;
 - (DOMRange *)smartDeleteRangeForProposedRange:(DOMRange *)proposedCharRange;
 - (void)smartInsertForString:(NSString *)pasteString replacingRange:(DOMRange *)charRangeToReplace beforeString:(NSString **)beforeString afterString:(NSString **)afterString;
+- (BOOL)canDeleteRange:(DOMRange *)range;
 
 - (DOMDocumentFragment *)documentFragmentWithMarkupString:(NSString *)markupString baseURLString:(NSString *)baseURLString;
 - (DOMDocumentFragment *)documentFragmentWithText:(NSString *)text;
index d60066780ad2e5168c9b92cdac2c089b3183dba5..f205c370dfa2c64204fa293dd3f73f493915eb1e 100644 (file)
@@ -56,6 +56,7 @@
 #import "render_style.h"
 #import "selection.h"
 #import "visible_position.h"
+#import "visible_units.h"
 #import "xml_tokenizer.h"
 
 #import <JavaScriptCore/npruntime.h>
@@ -1670,6 +1671,25 @@ static HTMLFormElementImpl *formElementFromDOMElement(DOMElement *element)
     [self ensureSelectionVisible];
 }
 
+- (BOOL)canDeleteRange:(DOMRange *)range
+{
+    NodeImpl *startContainer = [[range startContainer] _nodeImpl];
+    NodeImpl *endContainer = [[range endContainer] _nodeImpl];
+    if (startContainer == nil || endContainer == nil)
+        return NO;
+    
+    if (!startContainer->isContentEditable() || !endContainer->isContentEditable())
+        return NO;
+    
+    if ([range collapsed]) {
+        VisiblePosition start(startContainer, [range startOffset], DOWNSTREAM);
+        if (isStartOfEditableContent(start))
+            return NO;
+    }
+    
+    return YES;
+}
+
 // 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.