<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
+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
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
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
- (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;
#import "render_style.h"
#import "selection.h"
#import "visible_position.h"
+#import "visible_units.h"
#import "xml_tokenizer.h"
#import <JavaScriptCore/npruntime.h>
[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.