/// <summary>
        /// Adjust the start and end of the range to match the offset/length, in characters.
        /// if the offset/length adjustment fails to produce the expected value,
        /// then the adjustment is cancelled and false is returned.
        /// </summary>
        public static bool AdjustMarkupRange(ref IHTMLTxtRange stagingTextRange, MarkupRange range, int offset, int length)
        {
            string currentText = GetRangeTextFast(range) ?? "";

            if (offset == 0 && length == currentText.Length)
            {
                return(true);
            }

            string expectedText;

            try
            {
                expectedText = currentText.Substring(offset, length);
            }
            catch (ArgumentOutOfRangeException)
            {
                return(false);
            }

            MarkupRange testRange = range.Clone();

            AdjustMarkupRangeCore(testRange, offset, length, currentText);
            if (GetRangeTextFast(testRange) != expectedText)
            {
                return(false);
            }

            range.MoveToRange(testRange);
            return(true);
        }