mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-14 22:05:44 +00:00
Bug 786419 - Part 3 - Have the JS TCP sockets check if the app is offline r=jduell
This commit is contained in:
parent
a1b5100a48
commit
d799a20c7f
@ -68,14 +68,54 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(TCPSocketParentBase)
|
||||
TCPSocketParentBase::TCPSocketParentBase()
|
||||
: mIPCOpen(false)
|
||||
{
|
||||
mObserver = new mozilla::net::OfflineObserver(this);
|
||||
mozilla::HoldJSObjects(this);
|
||||
}
|
||||
|
||||
TCPSocketParentBase::~TCPSocketParentBase()
|
||||
{
|
||||
if (mObserver) {
|
||||
mObserver->RemoveObserver();
|
||||
}
|
||||
mozilla::DropJSObjects(this);
|
||||
}
|
||||
|
||||
nsresult
|
||||
TCPSocketParent::OfflineNotification(nsISupports *aSubject)
|
||||
{
|
||||
nsCOMPtr<nsIAppOfflineInfo> info(do_QueryInterface(aSubject));
|
||||
if (!info) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
uint32_t targetAppId = nsIScriptSecurityManager::UNKNOWN_APP_ID;
|
||||
info->GetAppId(&targetAppId);
|
||||
|
||||
// Obtain App ID
|
||||
uint32_t appId = nsIScriptSecurityManager::UNKNOWN_APP_ID;
|
||||
const PContentParent *content = Manager()->Manager();
|
||||
const InfallibleTArray<PBrowserParent*>& browsers = content->ManagedPBrowserParent();
|
||||
if (browsers.Length() > 0) {
|
||||
TabParent *tab = static_cast<TabParent*>(browsers[0]);
|
||||
appId = tab->OwnAppId();
|
||||
}
|
||||
|
||||
if (appId != targetAppId) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// If the app is offline, close the socket
|
||||
if (mSocket && NS_IsAppOffline(appId)) {
|
||||
mSocket->Close();
|
||||
mSocket = nullptr;
|
||||
mIntermediaryObj = nullptr;
|
||||
mIntermediary = nullptr;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
TCPSocketParentBase::ReleaseIPDLReference()
|
||||
{
|
||||
@ -115,7 +155,7 @@ TCPSocketParent::RecvOpen(const nsString& aHost, const uint16_t& aPort, const bo
|
||||
}
|
||||
|
||||
// Obtain App ID
|
||||
uint32_t appId = nsIScriptSecurityManager::NO_APP_ID;
|
||||
uint32_t appId = nsIScriptSecurityManager::UNKNOWN_APP_ID;
|
||||
const PContentParent *content = Manager()->Manager();
|
||||
const InfallibleTArray<PBrowserParent*>& browsers = content->ManagedPBrowserParent();
|
||||
if (browsers.Length() > 0) {
|
||||
@ -123,6 +163,12 @@ TCPSocketParent::RecvOpen(const nsString& aHost, const uint16_t& aPort, const bo
|
||||
appId = tab->OwnAppId();
|
||||
}
|
||||
|
||||
if (NS_IsAppOffline(appId)) {
|
||||
NS_ERROR("Can't open socket because app is offline");
|
||||
FireInteralError(this, __LINE__);
|
||||
return true;
|
||||
}
|
||||
|
||||
nsresult rv;
|
||||
mIntermediary = do_CreateInstance("@mozilla.org/tcp-socket-intermediary;1", &rv);
|
||||
if (NS_FAILED(rv)) {
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIDOMTCPSocket.h"
|
||||
#include "js/TypeDecls.h"
|
||||
#include "mozilla/net/OfflineObserver.h"
|
||||
|
||||
#define TCPSOCKETPARENT_CID \
|
||||
{ 0x4e7246c6, 0xa8b3, 0x426d, { 0x9c, 0x17, 0x76, 0xda, 0xb1, 0xe1, 0xe1, 0x4a } }
|
||||
@ -21,6 +22,7 @@ namespace dom {
|
||||
class PBrowserParent;
|
||||
|
||||
class TCPSocketParentBase : public nsITCPSocketParent
|
||||
, public mozilla::net::DisconnectableParent
|
||||
{
|
||||
public:
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TCPSocketParentBase)
|
||||
@ -36,6 +38,7 @@ protected:
|
||||
JS::Heap<JSObject*> mIntermediaryObj;
|
||||
nsCOMPtr<nsITCPSocketIntermediary> mIntermediary;
|
||||
nsCOMPtr<nsIDOMTCPSocket> mSocket;
|
||||
nsRefPtr<mozilla::net::OfflineObserver> mObserver;
|
||||
bool mIPCOpen;
|
||||
};
|
||||
|
||||
@ -58,6 +61,7 @@ public:
|
||||
virtual bool RecvData(const SendableData& aData,
|
||||
const uint32_t& aTrackingNumber) MOZ_OVERRIDE;
|
||||
virtual bool RecvRequestDelete() MOZ_OVERRIDE;
|
||||
virtual nsresult OfflineNotification(nsISupports *) MOZ_OVERRIDE;
|
||||
|
||||
private:
|
||||
virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE;
|
||||
|
Loading…
Reference in New Issue
Block a user