Commit Graph

76 Commits

Author SHA1 Message Date
Nicholas Nethercote
c1b91b0084 Bug 1436655 - Introduce a mechanism for VarCache prefs to be defined entirely in the binary. r=glandium
Currently VarCache prefs are setup in two parts:

- The vanilla pref part, installed via a data file such as all.js, or via an
  API call.

- The VarCache variable part, setup by an Add*VarCache() call.

Both parts are needed for the pref to actually operate as a proper VarCache
pref. (There are various prefs for which we do one but not the other unless a
certain condition is met.)

This patch introduces a new way of doing things. There is a new file,
modules/libpref/init/StaticPrefList.h, which defines prefs like this:

> VARCACHE_PREF(
>   "layout.accessiblecaret.width",
>   layout_accessiblecaret_width,
>   float, 34.0
> )

This replaces both the existing parts.

The preprocessor is used to generate multiple things from this single
definition:

- A global variable (the VarCache itself).

- A getter for that global variable.

- A call to an init function that unconditionally installs the pref in the
  prefs hash table at startup.

C++ files can include the new StaticPrefs.h file to access the getter.

Rust code cannot use the getter, but can access the global variable directly
via structs.rs. This is similar to how things currently work for Rust code.

Non-VarCache prefs can also be declared in StaticPrefList.h, using PREF instead
of the VARCACHE_PREF.

The new approach has the following advantages.

+ It eliminates the duplication (in all.js and the Add*VarCache() call) of the
  pref name and default value, preventing potential mismatches. (This is a real
  problem in practice!)

+ There is now a single initialization point for these VarCache prefs.
  + This avoids need to find a place to insert the Add*VarCache() calls, which
    are currently spread all over the place.
  + It also eliminates the common pattern whereby these calls are wrapped in a
    execute-once block protected by a static boolean (see bug 1346224).
  + It's no longer possible to have a VarCache pref for which only one of the
    pieces has been setup.

+ It encapsulates the VarCache global variable, so there is no need to declare
  it separately.

+ VarCache reads are done via a getter (e.g. StaticPrefs::foo_bar_baz())
  instead of a raw global variable read.
  + This makes it clearer that you're reading a pref value, and easier to
    search for uses.
  + This prevents accidental writes to the global variable.
  + This prevents accidental mistyping of the pref name.
  + This provides a single chokepoint in the code for such accesses, which make
    adding checking and instrumentation feasible.

+ It subsumes MediaPrefs, and will allow that class to be removed. (gfxPrefs is
  a harder lift, unfortunately.)

+ Once all VarCache prefs are migrated to the new approach, the VarCache
  mechanism will be better encapsulated, with fewer details publicly visible.

+ (Future work) This will allow the pref names to be stored statically, saving
  memory in every process.

The main downside of the new approach is that all of these prefs are in a
single header that is included in quite a few places, so any changes to this
header will cause a fair amount of recompilation.

Another minor downside is that all VarCache prefs are defined and visible from
start-up. For test-only prefs like network.predictor.doing-tests, having them
show in about:config isn't particularly useful.

The patch also moves three network VarCache prefs to the new mechanism as a
basic demonstration. (And note the inconsistencies in the multiple initial
values that were provided for
network.auth.subresource-img-cross-origin-http-auth-allow!) There will be
numerous follow-up bugs to convert the remaining VarCache prefs.

MozReview-Commit-ID: 9ABNpOR16uW
* * *
[mq]: fixup

MozReview-Commit-ID: 6ToT9dQjIAq
2018-03-26 09:39:40 +11:00
Nicholas Nethercote
24dd029e28 Bug 1444275 - Remove the *InAnyProcess() functions. r=glandium
All pref-modifying operations now only occur in the parent process. Hooray!

MozReview-Commit-ID: GDVsda4rw5f
2018-03-13 14:34:14 +11:00
Nicholas Nethercote
624d9b96e0 Bug 1436911 - Avoid the early/late prefs split. r=glandium
All prefs that need to be sent to a new content process are now put into the
shared memory segment, and they are identified by the pref name instead of an
index into a list. The old IPC used at process startup (in XPCOMInitData) is
removed.

