Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(791)

Side by Side Diff: Source/core/html/parser/HTMLTreeBuilder.cpp

Issue 26129005: Rewrite Text node attaching to not be N^2 (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Seems to actually work Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved.
3 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 #ifndef NDEBUG 331 #ifndef NDEBUG
332 // This call makes little sense in fragment mode, but for consistency 332 // This call makes little sense in fragment mode, but for consistency
333 // DocumentParser expects detach() to always be called before it's destroyed . 333 // DocumentParser expects detach() to always be called before it's destroyed .
334 m_isAttached = false; 334 m_isAttached = false;
335 #endif 335 #endif
336 // HTMLConstructionSite might be on the callstack when detach() is called 336 // HTMLConstructionSite might be on the callstack when detach() is called
337 // otherwise we'd just call m_tree.clear() here instead. 337 // otherwise we'd just call m_tree.clear() here instead.
338 m_tree.detach(); 338 m_tree.detach();
339 } 339 }
340 340
341 void HTMLTreeBuilder::flush()
342 {
343 m_tree.flush();
344 }
345
341 HTMLTreeBuilder::FragmentParsingContext::FragmentParsingContext() 346 HTMLTreeBuilder::FragmentParsingContext::FragmentParsingContext()
342 : m_fragment(0) 347 : m_fragment(0)
343 , m_contextElement(0) 348 , m_contextElement(0)
344 { 349 {
345 } 350 }
346 351
347 HTMLTreeBuilder::FragmentParsingContext::FragmentParsingContext(DocumentFragment * fragment, Element* contextElement) 352 HTMLTreeBuilder::FragmentParsingContext::FragmentParsingContext(DocumentFragment * fragment, Element* contextElement)
348 : m_fragment(fragment) 353 : m_fragment(fragment)
349 , m_contextElement(contextElement) 354 , m_contextElement(contextElement)
350 { 355 {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 // We might be detached now. 393 // We might be detached now.
389 } 394 }
390 395
391 void HTMLTreeBuilder::processToken(AtomicHTMLToken* token) 396 void HTMLTreeBuilder::processToken(AtomicHTMLToken* token)
392 { 397 {
393 if (token->type() == HTMLToken::Character) { 398 if (token->type() == HTMLToken::Character) {
394 processCharacter(token); 399 processCharacter(token);
395 return; 400 return;
396 } 401 }
397 402
403 // Any non-character token needs to cause us to flush any pending text immed iately.
404 // NOTE: flush() can cause any queued tasks to execute, possibly re-entering the parser.
405 m_tree.flush();
abarth-chromium 2013/10/11 18:54:04 I wonder if we need a faster reject here in the ca
398 m_shouldSkipLeadingNewline = false; 406 m_shouldSkipLeadingNewline = false;
399 407
400 switch (token->type()) { 408 switch (token->type()) {
401 case HTMLToken::Uninitialized: 409 case HTMLToken::Uninitialized:
402 case HTMLToken::Character: 410 case HTMLToken::Character:
403 ASSERT_NOT_REACHED(); 411 ASSERT_NOT_REACHED();
404 break; 412 break;
405 case HTMLToken::DOCTYPE: 413 case HTMLToken::DOCTYPE:
406 processDoctypeToken(token); 414 processDoctypeToken(token);
407 break; 415 break;
(...skipping 2414 matching lines...) Expand 10 before | Expand all | Expand 10 after
2822 ASSERT(m_isAttached); 2830 ASSERT(m_isAttached);
2823 // Warning, this may detach the parser. Do not do anything else after this. 2831 // Warning, this may detach the parser. Do not do anything else after this.
2824 m_tree.finishedParsing(); 2832 m_tree.finishedParsing();
2825 } 2833 }
2826 2834
2827 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) 2835 void HTMLTreeBuilder::parseError(AtomicHTMLToken*)
2828 { 2836 {
2829 } 2837 }
2830 2838
2831 } // namespace WebCore 2839 } // namespace WebCore
OLDNEW
« Source/core/html/parser/HTMLDocumentParser.cpp ('K') | « Source/core/html/parser/HTMLTreeBuilder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698