• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All right reserved.
4  * Copyright (C) 2010 Google Inc. All rights reserved.
5  * Copyright (C) 2013 Adobe Systems Incorporated.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23 
24 #include "config.h"
25 #include "core/rendering/line/BreakingContextInlineHeaders.h"
26 
27 namespace blink {
28 
handleEndOfLine()29 InlineIterator BreakingContext::handleEndOfLine()
30 {
31     if (m_lineBreak == m_resolver.position() && (!m_lineBreak.object() || !m_lineBreak.object()->isBR())) {
32         // we just add as much as possible
33         if (m_blockStyle->whiteSpace() == PRE && !m_current.offset()) {
34             m_lineBreak.moveTo(m_lastObject, m_lastObject->isText() ? m_lastObject->length() : 0);
35         } else if (m_lineBreak.object()) {
36             // Don't ever break in the middle of a word if we can help it.
37             // There's no room at all. We just have to be on this line,
38             // even though we'll spill out.
39             m_lineBreak.moveTo(m_current.object(), m_current.offset());
40         }
41     }
42 
43     // FIXME Bug 100049: We do not need to consume input in a multi-segment line
44     // unless no segment will.
45     if (m_lineBreak == m_resolver.position())
46         m_lineBreak.increment();
47 
48     // Sanity check our midpoints.
49     m_lineMidpointState.checkMidpoints(m_lineBreak);
50 
51     m_trailingObjects.updateMidpointsForTrailingObjects(m_lineMidpointState, m_lineBreak, TrailingObjects::CollapseFirstSpace);
52 
53     // We might have made lineBreak an iterator that points past the end
54     // of the object. Do this adjustment to make it point to the start
55     // of the next object instead to avoid confusing the rest of the
56     // code.
57     if (m_lineBreak.offset()) {
58         // This loop enforces the invariant that line breaks should never point
59         // at an empty inline. See http://crbug.com/305904.
60         do {
61             m_lineBreak.setOffset(m_lineBreak.offset() - 1);
62             m_lineBreak.increment();
63         } while (!m_lineBreak.atEnd() && isEmptyInline(m_lineBreak.object()));
64     }
65 
66     return m_lineBreak;
67 }
68 
69 }
70