Benefits:

- It removes the need for the early prefs list
  (dom/ipc/ContentProcesses.{h,cpp}) and the associated checking, which is ugly
  and often trips people up (e.g. bug 1432979, bug 1439406).

- Using prefnames instead of indices fixes some fragility (fixing bug 1419432).

- It fixes the problem of early prefs being installed as unlocked default
  values even if they are locked and/or have user values.

MozReview-Commit-ID: FRIzHF8Tjd
2018-03-08 15:47:24 +11:00
Nicholas Nethercote
26fdec1d26 Bug 1444276 - Refactor the telemetry pref setting code. r=glandium,chutten
This patch doesn't change the functionality, it just splits out the code into
separate functions that are easier to read.

MozReview-Commit-ID: Gx05YCxGgve
2018-03-09 16:39:31 +11:00
Nicholas Nethercote
d911a57ece Bug 1438678 - Pass early prefs via shared memory instead of the command line. r=bobowen,jld,glandium.
This patch replaces the large -intPrefs/-boolPrefs/-stringPrefs flags with
a short-lived, anonymous, shared memory segment that is used to pass the early
prefs.

Removing the bloat from the command line is nice, but more important is the
fact that this will let us pass more prefs at content process start-up, which
will allow us to remove the early/late prefs split (bug 1436911).

Although this mechanism is only used for prefs, it's conceivable that it could
be used for other data that must be received very early by children, and for
which the command line isn't ideal.

Notable details:

