<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[225070] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/225070">225070</a></dd>
<dt>Author</dt> <dd>fred.wang@free.fr</dd>
<dt>Date</dt> <dd>2017-11-21 01:19:17 -0800 (Tue, 21 Nov 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Remove unintentionally committed .orig file.
https://bugs.webkit.org/show_bug.cgi?id=174131

Unreviewed, fix previous commit.

Patch by Frederic Wang <fwang@igalia.com> on 2017-11-21

* rendering/mathml/RenderMathMLScripts.cpp.orig: Removed.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCorerenderingmathmlRenderMathMLScriptscpporig">trunk/Source/WebCore/rendering/mathml/RenderMathMLScripts.cpp.orig</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (225069 => 225070)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2017-11-21 08:37:59 UTC (rev 225069)
+++ trunk/Source/WebCore/ChangeLog      2017-11-21 09:19:17 UTC (rev 225070)
</span><span class="lines">@@ -1,5 +1,14 @@
</span><span class="cx"> 2017-11-21  Frederic Wang  <fwang@igalia.com>
</span><span class="cx"> 
</span><ins>+        Remove unintentionally committed .orig file.
+        https://bugs.webkit.org/show_bug.cgi?id=174131
+
+        Unreviewed, fix previous commit.
+
+        * rendering/mathml/RenderMathMLScripts.cpp.orig: Removed.
+
+2017-11-21  Frederic Wang  <fwang@igalia.com>
+
</ins><span class="cx">         ASSERTION FAILED: !needsLayout() in WebCore::RenderMathMLScripts::firstLineBaseline
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=174131
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingmathmlRenderMathMLScriptscpporig"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/rendering/mathml/RenderMathMLScripts.cpp.orig (225069 => 225070)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/mathml/RenderMathMLScripts.cpp.orig       2017-11-21 08:37:59 UTC (rev 225069)
+++ trunk/Source/WebCore/rendering/mathml/RenderMathMLScripts.cpp.orig  2017-11-21 09:19:17 UTC (rev 225070)
</span><span class="lines">@@ -1,490 +0,0 @@
</span><del>-/*
- * Copyright (C) 2010 Alex Milowski (alex@milowski.com). All rights reserved.
- * Copyright (C) 2013 The MathJax Consortium.
- * Copyright (C) 2016 Igalia S.L.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "RenderMathMLScripts.h"
-
-#if ENABLE(MATHML)
-
-#include "MathMLElement.h"
-#include "MathMLScriptsElement.h"
-#include "RenderMathMLOperator.h"
-#include <wtf/IsoMallocInlines.h>
-
-namespace WebCore {
-
-WTF_MAKE_ISO_ALLOCATED_IMPL(RenderMathMLScripts);
-
-static bool isPrescriptDelimiter(const RenderObject& renderObject)
-{
-    return renderObject.node() && renderObject.node()->hasTagName(MathMLNames::mprescriptsTag);
-}
-
-RenderMathMLScripts::RenderMathMLScripts(MathMLScriptsElement& element, RenderStyle&& style)
-    : RenderMathMLBlock(element, WTFMove(style))
-{
-    // Determine what kind of sub/sup expression we have by element name
-    if (element.hasTagName(MathMLNames::msubTag))
-        m_scriptType = Sub;
-    else if (element.hasTagName(MathMLNames::msupTag))
-        m_scriptType = Super;
-    else if (element.hasTagName(MathMLNames::msubsupTag))
-        m_scriptType = SubSup;
-    else if (element.hasTagName(MathMLNames::munderTag))
-        m_scriptType = Under;
-    else if (element.hasTagName(MathMLNames::moverTag))
-        m_scriptType = Over;
-    else if (element.hasTagName(MathMLNames::munderoverTag))
-        m_scriptType = UnderOver;
-    else {
-        ASSERT(element.hasTagName(MathMLNames::mmultiscriptsTag));
-        m_scriptType = Multiscripts;
-    }
-}
-
-MathMLScriptsElement& RenderMathMLScripts::element() const
-{
-    return static_cast<MathMLScriptsElement&>(nodeForNonAnonymous());
-}
-
-RenderMathMLOperator* RenderMathMLScripts::unembellishedOperator()
-{
-    auto base = firstChildBox();
-    if (!is<RenderMathMLBlock>(base))
-        return nullptr;
-    return downcast<RenderMathMLBlock>(base)->unembellishedOperator();
-}
-
-std::optional<RenderMathMLScripts::ReferenceChildren> RenderMathMLScripts::validateAndGetReferenceChildren()
-{
-    // All scripted elements must have at least one child.
-    // The first child is the base.
-    auto base = firstChildBox();
-    if (!base)
-        return std::nullopt;
-
-    ReferenceChildren reference;
-    reference.base = base;
-    reference.firstPostScript = nullptr;
-    reference.firstPreScript = nullptr;
-    reference.prescriptDelimiter = nullptr;
-
-    switch (m_scriptType) {
-    case Sub:
-    case Super:
-    case Under:
-    case Over: {
-        // These elements must have exactly two children.
-        // The second child is a postscript and there are no prescripts.
-        // <msub> base subscript </msub>
-        // <msup> base superscript </msup>
-        // <munder> base underscript </munder>
-        // <mover> base overscript </mover>
-        auto script = base->nextSiblingBox();
-        if (!script || isPrescriptDelimiter(*script) || script->nextSiblingBox())
-            return std::nullopt;
-        reference.firstPostScript = script;
-        return reference;
-    }
-    case SubSup:
-    case UnderOver: {
-        // These elements must have exactly three children.
-        // The second and third children are postscripts and there are no prescripts.
-        // <msubsup> base subscript superscript </msubsup>
-        // <munderover> base subscript superscript </munderover>
-        auto subScript = base->nextSiblingBox();
-        if (!subScript || isPrescriptDelimiter(*subScript))
-            return std::nullopt;
-        auto superScript = subScript->nextSiblingBox();
-        if (!superScript || isPrescriptDelimiter(*superScript) || superScript->nextSiblingBox())
-            return std::nullopt;
-        reference.firstPostScript = subScript;
-        return reference;
-    }
-    case Multiscripts: {
-        // This element accepts the following syntax:
-        //
-        // <mmultiscripts>
-        //   base
-        //   (subscript superscript)*
-        //   [ <mprescripts/> (presubscript presuperscript)* ]
-        // </mmultiscripts>
-        //
-        // https://www.w3.org/TR/MathML3/chapter3.html#presm.mmultiscripts
-        //
-        // We set the first postscript, unless (subscript superscript)* is empty.
-        if (base->nextSiblingBox() && !isPrescriptDelimiter(*base->nextSiblingBox()))
-            reference.firstPostScript = base->nextSiblingBox();
-
-        // We browse the children in order to
-        // 1) Set the first prescript, unless (presubscript presuperscript)* is empty.
-        // 2) Ensure the validity of the element i.e.
-        //   a) That the list of postscripts can be grouped into pairs of subscript/superscript.
-        //   b) That the list of prescripts can be grouped into pairs of subscript/superscript.
-        //   c) That there is at most one <mprescripts/>.
-        bool numberOfScriptIsEven = true;
-        for (auto script = base->nextSiblingBox(); script; script = script->nextSiblingBox()) {
-            if (isPrescriptDelimiter(*script)) {
-                // This is a <mprescripts/>. Let's check 2a) and 2c).
-                if (!numberOfScriptIsEven || reference.firstPreScript)
-                    return std::nullopt;
-                reference.firstPreScript = script->nextSiblingBox(); // We do 1).
-                reference.prescriptDelimiter = script;
-                continue;
-            }
-            numberOfScriptIsEven = !numberOfScriptIsEven;
-        }
-        return numberOfScriptIsEven ? std::optional<ReferenceChildren>(reference) : std::nullopt; // We verify 2b).
-    }
-    }
-
-    ASSERT_NOT_REACHED();
-    return std::nullopt;
-}
-
-LayoutUnit RenderMathMLScripts::spaceAfterScript()
-{
-    const auto& primaryFont = style().fontCascade().primaryFont();
-    if (auto* mathData = primaryFont.mathData())
-        return mathData->getMathConstant(primaryFont, OpenTypeMathData::SpaceAfterScript);
-    return style().fontCascade().size() / 5;
-}
-
-LayoutUnit RenderMathMLScripts::italicCorrection(const ReferenceChildren& reference)
-{
-    if (is<RenderMathMLBlock>(*reference.base)) {
-        if (auto* renderOperator = downcast<RenderMathMLBlock>(*reference.base).unembellishedOperator())
-            return renderOperator->italicCorrection();
-    }
-    return 0;
-}
-
-void RenderMathMLScripts::computePreferredLogicalWidths()
-{
-    ASSERT(preferredLogicalWidthsDirty());
-
-    m_minPreferredLogicalWidth = 0;
-    m_maxPreferredLogicalWidth = 0;
-
-    auto possibleReference = validateAndGetReferenceChildren();
-    if (!possibleReference) {
-        setPreferredLogicalWidthsDirty(false);
-        return;
-    }
-    auto& reference = possibleReference.value();
-
-    LayoutUnit baseItalicCorrection = std::min(reference.base->maxPreferredLogicalWidth(), italicCorrection(reference));
-    LayoutUnit space = spaceAfterScript();
-
-    switch (m_scriptType) {
-    case Sub:
-    case Under:
-        m_maxPreferredLogicalWidth += reference.base->maxPreferredLogicalWidth();
-        m_maxPreferredLogicalWidth += std::max(LayoutUnit(0), reference.firstPostScript->maxPreferredLogicalWidth() - baseItalicCorrection + space);
-        break;
-    case Super:
-    case Over:
-        m_maxPreferredLogicalWidth += reference.base->maxPreferredLogicalWidth();
-        m_maxPreferredLogicalWidth += std::max(LayoutUnit(0), reference.firstPostScript->maxPreferredLogicalWidth() + space);
-        break;
-    case SubSup:
-    case UnderOver:
-    case Multiscripts: {
-        auto subScript = reference.firstPreScript;
-        while (subScript) {
-            auto supScript = subScript->nextSiblingBox();
-            ASSERT(supScript);
-            LayoutUnit subSupPairWidth = std::max(subScript->maxPreferredLogicalWidth(), supScript->maxPreferredLogicalWidth());
-            m_maxPreferredLogicalWidth += subSupPairWidth + space;
-            subScript = supScript->nextSiblingBox();
-        }
-        m_maxPreferredLogicalWidth += reference.base->maxPreferredLogicalWidth();
-        subScript = reference.firstPostScript;
-        while (subScript && subScript != reference.prescriptDelimiter) {
-            auto supScript = subScript->nextSiblingBox();
-            ASSERT(supScript);
-            LayoutUnit subSupPairWidth = std::max(std::max(LayoutUnit(0), subScript->maxPreferredLogicalWidth() - baseItalicCorrection), supScript->maxPreferredLogicalWidth());
-            m_maxPreferredLogicalWidth += subSupPairWidth + space;
-            subScript = supScript->nextSiblingBox();
-        }
-    }
-    }
-
-    m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth;
-
-    setPreferredLogicalWidthsDirty(false);
-}
-
-auto RenderMathMLScripts::verticalParameters() const -> VerticalParameters
-{
-    VerticalParameters parameters;
-    const auto& primaryFont = style().fontCascade().primaryFont();
-    if (auto* mathData = primaryFont.mathData()) {
-        parameters.subscriptShiftDown = mathData->getMathConstant(primaryFont, OpenTypeMathData::SubscriptShiftDown);
-        parameters.superscriptShiftUp = mathData->getMathConstant(primaryFont, OpenTypeMathData::SuperscriptShiftUp);
-        parameters.subscriptBaselineDropMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::SubscriptBaselineDropMin);
-        parameters.superScriptBaselineDropMax = mathData->getMathConstant(primaryFont, OpenTypeMathData::SuperscriptBaselineDropMax);
-        parameters.subSuperscriptGapMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::SubSuperscriptGapMin);
-        parameters.superscriptBottomMin = mathData->getMathConstant(primaryFont, OpenTypeMathData::SuperscriptBottomMin);
-        parameters.subscriptTopMax = mathData->getMathConstant(primaryFont, OpenTypeMathData::SubscriptTopMax);
-        parameters.superscriptBottomMaxWithSubscript = mathData->getMathConstant(primaryFont, OpenTypeMathData::SuperscriptBottomMaxWithSubscript);
-    } else {
-        // Default heuristic values when you do not have a font.
-        parameters.subscriptShiftDown = style().fontMetrics().xHeight() / 3;
-        parameters.superscriptShiftUp = style().fontMetrics().xHeight();
-        parameters.subscriptBaselineDropMin = style().fontMetrics().xHeight() / 2;
-        parameters.superScriptBaselineDropMax = style().fontMetrics().xHeight() / 2;
-        parameters.subSuperscriptGapMin = style().fontCascade().size() / 5;
-        parameters.superscriptBottomMin = style().fontMetrics().xHeight() / 4;
-        parameters.subscriptTopMax = 4 * style().fontMetrics().xHeight() / 5;
-        parameters.superscriptBottomMaxWithSubscript = 4 * style().fontMetrics().xHeight() / 5;
-    }
-    return parameters;
-}
-
-RenderMathMLScripts::VerticalMetrics RenderMathMLScripts::verticalMetrics(const ReferenceChildren& reference)
-{
-    VerticalParameters parameters = verticalParameters();
-    VerticalMetrics metrics = { 0, 0, 0, 0 };
-
-    LayoutUnit baseAscent = ascentForChild(*reference.base);
-    LayoutUnit baseDescent = reference.base->logicalHeight() - baseAscent;
-    if (m_scriptType == Sub || m_scriptType == SubSup || m_scriptType == Multiscripts || m_scriptType == Under || m_scriptType == UnderOver) {
-        metrics.subShift = std::max(parameters.subscriptShiftDown, baseDescent + parameters.subscriptBaselineDropMin);
-        if (!isRenderMathMLUnderOver()) {
-            // It is not clear how to interpret the default shift and it is not available yet anyway.
-            // Hence we just pass 0 as the default value used by toUserUnits.
-            LayoutUnit specifiedMinSubShift = toUserUnits(element().subscriptShift(), style(), 0);
-            metrics.subShift = std::max(metrics.subShift, specifiedMinSubShift);
-        }
-    }
-    if (m_scriptType == Super || m_scriptType == SubSup || m_scriptType == Multiscripts  || m_scriptType == Over || m_scriptType == UnderOver) {
-        metrics.supShift = std::max(parameters.superscriptShiftUp, baseAscent - parameters.superScriptBaselineDropMax);
-        if (!isRenderMathMLUnderOver()) {
-            // It is not clear how to interpret the default shift and it is not available yet anyway.
-            // Hence we just pass 0 as the default value used by toUserUnits.
-            LayoutUnit specifiedMinSupShift = toUserUnits(element().superscriptShift(), style(), 0);
-            metrics.supShift = std::max(metrics.supShift, specifiedMinSupShift);
-        }
-    }
-
-    switch (m_scriptType) {
-    case Sub:
-    case Under: {
-        LayoutUnit subAscent = ascentForChild(*reference.firstPostScript);
-        LayoutUnit subDescent = reference.firstPostScript->logicalHeight() - subAscent;
-        metrics.descent = subDescent;
-        metrics.subShift = std::max(metrics.subShift, subAscent - parameters.subscriptTopMax);
-    }
-        break;
-    case Super:
-    case Over: {
-        LayoutUnit supAscent = ascentForChild(*reference.firstPostScript);
-        LayoutUnit supDescent = reference.firstPostScript->logicalHeight() - supAscent;
-        metrics.ascent = supAscent;
-        metrics.supShift = std::max(metrics.supShift, parameters.superscriptBottomMin + supDescent);
-    }
-        break;
-    case SubSup:
-    case UnderOver:
-    case Multiscripts: {
-        // FIXME: We should move the code updating VerticalMetrics for each sub/sup pair in a helper
-        // function. That way, SubSup/UnderOver can just make one call and the loop for Multiscripts
-        // can be rewritten in a more readable.
-        auto subScript = reference.firstPostScript ? reference.firstPostScript : reference.firstPreScript;
-        while (subScript) {
-            auto supScript = subScript->nextSiblingBox();
-            ASSERT(supScript);
-            LayoutUnit subAscent = ascentForChild(*subScript);
-            LayoutUnit subDescent = subScript->logicalHeight() - subAscent;
-            LayoutUnit supAscent = ascentForChild(*supScript);
-            LayoutUnit supDescent = supScript->logicalHeight() - supAscent;
-            metrics.ascent = std::max(metrics.ascent, supAscent);
-            metrics.descent = std::max(metrics.descent, subDescent);
-            LayoutUnit subScriptShift = std::max(parameters.subscriptShiftDown, baseDescent + parameters.subscriptBaselineDropMin);
-            subScriptShift = std::max(subScriptShift, subAscent - parameters.subscriptTopMax);
-            LayoutUnit supScriptShift = std::max(parameters.superscriptShiftUp, baseAscent - parameters.superScriptBaselineDropMax);
-            supScriptShift = std::max(supScriptShift, parameters.superscriptBottomMin + supDescent);
-
-            LayoutUnit subSuperscriptGap = (subScriptShift - subAscent) + (supScriptShift - supDescent);
-            if (subSuperscriptGap < parameters.subSuperscriptGapMin) {
-                // First, we try and push the superscript up.
-                LayoutUnit delta = parameters.superscriptBottomMaxWithSubscript - (supScriptShift - supDescent);
-                if (delta > 0) {
-                    delta = std::min(delta, parameters.subSuperscriptGapMin - subSuperscriptGap);
-                    supScriptShift += delta;
-                    subSuperscriptGap += delta;
-                }
-                // If that is not enough, we push the subscript down.
-                if (subSuperscriptGap < parameters.subSuperscriptGapMin)
-                    subScriptShift += parameters.subSuperscriptGapMin - subSuperscriptGap;
-            }
-
-            metrics.subShift = std::max(metrics.subShift, subScriptShift);
-            metrics.supShift = std::max(metrics.supShift, supScriptShift);
-
-            subScript = supScript->nextSiblingBox();
-            if (subScript == reference.prescriptDelimiter)
-                subScript = reference.firstPreScript;
-        }
-    }
-    }
-
-    return metrics;
-}
-
-void RenderMathMLScripts::layoutBlock(bool relayoutChildren, LayoutUnit)
-{
-    ASSERT(needsLayout());
-
-    if (!relayoutChildren && simplifiedLayout())
-        return;
-
-    auto possibleReference = validateAndGetReferenceChildren();
-    if (!possibleReference) {
-        layoutInvalidMarkup(relayoutChildren);
-        return;
-    }
-    auto& reference = possibleReference.value();
-
-    recomputeLogicalWidth();
-    for (auto child = firstChildBox(); child; child = child->nextSiblingBox())
-        child->layoutIfNeeded();
-
-    LayoutUnit space = spaceAfterScript();
-
-    // We determine the minimal shift/size of each script and take the maximum of the values.
-    VerticalMetrics metrics = verticalMetrics(reference);
-
-    LayoutUnit baseAscent = ascentForChild(*reference.base);
-    LayoutUnit baseDescent = reference.base->logicalHeight() - baseAscent;
-    LayoutUnit baseItalicCorrection = std::min(reference.base->logicalWidth(), italicCorrection(reference));
-    LayoutUnit horizontalOffset = 0;
-
-    LayoutUnit ascent = std::max(baseAscent, metrics.ascent + metrics.supShift);
-    LayoutUnit descent = std::max(baseDescent, metrics.descent + metrics.subShift);
-    setLogicalHeight(ascent + descent);
-
-    switch (m_scriptType) {
-    case Sub:
-    case Under: {
-        setLogicalWidth(reference.base->logicalWidth() + std::max(LayoutUnit(0), reference.firstPostScript->logicalWidth() - baseItalicCorrection + space));
-        LayoutPoint baseLocation(mirrorIfNeeded(horizontalOffset, *reference.base), ascent - baseAscent);
-        reference.base->setLocation(baseLocation);
-        horizontalOffset += reference.base->logicalWidth();
-        LayoutUnit scriptAscent = ascentForChild(*reference.firstPostScript);
-        LayoutPoint scriptLocation(mirrorIfNeeded(horizontalOffset - baseItalicCorrection, *reference.firstPostScript), ascent + metrics.subShift - scriptAscent);
-        reference.firstPostScript->setLocation(scriptLocation);
-    }
-        break;
-    case Super:
-    case Over: {
-        setLogicalWidth(reference.base->logicalWidth() + std::max(LayoutUnit(0), reference.firstPostScript->logicalWidth() + space));
-        LayoutPoint baseLocation(mirrorIfNeeded(horizontalOffset, *reference.base), ascent - baseAscent);
-        reference.base->setLocation(baseLocation);
-        horizontalOffset += reference.base->logicalWidth();
-        LayoutUnit scriptAscent = ascentForChild(*reference.firstPostScript);
-        LayoutPoint scriptLocation(mirrorIfNeeded(horizontalOffset, *reference.firstPostScript), ascent - metrics.supShift - scriptAscent);
-        reference.firstPostScript->setLocation(scriptLocation);
-    }
-        break;
-    case SubSup:
-    case UnderOver:
-    case Multiscripts: {
-        // Calculate the logical width.
-        LayoutUnit logicalWidth = 0;
-        auto subScript = reference.firstPreScript;
-        while (subScript) {
-            auto supScript = subScript->nextSiblingBox();
-            ASSERT(supScript);
-            LayoutUnit subSupPairWidth = std::max(subScript->logicalWidth(), supScript->logicalWidth());
-            logicalWidth += subSupPairWidth + space;
-            subScript = supScript->nextSiblingBox();
-        }
-        logicalWidth += reference.base->logicalWidth();
-        subScript = reference.firstPostScript;
-        while (subScript && subScript != reference.prescriptDelimiter) {
-            auto supScript = subScript->nextSiblingBox();
-            ASSERT(supScript);
-            LayoutUnit subSupPairWidth = std::max(std::max(LayoutUnit(0), subScript->logicalWidth() - baseItalicCorrection), supScript->logicalWidth());
-            logicalWidth += subSupPairWidth + space;
-            subScript = supScript->nextSiblingBox();
-        }
-        setLogicalWidth(logicalWidth);
-
-        subScript = reference.firstPreScript;
-        while (subScript) {
-            auto supScript = subScript->nextSiblingBox();
-            ASSERT(supScript);
-            LayoutUnit subSupPairWidth = std::max(subScript->logicalWidth(), supScript->logicalWidth());
-            horizontalOffset += space + subSupPairWidth;
-            LayoutUnit subAscent = ascentForChild(*subScript);
-            LayoutPoint subScriptLocation(mirrorIfNeeded(horizontalOffset - subScript->logicalWidth(), *subScript), ascent + metrics.subShift - subAscent);
-            subScript->setLocation(subScriptLocation);
-            LayoutUnit supAscent = ascentForChild(*supScript);
-            LayoutPoint supScriptLocation(mirrorIfNeeded(horizontalOffset - supScript->logicalWidth(), *supScript), ascent - metrics.supShift - supAscent);
-            supScript->setLocation(supScriptLocation);
-            subScript = supScript->nextSiblingBox();
-        }
-        LayoutPoint baseLocation(mirrorIfNeeded(horizontalOffset, *reference.base), ascent - baseAscent);
-        reference.base->setLocation(baseLocation);
-        horizontalOffset += reference.base->logicalWidth();
-        subScript = reference.firstPostScript;
-        while (subScript && subScript != reference.prescriptDelimiter) {
-            auto supScript = subScript->nextSiblingBox();
-            ASSERT(supScript);
-            LayoutUnit subAscent = ascentForChild(*subScript);
-            LayoutPoint subScriptLocation(mirrorIfNeeded(horizontalOffset - baseItalicCorrection, *subScript), ascent + metrics.subShift - subAscent);
-            subScript->setLocation(subScriptLocation);
-            LayoutUnit supAscent = ascentForChild(*supScript);
-            LayoutPoint supScriptLocation(mirrorIfNeeded(horizontalOffset, *supScript), ascent - metrics.supShift - supAscent);
-            supScript->setLocation(supScriptLocation);
-
-            LayoutUnit subSupPairWidth = std::max(subScript->logicalWidth(), supScript->logicalWidth());
-            horizontalOffset += subSupPairWidth + space;
-            subScript = supScript->nextSiblingBox();
-        }
-    }
-    }
-
-    layoutPositionedObjects(relayoutChildren);
-
-    clearNeedsLayout();
-}
-
-std::optional<int> RenderMathMLScripts::firstLineBaseline() const
-{
-    ASSERT(!needsLayout());
-    auto* base = firstChildBox();
-    if (!base)
-        return std::optional<int>();
-    return std::optional<int>(static_cast<int>(lroundf(ascentForChild(*base) + base->logicalTop())));
-}
-
-}
-
-#endif // ENABLE(MATHML)
</del></span></pre>
</div>
</div>

</body>
</html>