Bug 786419 - Part 6 - Disable HTMLDNSPrefetches for offline apps r=jduell
--- a/content/html/content/src/nsHTMLDNSPrefetch.cpp
+++ b/content/html/content/src/nsHTMLDNSPrefetch.cpp
@@ -89,16 +89,20 @@ nsHTMLDNSPrefetch::Shutdown()
NS_IF_RELEASE(sDNSListener);
return NS_OK;
}
bool
nsHTMLDNSPrefetch::IsAllowed (nsIDocument *aDocument)
{
+ if (NS_IsAppOffline(aDocument->NodePrincipal())) {
+ return false;
+ }
+
// There is no need to do prefetch on non UI scenarios such as XMLHttpRequest.
return aDocument->IsDNSPrefetchAllowed() && aDocument->GetWindow();
}
nsresult
nsHTMLDNSPrefetch::Prefetch(Link *aElement, uint16_t flags)
{
if (!(sInitialized && sPrefetches && sDNSService && sDNSListener))
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -534,16 +534,21 @@ child:
async RequestNotifyAfterRemotePaint();
/**
* Tell the child that the UI resolution changed for the containing
* window.
*/
UIResolutionChanged();
+ /**
+ * Tell the child of an app's offline status
+ */
+ AppOfflineStatus(uint32_t id, bool offline);
+
/*
* FIXME: write protocol!
state LIVE:
send LoadURL goto LIVE;
//etc.
send Destroy goto DYING;
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -75,16 +75,17 @@
#include "nsViewportInfo.h"
#include "JavaScriptChild.h"
#include "nsILoadContext.h"
#include "ipc/nsGUIEventIPC.h"
#include "mozilla/gfx/Matrix.h"
#include "UnitTransforms.h"
#include "ClientLayerManager.h"
#include "LayersLogging.h"
+#include "nsIOService.h"
#include "nsColorPickerProxy.h"
#define BROWSER_ELEMENT_CHILD_SCRIPT \
NS_LITERAL_STRING("chrome://global/content/BrowserElementChild.js")
#define TABC_LOG(...)
// #define TABC_LOG(...) printf_stderr("TABC: " __VA_ARGS__)
@@ -2567,16 +2568,28 @@ TabChild::RecvAsyncMessage(const nsStrin
static_cast<nsFrameMessageManager*>(mTabChildGlobal->mMessageManager.get());
CpowIdHolder cpows(Manager(), aCpows);
mm->ReceiveMessage(static_cast<EventTarget*>(mTabChildGlobal),
aMessage, false, &cloneData, &cpows, aPrincipal, nullptr);
}
return true;
}
+bool
+TabChild::RecvAppOfflineStatus(const uint32_t& aId, const bool& aOffline)
+{
+ // Instantiate the service to make sure gIOService is initialized
+ nsCOMPtr<nsIIOService> ioService = mozilla::services::GetIOService();
+ if (gIOService && ioService) {
+ gIOService->SetAppOfflineInternal(aId, aOffline ?
+ nsIAppOfflineInfo::OFFLINE : nsIAppOfflineInfo::ONLINE);
+ }
+ return true;
+}
+
class UnloadScriptEvent : public nsRunnable
{
public:
UnloadScriptEvent(TabChild* aTabChild, TabChildGlobal* aTabChildGlobal)
: mTabChild(aTabChild), mTabChildGlobal(aTabChildGlobal)
{ }
NS_IMETHOD Run()
--- a/dom/ipc/TabChild.h
+++ b/dom/ipc/TabChild.h
@@ -369,16 +369,18 @@ public:
virtual bool RecvActivateFrameEvent(const nsString& aType, const bool& capture) MOZ_OVERRIDE;
virtual bool RecvLoadRemoteScript(const nsString& aURL,
const bool& aRunInGlobalScope) MOZ_OVERRIDE;
virtual bool RecvAsyncMessage(const nsString& aMessage,
const ClonedMessageData& aData,
const InfallibleTArray<CpowEntry>& aCpows,
const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
+ virtual bool RecvAppOfflineStatus(const uint32_t& aId, const bool& aOffline) MOZ_OVERRIDE;
+
virtual PDocumentRendererChild*
AllocPDocumentRendererChild(const nsRect& documentRect, const gfx::Matrix& transform,
const nsString& bgcolor,
const uint32_t& renderFlags, const bool& flushLayout,
const nsIntSize& renderSize) MOZ_OVERRIDE;
virtual bool DeallocPDocumentRendererChild(PDocumentRendererChild* actor) MOZ_OVERRIDE;
virtual bool RecvPDocumentRendererConstructor(PDocumentRendererChild* actor,
const nsRect& documentRect,
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -235,16 +235,17 @@ TabParent::TabParent(nsIContentParent* a
, mDPI(0)
, mDefaultScale(0)
, mShown(false)
, mUpdatedDimensions(false)
, mManager(aManager)
, mMarkedDestroying(false)
, mIsDestroyed(false)
, mAppPackageFileDescriptorSent(false)
+ , mSendOfflineStatus(true)
, mChromeFlags(aChromeFlags)
{
MOZ_ASSERT(aManager);
}
TabParent::~TabParent()
{
}
@@ -494,16 +495,24 @@ TabParent::LoadURL(nsIURI* aURI)
if (!mShown) {
NS_WARNING(nsPrintfCString("TabParent::LoadURL(%s) called before "
"Show(). Ignoring LoadURL.\n",
spec.get()).get());
return;
}
+ uint32_t appId = OwnOrContainingAppId();
+ if (mSendOfflineStatus && NS_IsAppOffline(appId)) {
+ // If the app is offline in the parent process
+ // pass that state to the child process as well
+ unused << SendAppOfflineStatus(appId, true);
+ }
+ mSendOfflineStatus = false;
+
unused << SendLoadURL(spec);
// If this app is a packaged app then we can speed startup by sending over
// the file descriptor for the "application.zip" file that it will
// invariably request. Only do this once.
if (!mAppPackageFileDescriptorSent) {
mAppPackageFileDescriptorSent = true;
--- a/dom/ipc/TabParent.h
+++ b/dom/ipc/TabParent.h
@@ -423,16 +423,20 @@ private:
// managing PContent.
bool mMarkedDestroying;
// When true, the TabParent is invalid and we should not send IPC messages
// anymore.
bool mIsDestroyed;
// Whether we have already sent a FileDescriptor for the app package.
bool mAppPackageFileDescriptorSent;
+ // Whether we need to send the offline status to the TabChild
+ // This is true, until the first call of LoadURL
+ bool mSendOfflineStatus;
+
uint32_t mChromeFlags;
nsCOMPtr<nsILoadContext> mLoadContext;
};
} // namespace dom
} // namespace mozilla