| Index: Source/core/rendering/svg/SVGTextQuery.cpp
 | 
| diff --git a/Source/core/rendering/svg/SVGTextQuery.cpp b/Source/core/rendering/svg/SVGTextQuery.cpp
 | 
| index e9096d9bab498b9bbaf7113a2e0e8a24ff47013f..fe7f7c08c3b9c361b9321c7fc1b1a00aac61f0bf 100644
 | 
| --- a/Source/core/rendering/svg/SVGTextQuery.cpp
 | 
| +++ b/Source/core/rendering/svg/SVGTextQuery.cpp
 | 
| @@ -545,23 +545,24 @@ bool SVGTextQuery::characterNumberAtPositionCallback(Data* queryData, const SVGT
 | 
|  {
 | 
|      CharacterNumberAtPositionData* data = static_cast<CharacterNumberAtPositionData*>(queryData);
 | 
|  
 | 
| -    // Offset of the fragment within the text box.
 | 
| -    unsigned boxOffset = fragment.characterOffset - queryData->textBox->start();
 | 
| -
 | 
| +    // Iterate through the glyphs in this fragment, and check if their extents
 | 
| +    // contain the query point.
 | 
|      FloatRect extent;
 | 
| -    for (unsigned i = 0; i < fragment.length; ++i) {
 | 
| -        int startPosition = data->processedCharacters + boxOffset + i;
 | 
| -        int endPosition = startPosition + 1;
 | 
| -        if (!mapStartEndPositionsIntoFragmentCoordinates(queryData, fragment, startPosition, endPosition))
 | 
| -            continue;
 | 
| -
 | 
| -        calculateGlyphBoundaries(queryData, fragment, startPosition, extent);
 | 
| +    const Vector<SVGTextMetrics>& textMetrics = queryData->textRenderer->layoutAttributes()->textMetricsValues();
 | 
| +    unsigned textMetricsOffset = fragment.metricsListOffset;
 | 
| +    unsigned fragmentOffset = 0;
 | 
| +    while (fragmentOffset < fragment.length) {
 | 
| +        calculateGlyphBoundaries(queryData, fragment, fragmentOffset, extent);
 | 
|          if (extent.contains(data->position)) {
 | 
| -            data->processedCharacters += boxOffset + i;
 | 
| +            // Compute the character offset of the glyph within the text box
 | 
| +            // and add to processedCharacters.
 | 
| +            unsigned characterOffset = fragment.characterOffset + fragmentOffset;
 | 
| +            data->processedCharacters += characterOffset - data->textBox->start();
 | 
|              return true;
 | 
|          }
 | 
| +        fragmentOffset += textMetrics[textMetricsOffset].length();
 | 
| +        textMetricsOffset++;
 | 
|      }
 | 
| -
 | 
|      return false;
 | 
|  }
 | 
|  
 | 
| 
 |