Home | History | Annotate | Download | only in line
      1 /*
      2  * Copyright (C) 2000 Lars Knoll (knoll (at) 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 
     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