fmalita
44162675ca
Nested picture nanobench
...
Measure picture overhead for recording & playback using a Sierpinski fractal (http://skfiddle.com/c/a2b6e60d775543b7c29a5d45d0371c02 ) with various picture nesting levels.
R=mtklein@google.com , reed@google.com
Author: fmalita@chromium.org
Review URL: https://codereview.chromium.org/566393002
2014-09-15 16:46:16 -07:00
mtklein
db26a1267d
SkRecord: clean up comments and 4 bytes per SkRecord.
...
Just happened to notice these while skimming through. The comments are a
little out of date; now that we have visit/mutate, we do need O(1) random
access.
The constructor arguments are flexibility we're not using.
BUG=skia:
R=fmalita@google.com
Author: mtklein@skia.org
Review URL: https://codereview.chromium.org/569373002
2014-09-15 14:26:57 -07:00
reed
f0ddf33f19
add lua to histogram text lengths
...
NOTRY=True
R=bungeman@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/574493002
2014-09-15 12:44:14 -07:00
mtklein
4fc5b8811e
SkPicture::PathCounter is O(N^2) for pictures nested N deep. Fix that.
...
We've already done the analysis for child pictures. Don't do it again.
BUG=skia:
R=fmalita@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/573833002
2014-09-15 12:31:34 -07:00
joshualitt
249af15fb8
BUG=skia:
...
R=bsalomon@google.com , egdaniel@google.com , jvanverth@google.com , robertphillips@google.com
Author: joshualitt@chromium.org
Review URL: https://codereview.chromium.org/543623004
2014-09-15 11:41:14 -07:00
reed
c90e0149ec
Change SkResourceCache to take a Visitor inside its find().
...
This reverts commit 595aa05efc
.
BUG=skia:
R=mtklein@google.com , danakj@chromium.org
Author: reed@google.com
Review URL: https://codereview.chromium.org/569353002
2014-09-15 11:39:45 -07:00
dneto
327f905d2c
Fix recording of saveLayout with unusual Xfermodes.
...
This is the root cause of a Chrome rendering bug when it tiles
layers with masks.
BUG=skia:1291,chromium:401593
R=reed@google.com , mtklein@google.com , junov@chromium.org
Author: dneto@chromium.org
Review URL: https://codereview.chromium.org/568073004
2014-09-15 10:53:16 -07:00
reed
595aa05efc
Revert of Change SkResourceCache to take a Visitor inside its find(). (patchset #2 id:20001 of https://codereview.chromium.org/567393002/ )
...
Reason for revert:
crashes on android bots, haven't diagnosed yet
Original issue's description:
> Change SkResourceCache to take a Visitor inside its find().
>
> This simplifies the API/contract, in that there are not any exposed
> lock/unlock scopes.
>
>
> patch from issue 572573002
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/dee6a8e67db39fcbde2b3bb09be1d088ebb9db8a
R=mtklein@google.com , danakj@chromium.org
TBR=danakj@chromium.org , mtklein@google.com
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Author: reed@google.com
Review URL: https://codereview.chromium.org/569303002
2014-09-15 10:15:18 -07:00
mtklein
81940de688
Add flag to call SkRecordOptimize on new pictures.
...
As usual it's enabled by default in the Skia tree. Will flip in Chrome after this rolls.
BUG=skia:
R=robertphillips@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/573773002
2014-09-15 09:28:54 -07:00
caryclark
e956259c5a
add dumpHex() option to SkPath
...
This provides exact precision
to help debugging when the float
representation of a SkScalar may
introduce error.
R=reed@google.com
Author: caryclark@google.com
Review URL: https://codereview.chromium.org/571973003
2014-09-15 09:26:09 -07:00
Mike Klein
a63d5df455
Rebaseline hittestpath and ignore flaky failure on TARUAD
...
BUG=skia:2937
Review URL: https://codereview.chromium.org/571963002
2014-09-15 10:56:59 -04:00
egdaniel
3658f382cc
Create an optimized draw state but not hooked in yet to gpu pipeline
...
BUG=skia:
R=bsalomon@google.com
Author: egdaniel@google.com
Review URL: https://codereview.chromium.org/508663002
2014-09-15 07:01:59 -07:00
reed
dee6a8e67d
Change SkResourceCache to take a Visitor inside its find().
...
This simplifies the API/contract, in that there are not any exposed
lock/unlock scopes.
patch from issue 572573002
BUG=skia:
R=mtklein@google.com , danakj@chromium.org
Author: reed@google.com
Review URL: https://codereview.chromium.org/567393002
2014-09-15 06:44:47 -07:00
mtklein
5087b2c067
Revert of Picture Recording: fix the performance bottleneck in SkDeferredCanvas::isFullFrame (patchset #7 id:140001 of https://codereview.chromium.org/545813002/ )
...
Reason for revert:
This is leaking memory:
http://108.170.220.120:10117/builders/Test-Ubuntu13.10-GCE-NoGPU-x86_64-Debug-ASAN/builds/2516/steps/RunDM/logs/stdio
Original issue's description:
> Picture Recording: fix the performance bottleneck in SkDeferredCanvas::isFullFrame
>
> blink skips all pending commands during picture recording if it is drawing an opaque full-frame
> geometry or image. This may improve performance for some edge cases. To recognize an opaque
> full-frame drawing should be cheap enough. Otherwise, the overhead will offset the improvement.
> Unfortunately, data from perf for content_shell on Nexus7 shows that SkDeferredCanvas::isFullFrame
> is far from cheap. Table below shows that how much isFullFrame() costs in the whole render process.
>
> benchmark percentage
> my local benchmark(draw 1000 sprites) 4.1%
> speedReading 2.8%
> FishIETank(1000 fishes) 1.5%
> GUIMark3 Bitmap 2.0%
>
> By contrast, real recording (SkGPipeCanvas::drawBitmapRectToRect) and real rasterization
> (GrDrawTarget::drawRect) cost ~4% and ~6% in the whole render process respectively. Apparently,
> SkDeferredCanvas::isFullFrame() is nontrivial.
>
> getDeviceSize() is the main contributor to this hotspot. The change simply save the canvasSize and
> reuse it among drawings if it is not a fresh frame. This change cut off ~65% (or improved ~2 times)
> of isFullFrame().
>
> telemetry smoothness canvas_tough_test didn't show obvious improvement or regression.
>
> BUG=411166
>
> Committed: https://skia.googlesource.com/skia/+/8e45c3777d886ba3fe239bb549d06b0693692152
R=junov@chromium.org , tomhudson@google.com , reed@google.com , yunchao.he@intel.com
TBR=junov@chromium.org , reed@google.com , tomhudson@google.com , yunchao.he@intel.com
NOTREECHECKS=true
NOTRY=true
BUG=411166
Author: mtklein@google.com
Review URL: https://codereview.chromium.org/571053002
2014-09-15 06:00:49 -07:00
reed
e6cb48382d
remove 'experimental' from using hash tables in resourcecache
...
TBR=
Author: reed@chromium.org
Review URL: https://codereview.chromium.org/567303002
2014-09-14 19:58:24 -07:00
yunchao.he
8e45c3777d
Picture Recording: fix the performance bottleneck in SkDeferredCanvas::isFullFrame
...
blink skips all pending commands during picture recording if it is drawing an opaque full-frame
geometry or image. This may improve performance for some edge cases. To recognize an opaque
full-frame drawing should be cheap enough. Otherwise, the overhead will offset the improvement.
Unfortunately, data from perf for content_shell on Nexus7 shows that SkDeferredCanvas::isFullFrame
is far from cheap. Table below shows that how much isFullFrame() costs in the whole render process.
benchmark percentage
my local benchmark(draw 1000 sprites) 4.1%
speedReading 2.8%
FishIETank(1000 fishes) 1.5%
GUIMark3 Bitmap 2.0%
By contrast, real recording (SkGPipeCanvas::drawBitmapRectToRect) and real rasterization
(GrDrawTarget::drawRect) cost ~4% and ~6% in the whole render process respectively. Apparently,
SkDeferredCanvas::isFullFrame() is nontrivial.
getDeviceSize() is the main contributor to this hotspot. The change simply save the canvasSize and
reuse it among drawings if it is not a fresh frame. This change cut off ~65% (or improved ~2 times)
of isFullFrame().
telemetry smoothness canvas_tough_test didn't show obvious improvement or regression.
BUG=411166
R=junov@chromium.org , tomhudson@google.com , reed@google.com
Author: yunchao.he@intel.com
Review URL: https://codereview.chromium.org/545813002
2014-09-14 18:59:04 -07:00
rileya
abaef86f2b
Add support for the Rec601 YUV color space to GrYUVtoRGBEffect.
...
R=bsalomon@google.com , senorblanco@chromium.org , sugoi@chromium.org , reed@google.com
Author: rileya@chromium.org
Review URL: https://codereview.chromium.org/516463005
2014-09-12 17:45:58 -07:00
mtklein
94c415170b
Revert of Add a test that uses C++11 features as a compiler canary. (patchset #2 id:20001 of https://codereview.chromium.org/568913002/ )
...
Reason for revert:
nope, nacl and ubuntu local bots (at least) broken
Original issue's description:
> Add a test that uses C++11 features as a compiler canary.
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/86e01df8d1d8848044c3fcc31c1a2008b70fe08c
R=bungeman@google.com , mtklein@chromium.org
TBR=bungeman@google.com , mtklein@chromium.org
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Author: mtklein@google.com
Review URL: https://codereview.chromium.org/565213008
2014-09-12 17:07:34 -07:00
mtklein
86e01df8d1
Add a test that uses C++11 features as a compiler canary.
...
BUG=skia:
R=bungeman@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/568913002
2014-09-12 17:02:52 -07:00
ehsan.akhgari
c34b0d4e9a
Do not expect a copysign function to be defined in <cmath> with clang-cl
...
clang-cl defines __cplusplus to 201103L, but it uses the runtime library
provided by MSVC, so the copysign function will not be available there.
BUG=skia:
R=reed@google.com
Author: ehsan.akhgari@gmail.com
Review URL: https://codereview.chromium.org/526813002
2014-09-12 12:30:35 -07:00
bungeman
9db509272a
Handle NULL typeface in SkFontMgr_fontconfig::onMatchFaceStyle.
...
SampleApp does this, and it needs to be handled properly.
R=mtklein@google.com
Author: bungeman@google.com
Review URL: https://codereview.chromium.org/563263003
2014-09-12 12:14:14 -07:00
reed
9594da111d
use SkData::NewUninitialized
...
BUG=skia:
R=bungeman@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/565803005
2014-09-12 12:12:27 -07:00
mtklein
9db328b64f
Add *@skia.org to AUTHORS so we can land CLs using those addresses if we like.
...
BUG=skia:
R=hcm@google.com , reed@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/565293002
2014-09-12 12:03:55 -07:00
mtklein
eefd18cef2
Let SkTaskGroup work synchronously if no one created an SkTaskGroup::Enabler.
...
Tested by running DM with its SkTaskGroup::Enabler commented out. Slow, but completed correctly.
BUG=skia:
R=reed@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/556223003
2014-09-12 09:35:56 -07:00
Mike Klein
11fca3f29f
Add more debugging for newly failing assert (DM on Xoom bots).
...
BUG=skia:
Review URL: https://codereview.chromium.org/568823002
2014-09-12 12:17:25 -04:00
reed
83658305a1
remove confusing/unused stream methods
...
BUG=skia:
R=bungeman@google.com , djsollen@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/563273003
2014-09-12 08:49:54 -07:00
borenet
1f777e8580
Update SKP version to 99
...
Automatic commit by the RecreateSKPs bot.
TBR=
Author: borenet@google.com
Review URL: https://codereview.chromium.org/571443002
2014-09-11 21:31:30 -07:00
mtklein
fbe4136845
Clear away any lingering error before testing SkError.
...
Looks like something's setting an error before ErrorTest runs on our new
Venue8 bots.
BUG=skia:
R=humper@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/551973004
2014-09-11 14:41:56 -07:00
mtklein
0b36e6b65f
Add --matrix to DM, to play around with and maybe use on a bot.
...
BUG=skia:
R=reed@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/563723005
2014-09-11 12:30:12 -07:00
reed
56b00d9e7a
add PurgeResourceCache to track leaks
...
TBR=halcananry
Author: reed@google.com
Review URL: https://codereview.chromium.org/554263005
2014-09-11 12:22:34 -07:00
danakj
f58a562d56
Disable discardable memory for the resource cache until tests pass.
...
BUG=skia:2926
R=reed@google.com
Author: danakj@chromium.org
Review URL: https://codereview.chromium.org/568493002
2014-09-11 11:08:50 -07:00
danakj
790ffe3feb
Make SkBitmapCache remove invalid bitmaps from the SkResourceCache.
...
This adds SkResourceCache::Remove() which will remove a resource from
its cache. The resource is required to be unlocked at the time Remove()
is called.
Then SkBitmapCache::Find() makes use of this to Remove() bitmaps from
the cache whose pixels have been evicted. This allows the bitmap to be
re-added to the cache with pixels again.
After this change, background a tab (and discarding all the bitmaps'
contents) no longer disables image caching for those discarded images
once the tab is visible again.
BUG=skia:2926
NOTRY=true
R=reed@android.com , tomhudson@google.com , reed@google.com
Author: danakj@chromium.org
Review URL: https://codereview.chromium.org/561953002
2014-09-11 10:49:52 -07:00
reed
33a30503d7
SkData can allocate room for its contents in the same block
...
BUG=skia:
R=bungeman@google.com , mtklein@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/560653004
2014-09-11 08:42:36 -07:00
mtklein
aa90d00f14
Assert SkTDArray::pop() doesn't underflow.
...
BUG=skia:
R=reed@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/563633003
2014-09-11 06:36:11 -07:00
borenet
26a4b51499
Update SKP version to 98
...
Automatic commit by the RecreateSKPs bot.
TBR=
Author: borenet@google.com
Review URL: https://codereview.chromium.org/559283002
2014-09-10 21:25:40 -07:00
mtklein
97bf60ff7f
Delay any SkRecordOptimize until after SkRecord has stuck.
...
BUG=skia:
R=robertphillips@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/561993002
2014-09-10 16:40:05 -07:00
mtklein
99d6a9ee8b
Fix a bug in Save-Restore no-op optimization.
...
We optimize
Save
SaveLayer
Restore
Restore
into
NoOp
NoOp
NoOp
Restore
I'm considering skipping the call to SkRecordOptimize again just to eliminate
this extra variable from landing SkRecord. Thoughts?
BUG=skia:
R=robertphillips@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/560163002
2014-09-10 16:08:28 -07:00
bungeman
f91c47d91d
Remove a layer of indirection and code from SkFontHost.
...
R=mtklein@google.com , tomhudson@google.com , djsollen@google.com
Author: bungeman@google.com
Review URL: https://codereview.chromium.org/105223006
2014-09-10 15:49:48 -07:00
bungeman
77cd8b0ba2
Revert of Added test for non cached ETC1 (patchset #2 id:20001 of https://codereview.chromium.org/564493002/ )
...
Reason for revert:
This is causing dm and gm to crash on the Win8 7770 bots, for example
http://108.170.220.120:10117/builders/Test-Win8-ShuttleA-HD7770-x86-Debug/builds/2128
An example stack trace looks like
[13:46:16.260000] -1M drawing... extractbitmap [600 600]
[13:46:16.760000] -1M drawing... etc1bitmap_npot [124 124]
[13:46:16.760000] -1M drawing... etc1bitmap_r11.ktx [128 128]
[13:46:16.760000] -1M drawing... etc1bitmap_ktx [128 128]
[13:46:16.760000] -1M drawing... etc1bitmap_pkm_volatile [128 128]
[13:46:16.760000]
[13:46:16.760000] Caught exception 3221225477 EXCEPTION_ACCESS_VIOLATION
[13:46:16.760000] sk_gr_allocate_texture +c9
[13:46:16.760000] load_etc1_texture +1dd
[13:46:16.760000] sk_gr_create_bitmap_texture +199
[13:46:16.760000] GrLockAndRefCachedBitmapTexture +ad
[13:46:16.760000] SkGpuDevice::SkAutoCachedTexture::set +5d
[13:46:16.760000] SkGpuDevice::SkAutoCachedTexture::SkAutoCachedTexture +65
[13:46:16.760000] SkGpuDevice::internalDrawBitmap +8e
[13:46:16.760000] SkGpuDevice::drawBitmapCommon +608
[13:46:16.760000] SkGpuDevice::drawBitmap +79
[13:46:16.760000] SkCanvas::internalDrawBitmap +11b
[13:46:16.760000] SkCanvas::drawBitmap +d3
[13:46:16.760000] skiagm::ETC1BitmapGM::onDraw +140
[13:46:16.760000] skiagm::GM::drawContent +3c
[13:46:16.760000] skiagm::GM::draw +24
[13:46:16.760000] GMMain::invokeGM +63
[13:46:16.760000] GMMain::generate_image +186
[13:46:16.760000] GMMain::test_drawing +5b
[13:46:16.760000] run_multiple_configs +2f9
[13:46:16.760000] tool_main +75d
[13:46:16.760000] main +16
[13:46:16.760000] __tmainCRTStartup +199
[13:46:16.760000] mainCRTStartup +d
[13:46:16.760000] BaseThreadInitThunk +e
[13:46:16.760000] RtlInitializeExceptionChain +84
[13:46:16.760000] RtlInitializeExceptionChain +5a
Original issue's description:
> Added test for non cached ETC1
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/d9ec549071581d9d1dc2e5fac3163305ae935a39
R=bsalomon@chromium.org , robertphillips@chromium.org , robertphillips@google.com , sugoi@chromium.org
TBR=bsalomon@chromium.org , robertphillips@chromium.org , robertphillips@google.com , sugoi@chromium.org
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Author: bungeman@google.com
Review URL: https://codereview.chromium.org/559093003
2014-09-10 14:59:59 -07:00
cjacek
3e15f9006c
Fixed void* to uint64_t cast on win64 in TraceID.
...
On win64, long is 32-bit. Found by GCC (mingw-w64) build, where this causes an error.
This is the Skia version of https://codereview.chromium.org/374043002 .
R=bungeman@google.com , humper@google.com
Author: cjacek@gmail.com
Review URL: https://codereview.chromium.org/510923002
2014-09-10 14:28:07 -07:00
sugoi
d9ec549071
Added test for non cached ETC1
...
BUG=skia:
R=bsalomon@chromium.org , robertphillips@chromium.org , robertphillips@google.com
Author: sugoi@chromium.org
Review URL: https://codereview.chromium.org/564493002
2014-09-10 13:40:18 -07:00
mtklein
fd731ce804
Measure picture recording speed in nanobench.
...
Today we measure SkPicture playback speed, but not the time it takes to record
the SkPicture. This fixes that by reading SKPs from disk and re-recording them.
On the console, recording shows up first as the nonrendering skp benches,
followed later by the usual playback benches:
maxrss loops min median mean max stddev samples config bench
51M 2 165µs 168µs 169µs 178µs 3% ▆▄▃█▂▄▁▂▁▁ nonrendering tabl_slashdot.skp
57M 1 9.72ms 9.77ms 9.79ms 9.97ms 1% █▂▂▅▃▂▁▄▂▁ nonrendering desk_pokemonwiki.skp
57M 32 2.92µs 2.96µs 3.03µs 3.46µs 6% ▅▁▁▁▁▁▁█▂▁ nonrendering desk_yahoosports.skp
...
147M 1 3.86ms 3.87ms 3.97ms 4.81ms 7% █▁▁▁▁▁▁▁▁▁ 8888 tabl_slashdot.skp_1
147M 1 4.54ms 4.56ms 4.55ms 4.56ms 0% █▅▇▅█▅▂▁▅▁ 565 tabl_slashdot.skp_1
147M 2 3.08ms 3.24ms 4.17ms 8.18ms 50% █▁▁█▁▁▁▁▁▁ gpu tabl_slashdot.skp_1
147M 1 1.61ms 1.62ms 1.69ms 2.33ms 13% █▁▁▁▁▁▁▁▁▁ 8888 desk_pokemonwiki.skp_1
147M 1 1.44ms 1.44ms 1.45ms 1.47ms 1% ▅▂█▂▂▅▁▁▂▁ 565 desk_pokemonwiki.skp_1
...
On skiaperf.com, they'll also be separated out from playback benches by bench_type.
BUG=skia:
R=reed@google.com , mtklein@google.com , jcgregorio@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/559153002
2014-09-10 12:19:30 -07:00
mtklein
33bce0a68b
Clean up old custom tools now subsumed by nanobench.
...
BUG=skia:
R=mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/551263003
2014-09-10 12:11:23 -07:00
mtklein
962890568d
Distinguish common and unique names for skiaperf.com.
...
Turns out we tack on the size post-facto in ResultsWriter::bench(), so the only
place we need getUniqueName() to differ from getName() is SKPBench.
BUG=skia:
R=jcgregorio@google.com , mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/552303004
2014-09-10 12:05:59 -07:00
tomhudson
579b4fb92e
Fix iteration bounds of Android GL API initialization
...
A dormant error in https://codereview.chromium.org/319043005 was
exposed on some new platforms; this makes sure loop iterations
are bounded.
BUG=
R=joshualitt@google.com , joshualitt@chromium.org
Author: tomhudson@google.com
Review URL: https://codereview.chromium.org/557363002
2014-09-10 10:45:42 -07:00
reed
cc0e3110bd
make set3DMask virtual, so we can safely notify the shadercontext
...
also boost preallocated storage to account for this combo of bitmapshader + emboss + colorfilter
BUG=skia:
R=djsollen@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/563563002
2014-09-10 10:20:24 -07:00
Mike Klein
d0af38793e
Expectation file update for bot changes.
...
BUG=skia:
Review URL: https://codereview.chromium.org/560873002
2014-09-10 11:10:48 -04:00
bungeman
f548444684
Detect presence of dwrite_1.h.
...
This introduces the SK_HAS_DWRITE_1_H define which may be set at
build time or will be true when WINVER_MAXVER >= 0x0602 .
The dwrite_1.h header is available starting in Windows SDK 8.0.
This change supports users who must still use Windows SDK 7.0.
It also allows for easier local testing of the older interfaces
on newer versions of Windows.
See also: https://bugzilla.mozilla.org/show_bug.cgi?id=1053652
R=george@mozilla.com , mtklein@google.com
Author: bungeman@google.com
Review URL: https://codereview.chromium.org/552383002
2014-09-10 07:49:05 -07:00
reed
841010f4bd
disable conservative rasterclip on gpu, until we understand perspective
...
BUG=skia:
R=bsalomon@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/561763002
2014-09-10 07:23:32 -07:00
borenet
1e3dad0b17
Update SKP version to 97
...
Automatic commit by the RecreateSKPs bot.
TBR=
Author: borenet@google.com
Review URL: https://codereview.chromium.org/560743002
2014-09-09 21:14:51 -07:00