Bug 792471 - Fix crash in navigator.mozSms when child process doesn't have 'sms' permission. r=mounir

This commit is contained in:
Andrea Marchesini 2012-09-25 14:46:41 +01:00
parent 16a62a6605
commit cb4376662b
4 changed files with 17 additions and 25 deletions

View File

@ -1113,36 +1113,16 @@ Navigator::RequestWakeLock(const nsAString &aTopic, nsIDOMMozWakeLock **aWakeLoc
// Navigator::nsIDOMNavigatorSms
//*****************************************************************************
bool
Navigator::IsSmsSupported() const
{
#ifdef MOZ_WEBSMS_BACKEND
nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(smsService, false);
bool result = false;
smsService->HasSupport(&result);
return result;
#else
return false;
#endif
}
NS_IMETHODIMP
Navigator::GetMozSms(nsIDOMMozSmsManager** aSmsManager)
{
*aSmsManager = nullptr;
if (!mSmsManager) {
if (!IsSmsSupported()) {
return NS_OK;
}
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
NS_ENSURE_TRUE(window && window->GetDocShell(), NS_OK);
mSmsManager = SmsManager::CheckPermissionAndCreateInstance(window);
mSmsManager = SmsManager::CreateInstanceIfAllowed(window);
NS_ENSURE_TRUE(mSmsManager, NS_OK);
}

View File

@ -162,8 +162,6 @@ public:
NS_DECL_NSIDOMNAVIGATORCAMERA
private:
bool IsSmsSupported() const;
nsRefPtr<nsMimeTypeArray> mMimeTypes;
nsRefPtr<nsPluginArray> mPlugins;
nsRefPtr<nsGeolocation> mGeolocation;

View File

@ -60,10 +60,14 @@ NS_IMPL_EVENT_HANDLER(SmsManager, sent)
NS_IMPL_EVENT_HANDLER(SmsManager, delivered)
/* static */already_AddRefed<SmsManager>
SmsManager::CheckPermissionAndCreateInstance(nsPIDOMWindow* aWindow)
SmsManager::CreateInstanceIfAllowed(nsPIDOMWindow* aWindow)
{
NS_ASSERTION(aWindow, "Null pointer!");
#ifndef MOZ_WEBSMS_BACKEND
return nullptr;
#endif
// First of all, the general pref has to be turned on.
bool enabled = false;
Preferences::GetBool("dom.sms.enabled", &enabled);
@ -80,6 +84,16 @@ SmsManager::CheckPermissionAndCreateInstance(nsPIDOMWindow* aWindow)
return nullptr;
}
// Check the Sms Service:
nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(smsService, nullptr);
bool result = false;
smsService->HasSupport(&result);
if (!result) {
return nullptr;
}
nsRefPtr<SmsManager> smsMgr = new SmsManager();
smsMgr->Init(aWindow);

View File

@ -31,7 +31,7 @@ public:
nsDOMEventTargetHelper)
static already_AddRefed<SmsManager>
CheckPermissionAndCreateInstance(nsPIDOMWindow *aWindow);
CreateInstanceIfAllowed(nsPIDOMWindow *aWindow);
void Init(nsPIDOMWindow *aWindow);
void Shutdown();