Closed Bug 1488698 Opened Last year Closed Last year

Always use braces for if/for/while statements

Categories

(Core :: JavaScript Engine, enhancement, P1)

enhancement

Tracking

()

RESOLVED FIXED
mozilla64
Tracking Status
firefox64 --- fixed

People

(Reporter: jandem, Assigned: jandem)

References

Details

Attachments

(39 files)

221.80 KB, patch
anba
: review+
Details | Diff | Splinter Review
396.47 KB, patch
jorendorff
: review+
Details | Diff | Splinter Review
455.38 KB, patch
evilpie
: review+
Details | Diff | Splinter Review
112.88 KB, patch
jorendorff
: review+
Details | Diff | Splinter Review
35.40 KB, patch
Yoric
: review+
Details | Diff | Splinter Review
361.19 KB, patch
arai
: review+
Details | Diff | Splinter Review
134.96 KB, patch
arai
: review+
Details | Diff | Splinter Review
486.52 KB, patch
jorendorff
: review+
Details | Diff | Splinter Review
43.27 KB, patch
sfink
: review+
Details | Diff | Splinter Review
188.41 KB, patch
jonco
: review+
Details | Diff | Splinter Review
142.22 KB, patch
jorendorff
: review+
Details | Diff | Splinter Review
103.77 KB, patch
sfink
: review+
Details | Diff | Splinter Review
98.23 KB, patch
evilpie
: review+
Details | Diff | Splinter Review
26.12 KB, patch
anba
: review+
Details | Diff | Splinter Review
9.49 KB, patch
khyperia
: review+
Details | Diff | Splinter Review
95.36 KB, patch
tcampbell
: review+
Details | Diff | Splinter Review
145.77 KB, patch
mgaudet
: review+
Details | Diff | Splinter Review
331.72 KB, patch
nbp
: review+
Details | Diff | Splinter Review
125.04 KB, patch
luke
: review+
Details | Diff | Splinter Review
121.05 KB, patch
bbouvier
: review+
Details | Diff | Splinter Review
198.71 KB, patch
jorendorff
: review+
Details | Diff | Splinter Review
463.92 KB, patch
jorendorff
: review+
Details | Diff | Splinter Review
236.12 KB, patch
sfink
: review+
Details | Diff | Splinter Review
85.63 KB, patch
khyperia
: review+
Details | Diff | Splinter Review
480.06 KB, patch
lth
: review+
Details | Diff | Splinter Review
274.89 KB, patch
tcampbell
: review+
Details | Diff | Splinter Review
105.32 KB, patch
bbouvier
: review+
Details | Diff | Splinter Review
204.73 KB, patch
bbouvier
: review+
Details | Diff | Splinter Review
176.17 KB, patch
lth
: review+
Details | Diff | Splinter Review
259.81 KB, patch
luke
: review+
Details | Diff | Splinter Review
76.27 KB, patch
luke
: review+
Details | Diff | Splinter Review
328.96 KB, patch
bbouvier
: review+
Details | Diff | Splinter Review
448.27 KB, patch
tcampbell
: review+
Details | Diff | Splinter Review
139.32 KB, patch
mgaudet
: review+
Details | Diff | Splinter Review
382.28 KB, patch
nbp
: review+
Details | Diff | Splinter Review
751.94 KB, patch
bbouvier
: review+
Details | Diff | Splinter Review
248.80 KB, patch
tcampbell
: review+
Details | Diff | Splinter Review
514.64 KB, patch
evilpie
: review+
Details | Diff | Splinter Review
2.76 KB, text/x-python-script
Details
Jason, can you sign off on this as module owner?
Flags: needinfo?(jorendorff)
My plan would be to do this incrementally, one bug/patch per directory, and to somehow compare the binaries/IR/AST before/after. I'll see if I can easily do that with Clang.
(In reply to Jan de Mooij [:jandem] from comment #2)
> somehow compare the binaries/IR/AST before/after. I'll see if I can
> easily do that with Clang.

What seems to work:

1) Replace __LINE__ with 1 in mfbt/Assertions.h, because we expect line numbers to change.
2) Compile the shell with --enable-debug --disable-optimize
3) strip dist/bin/js
4) sha1sum dist/bin/js

