mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-27 23:02:20 +00:00
Bug 1299493 - Remove Navigator.get/hasFeature(); r=baku
This commit is contained in:
parent
67d57d7fa7
commit
d05eb37eea
@ -120,10 +120,6 @@
|
||||
#include "mozilla/DetailedPromise.h"
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
#include <cutils/properties.h>
|
||||
#endif
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
@ -1639,157 +1635,6 @@ Navigator::PublishServer(const nsAString& aName,
|
||||
return domPromise.forget();
|
||||
}
|
||||
|
||||
already_AddRefed<Promise>
|
||||
Navigator::GetFeature(const nsAString& aName, ErrorResult& aRv)
|
||||
{
|
||||
nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mWindow);
|
||||
RefPtr<Promise> p = Promise::Create(go, aRv);
|
||||
if (aRv.Failed()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#if defined(XP_LINUX)
|
||||
if (aName.EqualsLiteral("hardware.memory")) {
|
||||
// with seccomp enabled, fopen() should be in a non-sandboxed process
|
||||
if (XRE_IsParentProcess()) {
|
||||
uint32_t memLevel = mozilla::hal::GetTotalSystemMemoryLevel();
|
||||
if (memLevel == 0) {
|
||||
p->MaybeReject(NS_ERROR_NOT_AVAILABLE);
|
||||
return p.forget();
|
||||
}
|
||||
p->MaybeResolve((int)memLevel);
|
||||
} else {
|
||||
mozilla::dom::ContentChild* cc =
|
||||
mozilla::dom::ContentChild::GetSingleton();
|
||||
RefPtr<Promise> ipcRef(p);
|
||||
cc->SendGetSystemMemory(reinterpret_cast<uint64_t>(ipcRef.forget().take()));
|
||||
}
|
||||
return p.forget();
|
||||
} // hardware.memory
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
if (StringBeginsWith(aName, NS_LITERAL_STRING("acl.")) &&
|
||||
(aName.EqualsLiteral("acl.version") || CheckPermission("external-app"))) {
|
||||
char value[PROPERTY_VALUE_MAX];
|
||||
nsCString propertyKey("persist.");
|
||||
propertyKey.Append(NS_ConvertUTF16toUTF8(aName));
|
||||
uint32_t len = property_get(propertyKey.get(), value, nullptr);
|
||||
if (len > 0) {
|
||||
p->MaybeResolve(NS_ConvertUTF8toUTF16(value));
|
||||
return p.forget();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Mirror the dom.apps.developer_mode pref to let apps get it read-only.
|
||||
if (aName.EqualsLiteral("dom.apps.developer_mode")) {
|
||||
p->MaybeResolve(Preferences::GetBool("dom.apps.developer_mode", false));
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
p->MaybeResolveWithUndefined();
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
already_AddRefed<Promise>
|
||||
Navigator::HasFeature(const nsAString& aName, ErrorResult& aRv)
|
||||
{
|
||||
nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mWindow);
|
||||
RefPtr<Promise> p = Promise::Create(go, aRv);
|
||||
if (aRv.Failed()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Hardcoded extensions features which are b2g specific.
|
||||
#ifdef MOZ_B2G
|
||||
if (aName.EqualsLiteral("web-extensions") ||
|
||||
aName.EqualsLiteral("late-customization")) {
|
||||
p->MaybeResolve(true);
|
||||
return p.forget();
|
||||
}
|
||||
#endif
|
||||
|
||||
// Hardcoded manifest features. Some are still b2g specific.
|
||||
const char manifestFeatures[][64] = {
|
||||
"manifest.origin"
|
||||
, "manifest.redirects"
|
||||
#ifdef MOZ_B2G
|
||||
, "manifest.chrome.navigation"
|
||||
, "manifest.precompile"
|
||||
, "manifest.role.homescreen"
|
||||
#endif
|
||||
};
|
||||
|
||||
nsAutoCString feature = NS_ConvertUTF16toUTF8(aName);
|
||||
for (uint32_t i = 0; i < MOZ_ARRAY_LENGTH(manifestFeatures); i++) {
|
||||
if (feature.Equals(manifestFeatures[i])) {
|
||||
p->MaybeResolve(true);
|
||||
return p.forget();
|
||||
}
|
||||
}
|
||||
|
||||
NS_NAMED_LITERAL_STRING(apiWindowPrefix, "api.window.");
|
||||
if (StringBeginsWith(aName, apiWindowPrefix)) {
|
||||
const nsAString& featureName = Substring(aName, apiWindowPrefix.Length());
|
||||
|
||||
// Temporary hardcoded entry points due to technical constraints
|
||||
if (featureName.EqualsLiteral("Navigator.mozTCPSocket")) {
|
||||
p->MaybeResolve(Preferences::GetBool("dom.mozTCPSocket.enabled"));
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
if (featureName.EqualsLiteral("Navigator.mozMobileConnections") ||
|
||||
featureName.EqualsLiteral("MozMobileNetworkInfo")) {
|
||||
p->MaybeResolve(Preferences::GetBool("dom.mobileconnection.enabled"));
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
if (featureName.EqualsLiteral("Navigator.mozInputMethod")) {
|
||||
p->MaybeResolve(Preferences::GetBool("dom.mozInputMethod.enabled"));
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
if (featureName.EqualsLiteral("Navigator.getDeviceStorage")) {
|
||||
p->MaybeResolve(Preferences::GetBool("device.storage.enabled"));
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
if (featureName.EqualsLiteral("Navigator.mozNetworkStats")) {
|
||||
p->MaybeResolve(Preferences::GetBool("dom.mozNetworkStats.enabled"));
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
if (featureName.EqualsLiteral("Navigator.push")) {
|
||||
p->MaybeResolve(Preferences::GetBool("services.push.enabled"));
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
if (featureName.EqualsLiteral("Navigator.mozAlarms")) {
|
||||
p->MaybeResolve(Preferences::GetBool("dom.mozAlarms.enabled"));
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
if (featureName.EqualsLiteral("Navigator.mozCameras")) {
|
||||
p->MaybeResolve(true);
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
if (featureName.EqualsLiteral("XMLHttpRequest.mozSystem")) {
|
||||
p->MaybeResolve(true);
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
p->MaybeResolveWithUndefined();
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
// resolve with <undefined> because the feature name is not supported
|
||||
p->MaybeResolveWithUndefined();
|
||||
|
||||
return p.forget();
|
||||
}
|
||||
|
||||
PowerManager*
|
||||
Navigator::GetMozPower(ErrorResult& aRv)
|
||||
{
|
||||
|
@ -185,13 +185,6 @@ public:
|
||||
// NavigatorBinding::ClearCachedUserAgentValue(this);
|
||||
void ClearUserAgentCache();
|
||||
|
||||
// Feature Detection API
|
||||
already_AddRefed<Promise> GetFeature(const nsAString& aName,
|
||||
ErrorResult& aRv);
|
||||
|
||||
already_AddRefed<Promise> HasFeature(const nsAString &aName,
|
||||
ErrorResult& aRv);
|
||||
|
||||
bool Vibrate(uint32_t aDuration);
|
||||
bool Vibrate(const nsTArray<uint32_t>& aDuration);
|
||||
void SetVibrationPermission(bool aPermitted, bool aPersistent);
|
||||
|
@ -26,6 +26,4 @@ skip-if = buildapp == 'mulet'
|
||||
[test_bug1008126.html]
|
||||
[test_sandboxed_blob_uri.html]
|
||||
[test_websocket_frame.html]
|
||||
[test_getFeature_with_perm.html]
|
||||
[test_hasFeature.html]
|
||||
[test_mozbrowser_apis_allowed.html]
|
||||
|
@ -1,135 +0,0 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=979109
|
||||
-->
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Test for Bug 979109</title>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=983502">Mozilla Bug 983502</a>
|
||||
<script type="application/javascript">
|
||||
|
||||
function testSupported() {
|
||||
var mem;
|
||||
navigator.getFeature("hardware.memory").then(function(mem) {
|
||||
|
||||
var isLinux = (navigator.platform.indexOf('Linux') != -1);
|
||||
var isAndroid = !!navigator.userAgent.includes("Android");
|
||||
var isB2G = !isAndroid && /Mobile|Tablet/.test(navigator.userAgent);
|
||||
|
||||
if (isLinux) {
|
||||
info("It is Linux version:");
|
||||
}
|
||||
if (isAndroid) {
|
||||
info("It is Android version");
|
||||
}
|
||||
if (isB2G) {
|
||||
info("It is B2G version");
|
||||
}
|
||||
|
||||
if (isLinux || isAndroid || isB2G) {
|
||||
ok(typeof mem === 'number' && (mem) % 1 === 0, "We should receive an integer on this platform");
|
||||
ok(mem > 0, "hardware.memory is supported on this platform. mem=" + mem + "MiB");
|
||||
} else {
|
||||
ok(typeof mem === 'undefined', "hardware.memory is not support on this platform");
|
||||
}
|
||||
|
||||
runNextTest();
|
||||
|
||||
},function(mem) {
|
||||
ok(false, "The Promise should not be rejected");
|
||||
});
|
||||
}
|
||||
|
||||
function testNotSupported() {
|
||||
var tv;
|
||||
navigator.getFeature("hardware.tv").then(function(tv) {
|
||||
ok(typeof tv === 'undefined', "Resolve the Promise with undefined value (hardware.tv)");
|
||||
runNextTest();
|
||||
},function(tv) {
|
||||
ok(false, "The Promise should not be rejected");
|
||||
});
|
||||
}
|
||||
|
||||
function testNotSupportedManifest() {
|
||||
navigator.getFeature("manifest.origin").then(function(feature) {
|
||||
ok(typeof feature == 'undefined', "manifest.* resolves with undefined on getFeature");
|
||||
runNextTest();
|
||||
}, function() {
|
||||
ok(false, "The Promise should not be rejected");
|
||||
});
|
||||
}
|
||||
|
||||
function createManifestTest(aFeature) {
|
||||
return function() {
|
||||
var res;
|
||||
navigator.hasFeature(aFeature).then(function(res) {
|
||||
ok(res === true, "Resolve the Promise with 'true' for " + aFeature);
|
||||
runNextTest();
|
||||
}, function(tv) {
|
||||
ok(false, "The Promise should not be rejected");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function testDevMode(aExpected) {
|
||||
return function() {
|
||||
navigator.getFeature("dom.apps.developer_mode").then(res => {
|
||||
is(res, aExpected, "dom.apps.developer_mode is " + aExpected);
|
||||
runNextTest();
|
||||
}, function() {
|
||||
ok(false, "The Promise should not be rejected");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function enableDevMode() {
|
||||
SpecialPowers.pushPrefEnv({"set": [["dom.apps.developer_mode", true]]}, runNextTest);
|
||||
}
|
||||
|
||||
var currentTest = -1;
|
||||
var tests = [
|
||||
testNotSupported,
|
||||
testNotSupportedManifest,
|
||||
testSupported,
|
||||
createManifestTest("manifest.origin"),
|
||||
createManifestTest("manifest.redirects"),
|
||||
testDevMode(false),
|
||||
enableDevMode,
|
||||
testDevMode(true)
|
||||
];
|
||||
|
||||
function runNextTest() {
|
||||
currentTest++;
|
||||
if (currentTest < tests.length) {
|
||||
tests[currentTest]();
|
||||
} else {
|
||||
SimpleTest.finish();
|
||||
}
|
||||
}
|
||||
|
||||
info("About to run " + tests.length + " tests");
|
||||
|
||||
ok('getFeature' in navigator, "navigator.getFeature should exist");
|
||||
ok('hasFeature' in navigator, "navigator.hasFeature should exist");
|
||||
// B2G specific manifest features.
|
||||
// Touching navigator before pushPermissions makes it fail.
|
||||
if (!navigator.userAgent.includes("Android") &&
|
||||
/Mobile|Tablet/.test(navigator.userAgent)) {
|
||||
info("Adding B2G specific tests");
|
||||
tests.push(createManifestTest("manifest.chrome.navigation"));
|
||||
tests.push(createManifestTest("manifest.precompile"));
|
||||
tests.push(createManifestTest("manifest.role.homescreen"));
|
||||
}
|
||||
runNextTest();
|
||||
ok(true, "Test DONE");
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,101 +0,0 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=1009645
|
||||
-->
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Test for Bug 1009645</title>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1009645">Mozilla Bug 1009645</a>
|
||||
<script type="application/javascript">
|
||||
|
||||
var b2gOnly;
|
||||
|
||||
function pref(name) {
|
||||
try {
|
||||
return SpecialPowers.getBoolPref(name);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function testAPIs() {
|
||||
var APIEndPoints = [
|
||||
{ name: "MozMobileNetworkInfo", enabled: pref("dom.mobileconnection.enabled") },
|
||||
// { name: "Navigator.mozBluetooth", enabled: b2gOnly }, // conditional on MOZ_B2G_BT, tricky to test
|
||||
// Bug 1266035 { name: "Navigator.mozContacts", enabled: pref("dom.mozContacts.enabled") },
|
||||
{ name: "Navigator.getDeviceStorage", enabled: pref("device.storage.enabled") },
|
||||
// Bug 1266035 { name: "Navigator.addIdleObserver", enabled: true },
|
||||
{ name: "Navigator.mozNetworkStats", enabled: pref("dom.mozNetworkStats.enabled") },
|
||||
{ name: "Navigator.push", enabled: pref("services.push.enabled") },
|
||||
// { name: "Navigator.mozTime", enabled: b2gOnly }, // conditional on MOZ_TIME_MANAGER, tricky to test
|
||||
// { name: "Navigator.mozFMRadio", enabled: b2gOnly }, // conditional on MOZ_B2G_FM, tricky to test
|
||||
{ name: "Navigator.mozCameras", enabled: true },
|
||||
{ name: "Navigator.mozAlarms", enabled: pref("dom.mozAlarms.enabled") },
|
||||
{ name: "Navigator.mozTCPSocket", enabled: pref("dom.mozTCPSocket.enabled") },
|
||||
{ name: "Navigator.mozInputMethod", enabled: pref("dom.mozInputMethod.enabled") },
|
||||
{ name: "Navigator.mozMobileConnections", enabled: pref("dom.mobileconnection.enabled") },
|
||||
{ name: "XMLHttpRequest.mozSystem", enabled: true }
|
||||
];
|
||||
|
||||
var promises = [];
|
||||
APIEndPoints.forEach(function(v) {
|
||||
promises.push(navigator.hasFeature("api.window." + v.name));
|
||||
});
|
||||
|
||||
return Promise.all(promises).then(function(values) {
|
||||
for (var i = 0; i < values.length; ++i) {
|
||||
is(values[i], APIEndPoints[i].enabled,
|
||||
"Endpoint " + APIEndPoints[i].name + " resolved with the correct value. " +
|
||||
"If this is failing because you're changing how an API is exposed, you " +
|
||||
"must contact the Marketplace team to let them know about the change.");
|
||||
}
|
||||
}, function() {
|
||||
ok(false, "The Promise should not be rejected");
|
||||
});
|
||||
}
|
||||
|
||||
function testExtensions() {
|
||||
if (!b2gOnly) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
var builtInFeatures = [
|
||||
{feature: "web-extensions", value: true},
|
||||
{feature: "late-customization", value: true}
|
||||
];
|
||||
|
||||
builtInFeatures.forEach(function(x) {
|
||||
navigator.hasFeature(x.feature).then(function(value) {
|
||||
is(value, x.value, "Resolve the Promise with " + value + " for feature: " + x.feature);
|
||||
}).catch(function(ex) {
|
||||
ok(false, "The Promise should not be rejected");
|
||||
});
|
||||
});
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
SpecialPowers.pushPermissions([
|
||||
{type: "feature-detection", allow: true, context: document}
|
||||
], function() {
|
||||
b2gOnly = (function() {
|
||||
var isAndroid = !!navigator.userAgent.includes("Android");
|
||||
var isMulet = pref("b2g.is_mulet");
|
||||
var isB2g = isMulet || (!isAndroid && /Mobile|Tablet/.test(navigator.userAgent));
|
||||
return isB2g ? true : undefined;
|
||||
})();
|
||||
|
||||
ok('hasFeature' in navigator, "navigator.hasFeature should exist");
|
||||
testAPIs().then(testExtensions).catch(function(e) {
|
||||
ok(false, "The Promise should not be rejected: " + e);
|
||||
}).then(SimpleTest.finish);
|
||||
});
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -32,7 +32,6 @@
|
||||
#include "mozilla/dom/GetFilesHelper.h"
|
||||
#include "mozilla/dom/PCrashReporterChild.h"
|
||||
#include "mozilla/dom/ProcessGlobal.h"
|
||||
#include "mozilla/dom/Promise.h"
|
||||
#include "mozilla/dom/workers/ServiceWorkerManager.h"
|
||||
#include "mozilla/dom/nsIContentChild.h"
|
||||
#include "mozilla/gfx/gfxVars.h"
|
||||
@ -2263,22 +2262,6 @@ ContentChild::AddRemoteAlertObserver(const nsString& aData,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
ContentChild::RecvSystemMemoryAvailable(const uint64_t& aGetterId,
|
||||
const uint32_t& aMemoryAvailable)
|
||||
{
|
||||
RefPtr<Promise> p = dont_AddRef(reinterpret_cast<Promise*>(aGetterId));
|
||||
|
||||
if (!aMemoryAvailable) {
|
||||
p->MaybeReject(NS_ERROR_NOT_AVAILABLE);
|
||||
return true;
|
||||
}
|
||||
|
||||
p->MaybeResolve((int)aMemoryAvailable);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ContentChild::RecvPreferenceUpdate(const PrefSetting& aPref)
|
||||
{
|
||||
|
@ -404,9 +404,6 @@ public:
|
||||
// auto remove when alertfinished is received.
|
||||
nsresult AddRemoteAlertObserver(const nsString& aData, nsIObserver* aObserver);
|
||||
|
||||
virtual bool RecvSystemMemoryAvailable(const uint64_t& aGetterId,
|
||||
const uint32_t& aMemoryAvailable) override;
|
||||
|
||||
virtual bool RecvPreferenceUpdate(const PrefSetting& aPref) override;
|
||||
virtual bool RecvVarUpdate(const GfxVarUpdate& pref) override;
|
||||
|
||||
|
@ -3909,20 +3909,6 @@ ContentParent::RecvNSSU2FTokenSign(nsTArray<uint8_t>&& aApplication,
|
||||
return NS_SUCCEEDED(rv);
|
||||
}
|
||||
|
||||
bool
|
||||
ContentParent::RecvGetSystemMemory(const uint64_t& aGetterId)
|
||||
{
|
||||
uint32_t memoryTotal = 0;
|
||||
|
||||
#if defined(XP_LINUX)
|
||||
memoryTotal = mozilla::hal::GetTotalSystemMemoryLevel();
|
||||
#endif
|
||||
|
||||
Unused << SendSystemMemoryAvailable(aGetterId, memoryTotal);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ContentParent::RecvGetLookAndFeelCache(nsTArray<LookAndFeelInt>* aLookAndFeelIntCache)
|
||||
{
|
||||
|
@ -1013,8 +1013,6 @@ private:
|
||||
const bool& aContentOrNormalChannel,
|
||||
const bool& aAnyChannel) override;
|
||||
|
||||
virtual bool RecvGetSystemMemory(const uint64_t& getterId) override;
|
||||
|
||||
virtual bool RecvGetLookAndFeelCache(nsTArray<LookAndFeelInt>* aLookAndFeelIntCache) override;
|
||||
|
||||
virtual bool RecvSpeakerManagerGetSpeakerStatus(bool* aValue) override;
|
||||
|
@ -518,8 +518,6 @@ child:
|
||||
|
||||
async NotifyVisited(URIParams uri);
|
||||
|
||||
async SystemMemoryAvailable(uint64_t getterId, uint32_t memoryAvailable);
|
||||
|
||||
async PreferenceUpdate(PrefSetting pref);
|
||||
async VarUpdate(GfxVarUpdate var);
|
||||
|
||||
@ -829,8 +827,6 @@ parent:
|
||||
uint8_t[] keyHandle)
|
||||
returns (uint8_t[] signature);
|
||||
|
||||
async GetSystemMemory(uint64_t getterId);
|
||||
|
||||
sync IsSecureURI(uint32_t type, URIParams uri, uint32_t flags)
|
||||
returns (bool isSecureURI);
|
||||
|
||||
|
@ -29,7 +29,6 @@ Navigator implements NavigatorLanguage;
|
||||
Navigator implements NavigatorOnLine;
|
||||
Navigator implements NavigatorContentUtils;
|
||||
Navigator implements NavigatorStorageUtils;
|
||||
Navigator implements NavigatorFeatures;
|
||||
Navigator implements NavigatorConcurrentHardware;
|
||||
|
||||
[NoInterfaceObject, Exposed=(Window,Worker)]
|
||||
@ -92,15 +91,6 @@ interface NavigatorStorageUtils {
|
||||
//void yieldForStorageUpdates();
|
||||
};
|
||||
|
||||
[NoInterfaceObject]
|
||||
interface NavigatorFeatures {
|
||||
[ChromeOnly, Throws]
|
||||
Promise<any> getFeature(DOMString name);
|
||||
|
||||
[ChromeOnly, Throws]
|
||||
Promise<any> hasFeature(DOMString name);
|
||||
};
|
||||
|
||||
partial interface Navigator {
|
||||
[Throws]
|
||||
readonly attribute Permissions permissions;
|
||||
|
@ -1212,12 +1212,6 @@ GetTotalSystemMemory()
|
||||
return hal_impl::GetTotalSystemMemory();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
GetTotalSystemMemoryLevel()
|
||||
{
|
||||
return hal_impl::GetTotalSystemMemoryLevel();
|
||||
}
|
||||
|
||||
bool IsHeadphoneEventFromInputDev()
|
||||
{
|
||||
AssertMainThread();
|
||||
|
@ -627,14 +627,6 @@ void StopDiskSpaceWatcher();
|
||||
*/
|
||||
uint32_t GetTotalSystemMemory();
|
||||
|
||||
/**
|
||||
* Get the level of total system memory on device in MiB.
|
||||
* (round the value up to the next power of two)
|
||||
*
|
||||
* Returns 0 if we are unable to determine this information from /proc/meminfo.
|
||||
*/
|
||||
uint32_t GetTotalSystemMemoryLevel();
|
||||
|
||||
/**
|
||||
* Determine whether the headphone switch event is from input device
|
||||
*/
|
||||
|
@ -16,11 +16,5 @@ GetTotalSystemMemory()
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
GetTotalSystemMemoryLevel()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace hal_impl
|
||||
} // namespace mozilla
|
||||
|
@ -35,37 +35,5 @@ GetTotalSystemMemory()
|
||||
return sTotalMemory * 1024;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
GetTotalSystemMemoryLevel()
|
||||
{
|
||||
static uint32_t sTotalMemoryLevel = 1;
|
||||
uint32_t sTotalMemory;
|
||||
static bool sTotalMemoryObtained = false;
|
||||
|
||||
if (!sTotalMemoryObtained) {
|
||||
sTotalMemoryObtained = true;
|
||||
|
||||
FILE* fd = fopen("/proc/meminfo", "r");
|
||||
if (!fd) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rv = fscanf(fd, "MemTotal: %i kB", &sTotalMemory);
|
||||
|
||||
if (fclose(fd) || rv != 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// From KB to MiB
|
||||
sTotalMemory /= 1024;
|
||||
|
||||
while (sTotalMemoryLevel <= sTotalMemory) {
|
||||
sTotalMemoryLevel *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
return sTotalMemoryLevel;
|
||||
}
|
||||
|
||||
} // namespace hal_impl
|
||||
} // namespace mozilla
|
||||
|
Loading…
Reference in New Issue
Block a user