Merge b2g-inbound to m-c

This commit is contained in:
Phil Ringnalda 2013-09-08 08:28:14 -07:00
commit b6c19af956
57 changed files with 2135 additions and 803 deletions

View File

@ -4,7 +4,7 @@
#filter substitution #filter substitution
pref("toolkit.defaultChromeURI", "chrome://browser/content/shell.xul"); pref("toolkit.defaultChromeURI", "chrome://browser/content/shell.html");
pref("browser.chromeURL", "chrome://browser/content/"); pref("browser.chromeURL", "chrome://browser/content/");
// Device pixel to CSS px ratio, in percent. Set to -1 to calculate based on display density. // Device pixel to CSS px ratio, in percent. Set to -1 to calculate based on display density.

View File

@ -11,7 +11,7 @@ window.addEventListener('ContentStart', function() {
let shell = document.getElementById('shell'); let shell = document.getElementById('shell');
// The <browser> element inside it // The <browser> element inside it
let browser = document.getElementById('homescreen'); let browser = document.getElementById('systemapp');
// Figure out the native resolution of the screen // Figure out the native resolution of the screen
let windowUtils = window.QueryInterface(Ci.nsIInterfaceRequestor) let windowUtils = window.QueryInterface(Ci.nsIInterfaceRequestor)

View File

@ -314,8 +314,15 @@ let AdbController = {
} }
return; return;
} }
// Check if we have a remote debugging session going on. If so, we won't
// disable adb even if the screen is locked.
let isDebugging = Object.keys(DebuggerServer._connections).length > 0;
debug("isDebugging=" + isDebugging);
let enableAdb = this.remoteDebuggerEnabled && let enableAdb = this.remoteDebuggerEnabled &&
!(this.lockEnabled && this.locked); (!(this.lockEnabled && this.locked) || isDebugging);
let useDisableAdbTimer = true; let useDisableAdbTimer = true;
try { try {
if (Services.prefs.getBoolPref("marionette.defaultPrefs.enabled")) { if (Services.prefs.getBoolPref("marionette.defaultPrefs.enabled")) {
@ -366,7 +373,7 @@ let AdbController = {
} }
} }
if (useDisableAdbTimer) { if (useDisableAdbTimer) {
if (enableAdb) { if (enableAdb && !isDebugging) {
this.startDisableAdbTimer(); this.startDisableAdbTimer();
} else { } else {
this.stopDisableAdbTimer(); this.stopDisableAdbTimer();

View File

@ -0,0 +1,41 @@
<!DOCTYPE html>
<!-- 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/. -->
<html xmlns="http://www.w3.org/1999/xhtml "
id="shell"
windowtype="navigator:browser"
#ifdef ANDROID
sizemode="fullscreen"
#endif
style="background: black; overflow: hidden; width:100%; height:100%; padding: 0px !important"
onunload="shell.stop();">
<head>
<script type="application/javascript;version=1.8"
src="chrome://browser/content/settings.js"> </script>
<script type="application/javascript;version=1.8"
src="chrome://browser/content/shell.js"> </script>
#ifndef MOZ_WIDGET_GONK
<!-- this script handles the screen argument for desktop builds -->
<script type="application/javascript;version=1.8"
src="chrome://browser/content/screen.js"> </script>
<!-- this script handles the "runapp" argument for desktop builds -->
<script type="application/javascript;version=1.8"
src="chrome://browser/content/runapp.js"> </script>
#endif
</head>
<body id="container" style="margin: 0px; width:100%; height:100%;">
#ifdef MOZ_WIDGET_COCOA
<!--
If the document is empty at startup, we don't display the window
at all on Mac OS...
-->
<h1 id="placeholder">wtf mac os!</h1>
#endif
<!-- The html:iframe containing the UI is created here. -->
</body>
</html>

View File

@ -183,7 +183,7 @@ var shell = {
get contentBrowser() { get contentBrowser() {
delete this.contentBrowser; delete this.contentBrowser;
return this.contentBrowser = document.getElementById('homescreen'); return this.contentBrowser = document.getElementById('systemapp');
}, },
get homeURL() { get homeURL() {
@ -266,25 +266,29 @@ var shell = {
} }
let manifestURL = this.manifestURL; let manifestURL = this.manifestURL;
// <html:iframe id="homescreen" // <html:iframe id="systemapp"
// mozbrowser="true" allowfullscreen="true" // mozbrowser="true" allowfullscreen="true"
// style="overflow: hidden; -moz-box-flex: 1; border: none;" // style="overflow: hidden; height: 100%; width: 100%; border: none;"
// src="data:text/html;charset=utf-8,%3C!DOCTYPE html>%3Cbody style='background:black;'>"/> // src="data:text/html;charset=utf-8,%3C!DOCTYPE html>%3Cbody style='background:black;'>"/>
let browserFrame = let systemAppFrame =
document.createElementNS('http://www.w3.org/1999/xhtml', 'html:iframe'); document.createElementNS('http://www.w3.org/1999/xhtml', 'html:iframe');
browserFrame.setAttribute('id', 'homescreen'); systemAppFrame.setAttribute('id', 'systemapp');
browserFrame.setAttribute('mozbrowser', 'true'); systemAppFrame.setAttribute('mozbrowser', 'true');
browserFrame.setAttribute('mozapp', manifestURL); systemAppFrame.setAttribute('mozapp', manifestURL);
browserFrame.setAttribute('allowfullscreen', 'true'); systemAppFrame.setAttribute('allowfullscreen', 'true');
browserFrame.setAttribute('style', "overflow: hidden; -moz-box-flex: 1; border: none;"); systemAppFrame.setAttribute('style', "overflow: hidden; height: 100%; width: 100%; border: none;");
browserFrame.setAttribute('src', "data:text/html;charset=utf-8,%3C!DOCTYPE html>%3Cbody style='background:black;"); systemAppFrame.setAttribute('src', "data:text/html;charset=utf-8,%3C!DOCTYPE html>%3Cbody style='background:black;");
document.getElementById('shell').appendChild(browserFrame); let container = document.getElementById('container');
#ifdef MOZ_WIDGET_COCOA
container.removeChild(document.getElementById('placeholder'));
#endif
container.appendChild(systemAppFrame);
browserFrame.contentWindow systemAppFrame.contentWindow
.QueryInterface(Ci.nsIInterfaceRequestor) .QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation) .getInterface(Ci.nsIWebNavigation)
.sessionHistory = Cc["@mozilla.org/browser/shistory;1"] .sessionHistory = Cc["@mozilla.org/browser/shistory;1"]
.createInstance(Ci.nsISHistory); .createInstance(Ci.nsISHistory);
// Capture all key events so we can filter out hardware buttons // Capture all key events so we can filter out hardware buttons
// And send them to Gaia via mozChromeEvents. // And send them to Gaia via mozChromeEvents.
@ -1021,6 +1025,10 @@ let RemoteDebugger = {
DebuggerServer.addActors('chrome://browser/content/dbg-browser-actors.js'); DebuggerServer.addActors('chrome://browser/content/dbg-browser-actors.js');
DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/webapps.js"); DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/webapps.js");
DebuggerServer.registerModule("devtools/server/actors/device"); DebuggerServer.registerModule("devtools/server/actors/device");
DebuggerServer.onConnectionChange = function(what) {
AdbController.updateState();
}
} }
let port = Services.prefs.getIntPref('devtools.debugger.remote-port') || 6000; let port = Services.prefs.getIntPref('devtools.debugger.remote-port') || 6000;

View File

@ -1,26 +0,0 @@
<?xml version="1.0"?>
<!-- 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/. -->
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
id="shell"
windowtype="navigator:browser"
#ifdef ANDROID
sizemode="fullscreen"
#endif
style="background: black; overflow: hidden; width:320px; height:480px"
onunload="shell.stop();">
<script type="application/javascript" src="chrome://browser/content/settings.js"/>
<script type="application/javascript" src="chrome://browser/content/shell.js"/>
#ifndef MOZ_WIDGET_GONK
<!-- this script handles the screen argument for desktop builds -->
<script type="application/javascript" src="chrome://browser/content/screen.js"/>
<!-- this script handles the "runapp" argument for desktop builds -->
<script type="application/javascript" src="chrome://browser/content/runapp.js"/>
#endif
<!-- The html:iframe containing the UI is created here. -->
</window>

View File

@ -12,7 +12,7 @@ chrome.jar:
* content/dbg-browser-actors.js (content/dbg-browser-actors.js) * content/dbg-browser-actors.js (content/dbg-browser-actors.js)
content/forms.js (content/forms.js) content/forms.js (content/forms.js)
* content/settings.js (content/settings.js) * content/settings.js (content/settings.js)
* content/shell.xul (content/shell.xul) * content/shell.html (content/shell.html)
* content/shell.js (content/shell.js) * content/shell.js (content/shell.js)
#ifndef ANDROID #ifndef ANDROID
content/screen.js (content/screen.js) content/screen.js (content/screen.js)

View File

@ -1,4 +1,4 @@
{ {
"revision": "a04ef5d325988b36c3fb088d160c389a1e8682e5", "revision": "0bfd8f0e9f4a8ee91237545603cc8a216518de18",
"repo_path": "/integration/gaia-central" "repo_path": "/integration/gaia-central"
} }

View File

@ -164,7 +164,6 @@
@BINPATH@/components/dom_base.xpt @BINPATH@/components/dom_base.xpt
@BINPATH@/components/dom_system.xpt @BINPATH@/components/dom_system.xpt
#ifdef MOZ_B2G_RIL #ifdef MOZ_B2G_RIL
@BINPATH@/components/dom_telephony.xpt
@BINPATH@/components/dom_voicemail.xpt @BINPATH@/components/dom_voicemail.xpt
@BINPATH@/components/dom_wifi.xpt @BINPATH@/components/dom_wifi.xpt
@BINPATH@/components/dom_system_gonk.xpt @BINPATH@/components/dom_system_gonk.xpt
@ -203,6 +202,7 @@
@BINPATH@/components/dom_mobilemessage.xpt @BINPATH@/components/dom_mobilemessage.xpt
@BINPATH@/components/dom_storage.xpt @BINPATH@/components/dom_storage.xpt
@BINPATH@/components/dom_stylesheets.xpt @BINPATH@/components/dom_stylesheets.xpt
@BINPATH@/components/dom_telephony.xpt
@BINPATH@/components/dom_threads.xpt @BINPATH@/components/dom_threads.xpt
@BINPATH@/components/dom_traversal.xpt @BINPATH@/components/dom_traversal.xpt
@BINPATH@/components/dom_views.xpt @BINPATH@/components/dom_views.xpt
@ -471,6 +471,8 @@
@BINPATH@/components/NetworkStatsManager.manifest @BINPATH@/components/NetworkStatsManager.manifest
@BINPATH@/components/NetworkInterfaceListService.manifest @BINPATH@/components/NetworkInterfaceListService.manifest
@BINPATH@/components/NetworkInterfaceListService.js @BINPATH@/components/NetworkInterfaceListService.js
@BINPATH@/components/TelephonyProvider.manifest
@BINPATH@/components/TelephonyProvider.js
#endif #endif
#ifdef MOZ_ENABLE_DBUS #ifdef MOZ_ENABLE_DBUS
@BINPATH@/components/@DLL_PREFIX@dbusservice@DLL_SUFFIX@ @BINPATH@/components/@DLL_PREFIX@dbusservice@DLL_SUFFIX@

View File

@ -176,7 +176,6 @@
@BINPATH@/components/dom_base.xpt @BINPATH@/components/dom_base.xpt
@BINPATH@/components/dom_system.xpt @BINPATH@/components/dom_system.xpt
#ifdef MOZ_B2G_RIL #ifdef MOZ_B2G_RIL
@BINPATH@/components/dom_telephony.xpt
@BINPATH@/components/dom_voicemail.xpt @BINPATH@/components/dom_voicemail.xpt
@BINPATH@/components/dom_wifi.xpt @BINPATH@/components/dom_wifi.xpt
@BINPATH@/components/dom_system_gonk.xpt @BINPATH@/components/dom_system_gonk.xpt
@ -212,6 +211,7 @@
@BINPATH@/components/dom_mobilemessage.xpt @BINPATH@/components/dom_mobilemessage.xpt
@BINPATH@/components/dom_storage.xpt @BINPATH@/components/dom_storage.xpt
@BINPATH@/components/dom_stylesheets.xpt @BINPATH@/components/dom_stylesheets.xpt
@BINPATH@/components/dom_telephony.xpt
@BINPATH@/components/dom_traversal.xpt @BINPATH@/components/dom_traversal.xpt
#ifdef MOZ_WEBSPEECH #ifdef MOZ_WEBSPEECH
@BINPATH@/components/dom_webspeechrecognition.xpt @BINPATH@/components/dom_webspeechrecognition.xpt

View File

@ -54,7 +54,7 @@
#include "MediaManager.h" #include "MediaManager.h"
#endif #endif
#ifdef MOZ_B2G_RIL #ifdef MOZ_B2G_RIL
#include "Telephony.h" #include "mozilla/dom/telephony/Telephony.h"
#endif #endif
#ifdef MOZ_B2G_BT #ifdef MOZ_B2G_BT
#include "BluetoothManager.h" #include "BluetoothManager.h"

View File

@ -168,12 +168,12 @@ DOMInterfaces = {
'CallEvent': { 'CallEvent': {
'nativeType': 'mozilla::dom::telephony::CallEvent', 'nativeType': 'mozilla::dom::telephony::CallEvent',
'headerFile': 'CallEvent.h', 'headerFile': 'mozilla/dom/telephony/CallEvent.h',
}, },
'CallsList': { 'CallsList': {
'nativeType': 'mozilla::dom::telephony::CallsList', 'nativeType': 'mozilla::dom::telephony::CallsList',
'headerFile': 'CallsList.h', 'headerFile': 'mozilla/dom/telephony/CallsList.h',
}, },
'CameraControl': { 'CameraControl': {
@ -1162,17 +1162,17 @@ DOMInterfaces = {
'Telephony' : { 'Telephony' : {
'nativeType': 'mozilla::dom::telephony::Telephony', 'nativeType': 'mozilla::dom::telephony::Telephony',
'headerFile': 'Telephony.h', 'headerFile': 'mozilla/dom/telephony/Telephony.h',
}, },
'TelephonyCall' : { 'TelephonyCall' : {
'nativeType': 'mozilla::dom::telephony::TelephonyCall', 'nativeType': 'mozilla::dom::telephony::TelephonyCall',
'headerFile': 'TelephonyCall.h', 'headerFile': 'mozilla/dom/telephony/TelephonyCall.h',
}, },
'TelephonyCallGroup' : { 'TelephonyCallGroup' : {
'nativeType': 'mozilla::dom::telephony::TelephonyCallGroup', 'nativeType': 'mozilla::dom::telephony::TelephonyCallGroup',
'headerFile': 'TelephonyCallGroup.h', 'headerFile': 'mozilla/dom/telephony/TelephonyCallGroup.h',
}, },
'Text': { 'Text': {

View File

@ -1483,7 +1483,7 @@ BluetoothHfpManager::OnSocketConnectSuccess(BluetoothSocket* aSocket)
} }
nsCOMPtr<nsITelephonyProvider> provider = nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID); do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE_VOID(provider); NS_ENSURE_TRUE_VOID(provider);
provider->EnumerateCalls(mListener->GetListener()); provider->EnumerateCalls(mListener->GetListener());

View File

@ -61,13 +61,11 @@ TelephonyListener::EnumerateCallState(uint32_t aCallIndex,
bool aIsActive, bool aIsActive,
bool aIsOutgoing, bool aIsOutgoing,
bool aIsEmergency, bool aIsEmergency,
bool aIsConference, bool aIsConference)
bool* aResult)
{ {
BluetoothHfpManager* hfp = BluetoothHfpManager::Get(); BluetoothHfpManager* hfp = BluetoothHfpManager::Get();
hfp->HandleCallStateChanged(aCallIndex, aCallState, EmptyString(), aNumber, hfp->HandleCallStateChanged(aCallIndex, aCallState, EmptyString(), aNumber,
aIsOutgoing, false); aIsOutgoing, false);
*aResult = true;
return NS_OK; return NS_OK;
} }
@ -117,10 +115,10 @@ bool
BluetoothTelephonyListener::StartListening() BluetoothTelephonyListener::StartListening()
{ {
nsCOMPtr<nsITelephonyProvider> provider = nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID); do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, false); NS_ENSURE_TRUE(provider, false);
nsresult rv = provider->RegisterTelephonyMsg(mTelephonyListener); nsresult rv = provider->RegisterListener(mTelephonyListener);
NS_ENSURE_SUCCESS(rv, false); NS_ENSURE_SUCCESS(rv, false);
return true; return true;
@ -130,10 +128,10 @@ bool
BluetoothTelephonyListener::StopListening() BluetoothTelephonyListener::StopListening()
{ {
nsCOMPtr<nsITelephonyProvider> provider = nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID); do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, false); NS_ENSURE_TRUE(provider, false);
nsresult rv = provider->UnregisterTelephonyMsg(mTelephonyListener); nsresult rv = provider->UnregisterListener(mTelephonyListener);
return NS_FAILED(rv) ? false : true; return NS_FAILED(rv) ? false : true;
} }

View File

@ -74,7 +74,7 @@ StaticAutoPtr<DeviceStorageUsedSpaceCache>
DeviceStorageUsedSpaceCache::DeviceStorageUsedSpaceCache() DeviceStorageUsedSpaceCache::DeviceStorageUsedSpaceCache()
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
mIOThread = new LazyIdleThread( mIOThread = new LazyIdleThread(
DEFAULT_THREAD_TIMEOUT_MS, DEFAULT_THREAD_TIMEOUT_MS,
@ -93,7 +93,7 @@ DeviceStorageUsedSpaceCache::CreateOrGet()
return sDeviceStorageUsedSpaceCache; return sDeviceStorageUsedSpaceCache;
} }
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
sDeviceStorageUsedSpaceCache = new DeviceStorageUsedSpaceCache(); sDeviceStorageUsedSpaceCache = new DeviceStorageUsedSpaceCache();
ClearOnShutdown(&sDeviceStorageUsedSpaceCache); ClearOnShutdown(&sDeviceStorageUsedSpaceCache);
@ -208,8 +208,7 @@ DeviceStorageTypeChecker::CreateOrGet()
return sDeviceStorageTypeChecker; return sDeviceStorageTypeChecker;
} }
NS_ASSERTION(NS_IsMainThread(), MOZ_ASSERT(NS_IsMainThread());
"This can only be created on the main thread!");
nsCOMPtr<nsIStringBundleService> stringService nsCOMPtr<nsIStringBundleService> stringService
= mozilla::services::GetStringBundleService(); = mozilla::services::GetStringBundleService();
@ -473,7 +472,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
nsString data; nsString data;
CopyASCIItoUTF16(mType, data); CopyASCIItoUTF16(mType, data);
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
@ -585,7 +584,7 @@ InitDirs()
if (sDirs) { if (sDirs) {
return; return;
} }
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
sDirs = new GlobalDirs; sDirs = new GlobalDirs;
ClearOnShutdown(&sDirs); ClearOnShutdown(&sDirs);
@ -765,7 +764,7 @@ DeviceStorageFile::GetRootDirectoryForType(const nsAString& aStorageType,
} }
// in testing, we default all device storage types to a temp directory // in testing, we default all device storage types to a temp directory
if (f && mozilla::Preferences::GetBool("device.storage.testing", false)) { if (f && sDirs->temp) {
f = sDirs->temp; f = sDirs->temp;
} }
@ -998,7 +997,7 @@ DeviceStorageFile::Write(InfallibleTArray<uint8_t>& aBits)
nsresult nsresult
DeviceStorageFile::Remove() DeviceStorageFile::Remove()
{ {
NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(!NS_IsMainThread());
if (!mFile) { if (!mFile) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
@ -1027,7 +1026,7 @@ DeviceStorageFile::Remove()
nsresult nsresult
DeviceStorageFile::CalculateMimeType() DeviceStorageFile::CalculateMimeType()
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
nsAutoCString mimeType; nsAutoCString mimeType;
nsCOMPtr<nsIMIMEService> mimeService = nsCOMPtr<nsIMIMEService> mimeService =
@ -1047,7 +1046,7 @@ DeviceStorageFile::CalculateMimeType()
nsresult nsresult
DeviceStorageFile::CalculateSizeAndModifiedDate() DeviceStorageFile::CalculateSizeAndModifiedDate()
{ {
NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(!NS_IsMainThread());
int64_t fileSize; int64_t fileSize;
nsresult rv = mFile->GetFileSize(&fileSize); nsresult rv = mFile->GetFileSize(&fileSize);
@ -1343,6 +1342,8 @@ void
nsDOMDeviceStorage::SetRootDirectoryForType(const nsAString& aStorageType, nsDOMDeviceStorage::SetRootDirectoryForType(const nsAString& aStorageType,
const nsAString& aStorageName) const nsAString& aStorageName)
{ {
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIFile> f; nsCOMPtr<nsIFile> f;
DeviceStorageFile::GetRootDirectoryForType(aStorageType, DeviceStorageFile::GetRootDirectoryForType(aStorageType,
aStorageName, aStorageName,
@ -1387,7 +1388,7 @@ InterfaceToJsval(nsPIDOMWindow* aWindow,
JS::Value JS::Value
nsIFileToJsval(nsPIDOMWindow* aWindow, DeviceStorageFile* aFile) nsIFileToJsval(nsPIDOMWindow* aWindow, DeviceStorageFile* aFile)
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
NS_ASSERTION(aWindow, "Null Window"); NS_ASSERTION(aWindow, "Null Window");
if (!aFile) { if (!aFile) {
@ -1417,7 +1418,7 @@ nsIFileToJsval(nsPIDOMWindow* aWindow, DeviceStorageFile* aFile)
JS::Value StringToJsval(nsPIDOMWindow* aWindow, nsAString& aString) JS::Value StringToJsval(nsPIDOMWindow* aWindow, nsAString& aString)
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
NS_ASSERTION(aWindow, "Null Window"); NS_ASSERTION(aWindow, "Null Window");
nsCOMPtr<nsIScriptGlobalObject> sgo = do_QueryInterface(aWindow); nsCOMPtr<nsIScriptGlobalObject> sgo = do_QueryInterface(aWindow);
@ -1510,7 +1511,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
mRequest->FireError(mError); mRequest->FireError(mError);
mRequest = nullptr; mRequest = nullptr;
return NS_OK; return NS_OK;
@ -1534,7 +1535,7 @@ ContinueCursorEvent::ContinueCursorEvent(DOMRequest* aRequest)
already_AddRefed<DeviceStorageFile> already_AddRefed<DeviceStorageFile>
ContinueCursorEvent::GetNextFile() ContinueCursorEvent::GetNextFile()
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
nsDOMDeviceStorageCursor* cursor nsDOMDeviceStorageCursor* cursor
= static_cast<nsDOMDeviceStorageCursor*>(mRequest.get()); = static_cast<nsDOMDeviceStorageCursor*>(mRequest.get());
@ -1629,7 +1630,7 @@ public:
~InitCursorEvent() {} ~InitCursorEvent() {}
NS_IMETHOD Run() { NS_IMETHOD Run() {
NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(!NS_IsMainThread());
if (mFile->mFile) { if (mFile->mFile) {
bool check; bool check;
@ -1823,7 +1824,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
nsString state = NS_LITERAL_STRING("unavailable"); nsString state = NS_LITERAL_STRING("unavailable");
if (mFile) { if (mFile) {
@ -1868,7 +1869,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
AutoJSContext cx; AutoJSContext cx;
JS::Rooted<JS::Value> result(cx, JSVAL_NULL); JS::Rooted<JS::Value> result(cx, JSVAL_NULL);
@ -1910,7 +1911,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(!NS_IsMainThread());
nsCOMPtr<nsIInputStream> stream; nsCOMPtr<nsIInputStream> stream;
mBlob->GetInternalStream(getter_AddRefs(stream)); mBlob->GetInternalStream(getter_AddRefs(stream));
@ -1964,7 +1965,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(!NS_IsMainThread());
nsRefPtr<nsRunnable> r; nsRefPtr<nsRunnable> r;
if (!mFile->mEditable) { if (!mFile->mEditable) {
@ -2008,7 +2009,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(!NS_IsMainThread());
mFile->Remove(); mFile->Remove();
nsRefPtr<nsRunnable> r; nsRefPtr<nsRunnable> r;
@ -2045,7 +2046,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(!NS_IsMainThread());
uint64_t picturesUsage = 0, videosUsage = 0, musicUsage = 0, totalUsage = 0; uint64_t picturesUsage = 0, videosUsage = 0, musicUsage = 0, totalUsage = 0;
mFile->AccumDiskUsage(&picturesUsage, &videosUsage, mFile->AccumDiskUsage(&picturesUsage, &videosUsage,
@ -2084,7 +2085,7 @@ public:
NS_IMETHOD Run() NS_IMETHOD Run()
{ {
NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(!NS_IsMainThread());
int64_t freeSpace = 0; int64_t freeSpace = 0;
if (mFile) { if (mFile) {
@ -2142,6 +2143,7 @@ public:
nsIContentPermissionRequest) nsIContentPermissionRequest)
NS_IMETHOD Run() { NS_IMETHOD Run() {
MOZ_ASSERT(NS_IsMainThread());
if (mozilla::Preferences::GetBool("device.storage.prompt.testing", false)) { if (mozilla::Preferences::GetBool("device.storage.prompt.testing", false)) {
Allow(); Allow();
@ -2548,7 +2550,7 @@ nsDOMDeviceStorage::~nsDOMDeviceStorage()
void void
nsDOMDeviceStorage::Shutdown() nsDOMDeviceStorage::Shutdown()
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
if (!mStorageName.IsEmpty()) { if (!mStorageName.IsEmpty()) {
UnregisterForSDCardChanges(this); UnregisterForSDCardChanges(this);
@ -3139,6 +3141,8 @@ nsDOMDeviceStorage::EnumerateInternal(const nsAString& aPath,
const EnumerationParameters& aOptions, const EnumerationParameters& aOptions,
bool aEditable, ErrorResult& aRv) bool aEditable, ErrorResult& aRv)
{ {
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsPIDOMWindow> win = GetOwner(); nsCOMPtr<nsPIDOMWindow> win = GetOwner();
if (!win) { if (!win) {
aRv.Throw(NS_ERROR_UNEXPECTED); aRv.Throw(NS_ERROR_UNEXPECTED);
@ -3234,7 +3238,7 @@ nsDOMDeviceStorage::Observe(nsISupports *aSubject,
const char *aTopic, const char *aTopic,
const PRUnichar *aData) const PRUnichar *aData)
{ {
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); MOZ_ASSERT(NS_IsMainThread());
if (!strcmp(aTopic, "file-watcher-update")) { if (!strcmp(aTopic, "file-watcher-update")) {

View File

@ -40,7 +40,6 @@ DOM_SRCDIRS = \
ifdef MOZ_B2G_RIL ifdef MOZ_B2G_RIL
DOM_SRCDIRS += \ DOM_SRCDIRS += \
dom/system/gonk \ dom/system/gonk \
dom/telephony \
dom/wifi \ dom/wifi \
dom/icc/src \ dom/icc/src \
$(NULL) $(NULL)

View File

@ -96,6 +96,7 @@
#include "mozilla/dom/indexedDB/PIndexedDBChild.h" #include "mozilla/dom/indexedDB/PIndexedDBChild.h"
#include "mozilla/dom/mobilemessage/SmsChild.h" #include "mozilla/dom/mobilemessage/SmsChild.h"
#include "mozilla/dom/telephony/TelephonyChild.h"
#include "mozilla/dom/devicestorage/DeviceStorageRequestChild.h" #include "mozilla/dom/devicestorage/DeviceStorageRequestChild.h"
#include "mozilla/dom/bluetooth/PBluetoothChild.h" #include "mozilla/dom/bluetooth/PBluetoothChild.h"
#include "mozilla/dom/PFMRadioChild.h" #include "mozilla/dom/PFMRadioChild.h"
@ -126,6 +127,7 @@ using namespace mozilla::dom::devicestorage;
using namespace mozilla::dom::ipc; using namespace mozilla::dom::ipc;
using namespace mozilla::dom::mobilemessage; using namespace mozilla::dom::mobilemessage;
using namespace mozilla::dom::indexedDB; using namespace mozilla::dom::indexedDB;
using namespace mozilla::dom::telephony;
using namespace mozilla::hal_sandbox; using namespace mozilla::hal_sandbox;
using namespace mozilla::ipc; using namespace mozilla::ipc;
using namespace mozilla::layers; using namespace mozilla::layers;
@ -919,6 +921,19 @@ ContentChild::DeallocPSmsChild(PSmsChild* aSms)
return true; return true;
} }
PTelephonyChild*
ContentChild::AllocPTelephonyChild()
{
MOZ_CRASH("No one should be allocating PTelephonyChild actors");
}
bool
ContentChild::DeallocPTelephonyChild(PTelephonyChild* aActor)
{
delete aActor;
return true;
}
PStorageChild* PStorageChild*
ContentChild::AllocPStorageChild() ContentChild::AllocPStorageChild()
{ {

View File

@ -152,6 +152,9 @@ public:
virtual PSmsChild* AllocPSmsChild(); virtual PSmsChild* AllocPSmsChild();
virtual bool DeallocPSmsChild(PSmsChild*); virtual bool DeallocPSmsChild(PSmsChild*);
virtual PTelephonyChild* AllocPTelephonyChild();
virtual bool DeallocPTelephonyChild(PTelephonyChild*);
virtual PStorageChild* AllocPStorageChild(); virtual PStorageChild* AllocPStorageChild();
virtual bool DeallocPStorageChild(PStorageChild* aActor); virtual bool DeallocPStorageChild(PStorageChild* aActor);

View File

@ -35,6 +35,7 @@
#include "mozilla/dom/PFMRadioParent.h" #include "mozilla/dom/PFMRadioParent.h"
#include "mozilla/dom/devicestorage/DeviceStorageRequestParent.h" #include "mozilla/dom/devicestorage/DeviceStorageRequestParent.h"
#include "mozilla/dom/GeolocationBinding.h" #include "mozilla/dom/GeolocationBinding.h"
#include "mozilla/dom/telephony/TelephonyParent.h"
#include "SmsParent.h" #include "SmsParent.h"
#include "mozilla/Hal.h" #include "mozilla/Hal.h"
#include "mozilla/hal_sandbox/PHalParent.h" #include "mozilla/hal_sandbox/PHalParent.h"
@ -148,6 +149,7 @@ using namespace mozilla::dom::devicestorage;
using namespace mozilla::dom::indexedDB; using namespace mozilla::dom::indexedDB;
using namespace mozilla::dom::power; using namespace mozilla::dom::power;
using namespace mozilla::dom::mobilemessage; using namespace mozilla::dom::mobilemessage;
using namespace mozilla::dom::telephony;
using namespace mozilla::hal; using namespace mozilla::hal;
using namespace mozilla::ipc; using namespace mozilla::ipc;
using namespace mozilla::layers; using namespace mozilla::layers;
@ -2244,6 +2246,25 @@ ContentParent::DeallocPSmsParent(PSmsParent* aSms)
return true; return true;
} }
PTelephonyParent*
ContentParent::AllocPTelephonyParent()
{
if (!AssertAppProcessPermission(this, "telephony")) {
return nullptr;
}
TelephonyParent* actor = new TelephonyParent();
NS_ADDREF(actor);
return actor;
}
bool
ContentParent::DeallocPTelephonyParent(PTelephonyParent* aActor)
{
static_cast<TelephonyParent*>(aActor)->Release();
return true;
}
PStorageParent* PStorageParent*
ContentParent::AllocPStorageParent() ContentParent::AllocPStorageParent()
{ {

View File

@ -321,6 +321,9 @@ private:
virtual PSmsParent* AllocPSmsParent(); virtual PSmsParent* AllocPSmsParent();
virtual bool DeallocPSmsParent(PSmsParent*); virtual bool DeallocPSmsParent(PSmsParent*);
virtual PTelephonyParent* AllocPTelephonyParent();
virtual bool DeallocPTelephonyParent(PTelephonyParent*);
virtual PStorageParent* AllocPStorageParent(); virtual PStorageParent* AllocPStorageParent();
virtual bool DeallocPStorageParent(PStorageParent* aActor); virtual bool DeallocPStorageParent(PStorageParent* aActor);

View File

@ -20,6 +20,7 @@ include protocol PNecko;
include protocol PSms; include protocol PSms;
include protocol PSpeechSynthesis; include protocol PSpeechSynthesis;
include protocol PStorage; include protocol PStorage;
include protocol PTelephony;
include protocol PTestShell; include protocol PTestShell;
include protocol PJavaScript; include protocol PJavaScript;
include DOMTypes; include DOMTypes;
@ -197,6 +198,7 @@ rpc protocol PContent
manages PSms; manages PSms;
manages PSpeechSynthesis; manages PSpeechSynthesis;
manages PStorage; manages PStorage;
manages PTelephony;
manages PTestShell; manages PTestShell;
manages PJavaScript; manages PJavaScript;
@ -353,6 +355,8 @@ parent:
PStorage(); PStorage();
PTelephony();
PBluetooth(); PBluetooth();
PFMRadio(); PFMRadio();

View File

@ -28,7 +28,6 @@ LOCAL_INCLUDES += $(VPATH:%=-I%)
ifdef MOZ_B2G_RIL ifdef MOZ_B2G_RIL
LOCAL_INCLUDES += \ LOCAL_INCLUDES += \
-I$(topsrcdir)/dom/telephony \
-I$(topsrcdir)/dom/system/gonk \ -I$(topsrcdir)/dom/system/gonk \
$(NULL) $(NULL)
endif endif

View File

@ -72,7 +72,8 @@ PARALLEL_DIRS += [
'camera', 'camera',
'audiochannel', 'audiochannel',
'promise', 'promise',
'wappush' 'wappush',
'telephony',
] ]
if CONFIG['OS_ARCH'] == 'WINNT': if CONFIG['OS_ARCH'] == 'WINNT':
@ -80,7 +81,6 @@ if CONFIG['OS_ARCH'] == 'WINNT':
if CONFIG['MOZ_B2G_RIL']: if CONFIG['MOZ_B2G_RIL']:
PARALLEL_DIRS += [ PARALLEL_DIRS += [
'telephony',
'wifi', 'wifi',
'icc', 'icc',
'cellbroadcast', 'cellbroadcast',

View File

@ -17,7 +17,6 @@ include $(topsrcdir)/dom/dom-config.mk
LOCAL_INCLUDES = \ LOCAL_INCLUDES = \
-I$(topsrcdir)/dom/base \ -I$(topsrcdir)/dom/base \
-I$(topsrcdir)/dom/src/geolocation \ -I$(topsrcdir)/dom/src/geolocation \
-I$(topsrcdir)/dom/telephony \
-I$(topsrcdir)/dom/wifi \ -I$(topsrcdir)/dom/wifi \
-I$(topsrcdir)/dom/bluetooth \ -I$(topsrcdir)/dom/bluetooth \
-I$(topsrcdir)/content/events/src \ -I$(topsrcdir)/content/events/src \

View File

@ -71,17 +71,13 @@ const RIL_IPC_MSG_NAMES = [
"RIL:IccInfoChanged", "RIL:IccInfoChanged",
"RIL:VoiceInfoChanged", "RIL:VoiceInfoChanged",
"RIL:DataInfoChanged", "RIL:DataInfoChanged",
"RIL:EnumerateCalls",
"RIL:GetAvailableNetworks", "RIL:GetAvailableNetworks",
"RIL:NetworkSelectionModeChanged", "RIL:NetworkSelectionModeChanged",
"RIL:SelectNetwork", "RIL:SelectNetwork",
"RIL:SelectNetworkAuto", "RIL:SelectNetworkAuto",
"RIL:CallStateChanged",
"RIL:EmergencyCbModeChanged", "RIL:EmergencyCbModeChanged",
"RIL:VoicemailNotification", "RIL:VoicemailNotification",
"RIL:VoicemailInfoChanged", "RIL:VoicemailInfoChanged",
"RIL:CallError",
"RIL:SuppSvcNotification",
"RIL:CardLockResult", "RIL:CardLockResult",
"RIL:CardLockRetryCount", "RIL:CardLockRetryCount",
"RIL:USSDReceived", "RIL:USSDReceived",
@ -108,11 +104,9 @@ const RIL_IPC_MSG_NAMES = [
"RIL:UpdateIccContact", "RIL:UpdateIccContact",
"RIL:SetRoamingPreference", "RIL:SetRoamingPreference",
"RIL:GetRoamingPreference", "RIL:GetRoamingPreference",
"RIL:CdmaCallWaiting",
"RIL:ExitEmergencyCbMode", "RIL:ExitEmergencyCbMode",
"RIL:SetVoicePrivacyMode", "RIL:SetVoicePrivacyMode",
"RIL:GetVoicePrivacyMode", "RIL:GetVoicePrivacyMode",
"RIL:ConferenceCallStateChanged",
"RIL:OtaStatusChanged" "RIL:OtaStatusChanged"
]; ];
@ -120,10 +114,6 @@ XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
"@mozilla.org/childprocessmessagemanager;1", "@mozilla.org/childprocessmessagemanager;1",
"nsISyncMessageSender"); "nsISyncMessageSender");
XPCOMUtils.defineLazyServiceGetter(this, "gUUIDGenerator",
"@mozilla.org/uuid-generator;1",
"nsIUUIDGenerator");
function MobileIccCardLockResult(options) { function MobileIccCardLockResult(options) {
this.lockType = options.lockType; this.lockType = options.lockType;
this.enabled = options.enabled; this.enabled = options.enabled;
@ -449,7 +439,6 @@ RILContentHelper.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIMobileConnectionProvider, QueryInterface: XPCOMUtils.generateQI([Ci.nsIMobileConnectionProvider,
Ci.nsICellBroadcastProvider, Ci.nsICellBroadcastProvider,
Ci.nsIVoicemailProvider, Ci.nsIVoicemailProvider,
Ci.nsITelephonyProvider,
Ci.nsIIccProvider, Ci.nsIIccProvider,
Ci.nsIObserver, Ci.nsIObserver,
Ci.nsISupportsWeakReference]), Ci.nsISupportsWeakReference]),
@ -459,7 +448,6 @@ RILContentHelper.prototype = {
interfaces: [Ci.nsIMobileConnectionProvider, interfaces: [Ci.nsIMobileConnectionProvider,
Ci.nsICellBroadcastProvider, Ci.nsICellBroadcastProvider,
Ci.nsIVoicemailProvider, Ci.nsIVoicemailProvider,
Ci.nsITelephonyProvider,
Ci.nsIIccProvider]}), Ci.nsIIccProvider]}),
// An utility function to copy objects. // An utility function to copy objects.
@ -1281,11 +1269,9 @@ RILContentHelper.prototype = {
}, },
_mobileConnectionListeners: null, _mobileConnectionListeners: null,
_telephonyListeners: null,
_cellBroadcastListeners: null, _cellBroadcastListeners: null,
_voicemailListeners: null, _voicemailListeners: null,
_iccListeners: null, _iccListeners: null,
_enumerateTelephonyCallbacks: null,
voicemailStatus: null, voicemailStatus: null,
@ -1347,24 +1333,6 @@ RILContentHelper.prototype = {
this.unregisterListener("_mobileConnectionListeners", listener); this.unregisterListener("_mobileConnectionListeners", listener);
}, },
registerTelephonyMsg: function registerTelephonyMsg(listener) {
debug("Registering for telephony-related messages");
this.registerListener("_telephonyListeners", listener);
cpmm.sendAsyncMessage("RIL:RegisterTelephonyMsg");
},
unregisterTelephonyMsg: function unregisteTelephonyMsg(listener) {
this.unregisterListener("_telephonyListeners", listener);
// We also need to make sure the listener is removed from
// _enumerateTelephonyCallbacks.
let index = this._enumerateTelephonyCallbacks.indexOf(listener);
if (index != -1) {
this._enumerateTelephonyCallbacks.splice(index, 1);
if (DEBUG) debug("Unregistered enumerateTelephony callback: " + listener);
}
},
registerVoicemailMsg: function registerVoicemailMsg(listener) { registerVoicemailMsg: function registerVoicemailMsg(listener) {
debug("Registering for voicemail-related messages"); debug("Registering for voicemail-related messages");
this.registerListener("_voicemailListeners", listener); this.registerListener("_voicemailListeners", listener);
@ -1395,135 +1363,6 @@ RILContentHelper.prototype = {
this.unregisterListener("_iccListeners", listener); this.unregisterListener("_iccListeners", listener);
}, },
enumerateCalls: function enumerateCalls(callback) {
debug("Requesting enumeration of calls for callback: " + callback);
// We need 'requestId' to meet the 'RILContentHelper <--> RadioInterfaceLayer'
// protocol.
let requestId = this._getRandomId();
cpmm.sendAsyncMessage("RIL:EnumerateCalls", {
clientId: 0,
data: {
requestId: requestId
}
});
if (!this._enumerateTelephonyCallbacks) {
this._enumerateTelephonyCallbacks = [];
}
this._enumerateTelephonyCallbacks.push(callback);
},
startTone: function startTone(dtmfChar) {
debug("Sending Tone for " + dtmfChar);
cpmm.sendAsyncMessage("RIL:StartTone", {
clientId: 0,
data: dtmfChar
});
},
stopTone: function stopTone() {
debug("Stopping Tone");
cpmm.sendAsyncMessage("RIL:StopTone", {clientId: 0});
},
dial: function dial(number) {
debug("Dialing " + number);
cpmm.sendAsyncMessage("RIL:Dial", {
clientId: 0,
data: number
});
},
dialEmergency: function dialEmergency(number) {
debug("Dialing emergency " + number);
cpmm.sendAsyncMessage("RIL:DialEmergency", {
clientId: 0,
data: number
});
},
hangUp: function hangUp(callIndex) {
debug("Hanging up call no. " + callIndex);
cpmm.sendAsyncMessage("RIL:HangUp", {
clientId: 0,
data: callIndex
});
},
answerCall: function answerCall(callIndex) {
cpmm.sendAsyncMessage("RIL:AnswerCall", {
clientId: 0,
data: callIndex
});
},
rejectCall: function rejectCall(callIndex) {
cpmm.sendAsyncMessage("RIL:RejectCall", {
clientId: 0,
data: callIndex
});
},
holdCall: function holdCall(callIndex) {
cpmm.sendAsyncMessage("RIL:HoldCall", {
clientId: 0,
data: callIndex
});
},
resumeCall: function resumeCall(callIndex) {
cpmm.sendAsyncMessage("RIL:ResumeCall", {
clientId: 0,
data: callIndex
});
},
conferenceCall: function conferenceCall() {
cpmm.sendAsyncMessage("RIL:ConferenceCall", {
clientId: 0
});
},
separateCall: function separateCall(callIndex) {
cpmm.sendAsyncMessage("RIL:SeparateCall", {
clientId: 0,
data: callIndex
});
},
holdConference: function holdConference() {
cpmm.sendAsyncMessage("RIL:HoldConference", {
clientId: 0
});
},
resumeConference: function resumeConference() {
cpmm.sendAsyncMessage("RIL:ResumeConference", {
clientId: 0
});
},
get microphoneMuted() {
return cpmm.sendSyncMessage("RIL:GetMicrophoneMuted", {clientId: 0})[0];
},
set microphoneMuted(value) {
cpmm.sendAsyncMessage("RIL:SetMicrophoneMuted", {
clientId: 0,
data: value
});
},
get speakerEnabled() {
return cpmm.sendSyncMessage("RIL:GetSpeakerEnabled", {clientId: 0})[0];
},
set speakerEnabled(value) {
cpmm.sendAsyncMessage("RIL:SetSpeakerEnabled", {
clientId: 0,
data: value
});
},
// nsIObserver // nsIObserver
observe: function observe(subject, topic, data) { observe: function observe(subject, topic, data) {
@ -1620,9 +1459,6 @@ RILContentHelper.prototype = {
"notifyOtaStatusChanged", "notifyOtaStatusChanged",
[msg.json.data]); [msg.json.data]);
break; break;
case "RIL:EnumerateCalls":
this.handleEnumerateCalls(msg.json.calls);
break;
case "RIL:GetAvailableNetworks": case "RIL:GetAvailableNetworks":
this.handleGetAvailableNetworks(msg.json); this.handleGetAvailableNetworks(msg.json);
break; break;
@ -1637,35 +1473,6 @@ RILContentHelper.prototype = {
this.handleSelectNetwork(msg.json, this.handleSelectNetwork(msg.json,
RIL.GECKO_NETWORK_SELECTION_AUTOMATIC); RIL.GECKO_NETWORK_SELECTION_AUTOMATIC);
break; break;
case "RIL:CallStateChanged": {
let data = msg.json.data;
this._deliverEvent("_telephonyListeners",
"callStateChanged",
[data.callIndex, data.state,
data.number, data.isActive,
data.isOutgoing, data.isEmergency,
data.isConference]);
break;
}
case "RIL:ConferenceCallStateChanged": {
let data = msg.json.data;
this._deliverEvent("_telephonyListeners",
"conferenceCallStateChanged",
[data]);
break;
}
case "RIL:CallError": {
let data = msg.json.data;
this._deliverEvent("_telephonyListeners",
"notifyError",
[data.callIndex, data.errorMsg]);
break;
}
case "RIL:SuppSvcNotification":
this._deliverEvent("_telephonyListeners",
"supplementaryServiceNotification",
[msg.json.callIndex, msg.json.notification]);
break;
case "RIL:VoicemailNotification": case "RIL:VoicemailNotification":
this.handleVoicemailNotification(msg.json.data); this.handleVoicemailNotification(msg.json.data);
break; break;
@ -1786,11 +1593,6 @@ RILContentHelper.prototype = {
this.handleSimpleRequest(msg.json.requestId, msg.json.errorMsg, this.handleSimpleRequest(msg.json.requestId, msg.json.errorMsg,
msg.json.mode); msg.json.mode);
break; break;
case "RIL:CdmaCallWaiting":
this._deliverEvent("_telephonyListeners",
"notifyCdmaCallWaiting",
[msg.json.data]);
break;
case "RIL:ExitEmergencyCbMode": case "RIL:ExitEmergencyCbMode":
this.handleExitEmergencyCbMode(msg.json); this.handleExitEmergencyCbMode(msg.json);
break; break;
@ -1810,35 +1612,6 @@ RILContentHelper.prototype = {
} }
}, },
handleEnumerateCalls: function handleEnumerateCalls(calls) {
debug("handleEnumerateCalls: " + JSON.stringify(calls));
let callback = this._enumerateTelephonyCallbacks.shift();
if (!calls.length) {
callback.enumerateCallStateComplete();
return;
}
for (let i in calls) {
let call = calls[i];
let keepGoing;
try {
keepGoing =
callback.enumerateCallState(call.callIndex, call.state, call.number,
call.isActive, call.isOutgoing,
call.isEmergency, call.isConference);
} catch (e) {
debug("callback handler for 'enumerateCallState' threw an " +
" exception: " + e);
keepGoing = true;
}
if (!keepGoing) {
break;
}
}
callback.enumerateCallStateComplete();
},
handleSimpleRequest: function handleSimpleRequest(requestId, errorMsg, result) { handleSimpleRequest: function handleSimpleRequest(requestId, errorMsg, result) {
if (errorMsg) { if (errorMsg) {
this.fireRequestError(requestId, errorMsg); this.fireRequestError(requestId, errorMsg);
@ -2051,10 +1824,6 @@ RILContentHelper.prototype = {
} }
}, },
_getRandomId: function _getRandomId() {
return gUUIDGenerator.generateUUID().toString();
},
_deliverEvent: function _deliverEvent(listenerType, name, args) { _deliverEvent: function _deliverEvent(listenerType, name, args) {
let thisListeners = this[listenerType]; let thisListeners = this[listenerType];
if (!thisListeners) { if (!thisListeners) {

View File

@ -46,9 +46,6 @@ const RADIOINTERFACE_CID =
const RILNETWORKINTERFACE_CID = const RILNETWORKINTERFACE_CID =
Components.ID("{3bdd52a9-3965-4130-b569-0ac5afed045e}"); Components.ID("{3bdd52a9-3965-4130-b569-0ac5afed045e}");
const nsIAudioManager = Ci.nsIAudioManager;
const nsITelephonyProvider = Ci.nsITelephonyProvider;
const kNetworkInterfaceStateChangedTopic = "network-interface-state-changed"; const kNetworkInterfaceStateChangedTopic = "network-interface-state-changed";
const kSmsReceivedObserverTopic = "sms-received"; const kSmsReceivedObserverTopic = "sms-received";
const kSilentSmsReceivedObserverTopic = "silent-sms-received"; const kSilentSmsReceivedObserverTopic = "silent-sms-received";
@ -73,30 +70,7 @@ const DOM_MOBILE_MESSAGE_DELIVERY_SENDING = "sending";
const DOM_MOBILE_MESSAGE_DELIVERY_SENT = "sent"; const DOM_MOBILE_MESSAGE_DELIVERY_SENT = "sent";
const DOM_MOBILE_MESSAGE_DELIVERY_ERROR = "error"; const DOM_MOBILE_MESSAGE_DELIVERY_ERROR = "error";
const CALL_WAKELOCK_TIMEOUT = 5000; const RADIO_POWER_OFF_TIMEOUT = 30000;
const RADIO_POWER_OFF_TIMEOUT = 30000;
const RIL_IPC_TELEPHONY_MSG_NAMES = [
"RIL:EnumerateCalls",
"RIL:GetMicrophoneMuted",
"RIL:SetMicrophoneMuted",
"RIL:GetSpeakerEnabled",
"RIL:SetSpeakerEnabled",
"RIL:StartTone",
"RIL:StopTone",
"RIL:Dial",
"RIL:DialEmergency",
"RIL:HangUp",
"RIL:AnswerCall",
"RIL:RejectCall",
"RIL:HoldCall",
"RIL:ResumeCall",
"RIL:RegisterTelephonyMsg",
"RIL:ConferenceCall",
"RIL:SeparateCall",
"RIL:HoldConference",
"RIL:ResumeConference"
];
const RIL_IPC_MOBILECONNECTION_MSG_NAMES = [ const RIL_IPC_MOBILECONNECTION_MSG_NAMES = [
"RIL:GetRilContext", "RIL:GetRilContext",
@ -188,6 +162,10 @@ XPCOMUtils.defineLazyServiceGetter(this, "gSystemWorkerManager",
"@mozilla.org/telephony/system-worker-manager;1", "@mozilla.org/telephony/system-worker-manager;1",
"nsISystemWorkerManager"); "nsISystemWorkerManager");
XPCOMUtils.defineLazyServiceGetter(this, "gTelephonyProvider",
"@mozilla.org/telephony/telephonyprovider;1",
"nsIGonkTelephonyProvider");
XPCOMUtils.defineLazyGetter(this, "WAP", function () { XPCOMUtils.defineLazyGetter(this, "WAP", function () {
let wap = {}; let wap = {};
Cu.import("resource://gre/modules/WapPushManager.js", wap); Cu.import("resource://gre/modules/WapPushManager.js", wap);
@ -200,64 +178,6 @@ XPCOMUtils.defineLazyGetter(this, "PhoneNumberUtils", function () {
return ns.PhoneNumberUtils; return ns.PhoneNumberUtils;
}); });
function convertRILCallState(state) {
switch (state) {
case RIL.CALL_STATE_ACTIVE:
return nsITelephonyProvider.CALL_STATE_CONNECTED;
case RIL.CALL_STATE_HOLDING:
return nsITelephonyProvider.CALL_STATE_HELD;
case RIL.CALL_STATE_DIALING:
return nsITelephonyProvider.CALL_STATE_DIALING;
case RIL.CALL_STATE_ALERTING:
return nsITelephonyProvider.CALL_STATE_ALERTING;
case RIL.CALL_STATE_INCOMING:
case RIL.CALL_STATE_WAITING:
return nsITelephonyProvider.CALL_STATE_INCOMING;
default:
throw new Error("Unknown rilCallState: " + state);
}
}
function convertRILSuppSvcNotification(notification) {
switch (notification) {
case RIL.GECKO_SUPP_SVC_NOTIFICATION_REMOTE_HELD:
return nsITelephonyProvider.NOTIFICATION_REMOTE_HELD;
case RIL.GECKO_SUPP_SVC_NOTIFICATION_REMOTE_RESUMED:
return nsITelephonyProvider.NOTIFICATION_REMOTE_RESUMED;
default:
throw new Error("Unknown rilSuppSvcNotification: " + notification);
}
}
/**
* Fake nsIAudioManager implementation so that we can run the telephony
* code in a non-Gonk build.
*/
let FakeAudioManager = {
microphoneMuted: false,
masterVolume: 1.0,
masterMuted: false,
phoneState: nsIAudioManager.PHONE_STATE_CURRENT,
_forceForUse: {},
setForceForUse: function setForceForUse(usage, force) {
this._forceForUse[usage] = force;
},
getForceForUse: function setForceForUse(usage) {
return this._forceForUse[usage] || nsIAudioManager.FORCE_NONE;
}
};
XPCOMUtils.defineLazyGetter(this, "gAudioManager", function getAudioManager() {
try {
return Cc["@mozilla.org/telephony/audiomanager;1"]
.getService(nsIAudioManager);
} catch (ex) {
//TODO on the phone this should not fall back as silently.
if (DEBUG) debug("Using fake audio manager.");
return FakeAudioManager;
}
});
XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () { XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
return { return {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIMessageListener, QueryInterface: XPCOMUtils.generateQI([Ci.nsIMessageListener,
@ -290,9 +210,6 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
_registerMessageListeners: function _registerMessageListeners() { _registerMessageListeners: function _registerMessageListeners() {
ppmm.addMessageListener("child-process-shutdown", this); ppmm.addMessageListener("child-process-shutdown", this);
for (let msgname of RIL_IPC_TELEPHONY_MSG_NAMES) {
ppmm.addMessageListener(msgname, this);
}
for (let msgname of RIL_IPC_MOBILECONNECTION_MSG_NAMES) { for (let msgname of RIL_IPC_MOBILECONNECTION_MSG_NAMES) {
ppmm.addMessageListener(msgname, this); ppmm.addMessageListener(msgname, this);
} }
@ -309,9 +226,6 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
_unregisterMessageListeners: function _unregisterMessageListeners() { _unregisterMessageListeners: function _unregisterMessageListeners() {
ppmm.removeMessageListener("child-process-shutdown", this); ppmm.removeMessageListener("child-process-shutdown", this);
for (let msgname of RIL_IPC_TELEPHONY_MSG_NAMES) {
ppmm.removeMessageListener(msgname, this);
}
for (let msgname of RIL_IPC_MOBILECONNECTION_MSG_NAMES) { for (let msgname of RIL_IPC_MOBILECONNECTION_MSG_NAMES) {
ppmm.removeMessageListener(msgname, this); ppmm.removeMessageListener(msgname, this);
} }
@ -430,15 +344,7 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
return; return;
} }
if (RIL_IPC_TELEPHONY_MSG_NAMES.indexOf(msg.name) != -1) { if (RIL_IPC_MOBILECONNECTION_MSG_NAMES.indexOf(msg.name) != -1) {
if (!msg.target.assertPermission("telephony")) {
if (DEBUG) {
debug("Telephony message " + msg.name +
" from a content process with no 'telephony' privileges.");
}
return null;
}
} else if (RIL_IPC_MOBILECONNECTION_MSG_NAMES.indexOf(msg.name) != -1) {
if (!msg.target.assertPermission("mobileconnection")) { if (!msg.target.assertPermission("mobileconnection")) {
if (DEBUG) { if (DEBUG) {
debug("MobileConnection message " + msg.name + debug("MobileConnection message " + msg.name +
@ -476,9 +382,6 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
} }
switch (msg.name) { switch (msg.name) {
case "RIL:RegisterTelephonyMsg":
this._registerMessageTarget("telephony", msg.target);
return;
case "RIL:RegisterMobileConnectionMsg": case "RIL:RegisterMobileConnectionMsg":
this._registerMessageTarget("mobileconnection", msg.target); this._registerMessageTarget("mobileconnection", msg.target);
return; return;
@ -519,13 +422,6 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
} }
}, },
sendTelephonyMessage: function sendTelephonyMessage(message, clientId, data) {
this._sendTargetMessage("telephony", message, {
clientId: clientId,
data: data
});
},
sendMobileConnectionMessage: function sendMobileConnectionMessage(message, clientId, data) { sendMobileConnectionMessage: function sendMobileConnectionMessage(message, clientId, data) {
this._sendTargetMessage("mobileconnection", message, { this._sendTargetMessage("mobileconnection", message, {
clientId: clientId, clientId: clientId,
@ -894,61 +790,6 @@ RadioInterface.prototype = {
case "RIL:GetRilContext": case "RIL:GetRilContext":
// This message is sync. // This message is sync.
return this.rilContext; return this.rilContext;
case "RIL:EnumerateCalls":
this.enumerateCalls(msg.target, msg.json.data);
break;
case "RIL:GetMicrophoneMuted":
// This message is sync.
return this.microphoneMuted;
case "RIL:SetMicrophoneMuted":
this.microphoneMuted = msg.json.data;
break;
case "RIL:GetSpeakerEnabled":
// This message is sync.
return this.speakerEnabled;
case "RIL:SetSpeakerEnabled":
this.speakerEnabled = msg.json.data;
break;
case "RIL:StartTone":
this.workerMessenger.send("startTone", { dtmfChar: msg.json.data });
break;
case "RIL:StopTone":
this.workerMessenger.send("stopTone");
break;
case "RIL:Dial":
this.dial(msg.json.data);
break;
case "RIL:DialEmergency":
this.dialEmergency(msg.json.data);
break;
case "RIL:HangUp":
this.workerMessenger.send("hangUp", { callIndex: msg.json.data });
break;
case "RIL:AnswerCall":
this.workerMessenger.send("answerCall", { callIndex: msg.json.data });
break;
case "RIL:RejectCall":
this.workerMessenger.send("rejectCall", { callIndex: msg.json.data });
break;
case "RIL:HoldCall":
this.workerMessenger.send("holdCall", { callIndex: msg.json.data });
break;
case "RIL:ResumeCall":
this.workerMessenger.send("resumeCall", { callIndex: msg.json.data });
break;
case "RIL:ConferenceCall":
this.workerMessenger.send("conferenceCall");
break;
case "RIL:SeparateCall":
this.workerMessenger.send("separateCall",
{ callIndex: msg.json.data });
break;
case "RIL:HoldConference":
this.workerMessenger.send("holdConference");
break;
case "RIL:ResumeConference":
this.workerMessenger.send("resumeConference");
break;
case "RIL:GetAvailableNetworks": case "RIL:GetAvailableNetworks":
this.workerMessenger.sendWithIPCMessage(msg, "getAvailableNetworks"); this.workerMessenger.sendWithIPCMessage(msg, "getAvailableNetworks");
break; break;
@ -1058,28 +899,26 @@ RadioInterface.prototype = {
handleUnsolicitedWorkerMessage: function handleUnsolicitedWorkerMessage(message) { handleUnsolicitedWorkerMessage: function handleUnsolicitedWorkerMessage(message) {
switch (message.rilMessageType) { switch (message.rilMessageType) {
case "callRing": case "callRing":
this.handleCallRing(); gTelephonyProvider.notifyCallRing();
break; break;
case "callStateChange": case "callStateChange":
// This one will handle its own notifications. gTelephonyProvider.notifyCallStateChanged(message.call);
this.handleCallStateChange(message.call);
break; break;
case "callDisconnected": case "callDisconnected":
// This one will handle its own notifications. gTelephonyProvider.notifyCallDisconnected(message.call);
this.handleCallDisconnected(message.call);
break; break;
case "conferenceCallStateChanged": case "conferenceCallStateChanged":
this.handleConferenceCallStateChanged(message.state); gTelephonyProvider.notifyConferenceCallStateChanged(message.state);
break; break;
case "cdmaCallWaiting": case "cdmaCallWaiting":
gMessageManager.sendTelephonyMessage("RIL:CdmaCallWaiting", gTelephonyProvider.notifyCdmaCallWaiting(message.number);
this.clientId, message.number);
break; break;
case "callError": case "callError":
this.handleCallError(message); gTelephonyProvider.notifyCallError(message.callIndex, message.errorMsg);
break; break;
case "suppSvcNotification": case "suppSvcNotification":
this.handleSuppSvcNotification(message); gTelephonyProvider.notifySupplementaryService(message.callIndex,
message.notification);
break; break;
case "emergencyCbModeChange": case "emergencyCbModeChange":
this.handleEmergencyCbModeChange(message); this.handleEmergencyCbModeChange(message);
@ -1727,165 +1566,6 @@ RadioInterface.prototype = {
this.setupDataCallByType("default"); this.setupDataCallByType("default");
}, },
/**
* Track the active call and update the audio system as its state changes.
*/
_activeCall: null,
updateCallAudioState: function updateCallAudioState(options) {
if (options.conferenceState === nsITelephonyProvider.CALL_STATE_CONNECTED) {
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_IN_CALL;
if (this.speakerEnabled) {
gAudioManager.setForceForUse(nsIAudioManager.USE_COMMUNICATION,
nsIAudioManager.FORCE_SPEAKER);
}
return;
}
if (options.conferenceState === nsITelephonyProvider.CALL_STATE_UNKNOWN ||
options.conferenceState === nsITelephonyProvider.CALL_STATE_HELD) {
if (!this._activeCall) {
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_NORMAL;
}
return;
}
if (!options.call) {
return;
}
if (options.call.isConference) {
if (this._activeCall && this._activeCall.callIndex == options.call.callIndex) {
this._activeCall = null;
}
return;
}
let call = options.call;
switch (call.state) {
case nsITelephonyProvider.CALL_STATE_DIALING: // Fall through...
case nsITelephonyProvider.CALL_STATE_ALERTING:
case nsITelephonyProvider.CALL_STATE_CONNECTED:
call.isActive = true;
this._activeCall = call;
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_IN_CALL;
if (this.speakerEnabled) {
gAudioManager.setForceForUse(nsIAudioManager.USE_COMMUNICATION,
nsIAudioManager.FORCE_SPEAKER);
}
if (DEBUG) {
this.debug("Active call, put audio system into PHONE_STATE_IN_CALL: "
+ gAudioManager.phoneState);
}
break;
case nsITelephonyProvider.CALL_STATE_INCOMING:
call.isActive = false;
if (!this._activeCall) {
// We can change the phone state into RINGTONE only when there's
// no active call.
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_RINGTONE;
if (DEBUG) {
this.debug("Incoming call, put audio system into " +
"PHONE_STATE_RINGTONE: " + gAudioManager.phoneState);
}
}
break;
case nsITelephonyProvider.CALL_STATE_HELD: // Fall through...
case nsITelephonyProvider.CALL_STATE_DISCONNECTED:
call.isActive = false;
if (this._activeCall &&
this._activeCall.callIndex == call.callIndex) {
// Previously active call is not active now.
this._activeCall = null;
}
if (!this._activeCall) {
// No active call. Disable the audio.
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_NORMAL;
if (DEBUG) {
this.debug("No active call, put audio system into " +
"PHONE_STATE_NORMAL: " + gAudioManager.phoneState);
}
}
break;
}
},
_callRingWakeLock: null,
_callRingWakeLockTimer: null,
_cancelCallRingWakeLockTimer: function _cancelCallRingWakeLockTimer() {
if (this._callRingWakeLockTimer) {
this._callRingWakeLockTimer.cancel();
}
if (this._callRingWakeLock) {
this._callRingWakeLock.unlock();
this._callRingWakeLock = null;
}
},
/**
* Handle an incoming call.
*
* Not much is known about this call at this point, but it's enough
* to start bringing up the Phone app already.
*/
handleCallRing: function handleCallRing() {
if (!this._callRingWakeLock) {
this._callRingWakeLock = gPowerManagerService.newWakeLock("cpu");
}
if (!this._callRingWakeLockTimer) {
this._callRingWakeLockTimer =
Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
}
this._callRingWakeLockTimer
.initWithCallback(this._cancelCallRingWakeLockTimer.bind(this),
CALL_WAKELOCK_TIMEOUT, Ci.nsITimer.TYPE_ONE_SHOT);
gSystemMessenger.broadcastMessage("telephony-new-call", {});
},
/**
* Handle call state changes by updating our current state and the audio
* system.
*/
handleCallStateChange: function handleCallStateChange(call) {
if (DEBUG) this.debug("handleCallStateChange: " + JSON.stringify(call));
call.state = convertRILCallState(call.state);
if (call.state == nsITelephonyProvider.CALL_STATE_DIALING) {
gSystemMessenger.broadcastMessage("telephony-new-call", {});
}
this.updateCallAudioState({call: call});
gMessageManager.sendTelephonyMessage("RIL:CallStateChanged",
this.clientId, call);
},
/**
* Handle call disconnects by updating our current state and the audio system.
*/
handleCallDisconnected: function handleCallDisconnected(call) {
if (DEBUG) this.debug("handleCallDisconnected: " + JSON.stringify(call));
call.state = nsITelephonyProvider.CALL_STATE_DISCONNECTED;
let duration = ("started" in call && typeof call.started == "number") ?
new Date().getTime() - call.started : 0;
let data = {
number: call.number,
duration: duration,
direction: call.isOutgoing ? "outgoing" : "incoming"
};
gSystemMessenger.broadcastMessage("telephony-call-ended", data);
this.updateCallAudioState({call: call});
gMessageManager.sendTelephonyMessage("RIL:CallStateChanged",
this.clientId, call);
},
handleConferenceCallStateChanged: function handleConferenceCallStateChanged(state) {
debug("handleConferenceCallStateChanged: " + state);
state = state != null ? convertRILCallState(state) :
nsITelephonyProvider.CALL_STATE_UNKNOWN;
this.updateCallAudioState({conferenceState: state});
gMessageManager.sendTelephonyMessage("RIL:ConferenceCallStateChanged",
this.clientId, state);
},
/** /**
* Update network selection mode * Update network selection mode
*/ */
@ -1905,23 +1585,6 @@ RadioInterface.prototype = {
this.clientId, message); this.clientId, message);
}, },
/**
* Handle call error.
*/
handleCallError: function handleCallError(message) {
gMessageManager.sendTelephonyMessage("RIL:CallError",
this.clientId, message);
},
/**
* Handle supplementary service notification.
*/
handleSuppSvcNotification: function handleSuppSvcNotification(message) {
message.notification = convertRILSuppSvcNotification(message.notification);
gMessageManager.sendTelephonyMessage("RIL:SuppSvcNotification",
this.clientId, message);
},
/** /**
* Handle WDP port push PDU. Constructor WDP bearer information and deliver * Handle WDP port push PDU. Constructor WDP bearer information and deliver
* to WapPushManager. * to WapPushManager.
@ -2309,8 +1972,6 @@ RadioInterface.prototype = {
} }
break; break;
case "xpcom-shutdown": case "xpcom-shutdown":
// Cancel the timer for the call-ring wake lock.
this._cancelCallRingWakeLockTimer();
// Shutdown all RIL network interfaces // Shutdown all RIL network interfaces
for each (let apnSetting in this.apnSettings.byAPN) { for each (let apnSetting in this.apnSettings.byAPN) {
if (apnSetting.iface) { if (apnSetting.iface) {
@ -2460,56 +2121,6 @@ RadioInterface.prototype = {
// Handle phone functions of nsIRILContentHelper // Handle phone functions of nsIRILContentHelper
enumerateCalls: function enumerateCalls(target, message) {
if (DEBUG) this.debug("Requesting enumeration of calls for callback");
this.workerMessenger.send("enumerateCalls", message, (function(response) {
for (let call of response.calls) {
call.state = convertRILCallState(call.state);
call.isActive = this._activeCall ?
call.callIndex == this._activeCall.callIndex : false;
}
target.sendAsyncMessage("RIL:EnumerateCalls", response);
return false;
}).bind(this));
},
_validateNumber: function _validateNumber(number) {
// note: isPlainPhoneNumber also accepts USSD and SS numbers
if (PhoneNumberUtils.isPlainPhoneNumber(number)) {
return true;
}
this.handleCallError({
callIndex: -1,
errorMsg: RIL.RIL_CALL_FAILCAUSE_TO_GECKO_CALL_ERROR[RIL.CALL_FAIL_UNOBTAINABLE_NUMBER]
});
if (DEBUG) {
this.debug("Number '" + number + "' doesn't seem to be a viable number." +
" Drop.");
}
return false;
},
dial: function dial(number) {
if (DEBUG) this.debug("Dialing " + number);
number = PhoneNumberUtils.normalize(number);
if (this._validateNumber(number)) {
this.workerMessenger.send("dial", { number: number,
isDialEmergency: false });
}
},
dialEmergency: function dialEmergency(number) {
if (DEBUG) this.debug("Dialing emergency " + number);
// we don't try to be too clever here, as the phone is probably in the
// locked state. Let's just check if it's a number without normalizing
if (this._validateNumber(number)) {
this.workerMessenger.send("dial", { number: number,
isDialEmergency: true });
}
},
_sendCfStateChanged: function _sendCfStateChanged(message) { _sendCfStateChanged: function _sendCfStateChanged(message) {
gMessageManager.sendMobileConnectionMessage("RIL:CfStateChanged", gMessageManager.sendMobileConnectionMessage("RIL:CfStateChanged",
this.clientId, message); this.clientId, message);
@ -2564,37 +2175,6 @@ RadioInterface.prototype = {
}).bind(this)); }).bind(this));
}, },
get microphoneMuted() {
return gAudioManager.microphoneMuted;
},
set microphoneMuted(value) {
if (value == this.microphoneMuted) {
return;
}
gAudioManager.microphoneMuted = value;
if (!this._activeCall) {
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_NORMAL;
}
},
get speakerEnabled() {
return (gAudioManager.getForceForUse(nsIAudioManager.USE_COMMUNICATION) ==
nsIAudioManager.FORCE_SPEAKER);
},
set speakerEnabled(value) {
if (value == this.speakerEnabled) {
return;
}
let force = value ? nsIAudioManager.FORCE_SPEAKER :
nsIAudioManager.FORCE_NONE;
gAudioManager.setForceForUse(nsIAudioManager.USE_COMMUNICATION, force);
if (!this._activeCall) {
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_NORMAL;
}
},
/** /**
* List of tuples of national language identifier pairs. * List of tuples of national language identifier pairs.
* *
@ -3362,6 +2942,13 @@ RadioInterface.prototype = {
this.workerMessenger.send("deactivateDataCall", { cid: cid, this.workerMessenger.send("deactivateDataCall", { cid: cid,
reason: reason }); reason: reason });
}, },
sendWorkerMessage: function sendWorkerMessage(rilMessageType, message,
callback) {
this.workerMessenger.send(rilMessageType, message, function (response) {
return callback.handleResponse(response);
});
}
}; };
function RILNetworkInterface(radioInterface, apnSetting) { function RILNetworkInterface(radioInterface, apnSetting) {

View File

@ -78,7 +78,13 @@ interface nsIRilContext : nsISupports
readonly attribute nsIDOMMozMobileConnectionInfo data; readonly attribute nsIDOMMozMobileConnectionInfo data;
}; };
[scriptable, uuid(a50d65aa-00da-11e3-b954-7bfb233d98fc)] [scriptable, function, uuid(3bc96351-53b0-47a1-a888-c74c64b60f25)]
interface nsIRilSendWorkerMessageCallback : nsISupports
{
boolean handleResponse(in jsval response);
};
[scriptable, uuid(61a8ca67-6113-4cd0-b443-e045f09863ed)]
interface nsIRadioInterface : nsISupports interface nsIRadioInterface : nsISupports
{ {
readonly attribute nsIRilContext rilContext; readonly attribute nsIRilContext rilContext;
@ -105,6 +111,10 @@ interface nsIRadioInterface : nsISupports
in DOMString message, in DOMString message,
in boolean silent, in boolean silent,
in nsIMobileMessageCallback request); in nsIMobileMessageCallback request);
void sendWorkerMessage(in DOMString type,
[optional] in jsval message,
[optional] in nsIRilSendWorkerMessageCallback callback);
}; };
[scriptable, uuid(44b03951-1444-4c03-bd37-0bcb3a01b56f)] [scriptable, uuid(44b03951-1444-4c03-bd37-0bcb3a01b56f)]

View File

@ -11,6 +11,7 @@
USING_TELEPHONY_NAMESPACE USING_TELEPHONY_NAMESPACE
using namespace mozilla::dom; using namespace mozilla::dom;
using mozilla::ErrorResult;
/* static */ /* static */
already_AddRefed<CallEvent> already_AddRefed<CallEvent>

View File

@ -3,3 +3,5 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
include $(topsrcdir)/dom/dom-config.mk include $(topsrcdir)/dom/dom-config.mk
include $(topsrcdir)/config/rules.mk
include $(topsrcdir)/ipc/chromium/chromium-config.mk

View File

@ -24,10 +24,9 @@
#include "TelephonyCall.h" #include "TelephonyCall.h"
#include "TelephonyCallGroup.h" #include "TelephonyCallGroup.h"
#define NS_RILCONTENTHELPER_CONTRACTID "@mozilla.org/ril/content-helper;1"
USING_TELEPHONY_NAMESPACE USING_TELEPHONY_NAMESPACE
using namespace mozilla::dom; using namespace mozilla::dom;
using mozilla::ErrorResult;
namespace { namespace {
@ -51,6 +50,8 @@ public:
MOZ_ASSERT(mTelephony); MOZ_ASSERT(mTelephony);
} }
virtual ~Listener() {}
void void
Disconnect() Disconnect()
{ {
@ -111,7 +112,7 @@ Telephony::Shutdown()
mListener->Disconnect(); mListener->Disconnect();
if (mProvider) { if (mProvider) {
mProvider->UnregisterTelephonyMsg(mListener); mProvider->UnregisterListener(mListener);
mProvider = nullptr; mProvider = nullptr;
} }
@ -132,7 +133,7 @@ Telephony::Create(nsPIDOMWindow* aOwner, ErrorResult& aRv)
NS_ASSERTION(aOwner, "Null owner!"); NS_ASSERTION(aOwner, "Null owner!");
nsCOMPtr<nsITelephonyProvider> ril = nsCOMPtr<nsITelephonyProvider> ril =
do_GetService(NS_RILCONTENTHELPER_CONTRACTID); do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
if (!ril) { if (!ril) {
aRv.Throw(NS_ERROR_UNEXPECTED); aRv.Throw(NS_ERROR_UNEXPECTED);
return nullptr; return nullptr;
@ -165,7 +166,7 @@ Telephony::Create(nsPIDOMWindow* aOwner, ErrorResult& aRv)
return nullptr; return nullptr;
} }
rv = ril->RegisterTelephonyMsg(telephony->mListener); rv = ril->RegisterListener(telephony->mListener);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
aRv.Throw(rv); aRv.Throw(rv);
return nullptr; return nullptr;
@ -222,12 +223,7 @@ Telephony::DialInternal(bool isEmergency,
} }
} }
nsresult rv; nsresult rv = mProvider->Dial(aNumber, isEmergency);
if (isEmergency) {
rv = mProvider->DialEmergency(aNumber);
} else {
rv = mProvider->Dial(aNumber);
}
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
aRv.Throw(rv); aRv.Throw(rv);
return nullptr; return nullptr;
@ -591,7 +587,7 @@ NS_IMETHODIMP
Telephony::EnumerateCallState(uint32_t aCallIndex, uint16_t aCallState, Telephony::EnumerateCallState(uint32_t aCallIndex, uint16_t aCallState,
const nsAString& aNumber, bool aIsActive, const nsAString& aNumber, bool aIsActive,
bool aIsOutgoing, bool aIsEmergency, bool aIsOutgoing, bool aIsEmergency,
bool aIsConference, bool* aContinue) bool aIsConference)
{ {
nsRefPtr<TelephonyCall> call; nsRefPtr<TelephonyCall> call;
@ -603,12 +599,10 @@ Telephony::EnumerateCallState(uint32_t aCallIndex, uint16_t aCallState,
call = aIsConference ? mGroup->GetCall(aCallIndex) : GetCall(aCallIndex); call = aIsConference ? mGroup->GetCall(aCallIndex) : GetCall(aCallIndex);
if (call) { if (call) {
// We have the call either in mCalls or in mGroup. Skip it. // We have the call either in mCalls or in mGroup. Skip it.
*aContinue = true;
return NS_OK; return NS_OK;
} }
if (MoveCall(aCallIndex, aIsConference)) { if (MoveCall(aCallIndex, aIsConference)) {
*aContinue = true;
return NS_OK; return NS_OK;
} }
@ -622,7 +616,6 @@ Telephony::EnumerateCallState(uint32_t aCallIndex, uint16_t aCallState,
mCalls.Contains(call), mCalls.Contains(call),
"Should have auto-added new call!"); "Should have auto-added new call!");
*aContinue = true;
return NS_OK; return NS_OK;
} }

View File

@ -15,6 +15,7 @@
USING_TELEPHONY_NAMESPACE USING_TELEPHONY_NAMESPACE
using namespace mozilla::dom; using namespace mozilla::dom;
using mozilla::ErrorResult;
// static // static
already_AddRefed<TelephonyCall> already_AddRefed<TelephonyCall>

View File

@ -13,6 +13,7 @@
USING_TELEPHONY_NAMESPACE USING_TELEPHONY_NAMESPACE
using namespace mozilla::dom; using namespace mozilla::dom;
using mozilla::ErrorResult;
TelephonyCallGroup::TelephonyCallGroup() TelephonyCallGroup::TelephonyCallGroup()
: mCallState(nsITelephonyProvider::CALL_STATE_UNKNOWN) : mCallState(nsITelephonyProvider::CALL_STATE_UNKNOWN)

View File

@ -0,0 +1,30 @@
/* -*- 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/telephony/TelephonyFactory.h"
#ifdef MOZ_WIDGET_GONK
#include "nsIGonkTelephonyProvider.h"
#endif
#include "nsServiceManagerUtils.h"
#include "nsXULAppAPI.h"
#include "ipc/TelephonyIPCProvider.h"
USING_TELEPHONY_NAMESPACE
/* static */ already_AddRefed<nsITelephonyProvider>
TelephonyFactory::CreateTelephonyProvider()
{
nsCOMPtr<nsITelephonyProvider> provider;
if (XRE_GetProcessType() == GeckoProcessType_Content) {
provider = new TelephonyIPCProvider();
#ifdef MOZ_WIDGET_GONK
} else {
provider = do_CreateInstance(GONK_TELEPHONY_PROVIDER_CONTRACTID);
#endif
}
return provider.forget();
}

View File

@ -0,0 +1,24 @@
/* -*- 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/. */
#ifndef mozilla_dom_telephony_TelephonyFactory_h
#define mozilla_dom_telephony_TelephonyFactory_h
#include "nsCOMPtr.h"
#include "mozilla/dom/telephony/TelephonyCommon.h"
class nsITelephonyProvider;
BEGIN_TELEPHONY_NAMESPACE
class TelephonyFactory
{
public:
static already_AddRefed<nsITelephonyProvider> CreateTelephonyProvider();
};
END_TELEPHONY_NAMESPACE
#endif // mozilla_dom_telephony_TelephonyFactory_h

View File

@ -0,0 +1,525 @@
/* -*- Mode: js; 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/. */
"use strict";
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
var RIL = {};
Cu.import("resource://gre/modules/ril_consts.js", RIL);
const GONK_TELEPHONYPROVIDER_CONTRACTID =
"@mozilla.org/telephony/gonktelephonyprovider;1";
const GONK_TELEPHONYPROVIDER_CID =
Components.ID("{67d26434-d063-4d28-9f48-5b3189788155}");
const kPrefenceChangedObserverTopic = "nsPref:changed";
const kXpcomShutdownObserverTopic = "xpcom-shutdown";
const nsIAudioManager = Ci.nsIAudioManager;
const nsITelephonyProvider = Ci.nsITelephonyProvider;
const CALL_WAKELOCK_TIMEOUT = 5000;
let DEBUG;
function debug(s) {
dump("TelephonyProvider: " + s + "\n");
}
XPCOMUtils.defineLazyGetter(this, "gAudioManager", function getAudioManager() {
try {
return Cc["@mozilla.org/telephony/audiomanager;1"]
.getService(nsIAudioManager);
} catch (ex) {
//TODO on the phone this should not fall back as silently.
// Fake nsIAudioManager implementation so that we can run the telephony
// code in a non-Gonk build.
if (DEBUG) debug("Using fake audio manager.");
return {
microphoneMuted: false,
masterVolume: 1.0,
masterMuted: false,
phoneState: nsIAudioManager.PHONE_STATE_CURRENT,
_forceForUse: {},
setForceForUse: function setForceForUse(usage, force) {
this._forceForUse[usage] = force;
},
getForceForUse: function setForceForUse(usage) {
return this._forceForUse[usage] || nsIAudioManager.FORCE_NONE;
}
};
}
});
XPCOMUtils.defineLazyServiceGetter(this, "gPowerManagerService",
"@mozilla.org/power/powermanagerservice;1",
"nsIPowerManagerService");
XPCOMUtils.defineLazyServiceGetter(this, "gSystemMessenger",
"@mozilla.org/system-message-internal;1",
"nsISystemMessagesInternal");
XPCOMUtils.defineLazyGetter(this, "gRadioInterface", function () {
let ril = Cc["@mozilla.org/ril;1"].getService(Ci["nsIRadioInterfaceLayer"]);
// TODO: Bug 854326 - B2G Multi-SIM: support multiple SIM cards for SMS/MMS
return ril.getRadioInterface(0);
});
XPCOMUtils.defineLazyGetter(this, "gPhoneNumberUtils", function () {
let ns = {};
Cu.import("resource://gre/modules/PhoneNumberUtils.jsm", ns);
return ns.PhoneNumberUtils;
});
function TelephonyProvider() {
this._listeners = [];
this._updateDebugFlag();
Services.obs.addObserver(this, kPrefenceChangedObserverTopic, false);
Services.obs.addObserver(this, kXpcomShutdownObserverTopic, false);
}
TelephonyProvider.prototype = {
classID: GONK_TELEPHONYPROVIDER_CID,
classInfo: XPCOMUtils.generateCI({classID: GONK_TELEPHONYPROVIDER_CID,
contractID: GONK_TELEPHONYPROVIDER_CONTRACTID,
classDescription: "TelephonyProvider",
interfaces: [Ci.nsITelephonyProvider,
Ci.nsIGonkTelephonyProvider],
flags: Ci.nsIClassInfo.SINGLETON}),
QueryInterface: XPCOMUtils.generateQI([Ci.nsITelephonyProvider,
Ci.nsIGonkTelephonyProvider,
Ci.nsIObserver]),
_callRingWakeLock: null,
_callRingWakeLockTimer: null,
_cancelCallRingWakeLockTimer: function _cancelCallRingWakeLockTimer() {
if (this._callRingWakeLockTimer) {
this._callRingWakeLockTimer.cancel();
}
if (this._callRingWakeLock) {
this._callRingWakeLock.unlock();
this._callRingWakeLock = null;
}
},
// An array of nsITelephonyListener instances.
_listeners: null,
_notifyAllListeners: function _notifyAllListeners(aMethodName, aArgs) {
let listeners = this._listeners.slice();
for (let listener of listeners) {
if (this._listeners.indexOf(listener) == -1) {
// Listener has been unregistered in previous run.
continue;
}
let handler = listener[aMethodName];
try {
handler.apply(listener, aArgs);
} catch (e) {
debug("listener for " + aMethodName + " threw an exception: " + e);
}
}
},
/**
* Track the active call and update the audio system as its state changes.
*/
_activeCall: null,
_updateCallAudioState: function _updateCallAudioState(aCall,
aConferenceState) {
if (aConferenceState === nsITelephonyProvider.CALL_STATE_CONNECTED) {
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_IN_CALL;
if (this.speakerEnabled) {
gAudioManager.setForceForUse(nsIAudioManager.USE_COMMUNICATION,
nsIAudioManager.FORCE_SPEAKER);
}
return;
}
if (aConferenceState === nsITelephonyProvider.CALL_STATE_UNKNOWN ||
aConferenceState === nsITelephonyProvider.CALL_STATE_HELD) {
if (!this._activeCall) {
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_NORMAL;
}
return;
}
if (!aCall) {
return;
}
if (aCall.isConference) {
if (this._activeCall && this._activeCall.callIndex == aCall.callIndex) {
this._activeCall = null;
}
return;
}
switch (aCall.state) {
case nsITelephonyProvider.CALL_STATE_DIALING: // Fall through...
case nsITelephonyProvider.CALL_STATE_ALERTING:
case nsITelephonyProvider.CALL_STATE_CONNECTED:
aCall.isActive = true;
this._activeCall = aCall;
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_IN_CALL;
if (this.speakerEnabled) {
gAudioManager.setForceForUse(nsIAudioManager.USE_COMMUNICATION,
nsIAudioManager.FORCE_SPEAKER);
}
if (DEBUG) {
debug("Active call, put audio system into PHONE_STATE_IN_CALL: " +
gAudioManager.phoneState);
}
break;
case nsITelephonyProvider.CALL_STATE_INCOMING:
aCall.isActive = false;
if (!this._activeCall) {
// We can change the phone state into RINGTONE only when there's
// no active call.
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_RINGTONE;
if (DEBUG) {
debug("Incoming call, put audio system into PHONE_STATE_RINGTONE: " +
gAudioManager.phoneState);
}
}
break;
case nsITelephonyProvider.CALL_STATE_HELD: // Fall through...
case nsITelephonyProvider.CALL_STATE_DISCONNECTED:
aCall.isActive = false;
if (this._activeCall &&
this._activeCall.callIndex == aCall.callIndex) {
// Previously active call is not active now.
this._activeCall = null;
}
if (!this._activeCall) {
// No active call. Disable the audio.
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_NORMAL;
if (DEBUG) {
debug("No active call, put audio system into PHONE_STATE_NORMAL: " +
gAudioManager.phoneState);
}
}
break;
}
},
_convertRILCallState: function _convertRILCallState(aState) {
switch (aState) {
case RIL.CALL_STATE_ACTIVE:
return nsITelephonyProvider.CALL_STATE_CONNECTED;
case RIL.CALL_STATE_HOLDING:
return nsITelephonyProvider.CALL_STATE_HELD;
case RIL.CALL_STATE_DIALING:
return nsITelephonyProvider.CALL_STATE_DIALING;
case RIL.CALL_STATE_ALERTING:
return nsITelephonyProvider.CALL_STATE_ALERTING;
case RIL.CALL_STATE_INCOMING:
case RIL.CALL_STATE_WAITING:
return nsITelephonyProvider.CALL_STATE_INCOMING;
default:
throw new Error("Unknown rilCallState: " + aState);
}
},
_convertRILSuppSvcNotification: function _convertRILSuppSvcNotification(aNotification) {
switch (aNotification) {
case RIL.GECKO_SUPP_SVC_NOTIFICATION_REMOTE_HELD:
return nsITelephonyProvider.NOTIFICATION_REMOTE_HELD;
case RIL.GECKO_SUPP_SVC_NOTIFICATION_REMOTE_RESUMED:
return nsITelephonyProvider.NOTIFICATION_REMOTE_RESUMED;
default:
throw new Error("Unknown rilSuppSvcNotification: " + aNotification);
}
},
_validateNumber: function _validateNumber(aNumber) {
// note: isPlainPhoneNumber also accepts USSD and SS numbers
if (gPhoneNumberUtils.isPlainPhoneNumber(aNumber)) {
return true;
}
let errorMsg = RIL.RIL_CALL_FAILCAUSE_TO_GECKO_CALL_ERROR[RIL.CALL_FAIL_UNOBTAINABLE_NUMBER];
let currentThread = Services.tm.currentThread;
currentThread.dispatch(this.notifyCallError.bind(this, -1, errorMsg),
Ci.nsIThread.DISPATCH_NORMAL);
if (DEBUG) {
debug("Number '" + aNumber + "' doesn't seem to be a viable number. Drop.");
}
return false;
},
_updateDebugFlag: function _updateDebugFlag() {
try {
DEBUG = RIL.DEBUG_RIL ||
Services.prefs.getBoolPref("ril.debugging.enabled");
} catch (e) {}
},
/**
* nsITelephonyProvider interface.
*/
registerListener: function(aListener) {
if (this._listeners.indexOf(aListener) >= 0) {
throw Cr.NS_ERROR_UNEXPECTED;
}
this._listeners.push(aListener);
},
unregisterListener: function(aListener) {
let index = this._listeners.indexOf(aListener);
if (index < 0) {
throw Cr.NS_ERROR_UNEXPECTED;
}
this._listeners.splice(index, 1);
},
enumerateCalls: function(aListener) {
if (DEBUG) debug("Requesting enumeration of calls for callback");
gRadioInterface.sendWorkerMessage("enumerateCalls", null,
(function(response) {
for (let call of response.calls) {
call.state = this._convertRILCallState(call.state);
call.isActive = this._activeCall ?
(call.callIndex == this._activeCall.callIndex) : false;
aListener.enumerateCallState(call.callIndex, call.state, call.number,
call.isActive, call.isOutgoing,
call.isEmergency, call.isConference);
}
aListener.enumerateCallStateComplete();
return false;
}).bind(this));
},
dial: function(aNumber, aIsEmergency) {
if (DEBUG) debug("Dialing " + (aIsEmergency ? "emergency " : "") + aNumber);
// we don't try to be too clever here, as the phone is probably in the
// locked state. Let's just check if it's a number without normalizing
if (!aIsEmergency) {
aNumber = gPhoneNumberUtils.normalize(aNumber);
}
if (this._validateNumber(aNumber)) {
gRadioInterface.sendWorkerMessage("dial", { number: aNumber,
isDialEmergency: aIsEmergency });
}
},
hangUp: function(aCallIndex) {
gRadioInterface.sendWorkerMessage("hangUp", { callIndex: aCallIndex });
},
startTone: function(aDtmfChar) {
gRadioInterface.sendWorkerMessage("startTone", { dtmfChar: aDtmfChar });
},
stopTone: function() {
gRadioInterface.sendWorkerMessage("stopTone");
},
answerCall: function(aCallIndex) {
gRadioInterface.sendWorkerMessage("answerCall", { callIndex: aCallIndex });
},
rejectCall: function(aCallIndex) {
gRadioInterface.sendWorkerMessage("rejectCall", { callIndex: aCallIndex });
},
holdCall: function(aCallIndex) {
gRadioInterface.sendWorkerMessage("holdCall", { callIndex: aCallIndex });
},
resumeCall: function(aCallIndex) {
gRadioInterface.sendWorkerMessage("resumeCall", { callIndex: aCallIndex });
},
conferenceCall: function conferenceCall() {
gRadioInterface.sendWorkerMessage("conferenceCall");
},
separateCall: function separateCall(aCallIndex) {
gRadioInterface.sendWorkerMessage("separateCall", { callIndex: aCallIndex });
},
holdConference: function holdConference() {
gRadioInterface.sendWorkerMessage("holdConference");
},
resumeConference: function resumeConference() {
gRadioInterface.sendWorkerMessage("resumeConference");
},
get microphoneMuted() {
return gAudioManager.microphoneMuted;
},
set microphoneMuted(aMuted) {
if (aMuted == this.microphoneMuted) {
return;
}
gAudioManager.microphoneMuted = aMuted;
if (!this._activeCall) {
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_NORMAL;
}
},
get speakerEnabled() {
let force = gAudioManager.getForceForUse(nsIAudioManager.USE_COMMUNICATION);
return (force == nsIAudioManager.FORCE_SPEAKER);
},
set speakerEnabled(aEnabled) {
if (aEnabled == this.speakerEnabled) {
return;
}
let force = aEnabled ? nsIAudioManager.FORCE_SPEAKER :
nsIAudioManager.FORCE_NONE;
gAudioManager.setForceForUse(nsIAudioManager.USE_COMMUNICATION, force);
if (!this._activeCall) {
gAudioManager.phoneState = nsIAudioManager.PHONE_STATE_NORMAL;
}
},
/**
* nsIGonkTelephonyProvider interface.
*/
/**
* Handle call disconnects by updating our current state and the audio system.
*/
notifyCallDisconnected: function notifyCallDisconnected(aCall) {
if (DEBUG) debug("handleCallDisconnected: " + JSON.stringify(aCall));
aCall.state = nsITelephonyProvider.CALL_STATE_DISCONNECTED;
let duration = ("started" in aCall && typeof aCall.started == "number") ?
new Date().getTime() - aCall.started : 0;
let data = {
number: aCall.number,
duration: duration,
direction: aCall.isOutgoing ? "outgoing" : "incoming"
};
gSystemMessenger.broadcastMessage("telephony-call-ended", data);
this._updateCallAudioState(aCall, null);
this._notifyAllListeners("callStateChanged", [aCall.callIndex,
aCall.state,
aCall.number,
aCall.isActive,
aCall.isOutgoing,
aCall.isEmergency,
aCall.isConference]);
},
/**
* Handle call error.
*/
notifyCallError: function notifyCallError(aCallIndex, aErrorMsg) {
this._notifyAllListeners("notifyError", [aCallIndex, aErrorMsg]);
},
/**
* Handle an incoming call.
*
* Not much is known about this call at this point, but it's enough
* to start bringing up the Phone app already.
*/
notifyCallRing: function notifyCallRing() {
if (!this._callRingWakeLock) {
this._callRingWakeLock = gPowerManagerService.newWakeLock("cpu");
}
if (!this._callRingWakeLockTimer) {
this._callRingWakeLockTimer =
Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
}
this._callRingWakeLockTimer
.initWithCallback(this._cancelCallRingWakeLockTimer.bind(this),
CALL_WAKELOCK_TIMEOUT, Ci.nsITimer.TYPE_ONE_SHOT);
gSystemMessenger.broadcastMessage("telephony-new-call", {});
},
/**
* Handle call state changes by updating our current state and the audio
* system.
*/
notifyCallStateChanged: function notifyCallStateChanged(aCall) {
if (DEBUG) debug("handleCallStateChange: " + JSON.stringify(aCall));
aCall.state = this._convertRILCallState(aCall.state);
if (aCall.state == nsITelephonyProvider.CALL_STATE_DIALING) {
gSystemMessenger.broadcastMessage("telephony-new-call", {});
}
this._updateCallAudioState(aCall, null);
this._notifyAllListeners("callStateChanged", [aCall.callIndex,
aCall.state,
aCall.number,
aCall.isActive,
aCall.isOutgoing,
aCall.isEmergency,
aCall.isConference]);
},
notifyCdmaCallWaiting: function notifyCdmaCallWaiting(aNumber) {
this._notifyAllListeners("notifyCdmaCallWaiting", [aNumber]);
},
notifySupplementaryService: function notifySupplementaryService(aCallIndex,
aNotification) {
let notification = this._convertRILSuppSvcNotification(aNotification);
this._notifyAllListeners("supplementaryServiceNotification",
[aCallIndex, notification]);
},
notifyConferenceCallStateChanged: function notifyConferenceCallStateChanged(aState) {
if (DEBUG) debug("handleConferenceCallStateChanged: " + aState);
aState = aState != null ? convertRILCallState(aState) :
nsITelephonyProvider.CALL_STATE_UNKNOWN;
this._updateCallAudioState(null, aState);
this._notifyAllListeners("conferenceCallStateChanged", [aState]);
},
/**
* nsIObserver interface.
*/
observe: function observe(aSubject, aTopic, aData) {
switch (aTopic) {
case kPrefenceChangedObserverTopic:
if (aData === "ril.debugging.enabled") {
this._updateDebugFlag();
}
break;
case kXpcomShutdownObserverTopic:
// Cancel the timer for the call-ring wake lock.
this._cancelCallRingWakeLockTimer();
Services.obs.removeObserver(this, kPrefenceChangedObserverTopic);
Services.obs.removeObserver(this, kXpcomShutdownObserverTopic);
break;
}
}
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([TelephonyProvider]);

View File

@ -0,0 +1,2 @@
component {67d26434-d063-4d28-9f48-5b3189788155} TelephonyProvider.js
contract @mozilla.org/telephony/gonktelephonyprovider;1 {67d26434-d063-4d28-9f48-5b3189788155}

View File

@ -0,0 +1,83 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et ft=cpp : */
/* 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 protocol PContent;
include protocol PTelephonyRequest;
include TelephonyTypes;
namespace mozilla {
namespace dom {
namespace telephony {
sync protocol PTelephony {
manager PContent;
manages PTelephonyRequest;
child:
NotifyCallError(int32_t aCallIndex, nsString aError);
NotifyCallStateChanged(IPCCallStateData aData);
NotifyCdmaCallWaiting(nsString aNumber);
NotifyConferenceCallStateChanged(uint16_t aCallState);
NotifySupplementaryService(int32_t aCallIndex, uint16_t aNotification);
parent:
/**
* Sent when the child no longer needs to use PTelephony.
*/
__delete__();
/**
* Sent when the child makes an asynchronous request to the parent. It's
* currently only for request call enumeration.
*/
PTelephonyRequest();
RegisterListener();
UnregisterListener();
DialCall(nsString aNumber, bool aIsEmergency);
HangUpCall(uint32_t aCallIndex);
AnswerCall(uint32_t aCallIndex);
RejectCall(uint32_t aCallIndex);
HoldCall(uint32_t aCallIndex);
ResumeCall(uint32_t aCallIndex);
ConferenceCall();
SeparateCall(uint32_t aCallIndex);
HoldConference();
ResumeConference();
StartTone(nsString aTone);
StopTone();
sync GetMicrophoneMuted()
returns (bool aMuted);
SetMicrophoneMuted(bool aMuted);
sync GetSpeakerEnabled()
returns (bool aEnabled);
SetSpeakerEnabled(bool aEnabled);
};
} /* namespace telephony */
} /* namespace dom */
} /* namespace mozilla */

View File

@ -0,0 +1,30 @@
/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* 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 protocol PTelephony;
include TelephonyTypes;
namespace mozilla {
namespace dom {
namespace telephony {
protocol PTelephonyRequest
{
manager PTelephony;
child:
NotifyEnumerateCallState(IPCCallStateData aData);
/**
* Sent when the asynchronous request has completed. It's currently only for
* request call enumeration.
*/
__delete__();
};
} /* namespace telephony */
} /* namespace dom */
} /* namespace mozilla */

View File

@ -0,0 +1,130 @@
/* -*- 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/telephony/TelephonyChild.h"
USING_TELEPHONY_NAMESPACE
/*******************************************************************************
* TelephonyChild
******************************************************************************/
TelephonyChild::TelephonyChild(nsITelephonyListener* aListener)
: mListener(aListener)
{
MOZ_ASSERT(aListener);
}
void
TelephonyChild::ActorDestroy(ActorDestroyReason aWhy)
{
mListener = nullptr;
}
PTelephonyRequestChild*
TelephonyChild::AllocPTelephonyRequestChild()
{
MOZ_CRASH("Caller is supposed to manually construct a request!");
}
bool
TelephonyChild::DeallocPTelephonyRequestChild(PTelephonyRequestChild* aActor)
{
delete aActor;
return true;
}
bool
TelephonyChild::RecvNotifyCallError(const int32_t& aCallIndex,
const nsString& aError)
{
MOZ_ASSERT(mListener);
mListener->NotifyError(aCallIndex, aError);
return true;
}
bool
TelephonyChild::RecvNotifyCallStateChanged(const IPCCallStateData& aData)
{
MOZ_ASSERT(mListener);
mListener->CallStateChanged(aData.callIndex(),
aData.callState(),
aData.number(),
aData.isActive(),
aData.isOutGoing(),
aData.isEmergency(),
aData.isConference());
return true;
}
bool
TelephonyChild::RecvNotifyCdmaCallWaiting(const nsString& aNumber)
{
MOZ_ASSERT(mListener);
mListener->NotifyCdmaCallWaiting(aNumber);
return true;
}
bool
TelephonyChild::RecvNotifyConferenceCallStateChanged(const uint16_t& aCallState)
{
MOZ_ASSERT(mListener);
mListener->ConferenceCallStateChanged(aCallState);
return true;
}
bool
TelephonyChild::RecvNotifySupplementaryService(const int32_t& aCallIndex,
const uint16_t& aNotification)
{
MOZ_ASSERT(mListener);
mListener->SupplementaryServiceNotification(aCallIndex, aNotification);
return true;
}
/*******************************************************************************
* TelephonyRequestChild
******************************************************************************/
TelephonyRequestChild::TelephonyRequestChild(nsITelephonyListener* aListener)
: mListener(aListener)
{
MOZ_ASSERT(aListener);
}
void
TelephonyRequestChild::ActorDestroy(ActorDestroyReason aWhy)
{
mListener = nullptr;
}
bool
TelephonyRequestChild::Recv__delete__()
{
MOZ_ASSERT(mListener);
mListener->EnumerateCallStateComplete();
return true;
}
bool
TelephonyRequestChild::RecvNotifyEnumerateCallState(const IPCCallStateData& aData)
{
MOZ_ASSERT(mListener);
mListener->EnumerateCallState(aData.callIndex(),
aData.callState(),
aData.number(),
aData.isActive(),
aData.isOutGoing(),
aData.isEmergency(),
aData.isConference());
return true;
}

View File

@ -0,0 +1,77 @@
/* -*- 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/. */
#ifndef mozilla_dom_telephony_TelephonyChild_h
#define mozilla_dom_telephony_TelephonyChild_h
#include "mozilla/dom/telephony/TelephonyCommon.h"
#include "mozilla/dom/telephony/PTelephonyChild.h"
#include "mozilla/dom/telephony/PTelephonyRequestChild.h"
#include "nsITelephonyProvider.h"
BEGIN_TELEPHONY_NAMESPACE
class TelephonyChild : public PTelephonyChild
{
public:
TelephonyChild(nsITelephonyListener* aListener);
protected:
virtual ~TelephonyChild() {}
virtual void
ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
virtual PTelephonyRequestChild*
AllocPTelephonyRequestChild() MOZ_OVERRIDE;
virtual bool
DeallocPTelephonyRequestChild(PTelephonyRequestChild* aActor) MOZ_OVERRIDE;
virtual bool
RecvNotifyCallError(const int32_t& aCallIndex,
const nsString& aError) MOZ_OVERRIDE;
virtual bool
RecvNotifyCallStateChanged(const IPCCallStateData& aData) MOZ_OVERRIDE;
virtual bool
RecvNotifyCdmaCallWaiting(const nsString& aNumber) MOZ_OVERRIDE;
virtual bool
RecvNotifyConferenceCallStateChanged(const uint16_t& aCallState) MOZ_OVERRIDE;
virtual bool
RecvNotifySupplementaryService(const int32_t& aCallIndex,
const uint16_t& aNotification) MOZ_OVERRIDE;
private:
nsCOMPtr<nsITelephonyListener> mListener;
};
class TelephonyRequestChild : public PTelephonyRequestChild
{
public:
TelephonyRequestChild(nsITelephonyListener* aListener);
protected:
virtual ~TelephonyRequestChild() {}
virtual void
ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
virtual bool
Recv__delete__() MOZ_OVERRIDE;
virtual bool
RecvNotifyEnumerateCallState(const IPCCallStateData& aData) MOZ_OVERRIDE;
private:
nsCOMPtr<nsITelephonyListener> mListener;
};
END_TELEPHONY_NAMESPACE
#endif // mozilla_dom_telephony_TelephonyChild_h

View File

@ -0,0 +1,258 @@
/* -*- 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/ContentChild.h"
#include "mozilla/dom/telephony/TelephonyChild.h"
#include "ipc/TelephonyIPCProvider.h"
USING_TELEPHONY_NAMESPACE
using namespace mozilla::dom;
NS_IMPL_ISUPPORTS2(TelephonyIPCProvider,
nsITelephonyProvider,
nsITelephonyListener)
TelephonyIPCProvider::TelephonyIPCProvider()
{
// Deallocated in ContentChild::DeallocPTelephonyChild().
mPTelephonyChild = new TelephonyChild(this);
ContentChild::GetSingleton()->SendPTelephonyConstructor(mPTelephonyChild);
}
TelephonyIPCProvider::~TelephonyIPCProvider()
{
mPTelephonyChild->Send__delete__(mPTelephonyChild);
mPTelephonyChild = nullptr;
}
/*
* Implementation of nsITelephonyProvider.
*/
NS_IMETHODIMP
TelephonyIPCProvider::RegisterListener(nsITelephonyListener *aListener)
{
MOZ_ASSERT(!mListeners.Contains(aListener));
// nsTArray doesn't fail.
mListeners.AppendElement(aListener);
if (mListeners.Length() == 1) {
mPTelephonyChild->SendRegisterListener();
}
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::UnregisterListener(nsITelephonyListener *aListener)
{
MOZ_ASSERT(mListeners.Contains(aListener));
// We always have the element here, so it can't fail.
mListeners.RemoveElement(aListener);
if (!mListeners.Length()) {
mPTelephonyChild->SendUnregisterListener();
}
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::EnumerateCalls(nsITelephonyListener *aListener)
{
// Life time of newly allocated TelephonyRequestChild instance is managed by
// IPDL itself.
TelephonyRequestChild* actor = new TelephonyRequestChild(aListener);
mPTelephonyChild->SendPTelephonyRequestConstructor(actor);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::Dial(const nsAString& aNumber,
bool aIsEmergency)
{
mPTelephonyChild->SendDialCall(nsString(aNumber), aIsEmergency);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::HangUp(uint32_t aCallIndex)
{
mPTelephonyChild->SendHangUpCall(aCallIndex);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::AnswerCall(uint32_t aCallIndex)
{
mPTelephonyChild->SendAnswerCall(aCallIndex);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::RejectCall(uint32_t aCallIndex)
{
mPTelephonyChild->SendRejectCall(aCallIndex);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::HoldCall(uint32_t aCallIndex)
{
mPTelephonyChild->SendHoldCall(aCallIndex);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::ResumeCall(uint32_t aCallIndex)
{
mPTelephonyChild->SendResumeCall(aCallIndex);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::ConferenceCall()
{
mPTelephonyChild->SendConferenceCall();
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::SeparateCall(uint32_t aCallIndex)
{
mPTelephonyChild->SendSeparateCall(aCallIndex);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::HoldConference()
{
mPTelephonyChild->SendHoldConference();
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::ResumeConference()
{
mPTelephonyChild->SendResumeConference();
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::StartTone(const nsAString& aDtmfChar)
{
mPTelephonyChild->SendStartTone(nsString(aDtmfChar));
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::StopTone()
{
mPTelephonyChild->SendStopTone();
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::GetMicrophoneMuted(bool* aMuted)
{
mPTelephonyChild->SendGetMicrophoneMuted(aMuted);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::SetMicrophoneMuted(bool aMuted)
{
mPTelephonyChild->SendSetMicrophoneMuted(aMuted);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::GetSpeakerEnabled(bool* aEnabled)
{
mPTelephonyChild->SendGetSpeakerEnabled(aEnabled);
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::SetSpeakerEnabled(bool aEnabled)
{
mPTelephonyChild->SendSetSpeakerEnabled(aEnabled);
return NS_OK;
}
// nsITelephonyListener
NS_IMETHODIMP
TelephonyIPCProvider::CallStateChanged(uint32_t aCallIndex,
uint16_t aCallState,
const nsAString& aNumber,
bool aIsActive,
bool aIsOutgoing,
bool aIsEmergency,
bool aIsConference)
{
for (uint32_t i = 0; i < mListeners.Length(); i++) {
mListeners[i]->CallStateChanged(aCallIndex, aCallState, aNumber,
aIsActive, aIsOutgoing, aIsEmergency,
aIsConference);
}
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::ConferenceCallStateChanged(uint16_t aCallState)
{
for (uint32_t i = 0; i < mListeners.Length(); i++) {
mListeners[i]->ConferenceCallStateChanged(aCallState);
}
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::EnumerateCallStateComplete()
{
MOZ_CRASH("Not a EnumerateCalls request!");
}
NS_IMETHODIMP
TelephonyIPCProvider::EnumerateCallState(uint32_t aCallIndex,
uint16_t aCallState,
const nsAString& aNumber,
bool aIsActive,
bool aIsOutgoing,
bool aIsEmergency,
bool aIsConference)
{
MOZ_CRASH("Not a EnumerateCalls request!");
}
NS_IMETHODIMP
TelephonyIPCProvider::NotifyCdmaCallWaiting(const nsAString& aNumber)
{
for (uint32_t i = 0; i < mListeners.Length(); i++) {
mListeners[i]->NotifyCdmaCallWaiting(aNumber);
}
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::NotifyError(int32_t aCallIndex,
const nsAString& aError)
{
for (uint32_t i = 0; i < mListeners.Length(); i++) {
mListeners[i]->NotifyError(aCallIndex, aError);
}
return NS_OK;
}
NS_IMETHODIMP
TelephonyIPCProvider::SupplementaryServiceNotification(int32_t aCallIndex,
uint16_t aNotification)
{
for (uint32_t i = 0; i < mListeners.Length(); i++) {
mListeners[i]->SupplementaryServiceNotification(aCallIndex, aNotification);
}
return NS_OK;
}

View File

@ -0,0 +1,37 @@
/* -*- 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/. */
#ifndef mozilla_dom_telephony_TelephonyIPCProvider_h
#define mozilla_dom_telephony_TelephonyIPCProvider_h
#include "mozilla/dom/telephony/TelephonyCommon.h"
#include "mozilla/Attributes.h"
#include "nsITelephonyProvider.h"
BEGIN_TELEPHONY_NAMESPACE
class PTelephonyChild;
class TelephonyIPCProvider MOZ_FINAL : public nsITelephonyProvider
, public nsITelephonyListener
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSITELEPHONYPROVIDER
NS_DECL_NSITELEPHONYLISTENER
TelephonyIPCProvider();
protected:
virtual ~TelephonyIPCProvider();
private:
nsTArray<nsCOMPtr<nsITelephonyListener> > mListeners;
PTelephonyChild* mPTelephonyChild;
};
END_TELEPHONY_NAMESPACE
#endif // mozilla_dom_telephony_TelephonyIPCProvider_h

View File

@ -0,0 +1,448 @@
/* -*- 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/telephony/TelephonyParent.h"
USING_TELEPHONY_NAMESPACE
/*******************************************************************************
* TelephonyParent
******************************************************************************/
NS_IMPL_ISUPPORTS1(TelephonyParent, nsITelephonyListener)
TelephonyParent::TelephonyParent()
: mActorDestroyed(false)
, mRegistered(false)
{
}
void
TelephonyParent::ActorDestroy(ActorDestroyReason why)
{
// The child process could die before this asynchronous notification, in which
// case ActorDestroy() was called and mActorDestroyed is set to true. Return
// an error here to avoid sending a message to the dead process.
mActorDestroyed = true;
// Try to unregister listener if we're still registered.
RecvUnregisterListener();
}
bool
TelephonyParent::RecvPTelephonyRequestConstructor(PTelephonyRequestParent* aActor)
{
TelephonyRequestParent* actor = static_cast<TelephonyRequestParent*>(aActor);
return actor->DoRequest();
}
PTelephonyRequestParent*
TelephonyParent::AllocPTelephonyRequestParent()
{
TelephonyRequestParent* actor = new TelephonyRequestParent();
// Add an extra ref for IPDL. Will be released in
// TelephonyParent::DeallocPTelephonyRequestParent().
NS_ADDREF(actor);
return actor;
}
bool
TelephonyParent::DeallocPTelephonyRequestParent(PTelephonyRequestParent* aActor)
{
// TelephonyRequestParent is refcounted, must not be freed manually.
static_cast<TelephonyRequestParent*>(aActor)->Release();
return true;
}
bool
TelephonyParent::Recv__delete__()
{
return true; // Unregister listener in TelephonyParent::ActorDestroy().
}
bool
TelephonyParent::RecvRegisterListener()
{
NS_ENSURE_TRUE(!mRegistered, true);
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
mRegistered = NS_SUCCEEDED(provider->RegisterListener(this));
return true;
}
bool
TelephonyParent::RecvUnregisterListener()
{
NS_ENSURE_TRUE(mRegistered, true);
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
mRegistered = !NS_SUCCEEDED(provider->UnregisterListener(this));
return true;
}
bool
TelephonyParent::RecvDialCall(const nsString& aNumber,
const bool& aIsEmergency)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->Dial(aNumber, aIsEmergency);
return true;
}
bool
TelephonyParent::RecvHangUpCall(const uint32_t& aCallIndex)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->HangUp(aCallIndex);
return true;
}
bool
TelephonyParent::RecvAnswerCall(const uint32_t& aCallIndex)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->AnswerCall(aCallIndex);
return true;
}
bool
TelephonyParent::RecvRejectCall(const uint32_t& aCallIndex)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->RejectCall(aCallIndex);
return true;
}
bool
TelephonyParent::RecvHoldCall(const uint32_t& aCallIndex)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->HoldCall(aCallIndex);
return true;
}
bool
TelephonyParent::RecvResumeCall(const uint32_t& aCallIndex)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->ResumeCall(aCallIndex);
return true;
}
bool
TelephonyParent::RecvConferenceCall()
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->ConferenceCall();
return true;
}
bool
TelephonyParent::RecvSeparateCall(const uint32_t& aCallState)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->SeparateCall(aCallState);
return true;
}
bool
TelephonyParent::RecvHoldConference()
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->HoldConference();
return true;
}
bool
TelephonyParent::RecvResumeConference()
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->ResumeConference();
return true;
}
bool
TelephonyParent::RecvStartTone(const nsString& aTone)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->StartTone(aTone);
return true;
}
bool
TelephonyParent::RecvStopTone()
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->StopTone();
return true;
}
bool
TelephonyParent::RecvGetMicrophoneMuted(bool* aMuted)
{
*aMuted = false;
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->GetMicrophoneMuted(aMuted);
return true;
}
bool
TelephonyParent::RecvSetMicrophoneMuted(const bool& aMuted)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->SetMicrophoneMuted(aMuted);
return true;
}
bool
TelephonyParent::RecvGetSpeakerEnabled(bool* aEnabled)
{
*aEnabled = false;
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->GetSpeakerEnabled(aEnabled);
return true;
}
bool
TelephonyParent::RecvSetSpeakerEnabled(const bool& aEnabled)
{
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
NS_ENSURE_TRUE(provider, true);
provider->SetSpeakerEnabled(aEnabled);
return true;
}
// nsITelephonyListener
NS_IMETHODIMP
TelephonyParent::CallStateChanged(uint32_t aCallIndex,
uint16_t aCallState,
const nsAString& aNumber,
bool aIsActive,
bool aIsOutgoing,
bool aIsEmergency,
bool aIsConference)
{
NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
IPCCallStateData data(aCallIndex, aCallState, nsString(aNumber), aIsActive,
aIsOutgoing, aIsEmergency, aIsConference);
return SendNotifyCallStateChanged(data) ? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
TelephonyParent::ConferenceCallStateChanged(uint16_t aCallState)
{
NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
return SendNotifyConferenceCallStateChanged(aCallState) ? NS_OK
: NS_ERROR_FAILURE;
}
NS_IMETHODIMP
TelephonyParent::EnumerateCallStateComplete()
{
MOZ_CRASH("Not a EnumerateCalls request!");
}
NS_IMETHODIMP
TelephonyParent::EnumerateCallState(uint32_t aCallIndex,
uint16_t aCallState,
const nsAString& aNumber,
bool aIsActive,
bool aIsOutgoing,
bool aIsEmergency,
bool aIsConference)
{
MOZ_CRASH("Not a EnumerateCalls request!");
}
NS_IMETHODIMP
TelephonyParent::NotifyCdmaCallWaiting(const nsAString& aNumber)
{
NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
return SendNotifyCdmaCallWaiting(nsString(aNumber)) ? NS_OK
: NS_ERROR_FAILURE;
}
NS_IMETHODIMP
TelephonyParent::NotifyError(int32_t aCallIndex,
const nsAString& aError)
{
NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
return SendNotifyCallError(aCallIndex, nsString(aError)) ? NS_OK
: NS_ERROR_FAILURE;
}
NS_IMETHODIMP
TelephonyParent::SupplementaryServiceNotification(int32_t aCallIndex,
uint16_t aNotification)
{
NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
return SendNotifySupplementaryService(aCallIndex, aNotification)
? NS_OK : NS_ERROR_FAILURE;
}
/*******************************************************************************
* TelephonyRequestParent
******************************************************************************/
NS_IMPL_ISUPPORTS1(TelephonyRequestParent, nsITelephonyListener)
TelephonyRequestParent::TelephonyRequestParent()
: mActorDestroyed(false)
{
}
void
TelephonyRequestParent::ActorDestroy(ActorDestroyReason why)
{
// The child process could die before this asynchronous notification, in which
// case ActorDestroy() was called and mActorDestroyed is set to true. Return
// an error here to avoid sending a message to the dead process.
mActorDestroyed = true;
}
bool
TelephonyRequestParent::DoRequest()
{
nsresult rv = NS_ERROR_FAILURE;
nsCOMPtr<nsITelephonyProvider> provider =
do_GetService(TELEPHONY_PROVIDER_CONTRACTID);
if (provider) {
rv = provider->EnumerateCalls(this);
}
if (NS_FAILED(rv)) {
return NS_SUCCEEDED(EnumerateCallStateComplete());
}
return true;
}
// nsITelephonyListener
NS_IMETHODIMP
TelephonyRequestParent::CallStateChanged(uint32_t aCallIndex,
uint16_t aCallState,
const nsAString& aNumber,
bool aIsActive,
bool aIsOutgoing,
bool aIsEmergency,
bool aIsConference)
{
MOZ_CRASH("Not a TelephonyParent!");
}
NS_IMETHODIMP
TelephonyRequestParent::ConferenceCallStateChanged(uint16_t aCallState)
{
MOZ_CRASH("Not a TelephonyParent!");
}
NS_IMETHODIMP
TelephonyRequestParent::EnumerateCallStateComplete()
{
NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
return Send__delete__(this) ? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
TelephonyRequestParent::EnumerateCallState(uint32_t aCallIndex,
uint16_t aCallState,
const nsAString& aNumber,
bool aIsActive,
bool aIsOutgoing,
bool aIsEmergency,
bool aIsConference)
{
NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
IPCCallStateData data(aCallIndex, aCallState, nsString(aNumber), aIsActive,
aIsOutgoing, aIsEmergency, aIsConference);
return SendNotifyEnumerateCallState(data) ? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
TelephonyRequestParent::NotifyCdmaCallWaiting(const nsAString& aNumber)
{
MOZ_CRASH("Not a TelephonyParent!");
}
NS_IMETHODIMP
TelephonyRequestParent::NotifyError(int32_t aCallIndex,
const nsAString& aError)
{
MOZ_CRASH("Not a TelephonyParent!");
}
NS_IMETHODIMP
TelephonyRequestParent::SupplementaryServiceNotification(int32_t aCallIndex,
uint16_t aNotification)
{
MOZ_CRASH("Not a TelephonyParent!");
}

View File

@ -0,0 +1,128 @@
/* -*- 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/. */
#ifndef mozilla_dom_telephony_TelephonyParent_h
#define mozilla_dom_telephony_TelephonyParent_h
#include "mozilla/dom/telephony/TelephonyCommon.h"
#include "mozilla/dom/telephony/PTelephonyParent.h"
#include "mozilla/dom/telephony/PTelephonyRequestParent.h"
#include "nsITelephonyProvider.h"
BEGIN_TELEPHONY_NAMESPACE
class TelephonyParent : public PTelephonyParent
, public nsITelephonyListener
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSITELEPHONYLISTENER
TelephonyParent();
protected:
virtual ~TelephonyParent() {}
virtual void
ActorDestroy(ActorDestroyReason why);
virtual bool
RecvPTelephonyRequestConstructor(PTelephonyRequestParent* aActor) MOZ_OVERRIDE;
virtual PTelephonyRequestParent*
AllocPTelephonyRequestParent() MOZ_OVERRIDE;
virtual bool
DeallocPTelephonyRequestParent(PTelephonyRequestParent* aActor) MOZ_OVERRIDE;
virtual bool
Recv__delete__() MOZ_OVERRIDE;
virtual bool
RecvRegisterListener() MOZ_OVERRIDE;
virtual bool
RecvUnregisterListener() MOZ_OVERRIDE;
virtual bool
RecvDialCall(const nsString& aNumber,
const bool& aIsEmergency) MOZ_OVERRIDE;
virtual bool
RecvHangUpCall(const uint32_t& aCallIndex) MOZ_OVERRIDE;
virtual bool
RecvAnswerCall(const uint32_t& aCallIndex) MOZ_OVERRIDE;
virtual bool
RecvRejectCall(const uint32_t& aCallIndex) MOZ_OVERRIDE;
virtual bool
RecvHoldCall(const uint32_t& aCallIndex) MOZ_OVERRIDE;
virtual bool
RecvResumeCall(const uint32_t& aCallIndex) MOZ_OVERRIDE;
virtual bool
RecvConferenceCall() MOZ_OVERRIDE;
virtual bool
RecvSeparateCall(const uint32_t& callIndex) MOZ_OVERRIDE;
virtual bool
RecvHoldConference() MOZ_OVERRIDE;
virtual bool
RecvResumeConference() MOZ_OVERRIDE;
virtual bool
RecvStartTone(const nsString& aTone) MOZ_OVERRIDE;
virtual bool
RecvStopTone() MOZ_OVERRIDE;
virtual bool
RecvGetMicrophoneMuted(bool* aMuted) MOZ_OVERRIDE;
virtual bool
RecvSetMicrophoneMuted(const bool& aMuted) MOZ_OVERRIDE;
virtual bool
RecvGetSpeakerEnabled(bool* aEnabled) MOZ_OVERRIDE;
virtual bool
RecvSetSpeakerEnabled(const bool& aEnabled) MOZ_OVERRIDE;
private:
bool mActorDestroyed;
bool mRegistered;
};
class TelephonyRequestParent : public PTelephonyRequestParent
, public nsITelephonyListener
{
friend class TelephonyParent;
public:
NS_DECL_ISUPPORTS
NS_DECL_NSITELEPHONYLISTENER
protected:
TelephonyRequestParent();
virtual ~TelephonyRequestParent() {}
virtual void
ActorDestroy(ActorDestroyReason why);
private:
bool mActorDestroyed;
bool
DoRequest();
};
END_TELEPHONY_NAMESPACE
#endif /* mozilla_dom_telephony_TelephonyParent_h */

View File

@ -0,0 +1,24 @@
/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* 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/. */
namespace mozilla {
namespace dom {
namespace telephony {
struct IPCCallStateData
{
uint32_t callIndex;
uint16_t callState;
nsString number;
bool isActive;
bool isOutGoing;
bool isEmergency;
bool isConference;
};
} /* namespace telephony */
} /* namespace dom */
} /* namespace mozilla */

View File

@ -12,17 +12,47 @@ XPIDL_MODULE = 'dom_telephony'
MODULE = 'dom' MODULE = 'dom'
EXPORTS.mozilla.dom.telephony += [
'CallEvent.h',
'CallsList.h',
'Telephony.h',
'TelephonyCall.h',
'TelephonyCallGroup.h',
'TelephonyCommon.h',
'TelephonyFactory.h',
'ipc/TelephonyChild.h',
'ipc/TelephonyParent.h',
]
CPP_SOURCES += [ CPP_SOURCES += [
'CallEvent.cpp', 'CallEvent.cpp',
'CallsList.cpp', 'CallsList.cpp',
'Telephony.cpp', 'Telephony.cpp',
'TelephonyCall.cpp', 'TelephonyCall.cpp',
'TelephonyCallGroup.cpp', 'TelephonyCallGroup.cpp',
'TelephonyFactory.cpp',
'ipc/TelephonyChild.cpp',
'ipc/TelephonyIPCProvider.cpp',
'ipc/TelephonyParent.cpp',
] ]
IPDL_SOURCES += [
'ipc/PTelephony.ipdl',
'ipc/PTelephonyRequest.ipdl',
'ipc/TelephonyTypes.ipdlh'
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
XPIDL_SOURCES += [
'nsIGonkTelephonyProvider.idl',
]
EXTRA_COMPONENTS += [
'gonk/TelephonyProvider.js',
'gonk/TelephonyProvider.manifest',
]
FAIL_ON_WARNINGS = True FAIL_ON_WARNINGS = True
LIBXUL_LIBRARY = True LIBXUL_LIBRARY = True
LIBRARY_NAME = 'domtelephony_s' LIBRARY_NAME = 'domtelephony_s'

View File

@ -0,0 +1,31 @@
/* -*- Mode: idl; 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 "nsITelephonyProvider.idl"
%{C++
#define GONK_TELEPHONY_PROVIDER_CONTRACTID \
"@mozilla.org/telephony/gonktelephonyprovider;1"
%}
[scriptable, uuid(0d106c7e-ba47-48ee-ba48-c92002d401b6)]
interface nsIGonkTelephonyProvider : nsITelephonyProvider
{
void notifyCallDisconnected(in jsval call);
void notifyCallError(in long callIndex,
in AString error);
void notifyCallRing();
void notifyCallStateChanged(in jsval call);
void notifyCdmaCallWaiting(in AString number);
void notifySupplementaryService(in long callIndex,
in AString notification);
void notifyConferenceCallStateChanged(in unsigned short state);
};

View File

@ -4,7 +4,7 @@
#include "nsISupports.idl" #include "nsISupports.idl"
[scriptable, uuid(a5818719-e1b6-4fdc-8551-006055fa9996)] [scriptable, uuid(3aa42e77-7c2b-43a1-b105-7be094b0817a)]
interface nsITelephonyListener : nsISupports interface nsITelephonyListener : nsISupports
{ {
/** /**
@ -67,15 +67,14 @@ interface nsITelephonyListener : nsISupports
* Indicates whether this call is outgoing or incoming. * Indicates whether this call is outgoing or incoming.
* @param isConference * @param isConference
* Indicates whether this call is a conference call. * Indicates whether this call is a conference call.
* @return true to continue enumeration or false to cancel.
*/ */
boolean enumerateCallState(in unsigned long callIndex, void enumerateCallState(in unsigned long callIndex,
in unsigned short callState, in unsigned short callState,
in AString number, in AString number,
in boolean isActive, in boolean isActive,
in boolean isOutgoing, in boolean isOutgoing,
in boolean isEmergency, in boolean isEmergency,
in boolean isConference); in boolean isConference);
/** /**
* Notify when RIL receives supplementary service notification. * Notify when RIL receives supplementary service notification.
@ -108,11 +107,18 @@ interface nsITelephonyListener : nsISupports
void notifyCdmaCallWaiting(in AString number); void notifyCdmaCallWaiting(in AString number);
}; };
%{C++
#define TELEPHONY_PROVIDER_CID \
{ 0x9cf8aa52, 0x7c1c, 0x4cde, { 0x97, 0x4e, 0xed, 0x2a, 0xa0, 0xe7, 0x35, 0xfa } }
#define TELEPHONY_PROVIDER_CONTRACTID \
"@mozilla.org/telephony/telephonyprovider;1"
%}
/** /**
* XPCOM component (in the content process) that provides the telephony * XPCOM component (in the content process) that provides the telephony
* information. * information.
*/ */
[scriptable, uuid(45a2f856-4e07-499a-94c6-624f90c3345b)] [scriptable, uuid(effca006-1ca8-47f7-9bab-1323f90a14ec)]
interface nsITelephonyProvider : nsISupports interface nsITelephonyProvider : nsISupports
{ {
const unsigned short CALL_STATE_UNKNOWN = 0; const unsigned short CALL_STATE_UNKNOWN = 0;
@ -135,8 +141,8 @@ interface nsITelephonyProvider : nsISupports
* RadioInterfaceLayer in the chrome process. Only a content process that has * RadioInterfaceLayer in the chrome process. Only a content process that has
* the 'telephony' permission is allowed to register. * the 'telephony' permission is allowed to register.
*/ */
void registerTelephonyMsg(in nsITelephonyListener listener); void registerListener(in nsITelephonyListener listener);
void unregisterTelephonyMsg(in nsITelephonyListener listener); void unregisterListener(in nsITelephonyListener listener);
/** /**
* Will continue calling listener.enumerateCallState until the listener * Will continue calling listener.enumerateCallState until the listener
@ -147,8 +153,8 @@ interface nsITelephonyProvider : nsISupports
/** /**
* Functionality for making and managing phone calls. * Functionality for making and managing phone calls.
*/ */
void dial(in DOMString number); void dial(in DOMString number,
void dialEmergency(in DOMString number); in boolean isEmergency);
void hangUp(in unsigned long callIndex); void hangUp(in unsigned long callIndex);
void startTone(in DOMString dtmfChar); void startTone(in DOMString dtmfChar);

View File

@ -102,7 +102,7 @@ var interfaceNamesInGlobalScope =
{name: "BluetoothStatusChangedEvent", b2g: true}, {name: "BluetoothStatusChangedEvent", b2g: true},
{name: "BoxObject", xbl: true}, {name: "BoxObject", xbl: true},
{name: "BrowserFeedWriter", desktop: true}, {name: "BrowserFeedWriter", desktop: true},
{name: "CallEvent", b2g: true}, "CallEvent",
"CameraCapabilities", "CameraCapabilities",
"CameraControl", "CameraControl",
"CameraManager", "CameraManager",
@ -531,9 +531,9 @@ var interfaceNamesInGlobalScope =
"SVGViewElement", "SVGViewElement",
"SVGZoomAndPan", "SVGZoomAndPan",
"SVGZoomEvent", "SVGZoomEvent",
{name: "Telephony", b2g: true}, "Telephony",
{name: "TelephonyCall", b2g: true}, "TelephonyCall",
{name: "TelephonyCallGroup", b2g: true}, "TelephonyCallGroup",
"Text", "Text",
"TextDecoder", "TextDecoder",
"TextEncoder", "TextEncoder",

View File

@ -34,6 +34,8 @@ webidl_files = \
BiquadFilterNode.webidl \ BiquadFilterNode.webidl \
Blob.webidl \ Blob.webidl \
BrowserElementDictionaries.webidl \ BrowserElementDictionaries.webidl \
CallEvent.webidl \
CallsList.webidl \
CameraControl.webidl \ CameraControl.webidl \
CameraManager.webidl \ CameraManager.webidl \
CanvasRenderingContext2D.webidl \ CanvasRenderingContext2D.webidl \
@ -359,6 +361,9 @@ webidl_files = \
SVGViewElement.webidl \ SVGViewElement.webidl \
SVGZoomAndPan.webidl \ SVGZoomAndPan.webidl \
SVGZoomEvent.webidl \ SVGZoomEvent.webidl \
Telephony.webidl \
TelephonyCall.webidl \
TelephonyCallGroup.webidl \
Text.webidl \ Text.webidl \
TextDecoder.webidl \ TextDecoder.webidl \
TextEncoder.webidl \ TextEncoder.webidl \
@ -445,12 +450,8 @@ endif
ifdef MOZ_B2G_RIL ifdef MOZ_B2G_RIL
webidl_files += \ webidl_files += \
CallsList.webidl \
MozStkCommandEvent.webidl \ MozStkCommandEvent.webidl \
MozVoicemail.webidl \ MozVoicemail.webidl \
Telephony.webidl \
TelephonyCall.webidl \
TelephonyCallGroup.webidl \
$(NULL) $(NULL)
endif endif
@ -495,7 +496,6 @@ endif
ifdef MOZ_B2G_RIL ifdef MOZ_B2G_RIL
webidl_files += \ webidl_files += \
CallEvent.webidl \
CFStateChangeEvent.webidl \ CFStateChangeEvent.webidl \
DataErrorEvent.webidl \ DataErrorEvent.webidl \
IccCardLockErrorEvent.webidl \ IccCardLockErrorEvent.webidl \

View File

@ -59,6 +59,7 @@ SHARED_LIBRARY_LIBS = \
$(DEPTH)/dom/promise/$(LIB_PREFIX)dompromise_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/promise/$(LIB_PREFIX)dompromise_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/src/notification/$(LIB_PREFIX)jsdomnotification_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/src/notification/$(LIB_PREFIX)jsdomnotification_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/system/$(LIB_PREFIX)domsystem_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/system/$(LIB_PREFIX)domsystem_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/telephony/$(LIB_PREFIX)domtelephony_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/workers/$(LIB_PREFIX)domworkers_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/workers/$(LIB_PREFIX)domworkers_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/indexedDB/$(LIB_PREFIX)dom_indexeddb_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/indexedDB/$(LIB_PREFIX)dom_indexeddb_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/indexedDB/ipc/$(LIB_PREFIX)dom_indexeddb_ipc_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/indexedDB/ipc/$(LIB_PREFIX)dom_indexeddb_ipc_s.$(LIB_SUFFIX) \
@ -129,7 +130,6 @@ SHARED_LIBRARY_LIBS += $(DEPTH)/dom/camera/$(LIB_PREFIX)domcamera_s.$(LIB_SUFFIX
ifdef MOZ_B2G_RIL #{ ifdef MOZ_B2G_RIL #{
SHARED_LIBRARY_LIBS += \ SHARED_LIBRARY_LIBS += \
$(DEPTH)/dom/system/gonk/$(LIB_PREFIX)domsystemgonk_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/system/gonk/$(LIB_PREFIX)domsystemgonk_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/telephony/$(LIB_PREFIX)domtelephony_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/icc/src/$(LIB_PREFIX)dom_icc_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/icc/src/$(LIB_PREFIX)dom_icc_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/cellbroadcast/src/$(LIB_PREFIX)dom_cellbroadcast_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/cellbroadcast/src/$(LIB_PREFIX)dom_cellbroadcast_s.$(LIB_SUFFIX) \
$(DEPTH)/dom/voicemail/$(LIB_PREFIX)domvoicemail_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/voicemail/$(LIB_PREFIX)domvoicemail_s.$(LIB_SUFFIX) \

View File

@ -230,6 +230,9 @@ static void Shutdown();
#include "mozilla/dom/alarm/AlarmHalService.h" #include "mozilla/dom/alarm/AlarmHalService.h"
#include "mozilla/dom/time/TimeService.h" #include "mozilla/dom/time/TimeService.h"
#include "mozilla/dom/telephony/TelephonyFactory.h"
#include "nsITelephonyProvider.h"
#ifdef MOZ_WIDGET_GONK #ifdef MOZ_WIDGET_GONK
#include "GonkGPSGeolocationProvider.h" #include "GonkGPSGeolocationProvider.h"
#endif #endif
@ -238,6 +241,7 @@ static void Shutdown();
using namespace mozilla; using namespace mozilla;
using namespace mozilla::dom; using namespace mozilla::dom;
using namespace mozilla::dom::mobilemessage; using namespace mozilla::dom::mobilemessage;
using namespace mozilla::dom::telephony;
using mozilla::dom::alarm::AlarmHalService; using mozilla::dom::alarm::AlarmHalService;
using mozilla::dom::indexedDB::IndexedDatabaseManager; using mozilla::dom::indexedDB::IndexedDatabaseManager;
using mozilla::dom::power::PowerManagerService; using mozilla::dom::power::PowerManagerService;
@ -338,6 +342,8 @@ NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsVolumeService,
#endif #endif
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIMediaManagerService, NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIMediaManagerService,
MediaManager::GetInstance) MediaManager::GetInstance)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsITelephonyProvider,
TelephonyFactory::CreateTelephonyProvider)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -811,6 +817,7 @@ NS_DEFINE_NAMED_CID(NS_SYNTHVOICEREGISTRY_CID);
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY
NS_DEFINE_NAMED_CID(NS_ACCESSIBILITY_SERVICE_CID); NS_DEFINE_NAMED_CID(NS_ACCESSIBILITY_SERVICE_CID);
#endif #endif
NS_DEFINE_NAMED_CID(TELEPHONY_PROVIDER_CID);
static nsresult static nsresult
CreateWindowCommandTableConstructor(nsISupports *aOuter, CreateWindowCommandTableConstructor(nsISupports *aOuter,
@ -1093,6 +1100,7 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY
{ &kNS_ACCESSIBILITY_SERVICE_CID, false, NULL, CreateA11yService }, { &kNS_ACCESSIBILITY_SERVICE_CID, false, NULL, CreateA11yService },
#endif #endif
{ &kTELEPHONY_PROVIDER_CID, false, NULL, nsITelephonyProviderConstructor },
{ NULL } { NULL }
}; };
@ -1248,6 +1256,7 @@ static const mozilla::Module::ContractIDEntry kLayoutContracts[] = {
{ "@mozilla.org/accessibilityService;1", &kNS_ACCESSIBILITY_SERVICE_CID }, { "@mozilla.org/accessibilityService;1", &kNS_ACCESSIBILITY_SERVICE_CID },
{ "@mozilla.org/accessibleRetrieval;1", &kNS_ACCESSIBILITY_SERVICE_CID }, { "@mozilla.org/accessibleRetrieval;1", &kNS_ACCESSIBILITY_SERVICE_CID },
#endif #endif
{ TELEPHONY_PROVIDER_CONTRACTID, &kTELEPHONY_PROVIDER_CID },
{ NULL } { NULL }
}; };

View File

@ -272,7 +272,7 @@ this.OnRefTestLoad = function OnRefTestLoad(win)
#if BOOTSTRAP #if BOOTSTRAP
#if REFTEST_B2G #if REFTEST_B2G
var doc = gContainingWindow.document.getElementsByTagName("window")[0]; var doc = gContainingWindow.document.getElementsByTagName("html")[0];
#else #else
var doc = gContainingWindow.document.getElementById('main-window'); var doc = gContainingWindow.document.getElementById('main-window');
#endif #endif

View File

@ -13,7 +13,8 @@ class testElementTouch(MarionetteTestCase):
button.tap() button.tap()
expected = "button1-touchstart-touchend-mousemove-mousedown-mouseup-click" expected = "button1-touchstart-touchend-mousemove-mousedown-mouseup-click"
self.wait_for_condition(lambda m: m.execute_script("return document.getElementById('button1').innerHTML;") == expected) self.wait_for_condition(lambda m: m.execute_script("return document.getElementById('button1').innerHTML;") == expected)
button.tap(0, 300) button = self.marionette.find_element("id", "button2")
button.tap()
expected = "button2-touchstart-touchend-mousemove-mousedown-mouseup-click" expected = "button2-touchstart-touchend-mousemove-mousedown-mouseup-click"
self.wait_for_condition(lambda m: m.execute_script("return document.getElementById('button2').innerHTML;") == expected) self.wait_for_condition(lambda m: m.execute_script("return document.getElementById('button2').innerHTML;") == expected)

View File

@ -9,7 +9,7 @@ const CHILD_SCRIPT = "chrome://specialpowers/content/specialpowers.js";
const CHILD_SCRIPT_API = "chrome://specialpowers/content/specialpowersAPI.js"; const CHILD_SCRIPT_API = "chrome://specialpowers/content/specialpowersAPI.js";
const CHILD_LOGGER_SCRIPT = "chrome://specialpowers/content/MozillaLogger.js"; const CHILD_LOGGER_SCRIPT = "chrome://specialpowers/content/MozillaLogger.js";
let homescreen = document.getElementById('homescreen'); let homescreen = document.getElementById('systemapp');
let container = homescreen.contentWindow.document.getElementById('test-container'); let container = homescreen.contentWindow.document.getElementById('test-container');
function openWindow(aEvent) { function openWindow(aEvent) {

View File

@ -409,7 +409,7 @@ toolbar#nav-bar {
if options.browserChrome or options.chrome or options.a11y or options.webapprtChrome: if options.browserChrome or options.chrome or options.a11y or options.webapprtChrome:
chrome += """ chrome += """
overlay chrome://browser/content/browser.xul chrome://mochikit/content/browser-test-overlay.xul overlay chrome://browser/content/browser.xul chrome://mochikit/content/browser-test-overlay.xul
overlay chrome://browser/content/shell.xul chrome://mochikit/content/browser-test-overlay.xul overlay chrome://browser/content/shell.xhtml chrome://mochikit/content/browser-test-overlay.xul
overlay chrome://navigator/content/navigator.xul chrome://mochikit/content/browser-test-overlay.xul overlay chrome://navigator/content/navigator.xul chrome://mochikit/content/browser-test-overlay.xul
overlay chrome://webapprt/content/webapp.xul chrome://mochikit/content/browser-test-overlay.xul overlay chrome://webapprt/content/webapp.xul chrome://mochikit/content/browser-test-overlay.xul
""" """

View File

@ -177,6 +177,19 @@ var DebuggerServer = {
*/ */
chromeWindowType: null, chromeWindowType: null,
/**
* Set that to a function that will be called anytime a new connection
* is opened or one is closed.
*/
onConnectionChange: null,
_fireConnectionChange: function(aWhat) {
if (this.onConnectionChange &&
typeof this.onConnectionChange === "function") {
this.onConnectionChange(aWhat);
}
},
/** /**
* Prompt the user to accept or decline the incoming connection. This is the * Prompt the user to accept or decline the incoming connection. This is the
* default implementation that products embedding the debugger server may * default implementation that products embedding the debugger server may
@ -275,6 +288,9 @@ var DebuggerServer = {
delete this._allowConnection; delete this._allowConnection;
this._transportInitialized = false; this._transportInitialized = false;
this._initialized = false; this._initialized = false;
this._fireConnectionChange("closed");
dumpn("Debugger server is shut down."); dumpn("Debugger server is shut down.");
}, },
@ -546,6 +562,7 @@ var DebuggerServer = {
} }
aTransport.ready(); aTransport.ready();
this._fireConnectionChange("opened");
return conn; return conn;
}, },
@ -554,6 +571,7 @@ var DebuggerServer = {
*/ */
_connectionClosed: function DS_connectionClosed(aConnection) { _connectionClosed: function DS_connectionClosed(aConnection) {
delete this._connections[aConnection.prefix]; delete this._connections[aConnection.prefix];
this._fireConnectionChange("closed");
}, },
// DebuggerServer extension API. // DebuggerServer extension API.