- Much of the patch deals with the various platform-specific ways of passing
  handles/fds to children.

  - Linux and Mac: we use a fixed fd (8) in combination with the new
    GeckoChildProcessHost::AddFdToRemap() function (which ensures the child
    won't close the fd).

  - Android: like Linux and Mac, but the handles get passed via "parcels" and
    we use the new SetPrefsFd() function instead of the fixed fd.

  - Windows: there is no need to duplicate the handle because Windows handles
    are system-wide. But we do use the new
    GeckoChildProcessHost::AddHandleToShare() function to add it to the list of
    inheritable handles. We also ensure that list is processed on all paths
    (MOZ_SANDBOX with sandbox, MOZ_SANDBOX without sandbox, non-MOZ_SANDBOX) so
    that the handles are marked as inheritable. The handle is passed via the
    -prefsHandle flag.

  The -prefsLen flag is used on all platforms to indicate the size of the
  shared memory segment.

- The patch also moves the serialization/deserialization of the prefs in/out of
  the shared memory into libpref, which is a better spot for it. (This means
  Preferences::MustSendToContentProcesses() can be removed.)

MozReview-Commit-ID: 8fREEBiYFvc
2018-02-16 17:54:16 +11:00
Nicholas Nethercote
c3ba94a60a Bug 1436863 - Only send possibly-changed prefs to content processes. r=glandium.
The meaning of "possibly-changed" is provided by the big comment above
MustSendToContentProcesses.

On a new profile this reduces the number of prefs sent like so:
- Command-line: 222 --> 3
- IPC:         3129 --> 130

On an older profile:
- Command-line: 222 --> 3
- IPC:         3165 --> 180

MozReview-Commit-ID: DcgedhXhZd8
2018-02-09 16:31:13 +11:00
Nicholas Nethercote
11b97d1928 Bug 1435942 - Fix buggy getters in Preferences.h. r=glandium
They currently fail to pass on `aKind`, always getting the user value (when
possible). There are three callsites that are affected:

- nsSHistory::Startup, docshell/shistory/nsSHistory.cpp.
- FeatureState::SetDefaultFromPref(), in gfx/config/gfxFeature.cpp.
- gfxPlatform::InitOMTPConfig(), in gfx/thebes/gfxPlatform.cpp.

The patch also adds a gtest that would have failed prior to the fix.

MozReview-Commit-ID: L0U1XQmPUFc
2018-02-07 09:11:11 +11:00
Nicholas Nethercote
8c14a93535 Bug 1435943 - Tweak Preferences::GetType() and nsPrefBranch::GetPrefType(). r=glandium
This patch rearranges these functions so that nsPrefBranch::GetPrefType() calls
into Preferences::GetType(), because all other nsPrefBranch methods depend on
Preferences methods.

The patch also removes the `aKind` argument from GetType(), because it has no
effect -- a pref only has one type, regardless of whether it has a default
value, a user value, or both.

MozReview-Commit-ID: J3vxFPaP8S3
2018-02-06 17:08:07 +11:00
Nicholas Nethercote
76937b2508 Bug 1423840 (attempt 2) - Rewrite the prefs parser. r=glandium,Manishearth
The prefs parser has two significant problems.

- It doesn't separate tokenizing from parsing.

- It is implemented as a loop around a big switch on a "current state"
  variable.

As a result, it is hard to understand and modify, slower than it could be, and
in obscure cases (involving comments and whitespace) it fails to parse what
should be valid input.

This patch replaces it with a recursive descent parser (albeit one without any
recursion!) that has separate tokenization. The new parser is easier to
understand and modify, more correct, and has better error messages. It doesn't
do error recovery, but that would be much easier to add than in the old parser.

The new parser also runs about 1.9x faster than the existing parser. (As
measured by parsing greprefs.js's contents from memory 1000 times in
succession, omitting the prefs hash table construction. If the table
construction is included, it's about 1.6x faster.)

The new parser is slightly stricter than the old parser in a few ways.

- Disconcertingly, the old parser allowed arbitrary junk between prefs
  (including at the start and end of the prefs file) so long as that junk
  didn't include any of the following chars: '/', '#', 'u', 's', 'p'. I.e.
  lines like these:

    !foo@bar&pref("prefname", true);
    ticky_pref("prefname", true);       // missing 's' at start
    User_pref("prefname", true);        // should be 'u' at start

  would all be treated the same as this:

    pref("prefname", true);

  The new parser disallows such junk because it isn't necessary and seems like
  an unintentional botch by the old parser.

- The old parser allowed character 0x1a (SUB) between tokens and treated it
  like '\n'.

  The new parser does not allow this character. SUB was used to indicate
  end-of-file (*not* end-of-line) in some old operating systems such as MS-DOS,
  but this doesn't seem necessary today.

- The old parser tolerated (with a warning) invalid escape sequences within
  string literals -- such as "\q" (not a valid escape) and "\x1" and "\u12"
  (both of which have insufficient hex digits) -- accepting them literally.

  The new parser does not tolerate invalid escape sequences because it doesn't
  seem necessary and would complicate things.

- The old parser tolerated character 0x00 (NUL) within string literals; this is
  dangerous because C++ code that manipulates string values with embedded NULs
  will almost certainly consider those chars as end-of-string markers.

  The new parser treats NUL chars as end-of-file, to avoid this danger and
  because it facilitates a significant optimization (described within the
  code).

- The old parser allowed integer literals to overflow, silently wrapping them.

  The new parser treats integer overflow as a parse error. This seems better,
  and it caught existing overflows of places.database.lastMaintenance, in
  testing/profiles/prefs_general.js (bug 1424030) and
  testing/talos/talos/config.py (bug 1434813).

The first of these changes meant that a couple of existing prefs with ";;" at
the end had to be changed (done in the preceding patch).

The minor increase in strictness shouldn't be a problem for default pref files
such as greprefs.js within the application (which we can modify), nor for
app-written prefs files such as prefs.js. It could affect user-written prefs
files such as user.js; the experience above suggests that integer overflow and
";;" are the most likely problems in practice. In my opinion, the risk here is
acceptable.

The new parser also does a better job of tracking line numbers because it (a)
treats "\r\n" sequences as a single end-of-line marker, and (a) pays attention
to end-of-line sequences within string literals.

Finally, the patch adds thorough tests of both valid and invalid syntax.

MozReview-Commit-ID: JD3beOQl4AJ
2018-02-01 16:21:47 +11:00
Cosmin Sabou
891a718f46 Backed out 2 changesets (bug 1423840) for mass Talos failures due to forbidden connections. CLOSED TREE
Backed out changeset e8b798a5205a (bug 1423840)
Backed out changeset e500592d3551 (bug 1423840)
2018-02-01 03:05:08 +02:00
Nicholas Nethercote
64fe3185f3 Bug 1423840 - Rewrite the prefs parser. r=glandium,Manishearth
The prefs parser has two significant problems.

- It doesn't separate tokenizing from parsing.

- It is implemented as a loop around a big switch on a "current state"
  variable.

As a result, it is hard to understand and modify, slower than it could be, and
in obscure cases (involving comments and whitespace) it fails to parse what
should be valid input.

This patch replaces it with a recursive descent parser (albeit one without any
recursion!) that has separate tokenization. The new parser is easier to
understand and modify, more correct, and has better error messages. It doesn't
do error recovery, but that would be much easier to add than in the old parser.

The new parser also runs about 1.9x faster than the existing parser. (As
measured by parsing greprefs.js's contents from memory 1000 times in
succession, omitting the prefs hash table construction. If the table
construction is included, it's about 1.6x faster.)

The new parser is slightly stricter than the old parser in a few ways.

- Disconcertingly, the old parser allowed arbitrary junk between prefs
  (including at the start and end of the prefs file) so long as that junk
  didn't include any of the following chars: '/', '#', 'u', 's', 'p'. I.e.
  lines like these:

    !foo@bar&pref("prefname", true);
    ticky_pref("prefname", true);       // missing 's' at start
    User_pref("prefname", true);        // should be 'u' at start

  would all be treated the same as this:

    pref("prefname", true);

  The new parser disallows such junk because it isn't necessary and seems like
  an unintentional botch by the old parser.

- The old parser allowed character 0x1a (SUB) between tokens and treated it
  like '\n'.

  The new parser does not allow this character. SUB was used to indicate
  end-of-file (*not* end-of-line) in some old operating systems such as MS-DOS,
  but this doesn't seem necessary today.

- The old parser tolerated (with a warning) invalid escape sequences within
  string literals -- such as "\q" (not a valid escape) and "\x1" and "\u12"
  (both of which have insufficient hex digits) -- accepting them literally.

  The new parser does not tolerate invalid escape sequences because it doesn't
  seem necessary and would complicate things.

- The old parser tolerated character 0x00 (NUL) within string literals; this is
  dangerous because C++ code that manipulates string values with embedded NULs
  will almost certainly consider those chars as end-of-string markers.

  The new parser treats NUL chars as end-of-file, to avoid this danger and
  because it facilitates a significant optimization (described within the
  code).

- The old parser allowed integer literals to overflow, silently wrapping them.

  The new parser treats integer overflow as a parse error. This seems better,
  and it caught an existing overflow in testing/profiles/prefs_general.js, for
  places.database.lastMaintenance (see bug 1424030).

The first of these changes meant that a couple of existing prefs with ";;" at
the end had to be changed (done in the preceding patch).

The minor increase in strictness shouldn't be a problem for default pref files
such as greprefs.js within the application (which we can modify), nor for
app-written prefs files such as prefs.js. It could affect user-written prefs
files such as user.js; the experience above suggests that ";;" is the most
likely problem in practice. In my opinion, the risk here is acceptable.

The new parser also does a better job of tracking line numbers because it (a)
treats "\r\n" sequences as a single end-of-line marker, and (a) pays attention
to end-of-line sequences within string literals.

Finally, the patch adds thorough tests of both valid and invalid syntax.

MozReview-Commit-ID: 8EYWH7KxGG
* * *
[mq]: win-fix

MozReview-Commit-ID: 91Bxjfghqfw
2017-12-03 00:26:36 +11:00
Nicholas Nethercote
e142bee515 Bug 1421541 - Overhaul the prefs phase code. r=glandium
This code is used to detect too-early accesses of prefs in content processes.

The patch makes the following changes.

- New terminology: "early" prefs are those sent via the command line; "late"
  prefs are those sent via IPC. Previously the former were "init" prefs and the
  latter didn't have a clear name.

- The phase tracking and checking is now almost completely encapsulated within
  Preferences.cpp. The only exposure to outside code is via the
  AreAllPrefsSetInContentProcess() method, which has a single use.

- The number of states tracked drops from 5 to 3. There's no need to track the
  beginning of the pref-setting operations, because we only need to know if
  they've finished. (This also avoids the weirdness where we could transition
  from END_INIT_PREFS back to BEGIN_INIT_PREFS because of the way -intPrefs,
  -boolPrefs and -stringPrefs were parsed separately.)

MozReview-Commit-ID: IVJWiDxdsDV
2017-11-30 09:14:32 +11:00
Nicholas Nethercote
b445e77165 Bug 1394578 - Rewrite Preferences::SetPreference(). r=glandium
Preferences::SetPreference() is used when setting prefs in the content process
from dom::Pref values that are passed from the parent process. Currently we
use the high-level Set*InAnyProcess() methods to do this -- basically the same
code path as sets done via the API -- but this has several problems.

- It is subtly broken. If the content process already has a pref of type T with
  a default value and then we get a SetPreference() call that tries to change
  it to type U, it will erroneously fail. In practice this never(?) happens,
  but it shows that things aren't arranged very well.

- SetPreference() also looks up the hashtable twice to get the same pref if
  both a default value and a user value are present in the dom::Pref.

- This happens in content processes, while all other pref set operations occur
  in the parent process. This is the main reason we have the Set*InAnyProcess()
  functions.

In short, the setting of prefs via IPC is quite different to the setting of
prefs via other means -- because it happens in content processes, and it's more
of a clobber that can set both values at once -- and so should be handled
differently.

The solution is to make Preferences::SetPreference() use lower-level operations
to do the update. It now does the hash table lookup/add itself, and then calls
the new Pref::FromDomPref() method. That method then possibly calls the new
PrefValue::FromDomPrefValue() method for both kinds of value, and overwrites
them as necessary. SetValueFromDom() is no longer used and the patch removes it.

MozReview-Commit-ID: 2Rg8VMOc0Cl
2017-11-23 18:03:02 +11:00
Nicholas Nethercote
862ce6e7d5 Bug 1394578 - Rename dom::PrefSetting as dom::Pref. r=glandium
It represents a pref, so `Pref` is a better name. Within Preferences.cpp the
patch uses domPref/aDomPref to distinguish it from PrefHashEntry values.

MozReview-Commit-ID: HXTl0GX4BtO
2017-11-22 21:21:19 +11:00
Nicholas Nethercote
e925faae0e Bug 1419648 - Remove and inline PREF_RegisterCallback(). r=glandium
This requires adding an aPriority argument (defaulting to false) to
Preferences::RegisterCallback(). And RegisterVarCacheCallback() is no longer
necessary.

MozReview-Commit-ID: BMDk3HuaQVV
2017-11-21 12:57:53 +11:00
Nicholas Nethercote
92141a53b0 Bug 1419648 - Remove and inline PREF_{LockPref,UnlockPref,PrefIsLocked}(). r=glandium
MozReview-Commit-ID: 7HatftTQwHr
2017-11-16 09:05:43 +11:00
Nicholas Nethercote
3ddd9dc465 Bug 1419648 - Inline and remove PREF_ClearUserPref(). r=glandium
MozReview-Commit-ID: EBb9hxtIwPz
2017-11-15 17:01:15 +11:00
Tim Huang
2e3e3f27ec Bug 1417741 - Add support of Atmoic<> for Preferences::Add*VarCache(). r=baku,njn
MozReview-Commit-ID: 9aeLvgWdZxy
2017-11-16 11:02:50 +08:00
Nicholas Nethercote
8e8ac9747e Bug 1417806 - Name variables more consistently. r=glandium
Specifically:

- PrefHashEntry --> `pref`
- PrefName      --> `prefName`
- PrefSetting   --> `setting`

MozReview-Commit-ID: CSse2jVro3E
2017-11-16 18:59:27 +11:00
Nicholas Nethercote
3f1d75113d Bug 1417746 - Overhaul libpref's memory reporter. r=glandium
This splits the measurements into several buckets, like so:

> 718,528 B (00.40%) -- preferences
> ├──262,176 B (00.14%) ── hash-table
> ├──181,952 B (00.10%) ── callbacks
> ├──122,880 B (00.07%) ── pref-name-arena
> ├───91,872 B (00.05%) ── root-branches
> ├───38,296 B (00.02%) ── string-values
> ├───21,272 B (00.01%) ── cache-data
> └───────80 B (00.00%) ── misc

The patch also measures some things that were previously overlooked.

- String pref values. (The old code had a comment that incorrectly claimed they
  were allocated out of an arena.)

- The PrefCallback objects pointed to by entries in nsPrefBranch::mObservers.

And it makes the code more like typical reporters.

- It removes the "AndOtherStuff" from Preferences' measuring method, and
  measuring those global structures in
  PreferenceServiceReporter::CollectReports().

- It adds `const` where appropriate.

MozReview-Commit-ID: dyNg7ldQdh
2017-11-16 15:55:58 +11:00
Nicholas Nethercote
318c4f45cf Bug 1416638 - Inline and remove PREF_Set*(). r=glandium.
This patch also adds some Set*InAnyProcess() methods, and makes nsPrefBranch a
friend of Preferences so it can call those methods.

And it moves the thin Set*() wrapper functions to Preferences.h, alongside
SetUint().

MozReview-Commit-ID: 88HhmcTFZNc
2017-11-14 19:06:02 +11:00
Nicholas Nethercote
4d87903d13 Bug 1416638 - Move a couple of functions into Preferences. r=glandium.
This will allow other functions to be moved into Preferences and be marked as
`private` in subsequent patches.

The patch also renames SetPrefValue() as SetValueFromDom(), because that's a
clearer name.

MozReview-Commit-ID: CB1xmPSmac6
2017-11-14 19:06:02 +11:00
Nicholas Nethercote
07ef85e49a Bug 1416638 - Use private instead of protected in Preferences. r=glandium.
It's a `final` class, so there's no need for `protected`.

MozReview-Commit-ID: 7n4DLpXo0el
2017-11-14 19:06:02 +11:00
Nicholas Nethercote
239fcd0ea0 Bug 1416638 - Change nsPrefBranch mIsDefault to a PrefValueKind. r=glandium.
This makes the next patches nicer.

MozReview-Commit-ID: 8EoAkmmMavY
2017-11-14 19:06:02 +11:00
Nicholas Nethercote
45164b6a68 Bug 1416638 - Add a PrefValueKind arg to Preferences::Get*(), and remove Preferences::GetDefault*(). r=glandium
MozReview-Commit-ID: LgnZAf1pAl1
2017-11-14 19:06:01 +11:00
Nicholas Nethercote
4cc62dcfa6 Bug 1416638 - Add a PrefValueKind arg to Preferences::Set*(). r=glandium
This is unused for now, but will be necessary for nsPrefBranch::Set*() to call
into Preferences::Set*().

The patch also renames some arguments from aPref to aPrefName, because that's a
better name.

MozReview-Commit-ID: 2OPB7CHOgpw
2017-11-13 09:20:45 +11:00
Nicholas Nethercote
03510e576d Bug 1416638 - Introduce PrefValueKind. r=glandium
This is nicer than a bool for tracking the Default vs. User distinction, and it
replaces the Preferences.cpp-only WhichValue type.

MozReview-Commit-ID: 8CrdDN2vBJQ
2017-11-13 09:20:42 +11:00
Nicholas Nethercote
b2fea6c14d Bug 1416613 - Improve comments about pref IPC. r=glandium
These would have saved me some time last week when I was figuring out how this
stuff works.

MozReview-Commit-ID: DUhxGDht6xT
2017-11-13 09:19:43 +11:00
Nicholas Nethercote
3f99320f1c Bug 1415799 - Inline and remove Preferences::Init(). r=glandium
It has a single call site.

MozReview-Commit-ID: A96MRRa3W5N
2017-11-09 17:59:51 +11:00
Nicholas Nethercote
341864cb20 Bug 1415418 - Simplify GetUint(). r=glandium.
This makes it just like GetDefaultUint().

MozReview-Commit-ID: CSoLpLdstAv
2017-11-08 16:45:42 +11:00
Nicholas Nethercote
d944481245 Bug 1415418 - Reorder Preferences.h. r=glandium.
The various getters and setters are in a confusing order. This patch puts them
in a more sensible order. It also streamlines the comments, which were
generally low-value and in some cases incorrect.

MozReview-Commit-ID: 3ngzZDSt0JI
2017-11-08 16:45:38 +11:00
Nicholas Nethercote
5d32486cc6 Bug 1413400 (part 2) - Make Preferences::sPreferences a StaticRefPtr. r=froydnj.
The notable part of this change is Shutdown(). I've made it just null out
sPreferences, contrary to the old comment, which was strange for a couple of
reasons:

- ~Preferences() used to null out sPreference, which is backwards compared to
  how this sort of thing normally works.

- In both the before and after cases, as far as I can tell,
  Preferences::Shutdown() is called but ~Preferences() is never called;
  something keeps the singleton Preferences instance alive until process
  termination.

MozReview-Commit-ID: Ab0ui31rVcI
2017-11-01 13:55:28 +11:00
Nicholas Nethercote
1c6ee5e178 Bug 1413400 (part 1) - Move s{,Default}RootBranch into Preferences. r=froydnj.
sRootBranch and sDefaultRootBranch have the same lifetime as sPreferences, so
this patch makes them non-static nsCOMPtr<> members of Preferences.

MozReview-Commit-ID: 1TLhh13ZpBI
2017-11-01 13:41:14 +11:00
Nicholas Nethercote
8f69c7ff72 Bug 1411480 (attempt 2) - Remove the machinery for choosing the dirty callback. r=glandium.
It's unnecessarily general, because we only ever use
Preferences::DirtyCallback() as the callback.

And because it's no longer a callback, the patch renames DirtyCallback() as
HandleDirty().

MozReview-Commit-ID: Hl50dcxfVQq
2017-10-26 16:14:01 +11:00
Kris Maglione
375dfdb59d Bug 1409249: Require singleton constructors to return explicit already_AddRefed. r=froydnj
Right now, NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR expects singleton
constructors to return already-addrefed raw pointers, and while it accepts
constructors that return already_AddRefed, most existing don't do so.

Meanwhile, the convention elsewhere is that a raw pointer return value is
owned by the callee, and that the caller needs to addref it if it wants to
keep its own reference to it.

The difference in convention makes it easy to leak (I've definitely caused
more than one shutdown leak this way), so it would be better if we required
the singleton getters to return an explicit already_AddRefed, which would
behave the same for all callers.


This also cleans up several singleton constructors that left a dangling
pointer to their singletons when their initialization methods failed, when
they released their references without clearing their global raw pointers.

MozReview-Commit-ID: 9peyG4pRYcr
2017-10-16 21:08:42 -07:00
Phil Ringnalda
4b3d6f969c Backed out 11 changesets (bug 1411480) for libpref xpcshell test failures
Backed out changeset 0f266ffacf0d (bug 1411480)
Backed out changeset 75212b4a8c0a (bug 1411480)
Backed out changeset 0c807a8e8b29 (bug 1411480)
Backed out changeset 21324f73db0c (bug 1411480)
Backed out changeset f7de6fa0ef2c (bug 1411480)
Backed out changeset b7cdbe5153fa (bug 1411480)
Backed out changeset 8a66ec3e8338 (bug 1411480)
Backed out changeset 3fdf2ac7762d (bug 1411480)
Backed out changeset eaa177ef5f60 (bug 1411480)
Backed out changeset e87ba9542cf8 (bug 1411480)
Backed out changeset f1cf84a50ebc (bug 1411480)

MozReview-Commit-ID: GEVRPZp5eSH
2017-10-25 20:03:25 -07:00
Nicholas Nethercote
99074502aa Bug 1411480 - Remove the machinery for choosing the dirty callback. r=glandium.
It's unnecessarily general, because we only ever use
Preferences::DirtyCallback() as the callback.

And because it's no longer a callback, the patch renames DirtyCallback() as
HandleDirty().

MozReview-Commit-ID: Hl50dcxfVQq
2017-10-25 10:22:38 +11:00
Nicholas Nethercote
0fc40eddec Bug 1407494 (part 4) - Remove have_PrefChangedFunc_typedef. r=glandium.
This is detritus from old changes that can be cleaned up now.

The patch removes the declaration of PrefChangedFunc from Preferences.cpp
because it's also in Preferences.h, which is included by Preferences.cpp.

The patch also removes the part of the comment about passing a non-zero result
because it's clearly false -- the callback has no return value.

MozReview-Commit-ID: 72cdauYsRUt
2017-10-13 15:24:58 +11:00
Nicholas Nethercote
d5c6ac2d61 Bug 1406280 - Restyle modules/libpref/*.h. r=erahm.
This is a mixture of clang-format and manual restyling.

MozReview-Commit-ID: 6S6yUDXQJtE
2017-10-08 07:46:07 +11:00
Nicholas Nethercote
a7e68f09c8 Bug 1276488 - Add diagnostics about Prefs startup failures. r=froydnj. 2017-09-06 15:17:05 +10:00
Masatoshi Kimura
3a683891af Bug 1374847 - Remove nsIPrefBranch2 and nsIPrefBranchInternal. r=njn
MozReview-Commit-ID: 2LFhKNVspko
2017-08-04 17:12:58 +09:00
Nicholas Nethercote
09493fcbcf Bug 1384835 (part 3, attempt 2) - Remove the Preferences::Get*CString() variants that return nsAdoptingCString. r=froydnj. 2017-07-31 14:28:48 +10:00
Nicholas Nethercote
a222153d9c Bug 1384835 (part 2, attempt 2) - Remove the Preferences::Get*String() variants that return nsAdoptingString. r=froydnj. 2017-07-31 14:23:50 +10:00
Nicholas Nethercote
636397db95 Bug 1384835 (part 1, attempt 2) - Use nsA[C]String references instead of pointers for outparams of Get*String() pref functions. r=froydnj. 2017-07-31 10:52:51 +10:00
Benjamin Smedberg
251b00e475 Bug 1382817 - Prefs shouldn't start out dirty or be written almost immediately after being read, r=milan
MozReview-Commit-ID: BFLMsMQjn9w
2017-07-20 16:19:39 -04:00
Benjamin Smedberg
52bbf161ce Bug 981818 followup - initialize member variable for correctness and valgrind happiness, r=trivial 2017-07-17 15:12:13 -04:00
Benjamin Smedberg
21d0e55716 Bug 981818 - Save preferences every time they are dirty on an timer for batching (only enabled when async pref writes are enabled) r=milan
MozReview-Commit-ID: 8O96jQIBsrb
2017-06-15 14:15:25 -04:00
Benjamin Smedberg
2d53b5dd88 Bug 1372988 part A - Warn when user prefs are set after the profile is dead, because the prefs won't get saved anyway. r=milan
MozReview-Commit-ID: IfwL5yYtLcF
2017-06-21 11:17:01 -04:00
Benjamin Smedberg
9db7895288 Bug 1367813 - 1) Add telemetry for prefs.js not existing or being corrupted, and the presence of a user.js file. 2) Rename and change the nsIPrefService.readUserPrefs API. The new API reads user prefs from a file but doesn't remember that location or save changed preferences to that location. r=milan data-r=rweiss
MozReview-Commit-ID: FD5npJlB24W
2017-06-21 15:26:10 -04:00
Phil Ringnalda
c64cad4109 Backed out changeset 4f0ee0f75a30 (bug 1367813) for Windows opt permaorange in test_worker_basic.html
MozReview-Commit-ID: 2k693yFa28r
2017-06-22 20:43:11 -07:00