That produces the same output for me before/after reformatting js/src/frontend. When I introduce a small bug somewhere I get a different hash.
This is great!
Flags: needinfo?(jorendorff)
I'm going to post a lot of patches for this. There shouldn't be actual correctness bugs in code that's compiled in debug builds on all platforms, based on checking the hash of the generated binary per comment 3, but please be extra careful with #ifdef'd code.

I still have to convert the platform-specific jit/* directories and jsapi-tests + ctypes but these will be done in follow-up bugs.
Assignee: nobody → jdemooij
Status: NEW → ASSIGNED
Attachment #9006832 - Attachment description: Part 2 - Always use braces for if/for/while statements in js/src/builtin, part 2 → Always use braces for if/for/while statements in js/src/builtin, part 2
All the BinAST files.
Attachment #9006835 - Flags: review?(dteller)
I skipped DoubleToString.cpp because it's (weird) imported C code and Unicode.cpp because it's generated.
Attachment #9006847 - Flags: review?(andrebargull)
Attachment #9006846 - Flags: review?(evilpies) → review+
Comment on attachment 9006867 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/vm, part 10

Review of attachment 9006867 [details] [diff] [review]:
-----------------------------------------------------------------

Little more than a rubber stamp here - I scanned many of the files but it became clear that if some subtle mistake was being made I was not going to see it, so I stopped pretending.  In general I think this style rule (like almost every style rule) has highly questionable value.
Attachment #9006867 - Flags: review?(lhansen) → review+
(In reply to Lars T Hansen [:lth] from comment #38)
> Little more than a rubber stamp here - I scanned many of the files but it
> became clear that if some subtle mistake was being made I was not going to
> see it, so I stopped pretending.

Yeah I'm just asking for a quick scan to catch anything that's obviously wrong. Maybe that's unnecessary and the same-binary-output check would have been sufficient here, but oh well...
Attachment #9006843 - Flags: review?(jcoppeard) → review+
Comment on attachment 9006835 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/frontend, part 1

Review of attachment 9006835 [details] [diff] [review]:
-----------------------------------------------------------------

rubberstamped!
Attachment #9006835 - Flags: review?(dteller) → review+
Attachment #9006852 - Flags: review?(nicolas.b.pierron) → review+
Attachment #9006880 - Flags: review?(nicolas.b.pierron) → review+
I have a few more parts here but given this is 99.9% auto-generated, just more of the same, and generates exactly the same binary, I think I can just check and rubberstamp these myself without wasting more of everyone's time.
Attachment #9006851 - Flags: review?(mgaudet) → review+
Attachment #9006879 - Flags: review?(mgaudet) → review+
Comment on attachment 9006831 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/builtin, part 1

Review of attachment 9006831 [details] [diff] [review]:
-----------------------------------------------------------------

I didn't check for missing braces outside the diffs displayed by splinter.
Attachment #9006831 - Flags: review?(andrebargull) → review+
Comment on attachment 9006847 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/util

Review of attachment 9006847 [details] [diff] [review]:
-----------------------------------------------------------------

::: js/src/util/NativeStack.cpp
@@ +182,2 @@
>          }
>      } else

Missing braces here.
Attachment #9006847 - Flags: review?(andrebargull) → review+
Comment on attachment 9006836 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/frontend, part 2

Review of attachment 9006836 [details] [diff] [review]:
-----------------------------------------------------------------

::: js/src/frontend/BytecodeCompiler.cpp
@@ +183,3 @@
>              JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
>                                        JSMSG_SOURCE_TOO_LONG);
> +        }

wow, this should've had braces even with previous rule :P

::: js/src/frontend/BytecodeEmitter.cpp
@@ +3147,5 @@
> +            return false;
> +        }
> +    }
> +
> +    if (!emitCheckIsObj(CheckIsObjectKind::IteratorNext)) { // ... RESULT

I prefer moving this comment to the next line ("return false;" line) and align "//" to other lines.
but yeah, there are already several places which puts comment in the same line, so I'm fine to leave this as is.
Attachment #9006836 - Flags: review?(arai.unmht) → review+
Attachment #9006839 - Flags: review?(arai.unmht) → review+
Attachment #9006857 - Flags: review?(bbouvier) → review+
Attachment #9006849 - Flags: review?(tcampbell) → review+
Attachment #9006871 - Flags: review?(bbouvier) → review+
Attachment #9006855 - Flags: review?(luke) → review+
Comment on attachment 9006873 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/wasm, part 1

Review of attachment 9006873 [details] [diff] [review]:
-----------------------------------------------------------------

rs=me on this one; I was merely looking for macros in the if bodies, just in case, but if you say the built binaries don't differ...
Attachment #9006873 - Flags: review?(bbouvier) → review+
Attachment #9006869 - Flags: review?(tcampbell) → review+
Comment on attachment 9006877 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/wasm, part 5

Review of attachment 9006877 [details] [diff] [review]:
-----------------------------------------------------------------

rs=me
Attachment #9006877 - Flags: review?(bbouvier) → review+
Comment on attachment 9006881 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/jit, part 4

Review of attachment 9006881 [details] [diff] [review]:
-----------------------------------------------------------------

rs=me
Attachment #9006881 - Flags: review?(bbouvier) → review+
Attachment #9006875 - Flags: review?(luke) → review+
Attachment #9006876 - Flags: review?(luke) → review+
Attachment #9006878 - Flags: review?(tcampbell) → review+
Attachment #9006883 - Flags: review?(tcampbell) → review+
Comment on attachment 9006874 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/wasm, part 2

Review of attachment 9006874 [details] [diff] [review]:
-----------------------------------------------------------------

Looks clean to me.
Attachment #9006874 - Flags: review?(lhansen) → review+
Attachment #9006866 - Flags: review?(khyperia) → review+
Attachment #9006848 - Flags: review?(khyperia) → review+
Attachment #9006842 - Flags: review?(sphink) → review+
Attachment #9006845 - Flags: review?(sphink) → review+
Comment on attachment 9006865 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/vm, part 8

Review of attachment 9006865 [details] [diff] [review]:
-----------------------------------------------------------------

You did for and while loops, too! \o/
Attachment #9006865 - Flags: review?(sphink) → review+
Comment on attachment 9006832 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/builtin, part 2

Review of attachment 9006832 [details] [diff] [review]:
-----------------------------------------------------------------

rs=me
Attachment #9006832 - Flags: review?(jorendorff) → review+
Attachment #9006860 - Flags: review?(jorendorff) → review+
Attachment #9006833 - Flags: review?(evilpies) → review+
Comment on attachment 9006884 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/jit, part 6

Review of attachment 9006884 [details] [diff] [review]:
-----------------------------------------------------------------

rs=me
Attachment #9006884 - Flags: review?(evilpies) → review+
Comment on attachment 9006844 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/gc, part 3

Review of attachment 9006844 [details] [diff] [review]:
-----------------------------------------------------------------

Stealing review (from pbone).
Attachment #9006844 - Flags: review?(pbone) → review+
Comment on attachment 9006834 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/builtin/intl

Review of attachment 9006834 [details] [diff] [review]:
-----------------------------------------------------------------

Stealing review (from Waldo).
Attachment #9006834 - Flags: review?(jwalden+bmo) → review+
Comment on attachment 9006840 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/frontend, part 4

Review of attachment 9006840 [details] [diff] [review]:
-----------------------------------------------------------------

Stealing review (from Waldo).
Attachment #9006840 - Flags: review?(jwalden+bmo) → review+
Comment on attachment 9006864 [details] [diff] [review]
Always use braces for if/for/while statements in js/src/vm, part 7

Review of attachment 9006864 [details] [diff] [review]:
-----------------------------------------------------------------

Stealing review (from sstangl).

Thank you for taking this on.
Attachment #9006864 - Flags: review?(sstangl) → review+
Jan, please post your script here.

Also, please land all of this as a single monolithic batch of changesets (so others can easily verify that the script generates exactly these changes).
Priority: -- → P1
I've been told there's some discussion about adopting Google's C++ style because it works better with clang-format, and that style guide doesn't require braces (it leaves it up to the project, so we could still require it, but will we?). Given that uncertainty, I'm leaning towards putting this on hold for now until we have a clear decision there, because the last thing I want to do is pull us in the opposite direction.
Attached file The script
You can run this from the root of the tree. It requires Mercurial (on a POSIX platform I think because path separators, not sure) and should just work. I change the should_restyle function to run this on particular sub directories of js/src.

It's written in a hackish way because it's based on the script for bug 1144366, and that one was process-one-line-at-a-time. It's quite effective though; there are I think 20-30? places where it generates code that requires manual fix up, these are usually places that violated the old style too, but these are all obvious compile errors so it's easy to fix up. Hm, maybe I should fix these up manually before running the script.
For the record (and to avoid people spending too much time on this script), on a debian/ubuntu, if you do
apt-get install clang-tidy-6.0
than
./mach static-analyzer check dom/presentation/Presentation.cpp (to force the generation of the compilation database)
ln -s obj-x86_64-pc-linux-gnu/compile_commands.json .
run-clang-tidy-6.0.py -j 12 -checks readability-braces-around-statements -fix js/src
it will do the autofix of this for you...
(if someone tries, the fixes are applied at the end of the process, hg diff js/ won't show anything before it ends)
I talked to Ehsan and Sylvestre and everyone agrees to go ahead with this.
Pushed by jandemooij@gmail.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/10d90fa56710
Always use braces for if/for/while statements in js/src/builtin, part 1. r=anba
https://hg.mozilla.org/integration/mozilla-inbound/rev/422abc78931c
Always use braces for if/for/while statements in js/src/builtin, part 2. r=jorendorff
https://hg.mozilla.org/integration/mozilla-inbound/rev/506e668e2864
Always use braces for if/for/while statements in js/src/builtin, part 3. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/3fa402809570
Always use braces for if/for/while statements in js/src/builtin/intl. r=jorendorff
https://hg.mozilla.org/integration/mozilla-inbound/rev/6c382d4ab0d0
Always use braces for if/for/while statements in js/src/frontend, part 1. r=Yoric
https://hg.mozilla.org/integration/mozilla-inbound/rev/f758714e4ed9
Always use braces for if/for/while statements in js/src/frontend, part 2. r=arai
https://hg.mozilla.org/integration/mozilla-inbound/rev/719bd7da3367
Always use braces for if/for/while statements in js/src/frontend, part 3. r=arai
https://hg.mozilla.org/integration/mozilla-inbound/rev/9f7beee7269b
Always use braces for if/for/while statements in js/src/frontend, part 4. r=jorendorff
https://hg.mozilla.org/integration/mozilla-inbound/rev/3ba56e06507e
Always use braces for if/for/while statements in js/src/gc, part 1. r=sfink
https://hg.mozilla.org/integration/mozilla-inbound/rev/d27cd3305320
Always use braces for if/for/while statements in js/src/gc, part 2. r=jonco
https://hg.mozilla.org/integration/mozilla-inbound/rev/68e5c74b6e90
Always use braces for if/for/while statements in js/src/gc, part 3. r=jorendorff
https://hg.mozilla.org/integration/mozilla-inbound/rev/5150b7022920
Always use braces for if/for/while statements in js/src/gc, part 4. r=sfink
https://hg.mozilla.org/integration/mozilla-inbound/rev/bc503aa87b27
Always use braces for if/for/while statements in js/src/proxy. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/847f8ad07bd5
Always use braces for if/for/while statements in js/src/util. r=anba
https://hg.mozilla.org/integration/mozilla-inbound/rev/062a7185253d
Always use braces for if/for/while statements in js/src/threading. r=khyperia
https://hg.mozilla.org/integration/mozilla-inbound/rev/48c78757dc15
Always use braces for if/for/while statements in js/src/vm, part 1. r=tcampbell
https://hg.mozilla.org/integration/mozilla-inbound/rev/9f1df06ee306
Always use braces for if/for/while statements in js/src/vm, part 2. r=mgaudet
https://hg.mozilla.org/integration/mozilla-inbound/rev/236cf9e1bd84
Always use braces for if/for/while statements in js/src/vm, part 3. r=nbp
https://hg.mozilla.org/integration/mozilla-inbound/rev/78d8957d12e2
Always use braces for if/for/while statements in js/src/vm, part 4. r=luke
https://hg.mozilla.org/integration/mozilla-inbound/rev/f24489d307be
Always use braces for if/for/while statements in js/src/vm, part 5. r=bbouvier
https://hg.mozilla.org/integration/mozilla-inbound/rev/b5b33a78679f
Always use braces for if/for/while statements in js/src/vm, part 6. r=jorendorff
https://hg.mozilla.org/integration/mozilla-inbound/rev/3810b18e5e79
Always use braces for if/for/while statements in js/src/vm, part 7. r=jorendorff
https://hg.mozilla.org/integration/mozilla-inbound/rev/bde61aedfb5c
Always use braces for if/for/while statements in js/src/vm, part 8. r=sfink
https://hg.mozilla.org/integration/mozilla-inbound/rev/045f3d6c7502
Always use braces for if/for/while statements in js/src/vm, part 9. r=khyperia
https://hg.mozilla.org/integration/mozilla-inbound/rev/6b3a95df3c12
Always use braces for if/for/while statements in js/src/vm, part 10. r=lth
https://hg.mozilla.org/integration/mozilla-inbound/rev/219721735c51
Always use braces for if/for/while statements in js/src/vm, part 11. r=tcampbell
https://hg.mozilla.org/integration/mozilla-inbound/rev/710ba7b57cd3
Always use braces for if/for/while statements in js/src/vm, part 12. r=bbouvier
https://hg.mozilla.org/integration/mozilla-inbound/rev/9a67686aabe8
Always use braces for if/for/while statements in js/src/wasm, part 1. r=bbouvier
https://hg.mozilla.org/integration/mozilla-inbound/rev/ed9bb62ebea1
Always use braces for if/for/while statements in js/src/wasm, part 2. r=lth
https://hg.mozilla.org/integration/mozilla-inbound/rev/ab68962c6c3f
Always use braces for if/for/while statements in js/src/wasm, part 3. r=luke
https://hg.mozilla.org/integration/mozilla-inbound/rev/20142eb6afd6
Always use braces for if/for/while statements in js/src/wasm, part 4. r=luke
https://hg.mozilla.org/integration/mozilla-inbound/rev/e3a9c003c9c5
Always use braces for if/for/while statements in js/src/wasm, part 5. r=bbouvier
https://hg.mozilla.org/integration/mozilla-inbound/rev/817b7142d4d9
Always use braces for if/for/while statements in js/src/jit, part 1. r=tcampbell
https://hg.mozilla.org/integration/mozilla-inbound/rev/6a52f517bdb4
Always use braces for if/for/while statements in js/src/jit, part 2. r=mgaudet
https://hg.mozilla.org/integration/mozilla-inbound/rev/19ae9ff093ca
Always use braces for if/for/while statements in js/src/jit, part 3. r=nbp
https://hg.mozilla.org/integration/mozilla-inbound/rev/bc2538bb2e9d
Always use braces for if/for/while statements in js/src/jit, part 4. r=bbouvier
https://hg.mozilla.org/integration/mozilla-inbound/rev/8fd55df51b25
Always use braces for if/for/while statements in js/src/jit, part 5. r=tcampbell
https://hg.mozilla.org/integration/mozilla-inbound/rev/a946ea065650
Always use braces for if/for/while statements in js/src/jit, part 6. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/fead9919a173
Always use braces for if/for/while statements in js/src/jit, part 7. r=jandem
https://hg.mozilla.org/integration/mozilla-inbound/rev/e620cff42c30
Always use braces for if/for/while statements in js/src/jit, part 8. r=jandem
https://hg.mozilla.org/integration/mozilla-inbound/rev/c56540cb6e02
Always use braces for if/for/while statements in js/src/shell. r=jandem
https://hg.mozilla.org/integration/mozilla-inbound/rev/a6baf63a4fd5
Always use braces for if/for/while statements in js/src/js*. r=jandem
https://hg.mozilla.org/integration/mozilla-inbound/rev/f2bedf1fe932
Always use braces for if/for/while statements in js/public. r=jandem
Note: I'll convert CTypes, XPConnect, maybe irregexp, jsapi-tests, and platform-specific jit/* directories in follow-up bugs.

Let's hope this sticks first.
https://hg.mozilla.org/mozilla-central/rev/10d90fa56710
https://hg.mozilla.org/mozilla-central/rev/422abc78931c
https://hg.mozilla.org/mozilla-central/rev/506e668e2864
https://hg.mozilla.org/mozilla-central/rev/3fa402809570
https://hg.mozilla.org/mozilla-central/rev/6c382d4ab0d0
https://hg.mozilla.org/mozilla-central/rev/f758714e4ed9
https://hg.mozilla.org/mozilla-central/rev/719bd7da3367
https://hg.mozilla.org/mozilla-central/rev/9f7beee7269b
https://hg.mozilla.org/mozilla-central/rev/3ba56e06507e
https://hg.mozilla.org/mozilla-central/rev/d27cd3305320
https://hg.mozilla.org/mozilla-central/rev/68e5c74b6e90
https://hg.mozilla.org/mozilla-central/rev/5150b7022920
https://hg.mozilla.org/mozilla-central/rev/bc503aa87b27
https://hg.mozilla.org/mozilla-central/rev/847f8ad07bd5
https://hg.mozilla.org/mozilla-central/rev/062a7185253d
https://hg.mozilla.org/mozilla-central/rev/48c78757dc15
https://hg.mozilla.org/mozilla-central/rev/9f1df06ee306
https://hg.mozilla.org/mozilla-central/rev/236cf9e1bd84
https://hg.mozilla.org/mozilla-central/rev/78d8957d12e2
https://hg.mozilla.org/mozilla-central/rev/f24489d307be
https://hg.mozilla.org/mozilla-central/rev/b5b33a78679f
https://hg.mozilla.org/mozilla-central/rev/3810b18e5e79
https://hg.mozilla.org/mozilla-central/rev/bde61aedfb5c
https://hg.mozilla.org/mozilla-central/rev/045f3d6c7502
https://hg.mozilla.org/mozilla-central/rev/6b3a95df3c12
https://hg.mozilla.org/mozilla-central/rev/219721735c51
https://hg.mozilla.org/mozilla-central/rev/710ba7b57cd3
https://hg.mozilla.org/mozilla-central/rev/9a67686aabe8
https://hg.mozilla.org/mozilla-central/rev/ed9bb62ebea1
https://hg.mozilla.org/mozilla-central/rev/ab68962c6c3f
https://hg.mozilla.org/mozilla-central/rev/20142eb6afd6
https://hg.mozilla.org/mozilla-central/rev/e3a9c003c9c5
https://hg.mozilla.org/mozilla-central/rev/817b7142d4d9
https://hg.mozilla.org/mozilla-central/rev/6a52f517bdb4
https://hg.mozilla.org/mozilla-central/rev/19ae9ff093ca
https://hg.mozilla.org/mozilla-central/rev/bc2538bb2e9d
https://hg.mozilla.org/mozilla-central/rev/8fd55df51b25
https://hg.mozilla.org/mozilla-central/rev/a946ea065650
https://hg.mozilla.org/mozilla-central/rev/fead9919a173
https://hg.mozilla.org/mozilla-central/rev/e620cff42c30
https://hg.mozilla.org/mozilla-central/rev/c56540cb6e02
https://hg.mozilla.org/mozilla-central/rev/a6baf63a4fd5
https://hg.mozilla.org/mozilla-central/rev/f2bedf1fe932
Status: ASSIGNED → RESOLVED
Closed: Last year
Resolution: --- → FIXED
Target Milestone: --- → mozilla64
Blocks: 1490589
Blocks: 1490594
Blocks: 1490993
Blocks: 1492416
Blocks: 1496033
You need to log in before you can comment on or make changes to this bug.