+2004-12-03 Ken Kocienda <kocienda@apple.com>
+
+ Reviewed by John
+
+ Did some clean up in the Position class as a result of trying to write some new layout
+ tests and discovering a bug along the way.
+
+ I removed these three functions from the Position class:
+
+ 1. bool isFirstRenderedPositionOnLine() const;
+ 2. bool isLastRenderedPositionOnLine() const;
+ 3. static bool renderersOnDifferentLine(RenderObject *r1, long o1, RenderObject *r2, long o2);
+ 4. bool inFirstEditableInRootEditableElement() const;
+
+ The first two have replacements in the VisiblePosition class, and some code has been
+ moved to use these new variants. The third function was a helper used only by these
+ first two function, and can be removed as well. The fourth function was not used by anyone.
+
+ * khtml/editing/htmlediting.cpp:
+ (khtml::InsertTextCommand::input): Change over to use VisiblePosition isFirstVisiblePositionOnLine().
+ * khtml/editing/visible_position.cpp:
+ (khtml::visiblePositionsOnDifferentLines): Added an additional check for blocks to this function.
+ Incorrect results were being returned when asking about positions at the starts of blocks.
+ * khtml/xml/dom_position.cpp:
+ (DOM::Position::previousCharacterPosition): Change over to use VisiblePosition isFirstVisiblePositionOnLine().
+ (DOM::Position::nextCharacterPosition): Change over to use VisiblePosition isLastVisiblePositionOnLine().
+ (DOM::Position::rendersInDifferentPosition): Removed use of #3 helper in a log message. We can live without it.
+ * khtml/xml/dom_position.h: Update header for deletions.
+
2004-12-03 Ken Kocienda <kocienda@apple.com>
Reviewed by John
#include "helper.h"
#include "htmltags.h"
#include "text_affinity.h"
+#include "visible_position.h"
#include "rendering/render_block.h"
#include "rendering/render_flow.h"
#include "rendering/render_line.h"
using khtml::RenderText;
using khtml::RootInlineBox;
using khtml::VISIBLE;
+using khtml::VisiblePosition;
namespace DOM {
-static bool renderersOnDifferentLine(RenderObject *r1, long o1, RenderObject *r2, long o2)
-{
- InlineBox *b1 = r1 ? r1->inlineBox(o1) : 0;
- InlineBox *b2 = r2 ? r2->inlineBox(o2) : 0;
- return (b1 && b2 && b1->root() != b2->root());
-}
-
static NodeImpl *nextRenderedEditable(NodeImpl *node)
{
while (1) {
NodeImpl *fromRootEditableElement = node()->rootEditableElement();
PositionIterator it(*this);
- bool atStartOfLine = isFirstRenderedPositionOnLine();
+ bool atStartOfLine = isFirstVisiblePositionOnLine(VisiblePosition(*this));
bool rendered = inRenderedContent();
while (!it.atStart()) {
NodeImpl *fromRootEditableElement = node()->rootEditableElement();
PositionIterator it(*this);
- bool atEndOfLine = isLastRenderedPositionOnLine();
+ bool atEndOfLine = isLastVisiblePositionOnLine(VisiblePosition(*this));
bool rendered = inRenderedContent();
while (!it.atEnd()) {
if (renderer == posRenderer && thisRenderedOffset == posRenderedOffset)
return false;
- LOG(Editing, "onDifferentLine: %s\n", renderersOnDifferentLine(renderer, offset(), posRenderer, pos.offset()) ? "YES" : "NO");
LOG(Editing, "renderer: %p [%p]\n", renderer, renderer ? renderer->inlineBox(offset()) : 0);
LOG(Editing, "thisRenderedOffset: %d\n", thisRenderedOffset);
LOG(Editing, "posRenderer: %p [%p]\n", posRenderer, posRenderer ? posRenderer->inlineBox(offset()) : 0);
return true;
}
-bool Position::isFirstRenderedPositionOnLine() const
-{
- if (isNull())
- return false;
-
- RenderObject *renderer = node()->renderer();
- if (!renderer)
- return false;
-
- if (renderer->style()->visibility() != VISIBLE)
- return false;
-
- if (!inRenderedContent())
- return false;
-
- PositionIterator it(*this);
- while (!it.atStart()) {
- it.previous();
- RenderObject *currentRenderer = it.current().node()->renderer();
- if (!currentRenderer || currentRenderer->firstChild())
- // we want a leaf for this check
- continue;
- if (it.current().inRenderedContent())
- return renderersOnDifferentLine(renderer, offset(), currentRenderer, it.current().offset());
- }
-
- return true;
-}
-
-bool Position::isLastRenderedPositionOnLine() const
-{
- if (isNull())
- return false;
-
- RenderObject *renderer = node()->renderer();
- if (!renderer)
- return false;
-
- if (renderer->style()->visibility() != VISIBLE)
- return false;
-
- if (!inRenderedContent())
- return false;
-
- if (node()->id() == ID_BR)
- return true;
-
- PositionIterator it(*this);
- while (!it.atEnd()) {
- it.next();
- RenderObject *currentRenderer = it.current().node()->renderer();
- if (!currentRenderer || currentRenderer->firstChild())
- // we want a leaf for this check
- continue;
- if (it.current().inRenderedContent())
- return renderersOnDifferentLine(renderer, offset(), currentRenderer, it.current().offset());
- }
-
- return true;
-}
-
-bool Position::inFirstEditableInRootEditableElement() const
-{
- if (isNull() || !inRenderedContent())
- return false;
-
- PositionIterator it(*this);
- while (!it.atStart()) {
- it.previous();
- RenderObject *currentRenderer = it.current().node()->renderer();
- if (!currentRenderer || currentRenderer->firstChild())
- // we want a leaf for this check
- continue;
- if (it.current().inRenderedContent())
- return false;
- }
-
- return true;
-}
-
static inline bool isWS(const QChar &c)
{
const char nonBreakingSpace = 0xA0;