forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* vim: set ts=2 sw=2 et tw=78: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "nsHtml5DocumentBuilder.h"
 | |
| 
 | |
| #include "nsIStyleSheetLinkingElement.h"
 | |
| #include "nsStyleLinkElement.h"
 | |
| #include "nsScriptLoader.h"
 | |
| #include "nsIHTMLDocument.h"
 | |
| 
 | |
| NS_IMPL_CYCLE_COLLECTION_INHERITED(nsHtml5DocumentBuilder, nsContentSink,
 | |
|                                    mOwnedElements)
 | |
| 
 | |
| NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsHtml5DocumentBuilder)
 | |
| NS_INTERFACE_MAP_END_INHERITING(nsContentSink)
 | |
| 
 | |
| NS_IMPL_ADDREF_INHERITED(nsHtml5DocumentBuilder, nsContentSink)
 | |
| NS_IMPL_RELEASE_INHERITED(nsHtml5DocumentBuilder, nsContentSink)
 | |
| 
 | |
| nsHtml5DocumentBuilder::nsHtml5DocumentBuilder(bool aRunsToCompletion)
 | |
| {
 | |
|   mRunsToCompletion = aRunsToCompletion;
 | |
| }
 | |
| 
 | |
| nsresult
 | |
| nsHtml5DocumentBuilder::Init(nsIDocument* aDoc,
 | |
|                             nsIURI* aURI,
 | |
|                             nsISupports* aContainer,
 | |
|                             nsIChannel* aChannel)
 | |
| {
 | |
|   return nsContentSink::Init(aDoc, aURI, aContainer, aChannel);
 | |
| }
 | |
| 
 | |
| nsHtml5DocumentBuilder::~nsHtml5DocumentBuilder()
 | |
| {
 | |
| }
 | |
| 
 | |
| nsresult
 | |
| nsHtml5DocumentBuilder::MarkAsBroken(nsresult aReason)
 | |
| {
 | |
|   mBroken = aReason;
 | |
|   return aReason;
 | |
| }
 | |
| 
 | |
| void
 | |
| nsHtml5DocumentBuilder::SetDocumentCharsetAndSource(nsACString& aCharset, int32_t aCharsetSource)
 | |
| {
 | |
|   if (mDocument) {
 | |
|     mDocument->SetDocumentCharacterSetSource(aCharsetSource);
 | |
|     mDocument->SetDocumentCharacterSet(aCharset);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void
 | |
| nsHtml5DocumentBuilder::UpdateStyleSheet(nsIContent* aElement)
 | |
| {
 | |
|   // Break out of the doc update created by Flush() to zap a runnable
 | |
|   // waiting to call UpdateStyleSheet without the right observer
 | |
|   EndDocUpdate();
 | |
| 
 | |
|   if (MOZ_UNLIKELY(!mParser)) {
 | |
|     // EndDocUpdate ran stuff that called nsIParser::Terminate()
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   nsCOMPtr<nsIStyleSheetLinkingElement> ssle(do_QueryInterface(aElement));
 | |
|   NS_ASSERTION(ssle, "Node didn't QI to style.");
 | |
| 
 | |
|   ssle->SetEnableUpdates(true);
 | |
| 
 | |
|   bool willNotify;
 | |
|   bool isAlternate;
 | |
|   nsresult rv = ssle->UpdateStyleSheet(mRunsToCompletion ? nullptr : this,
 | |
|                                        &willNotify,
 | |
|                                        &isAlternate);
 | |
|   if (NS_SUCCEEDED(rv) && willNotify && !isAlternate && !mRunsToCompletion) {
 | |
|     ++mPendingSheetCount;
 | |
|     mScriptLoader->AddParserBlockingScriptExecutionBlocker();
 | |
|   }
 | |
| 
 | |
|   // Re-open update
 | |
|   BeginDocUpdate();
 | |
| }
 | |
| 
 | |
| void
 | |
| nsHtml5DocumentBuilder::SetDocumentMode(nsHtml5DocumentMode m)
 | |
| {
 | |
|   nsCompatibility mode = eCompatibility_NavQuirks;
 | |
|   switch (m) {
 | |
|     case STANDARDS_MODE:
 | |
|       mode = eCompatibility_FullStandards;
 | |
|       break;
 | |
|     case ALMOST_STANDARDS_MODE:
 | |
|       mode = eCompatibility_AlmostStandards;
 | |
|       break;
 | |
|     case QUIRKS_MODE:
 | |
|       mode = eCompatibility_NavQuirks;
 | |
|       break;
 | |
|   }
 | |
|   nsCOMPtr<nsIHTMLDocument> htmlDocument = do_QueryInterface(mDocument);
 | |
|   NS_ASSERTION(htmlDocument, "Document didn't QI into HTML document.");
 | |
|   htmlDocument->SetCompatibilityMode(mode);
 | |
| }
 | |
| 
 | |
| // nsContentSink overrides
 | |
| 
 | |
| void
 | |
| nsHtml5DocumentBuilder::UpdateChildCounts()
 | |
| {
 | |
|   // No-op
 | |
| }
 | |
| 
 | |
| nsresult
 | |
| nsHtml5DocumentBuilder::FlushTags()
 | |
| {
 | |
|   return NS_OK;
 | |
| }
 | 
