use c++ to manipulate mozsettings in gecko
TRANSCRIPT
Use C++ to Manipulate mozSettings in Gecko
Mozilla Taiwan Tommy Kuo [:KuoE0] [email protected]
cc-by-sa
Func1
Func2
Func1
Func4
Func3
mozSettings
get()
get()
set()
set()
get()What would happen if get and set the same preference in the same time?
mozSettings
Lock1 Lock2 Lock3 Lock4Lock Queue
Func1 / Lock1
Func2 / Lock1
Func1 / Lock1
Func4 / Lock1
Func3 / Lock1
get()
get()
set()
set()
get()
JavaScriptvar lock = navigator.mozSettings.createLock();var setting = lock.get('multiscreen.enabled');
setting.onsuccess = function () { console.log('multiscreen.enabled: ' + setting.result['multiscreen.enabled']);}
setting.onerror = function () { console.warn('An error occured: ' + setting.error);}
More detail: https://developer.mozilla.org/en-US/docs/Web/API/Settings_API
JavaScriptvar lock = navigator.mozSettings.createLock();var setting = lock.get('multiscreen.enabled');
setting.onsuccess = function () { console.log('multiscreen.enabled: ' + setting.result['multiscreen.enabled']);}
setting.onerror = function () { console.warn('An error occured: ' + setting.error);}
Rutern a DOMRequest
More detail: https://developer.mozilla.org/en-US/docs/Web/API/Settings_API
JavaScriptvar lock = navigator.mozSettings.createLock();var setting = lock.get('multiscreen.enabled');
setting.onsuccess = function () { console.log('multiscreen.enabled: ' + setting.result['multiscreen.enabled']);}
setting.onerror = function () { console.warn('An error occured: ' + setting.error);}
Got result
More detail: https://developer.mozilla.org/en-US/docs/Web/API/Settings_API
JavaScriptvar lock = navigator.mozSettings.createLock();var setting = lock.get('multiscreen.enabled');
setting.onsuccess = function () { console.log('multiscreen.enabled: ' + setting.result['multiscreen.enabled']);}
setting.onerror = function () { console.warn('An error occured: ' + setting.error);}
Got error
More detail: https://developer.mozilla.org/en-US/docs/Web/API/Settings_API
C++#include "nsISettingsService.h"
nsCOMPtr<nsISettingsService> settings = do_GetService("@mozilla.org/settingsService;1");
nsCOMPtr<nsISettingsServiceLock> settingsLock;settings->CreateLock(nullptr, getter_AddRefs(settingsLock));
nsRefPtr<GetBoolTask> callback = new GetBoolTask();settingsLock->Get("multiscreen.enabled", callback);
#include "nsISettingsService.h"
nsCOMPtr<nsISettingsService> settings = do_GetService("@mozilla.org/settingsService;1");
nsCOMPtr<nsISettingsServiceLock> settingsLock;settings->CreateLock(nullptr, getter_AddRefs(settingsLock));
nsRefPtr<GetBoolTask> callback = new GetBoolTask();settingsLock->Get("multiscreen.enabled", callback);
C++
Get settings service
#include "nsISettingsService.h"
nsCOMPtr<nsISettingsService> settings = do_GetService("@mozilla.org/settingsService;1");
nsCOMPtr<nsISettingsServiceLock> settingsLock;settings->CreateLock(nullptr, getter_AddRefs(settingsLock));
nsRefPtr<GetBoolTask> callback = new GetBoolTask();settingsLock->Get("multiscreen.enabled", callback);
C++
Get settings lock
#include "nsISettingsService.h"
nsCOMPtr<nsISettingsService> settings = do_GetService("@mozilla.org/settingsService;1");
nsCOMPtr<nsISettingsServiceLock> settingsLock;settings->CreateLock(nullptr, getter_AddRefs(settingsLock));
nsRefPtr<GetBoolTask> callback = new GetBoolTask();settingsLock->Get("multiscreen.enabled", callback);
C++
Set callback
C++#include "nsISettingsService.h"
nsCOMPtr<nsISettingsService> settings = do_GetService("@mozilla.org/settingsService;1");
nsCOMPtr<nsISettingsServiceLock> settingsLock;settings->CreateLock(nullptr, getter_AddRefs(settingsLock));
nsRefPtr<GetBoolTask> callback = new GetBoolTask();settingsLock->Get("multiscreen.enabled", callback);
What’s this?
nsISettingsServiceCallback[scriptable, uuid(aad47850-2e87-11e2-81c1-0800200c9a66)]interface nsISettingsServiceCallback : nsISupports{ void handle(in DOMString aName, in jsval aResult); void handleError(in DOMString aErrorMessage);};
the callback object for settings request
nsISettingsServiceCallback[scriptable, uuid(aad47850-2e87-11e2-81c1-0800200c9a66)]interface nsISettingsServiceCallback : nsISupports{ void handle(in DOMString aName, in jsval aResult); void handleError(in DOMString aErrorMessage);};
the callback object for settings request
onsuccess
nsISettingsServiceCallback[scriptable, uuid(aad47850-2e87-11e2-81c1-0800200c9a66)]interface nsISettingsServiceCallback : nsISupports{ void handle(in DOMString aName, in jsval aResult); void handleError(in DOMString aErrorMessage);};
the callback object for settings request
onerror
GetBoolTaskclass GetBoolTask final : public nsISettingsServiceCallback {public: NS_DECL_ISUPPORTS NS_IMETHOD Handle(const nsAString& aName, JS::Handle<JS::Value> aResult) { PRINT("%s: %s", ToNewCString(aName), aResult.toBoolean() ? "True" : "False"); return NS_OK; } NS_IMETHOD HandleError(const nsAString& aMsg) { PRINT("error: %s", aMsg); return NS_OK; }protected: ~GetBoolTask() {}};
inherit from nsISettingsServiceCallback
GetBoolTaskclass GetBoolTask final : public nsISettingsServiceCallback {public: NS_DECL_ISUPPORTS NS_IMETHOD Handle(const nsAString& aName, JS::Handle<JS::Value> aResult) { PRINT("%s: %s", ToNewCString(aName), aResult.toBoolean() ? "True" : "False"); return NS_OK; } NS_IMETHOD HandleError(const nsAString& aMsg) { PRINT("error: %s", aMsg); return NS_OK; }protected: ~GetBoolTask() {}};
onsuccess
inherit from nsISettingsServiceCallback
GetBoolTaskclass GetBoolTask final : public nsISettingsServiceCallback {public: NS_DECL_ISUPPORTS NS_IMETHOD Handle(const nsAString& aName, JS::Handle<JS::Value> aResult) { PRINT("%s: %s", ToNewCString(aName), aResult.toBoolean() ? "True" : "False"); return NS_OK; } NS_IMETHOD HandleError(const nsAString& aMsg) { PRINT("error: %s", aMsg); return NS_OK; }protected: ~GetBoolTask() {}};
inherit from nsISettingsServiceCallback
onerror