| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 } | 220 } |
| 221 | 221 |
| 222 bool HTMLDocumentParser::isScheduledForResume() const | 222 bool HTMLDocumentParser::isScheduledForResume() const |
| 223 { | 223 { |
| 224 return m_parserScheduler && m_parserScheduler->isScheduledForResume(); | 224 return m_parserScheduler && m_parserScheduler->isScheduledForResume(); |
| 225 } | 225 } |
| 226 | 226 |
| 227 // Used by HTMLParserScheduler | 227 // Used by HTMLParserScheduler |
| 228 void HTMLDocumentParser::resumeParsingAfterYield() | 228 void HTMLDocumentParser::resumeParsingAfterYield() |
| 229 { | 229 { |
| 230 ASSERT(!m_isPinnedToMainThread); |
| 230 // pumpTokenizer can cause this parser to be detached from the Document, | 231 // pumpTokenizer can cause this parser to be detached from the Document, |
| 231 // but we need to ensure it isn't deleted yet. | 232 // but we need to ensure it isn't deleted yet. |
| 232 RefPtr<HTMLDocumentParser> protect(this); | 233 RefPtr<HTMLDocumentParser> protect(this); |
| 233 | 234 |
| 234 if (m_haveBackgroundParser) { | 235 if (m_haveBackgroundParser) { |
| 235 pumpPendingSpeculations(); | 236 pumpPendingSpeculations(); |
| 236 return; | 237 return; |
| 237 } | 238 } |
| 238 | 239 |
| 239 // We should never be here unless we can pump immediately. Call pumpTokeniz
er() | 240 // We should never be here unless we can pump immediately. Call pumpTokeniz
er() |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 | 385 |
| 385 ActiveParserSession session(contextForParsingSession()); | 386 ActiveParserSession session(contextForParsingSession()); |
| 386 | 387 |
| 387 OwnPtr<ParsedChunk> chunk(popChunk); | 388 OwnPtr<ParsedChunk> chunk(popChunk); |
| 388 OwnPtr<CompactHTMLTokenStream> tokens = chunk->tokens.release(); | 389 OwnPtr<CompactHTMLTokenStream> tokens = chunk->tokens.release(); |
| 389 | 390 |
| 390 HTMLParserThread::shared()->postTask(bind(&BackgroundHTMLParser::startedChun
kWithCheckpoint, m_backgroundParser, chunk->inputCheckpoint)); | 391 HTMLParserThread::shared()->postTask(bind(&BackgroundHTMLParser::startedChun
kWithCheckpoint, m_backgroundParser, chunk->inputCheckpoint)); |
| 391 | 392 |
| 392 for (XSSInfoStream::const_iterator it = chunk->xssInfos.begin(); it != chunk
->xssInfos.end(); ++it) { | 393 for (XSSInfoStream::const_iterator it = chunk->xssInfos.begin(); it != chunk
->xssInfos.end(); ++it) { |
| 393 m_textPosition = (*it)->m_textPosition; | 394 m_textPosition = (*it)->m_textPosition; |
| 394 m_xssAuditorDelegate.didBlockScript(**it); | 395 m_xssAuditorDelegate.didBlockScript(**it); |
| 395 if (isStopped()) | 396 if (isStopped()) |
| 396 break; | 397 break; |
| 397 } | 398 } |
| 398 | 399 |
| 399 for (Vector<CompactHTMLToken>::const_iterator it = tokens->begin(); it != to
kens->end(); ++it) { | 400 for (Vector<CompactHTMLToken>::const_iterator it = tokens->begin(); it != to
kens->end(); ++it) { |
| 400 ASSERT(!isWaitingForScripts()); | 401 ASSERT(!isWaitingForScripts()); |
| 401 | 402 |
| 402 if (!isParsingFragment() | 403 if (!isParsingFragment() |
| 403 && document()->frame() && document()->frame()->navigationScheduler()
->locationChangePending()) { | 404 && document()->frame() && document()->frame()->navigationScheduler()
->locationChangePending()) { |
| 404 | 405 |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 | 702 |
| 702 m_input.appendToEnd(source); | 703 m_input.appendToEnd(source); |
| 703 | 704 |
| 704 if (inPumpSession()) { | 705 if (inPumpSession()) { |
| 705 // We've gotten data off the network in a nested write. | 706 // We've gotten data off the network in a nested write. |
| 706 // We don't want to consume any more of the input stream now. Do | 707 // We don't want to consume any more of the input stream now. Do |
| 707 // not worry. We'll consume this data in a less-nested write(). | 708 // not worry. We'll consume this data in a less-nested write(). |
| 708 return; | 709 return; |
| 709 } | 710 } |
| 710 | 711 |
| 711 pumpTokenizerIfPossible(AllowYield); | 712 // A couple pinToMainThread() callers require synchronous parsing, but can't |
| 713 // easily use the insert() method, so we hack append() for them to be synchr
onous. |
| 714 // javascript: url handling is one such caller. |
| 715 // FIXME: This is gross, and we should separate the concept of synchronous p
arsing |
| 716 // from insert() so that only document.write() uses insert. |
| 717 if (m_isPinnedToMainThread) |
| 718 pumpTokenizerIfPossible(ForceSynchronous); |
| 719 else |
| 720 pumpTokenizerIfPossible(AllowYield); |
| 712 | 721 |
| 713 endIfDelayed(); | 722 endIfDelayed(); |
| 714 } | 723 } |
| 715 | 724 |
| 716 void HTMLDocumentParser::end() | 725 void HTMLDocumentParser::end() |
| 717 { | 726 { |
| 718 ASSERT(!isDetached()); | 727 ASSERT(!isDetached()); |
| 719 ASSERT(!isScheduledForResume()); | 728 ASSERT(!isScheduledForResume()); |
| 720 | 729 |
| 721 if (m_haveBackgroundParser) | 730 if (m_haveBackgroundParser) |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 // addClient would call notifyFinished if the load were complete. | 873 // addClient would call notifyFinished if the load were complete. |
| 865 // Callers do not expect to be re-entered from this call, so they should | 874 // Callers do not expect to be re-entered from this call, so they should |
| 866 // not an already-loaded CachedResource. | 875 // not an already-loaded CachedResource. |
| 867 cachedScript->addClient(this); | 876 cachedScript->addClient(this); |
| 868 } | 877 } |
| 869 | 878 |
| 870 void HTMLDocumentParser::stopWatchingForLoad(CachedResource* cachedScript) | 879 void HTMLDocumentParser::stopWatchingForLoad(CachedResource* cachedScript) |
| 871 { | 880 { |
| 872 cachedScript->removeClient(this); | 881 cachedScript->removeClient(this); |
| 873 } | 882 } |
| 874 | 883 |
| 875 void HTMLDocumentParser::appendCurrentInputStreamToPreloadScannerAndScan() | 884 void HTMLDocumentParser::appendCurrentInputStreamToPreloadScannerAndScan() |
| 876 { | 885 { |
| 877 ASSERT(m_preloadScanner); | 886 ASSERT(m_preloadScanner); |
| 878 m_preloadScanner->appendToEnd(m_input.current()); | 887 m_preloadScanner->appendToEnd(m_input.current()); |
| 879 m_preloadScanner->scan(m_preloader.get(), document()->baseElementURL()); | 888 m_preloadScanner->scan(m_preloader.get(), document()->baseElementURL()); |
| 880 } | 889 } |
| 881 | 890 |
| 882 void HTMLDocumentParser::notifyFinished(CachedResource* cachedResource) | 891 void HTMLDocumentParser::notifyFinished(CachedResource* cachedResource) |
| 883 { | 892 { |
| 884 // pumpTokenizer can cause this parser to be detached from the Document, | 893 // pumpTokenizer can cause this parser to be detached from the Document, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 } | 926 } |
| 918 | 927 |
| 919 void HTMLDocumentParser::parseDocumentFragment(const String& source, DocumentFra
gment* fragment, Element* contextElement, ParserContentPolicy parserContentPolic
y) | 928 void HTMLDocumentParser::parseDocumentFragment(const String& source, DocumentFra
gment* fragment, Element* contextElement, ParserContentPolicy parserContentPolic
y) |
| 920 { | 929 { |
| 921 RefPtr<HTMLDocumentParser> parser = HTMLDocumentParser::create(fragment, con
textElement, parserContentPolicy); | 930 RefPtr<HTMLDocumentParser> parser = HTMLDocumentParser::create(fragment, con
textElement, parserContentPolicy); |
| 922 parser->insert(source); // Use insert() so that the parser will not yield. | 931 parser->insert(source); // Use insert() so that the parser will not yield. |
| 923 parser->finish(); | 932 parser->finish(); |
| 924 ASSERT(!parser->processingData()); // Make sure we're done. <rdar://problem/
3963151> | 933 ASSERT(!parser->processingData()); // Make sure we're done. <rdar://problem/
3963151> |
| 925 parser->detach(); // Allows ~DocumentParser to assert it was detached before
destruction. | 934 parser->detach(); // Allows ~DocumentParser to assert it was detached before
destruction. |
| 926 } | 935 } |
| 927 | 936 |
| 928 void HTMLDocumentParser::suspendScheduledTasks() | 937 void HTMLDocumentParser::suspendScheduledTasks() |
| 929 { | 938 { |
| 930 if (m_parserScheduler) | 939 if (m_parserScheduler) |
| 931 m_parserScheduler->suspend(); | 940 m_parserScheduler->suspend(); |
| 932 } | 941 } |
| 933 | 942 |
| 934 void HTMLDocumentParser::resumeScheduledTasks() | 943 void HTMLDocumentParser::resumeScheduledTasks() |
| 935 { | 944 { |
| 936 if (m_parserScheduler) | 945 if (m_parserScheduler) |
| 937 m_parserScheduler->resume(); | 946 m_parserScheduler->resume(); |
| 938 } | 947 } |
| 939 | 948 |
| 940 } | 949 } |
| OLD | NEW |