use c++ to manipulate mozsettings in gecko

23
Use C++ to Manipulate mozSettings in Gecko Mozilla Taiwan Tommy Kuo [:KuoE0] [email protected] cc-by-sa

Upload: chih-hsuan-kuo

Post on 13-Apr-2017

486 views

Category:

Technology


3 download

TRANSCRIPT

Use C++ to Manipulate mozSettings in Gecko

Mozilla Taiwan Tommy Kuo [:KuoE0] [email protected]

cc-by-sa

mozSettingsPreference system in Gaia

Func1

Func2

Func1

Func4

Func3

mozSettings

get()

get()

set()

set()

get()

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

critical section protected with a lock queue

Lock1 Lock2 Lock3 …(active lock)

mozSettings

Lock1 Lock2 Lock3 Lock4Lock Queue

Func1 / Lock1

Func2 / Lock1

Func1 / Lock1

Func4 / Lock1

Func3 / Lock1

get()

get()

set()

set()

get()

Lock Queue Lock1 Lock2 Lock3 Lock4

(wait Lock1) (wait Lock2) (wait Lock3)

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