forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* 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 "mozilla/dom/BrowsingContext.h"
 | |
| #include "mozilla/dom/CanonicalBrowsingContext.h"
 | |
| #include "mozilla/dom/Document.h"
 | |
| #include "mozilla/dom/WindowGlobalChild.h"
 | |
| #include "mozilla/dom/WindowGlobalParent.h"
 | |
| #include "mozilla/Services.h"
 | |
| #include "nsIObserverService.h"
 | |
| #include "nsIURI.h"
 | |
| #include "nsNetUtil.h"
 | |
| #include "nsPIDOMWindow.h"
 | |
| #include "nsReadableUtils.h"
 | |
| #include "nsThreadUtils.h"
 | |
| #include "RestoreTabContentObserver.h"
 | |
| 
 | |
| using namespace mozilla::dom;
 | |
| 
 | |
| NS_IMPL_ISUPPORTS(RestoreTabContentObserver, nsIObserver)
 | |
| 
 | |
| const char* const kAboutReaderTopic = "AboutReader:Ready";
 | |
| const char* const kContentDocumentLoaded = "content-document-loaded";
 | |
| const char* const kChromeDocumentLoaded = "chrome-document-loaded";
 | |
| 
 | |
| /* static */
 | |
| void RestoreTabContentObserver::Initialize() {
 | |
|   MOZ_ASSERT(!gRestoreTabContentObserver);
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
| 
 | |
|   RefPtr<RestoreTabContentObserver> observer = new RestoreTabContentObserver();
 | |
| 
 | |
|   nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
 | |
|   if (NS_WARN_IF(!obs)) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   obs->AddObserver(observer, kAboutReaderTopic, false);
 | |
|   obs->AddObserver(observer, kContentDocumentLoaded, false);
 | |
|   obs->AddObserver(observer, kChromeDocumentLoaded, false);
 | |
| 
 | |
|   gRestoreTabContentObserver = observer;
 | |
| }
 | |
| 
 | |
| /* static */
 | |
| void RestoreTabContentObserver::Shutdown() {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
| 
 | |
|   if (!gRestoreTabContentObserver) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   RefPtr<RestoreTabContentObserver> observer = gRestoreTabContentObserver;
 | |
|   gRestoreTabContentObserver = nullptr;
 | |
| 
 | |
|   nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
 | |
|   if (!obs) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   obs->RemoveObserver(observer, kAboutReaderTopic);
 | |
|   obs->RemoveObserver(observer, kContentDocumentLoaded);
 | |
|   obs->RemoveObserver(observer, kChromeDocumentLoaded);
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| RestoreTabContentObserver::Observe(nsISupports* aSubject, const char* aTopic,
 | |
|                                    const char16_t* aData) {
 | |
|   nsCOMPtr<nsPIDOMWindowInner> inner;
 | |
|   if (!strcmp(aTopic, kAboutReaderTopic)) {
 | |
|     inner = do_QueryInterface(aSubject);
 | |
|   } else if (!strcmp(aTopic, kContentDocumentLoaded) ||
 | |
|              !strcmp(aTopic, kChromeDocumentLoaded)) {
 | |
|     nsCOMPtr<Document> doc = do_QueryInterface(aSubject);
 | |
|     inner = doc ? doc->GetInnerWindow() : nullptr;
 | |
|   }
 | |
|   if (!inner) {
 | |
|     return NS_OK;
 | |
|   }
 | |
| 
 | |
|   nsCOMPtr<nsIURI> uri = inner->GetDocumentURI();
 | |
|   if (!uri) {
 | |
|     return NS_OK;
 | |
|   }
 | |
| 
 | |
|   // We'll handle loading about:reader with "AboutReader:Ready"
 | |
|   // rather than "content-document-loaded".
 | |
|   if (uri->SchemeIs("about") &&
 | |
|       StringBeginsWith(uri->GetSpecOrDefault(), "about:reader"_ns) &&
 | |
|       strcmp(aTopic, kAboutReaderTopic) != 0) {
 | |
|     return NS_OK;
 | |
|   }
 | |
| 
 | |
|   RefPtr<BrowsingContext> bc = inner->GetBrowsingContext();
 | |
|   if (!bc || !bc->Top()->GetHasRestoreData()) {
 | |
|     return NS_OK;
 | |
|   }
 | |
|   if (XRE_IsParentProcess()) {
 | |
|     if (WindowGlobalParent* wgp = bc->Canonical()->GetCurrentWindowGlobal()) {
 | |
|       bc->Canonical()->Top()->RequestRestoreTabContent(wgp);
 | |
|     }
 | |
|   } else if (WindowContext* windowContext = bc->GetCurrentWindowContext()) {
 | |
|     if (WindowGlobalChild* wgc = windowContext->GetWindowGlobalChild()) {
 | |
|       wgc->SendRequestRestoreTabContent();
 | |
|     }
 | |
|   }
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| mozilla::StaticRefPtr<RestoreTabContentObserver>
 | |
|     RestoreTabContentObserver::gRestoreTabContentObserver;
 | 
