Commit Graph

17540 Commits

Author SHA1 Message Date
reed
c657b6932b Revert of Remove SK_FREETYPE_HAS_MM. (patchset #1 id:1 of https://codereview.chromium.org/1143133006/)
Reason for revert:
seems to be breaking DEPS roll

FAILED: /b/build/goma/gomacc ../../third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -shared -Wl,--fatal-warnings -fPIC -Wl,-z,noexecstack -Wl,-z,now -Wl,-z,relro -Wl,-z,defs -fuse-ld=gold -Wl,--no-undefined -Wl,--exclude-libs=libgcc.a -Wl,--exclude-libs=libc++_static.a -Wl,--exclude-libs=libvpx_assembly_arm.a -Wl,--icf=safe -Wl,--warn-shared-textrel -nostdlib --sysroot=/b/build/slave/android_chromium_gn/build/src/third_party/android_tools/ndk/platforms/android-14/arch-arm  -Wl,--warn-shared-textrel -Wl,-O1 -Wl,--gc-sections -Wl,--as-needed -Wl,--version-script=/b/build/slave/android_chromium_gn/build/src/build/android/android_no_jni_exports.lst -L../../third_party/android_tools/ndk/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a -o ./libskia.so -Wl,-soname=libskia.so @./libskia.so.rsp && { /b/build/goma/gomacc ../../third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-readelf -d ./libskia.so | grep SONAME ; /b/build/goma/gomacc ../../third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm -gD -f p ./libskia.so | cut -f1-2 -d' '; } > ./libskia.so.tmp && if ! cmp -s ./libskia.so.tmp ./libskia.so.TOC; then mv ./libskia.so.tmp ./libskia.so.TOC; fi && mkdir -p lib.stripped && ../../third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded -o lib.stripped/libskia.so.tmp libskia.so && if ! cmp -s lib.stripped/libskia.so.tmp lib.stripped/libskia.so; then mv lib.stripped/libskia.so.tmp lib.stripped/libskia.so; fi
../../third_party/skia/src/ports/SkFontHost_FreeType.cpp:283: error: undefined reference to 'FT_Get_MM_Var'
../../third_party/skia/src/ports/SkFontHost_FreeType.cpp:302: error: undefined reference to 'FT_Set_Var_Design_Coordinates'
../../third_party/skia/src/ports/SkFontHost_FreeType.cpp:1766: error: undefined reference to 'FT_Get_MM_Var'
collect2: error: ld returned 1 exit status

Original issue's description:
> Remove SK_FREETYPE_HAS_MM.
>
> The SK_FREETYPE_HAS_MM define was added to delay the changes to
> support GX variation fonts on platforms which did not compile ftmm.c
> into their FreeType build. Now that all builds should have this file
> the define can be removed.
>
> Committed: https://skia.googlesource.com/skia/+/4f61fee53af956a8beb4c56fa6479cb6b1aa5159

TBR=djsollen@google.com,bungeman@google.com
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/1148303005
2015-06-01 18:40:52 -07:00
joshualitt
8b08159aa7 Fix for crashing bots
TBR=bsalomon@google.com
BUG=skia:

Review URL: https://codereview.chromium.org/1159183006
2015-06-01 16:17:03 -07:00
joshualitt
e5b74c6856 Set GeometryBufferMapThreshold defaults
TBR=bsalomon@google.com
BUG=skia:

Review URL: https://codereview.chromium.org/1161543003
2015-06-01 14:17:47 -07:00
reed
933d9863dd suppress chatty warning about Funkster.ttf not be supported (on mac at least)
BUG=skia:

Review URL: https://codereview.chromium.org/1146273003
2015-06-01 12:51:24 -07:00
bungeman
4f61fee53a Remove SK_FREETYPE_HAS_MM.
The SK_FREETYPE_HAS_MM define was added to delay the changes to
support GX variation fonts on platforms which did not compile ftmm.c
into their FreeType build. Now that all builds should have this file
the define can be removed.

Review URL: https://codereview.chromium.org/1143133006
2015-06-01 12:05:23 -07:00
bsalomon
6df86409ca Revert "Revert of Move copy-surface-as-draw fallback to GrGLGpu. (patchset #12 id:220001 of https://codereview.chromium.org/1144433002/)"
This reverts commit 404b3b264b.

Review URL: https://codereview.chromium.org/1161063003
2015-06-01 10:41:49 -07:00
bsalomon
0513c83e0f Fix NULL access
BUG=skia:

TBR=egdaniel@google.com

Review URL: https://codereview.chromium.org/1157363004
2015-06-01 10:22:48 -07:00
caryclark
c00e1dd93d another double square
This is also a case where the square term is passed to a helper
function that squares the error term a second time.

R=reed@google.com
BUG=skia:3877

Review URL: https://codereview.chromium.org/1152623005
2015-06-01 10:21:31 -07:00
joshualitt
7fe8ee4cb7 Expand VisualBench to a real benching tool
BUG=skia:

Review URL: https://codereview.chromium.org/1159213002
2015-06-01 10:03:55 -07:00
nodir
038b01c081 /infra directory
Added /infra directory, it will contain chrome-infra specific files, in
particular configs for chrome infra services.

/infra/project-config/cr-buildbucket.cfg defines buckets on
cr-buildbucket.appspot.com

R=borenet@google.com
BUG=skia:

Review URL: https://codereview.chromium.org/1164633002
2015-06-01 09:39:11 -07:00
caryclark
1bfcaa4636 don't square error term twice
The cubic code erroneously passed the error square term to a function
which in turn squares the error term.

R=reed@google.com
BUG=skia:3877

Review URL: https://codereview.chromium.org/1163843003
2015-06-01 08:40:48 -07:00
bungeman
a35778ba32 Roll third_party/externals/gyp dd831fd:08429da
Summary of changes available at:
dd831fd..08429da

Review URL: https://codereview.chromium.org/1162453005
2015-06-01 07:25:18 -07:00
bsalomon
c59a1df655 Stretch small textures up to 16 pixels on PowerVR 54x
Review URL: https://codereview.chromium.org/1161183002
2015-06-01 07:13:42 -07:00
caryclark
c58e5326bb add res to stroke bench
R=reed@google.com

Review URL: https://codereview.chromium.org/1158183003
2015-06-01 06:30:06 -07:00
kkinnunen
cabe20cafd Refactor GrGpu path rendering functions to GrPathRendering
GrGpu, GrGLGpu, GrPathRendering, GrGLPathRendering all duplicated
each others' path rendering related member functions. Make
GrPathRending the logical extension of GrGpu by removing the methods
from GrGpu. Similarly to the GL variants.

Changes includes and forward declarations due to removing
GrDrawTarget.h include from GrGpu.h. This was necessary due to
GrDrawTarget.h including GrPathRendering.h, and now GrPathRendering.h
includes GrGpu.h. (Also GrGpu.h does not need GrDrawTarget.h anymore).

Very slight runtime improvement on x86_64:
             desk_fontwipe.skp_1	 836us ->  841us	1.01x
            desk_silkfinance.skp_1	2.01ms -> 2.01ms	1x
             desk_forecastio.skp_1	7.03ms -> 7.05ms	1x
                desk_weather.skp_1	3.74ms -> 3.74ms	1x
                desk_twitter.skp_1	8.02ms -> 8.01ms	1x
                 desk_mapsvg.skp_1	5.24ms -> 5.23ms	1x
            desk_pokemonwiki.skp_1	7.06ms -> 7.03ms	1x
                 desk_sfgate.skp_1	3.19ms -> 3.17ms	1x
           tabl_cuteoverload.skp_1	2.66ms -> 2.64ms	0.99x
...
           tabl_transformice.skp_1	3.06ms -> 2.98ms	0.98x
         tabl_googlecalendar.skp_1	11.3ms ->   11ms	0.97x
            tabl_gamedeksiam.skp_1	12.8ms -> 12.4ms	0.97x
               desk_samoasvg.skp_1	10.6ms -> 10.3ms	0.97x
           tabl_worldjournal.skp_1	4.44ms ->  4.3ms	0.97x

Review URL: https://codereview.chromium.org/1157683006
2015-06-01 01:37:27 -07:00
skia.buildbots
d772491274 Update SKP version
Automatic commit by the RecreateSKPs bot.

TBR=
NO_MERGE_BUILDS

Review URL: https://codereview.chromium.org/1155133003
2015-05-31 00:49:10 -07:00
reed
db74f62c7a Revert[6] of add asserts around results from requestLock
This reverts commit 11e833d91b.

BUG=skia:
TBR=

Review URL: https://codereview.chromium.org/1159183003
2015-05-30 13:41:15 -07:00
reed
11e833d91b Revert of Revert[4] of add asserts around results from requestLock (patchset #3 id:40001 of https://codereview.chromium.org/1159733006/)
Reason for revert:
gfx_unittests (under linux_asan)

@@@STEP_LOG_LINE@RenderTextTest.HarfBuzz_HorizontalPositions@Direct leak of 368 byte(s) in 1 object(s) allocated from:@@@
@@@STEP_LOG_LINE@RenderTextTest.HarfBuzz_HorizontalPositions@    #0 0x4cc74b in __interceptor_malloc (/b/build/slave/linux_asan/build/src/out/Release/gfx_unittests+0x4cc74b)@@@
@@@STEP_LOG_LINE@RenderTextTest.HarfBuzz_HorizontalPositions@    #1 0x7f2f7060ebdf in _cairo_image_surface_create_for_pixman_image /build/buildd/cairo-1.10.2/src/cairo-image-surface.c:158@@@
@@@STEP_LOG_LINE@RenderTextTest.HarfBuzz_HorizontalPositions@@@@
@@@STEP_LOG_LINE@RenderTextTest.HarfBuzz_HorizontalPositions@Indirect leak of 256 byte(s) in 1 object(s) allocated from:@@@
@@@STEP_LOG_LINE@RenderTextTest.HarfBuzz_HorizontalPositions@    #0 0x4cc74b in __interceptor_malloc (/b/build/slave/linux_asan/build/src/out/Release/gfx_unittests+0x4cc74b)@@@
@@@STEP_LOG_LINE@RenderTextTest.HarfBuzz_HorizontalPositions@    #1 0x7f2f6c7be26a in _pixman_image_allocate /build/buildd/pixman-0.30.2/build/pixman/../../pixman/pixman-image.c:184@@@
@@@STEP_LOG_LINE@RenderTextTest.HarfBuzz_HorizontalPositions@@@@

I think they are creating a cairo surface, but it has no pixels (zero size?). In this CL, if I see no pixels, I ignore the call-back which is used to free the surface (doh).

Original issue's description:
> Revert[4] of add asserts around results from requestLock
>
> This reverts commit 19663e54c0.
>
> BUG=skia:
> TBR=
>
> Committed: https://skia.googlesource.com/skia/+/df91b73a34e3a306c93a5e320704736255c3d9f0

TBR=reed@google.com
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:

Review URL: https://codereview.chromium.org/1151063005
2015-05-30 09:20:29 -07:00
reed
df91b73a34 Revert[4] of add asserts around results from requestLock
This reverts commit 19663e54c0.

BUG=skia:
TBR=

Review URL: https://codereview.chromium.org/1159733006
2015-05-30 06:32:55 -07:00
reed
19663e54c0 Revert of add asserts around results from requestLock (patchset #3 id:40001 of https://codereview.chromium.or… (patchset #1 id:1 of https://codereview.chromium.org/1165583005/)
Reason for revert:
failure in cc_unittests (need to diagnose)

@@@STEP_LOG_LINE@ResourceProviderTests_ResourceProviderTest.TransferInvalidSoftware_1@ResourceProviderTests/ResourceProviderTest.TransferInvalidSoftware/1 (run #1):@@@
@@@STEP_LOG_LINE@ResourceProviderTests_ResourceProviderTest.TransferInvalidSoftware_1@[ RUN      ] ResourceProviderTests/ResourceProviderTest.TransferInvalidSoftware/1@@@
@@@STEP_LOG_LINE@ResourceProviderTests_ResourceProviderTest.TransferInvalidSoftware_1@[17114:17114:0529/180822:15336467671:INFO:SkPixelRef.cpp(168)] ../../third_party/skia/src/core/SkPixelRef.cpp:168: failed assertion "pixels"@@@

Original issue's description:
> add asserts around results from requestLock (patchset #3 id:40001 of https://codereview.chromium.org/1155403003/)"
>
> This reverts commit 3953d36041.
>
> BUG=skia:
> TBR=
>
> Committed: https://skia.googlesource.com/skia/+/6980f5a96455c8062403c995a64b654a0e9a1319

TBR=
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:

Review URL: https://codereview.chromium.org/1151573009
2015-05-29 18:36:07 -07:00
reed
6980f5a964 add asserts around results from requestLock (patchset #3 id:40001 of https://codereview.chromium.org/1155403003/)"
This reverts commit 3953d36041.

BUG=skia:
TBR=

Review URL: https://codereview.chromium.org/1165583005
2015-05-29 15:46:36 -07:00
reed
3953d36041 Revert of add asserts around results from requestLock (patchset #3 id:40001 of https://codereview.chromium.org/1155403003/)
Reason for revert:
asserts in ui/gfx unittests (need to investigate why)

[ RUN      ] RenderTextTest.SelectionKeepsLigatures
[14602:14602:0529/134016:16779526944:INFO:SkPixelRef.cpp(164)] ../../third_party/skia/src/core/SkPixelRef.cpp:164: failed assertion "pixels"

Original issue's description:
> add asserts around results from requestLock and lockPixels, ensuring that true always means we have non-null pixels (and non-null colortable if that matches the colortype)
>
> BUG= 491975
> TBR=
>
> Committed: https://skia.googlesource.com/skia/+/f941a68126d8fe647eaea902c244c466568b7809

TBR=scroggo@google.com
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG= 491975

Review URL: https://codereview.chromium.org/1159013006
2015-05-29 14:22:05 -07:00
reed
f941a68126 add asserts around results from requestLock and lockPixels, ensuring that true always means we have non-null pixels (and non-null colortable if that matches the colortype)
BUG= 491975
TBR=

Review URL: https://codereview.chromium.org/1155403003
2015-05-29 11:39:14 -07:00
bsalomon
993a4216a6 SkImage::NewFromYUVTexturesCopy
Review URL: https://codereview.chromium.org/1149553002
2015-05-29 11:37:25 -07:00
bsalomon
4061b1262e Remove GrContext from GrDrawTarget
Still exists on clip target (for now).

Review URL: https://codereview.chromium.org/1166553002
2015-05-29 10:26:19 -07:00
bsalomon
edd77a112d Remove GrContext from GrClipMaskCache
Review URL: https://codereview.chromium.org/1144013007
2015-05-29 09:45:57 -07:00
bungeman
c4fba51ea6 Add Em test font.
This test font contains
☓ U+2613 SALTIRE
 U+2B1B BLACK LARGE SQUARE
 U+2B1C WHITE LARGE SQUARE
All at full EM size (with standard amount above and below the
baseline).

Review URL: https://codereview.chromium.org/1134153002
2015-05-29 08:42:21 -07:00
caryclark
ecaf9c9c21 use inline version of eval quad if tangent is not needed
R=reed@google.com

Review URL: https://codereview.chromium.org/1160163002
2015-05-29 08:11:16 -07:00
joshualitt
29f8679068 Removing GrAutoMalloc
BUG=skia:

Review URL: https://codereview.chromium.org/1161993003
2015-05-29 08:06:48 -07:00
bsalomon
7622863095 Add direct getter for GrCaps to GrContext.
TBR=joshualitt@google.com

Committed: https://skia.googlesource.com/skia/+/9138c46e572085870638b6f7ad7fcdfcdf3cac99

Review URL: https://codereview.chromium.org/1149773005
2015-05-29 08:02:10 -07:00
reed
ff2f423d90 add bench for building strokes
BUG=skia:

Review URL: https://codereview.chromium.org/1160093004
2015-05-29 07:17:16 -07:00
joshualitt
611cc5f964 delete experimental path renderers
BUG=skia:

Review URL: https://codereview.chromium.org/1160863006
2015-05-29 07:09:09 -07:00
joshualitt
7224c86632 add context override of GeometryBufferMapThreshold
BUG=skia:

Review URL: https://codereview.chromium.org/1159713006
2015-05-29 06:46:47 -07:00
reed
e800657f2f add assert that the pixelref really did success in requestlock
BUG=skia:
TBR=

Review URL: https://codereview.chromium.org/1142343010
2015-05-28 14:06:06 -07:00
joshualitt
bd245426bb Revert of small CL to experiment with 'disabling' memory mapping (patchset #1 id:1 of https://codereview.chromium.org/1160003004/)
Reason for revert:
experiment complete

Original issue's description:
> small CL to experiment with 'disabling' memory mapping
>
> TBR=bsalomon@google.com
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/2e48e1514396b363ecd19372eab637b11bfb8a82

TBR=robertphillips@google.com,joshualitt@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:

Review URL: https://codereview.chromium.org/1159133004
2015-05-28 13:40:20 -07:00
rmistry
9f19e8034b Whitespace change to test bugdroid
BUG=493278
BUG=skia:2139

NOTRY=true
TBR=

Review URL: https://codereview.chromium.org/1166443002
2015-05-28 11:59:07 -07:00
joshualitt
2e48e15143 small CL to experiment with 'disabling' memory mapping
TBR=bsalomon@google.com
BUG=skia:

Review URL: https://codereview.chromium.org/1160003004
2015-05-28 11:53:49 -07:00
bsalomon
084d1b61bc Revert of Add direct getter for GrCaps to GrContext. (patchset #4 id:60001 of https://codereview.chromium.org/1149773005/)
Reason for revert:
Breaking

Original issue's description:
> Add direct getter for GrCaps to GrContext.
>
> TBR=joshualitt@google.com
>
> Committed: https://skia.googlesource.com/skia/+/9138c46e572085870638b6f7ad7fcdfcdf3cac99

TBR=joshualitt@google.com
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/1164443002
2015-05-28 08:20:58 -07:00
bsalomon
9138c46e57 Add direct getter for GrCaps to GrContext.
TBR=joshualitt@google.com

Review URL: https://codereview.chromium.org/1149773005
2015-05-28 08:13:16 -07:00
robertphillips
9c240a1e6d Break GrTextContext's reliance on SkGpuDevice
This CL seems to have 2 main downsides:

1) It duplicates some code in SkBaseDevice::filterTextFlags
2) It makes it tougher to derive from SkGpuDevice

It seems reasonable (at least to me) that the TextContexts get the power to reset the LCD flags.

Review URL: https://codereview.chromium.org/1159973002
2015-05-28 07:45:59 -07:00
reed
6e43465039 simplify RawIter - don't return a pt in kClose
BUG=skia:
TBR=

Review URL: https://codereview.chromium.org/1156893003
2015-05-27 19:53:25 -07:00
cdalton
6fd158ea47 Implement Porter Duff XP with a blend table
Removes the runtime logic used by PorterDuffXferProcessor to decide
blend coeffs and shader outputs, and instead uses a compile-time
constant table of pre-selected blend formulas. Separates out the dst
read fallback into its own XP.

Introduces a new blend strategy for srcCoeff=0 that can apply coverage
with a reverse subtract blend equation instead of dual source
blending.

Adds new macros in GrBlend.h to analyze blend formulas both runtime.

Removes kSetCoverageDrawing_OptFlag and GrSimplifyBlend as they are no
longer used.

Adds a GM that verifies all xfermodes, including arithmetic, with the
color/coverage invariants used by Porter Duff.

Adds a unit test that verifies each Porter Duff formula with every
color/coverage invariant.

Major changes:

 * Uses a reverse subtract blend equation for coverage when srcCoeff=0
   (clear, dst-out [Sa=1], dst-in, modulate). Platforms that don't
   support dual source blending no longer require a dst copy for
   dst-in and modulate.

 * Sets BlendInfo::fWriteColor to false when the blend does not modify
   the dst. GrGLGpu will now use glColorMask instead of blending for
   these modes (dst, dst-in [Sa=1], modulate ignored for [Sc=1]).

 * Converts all SA blend coeffs to One for opaque inputs, and ISA to
   Zero if there is also no coverage. (We keep ISA around when there
   is coverage because we use it to tweak alpha for coverage.)

 * Abandons solid white optimizations for the sake of simplicity
   (screen was the only mode that previous had solid white opts).

Minor differences:

 * Inconsequential differences in opt flags (e.g. we now return
   kCanTweakAlphaForCoverage_OptFlag even when there is no coverage).

 * Src coeffs when the shader outputs 0.

 * IS2C vs IS2A when the secondary output is scalar.

BUG=skia:

Committed: https://skia.googlesource.com/skia/+/9a70920db22b6309c671f8e5d519bb95570e4414

Review URL: https://codereview.chromium.org/1124373002
2015-05-27 15:08:33 -07:00
halcanary
3098a752ef Better comments in SkXfermodeInterpretation
TBR=reed@google.com

Review URL: https://codereview.chromium.org/1159493003
2015-05-27 14:43:40 -07:00
joshualitt
f152e98cfa revert reordering
BUG=skia:

Review URL: https://codereview.chromium.org/1155593004
2015-05-27 14:28:09 -07:00
bsalomon
4ee6bd86c5 Add caps overrides to GMs
Review URL: https://codereview.chromium.org/1158963002
2015-05-27 13:23:23 -07:00
bungeman
a9f1db7902 Use SkTArray instead of SkSTArray in movable.
SkTArray is trivially movable, but SkSTArray is not, since it may
contain an internal pointer. FontFileInfo is supposed to be
trivially movable but currently isn't due to containing an SkSTArray.
Removing this particular optimization should not affect performance
much as this type is only used for parsing and does not allocate any
memory unless a variation axis is actually specified.

Review URL: https://codereview.chromium.org/1155383002
2015-05-27 13:10:03 -07:00
emmaleer
9700206b67 New CodeSrc* draw mode kScanline_Subset_Mode
kScanline_Subset_Mode decodes the image in subsets using a
scanline decoder.
The number of subsets can be specified by changing the constant divisor.
The number of subsets is equal to divisor*divisor.

Review URL: https://codereview.chromium.org/1157153003
2015-05-27 12:36:10 -07:00
robertphillips
ccb1b57510 Move SkGpuDevice::internalDrawPath to GrBlurUtils::drawPathWithMaskFilter
This CL is ugly but it:

removes the stored SkGpuDevice back pointer from GrTextContext (at the cost of passing more parameters)
moves SkGpuDevice::internalDrawPath to GrDrawContext::drawPathFull

Unfortunately, the GrTextContext-derived classes still need the SkGpuDevice for filterTextFlags calls but I will try removing that in a separate CL.

Review URL: https://codereview.chromium.org/1157773003
2015-05-27 11:02:55 -07:00
joshualitt
24a366a037 Fall back to older inorder buffer if we have NVPR
BUG=skia:

Committed: https://skia.googlesource.com/skia/+/b72ec98b2090e5728354dac66eb1886a28e4da6b

Review URL: https://codereview.chromium.org/1143153008
2015-05-27 10:56:41 -07:00
joshualitt
d8e2d28913 Revert of Fall back to older inorder buffer if we have NVPR (patchset #3 id:40001 of https://codereview.chromium.org/1143153008/)
Reason for revert:
breaking bots

Original issue's description:
> Fall back to older inorder buffer if we have NVPR
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/b72ec98b2090e5728354dac66eb1886a28e4da6b

TBR=bsalomon@google.com,joshualitt@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:

Review URL: https://codereview.chromium.org/1160663006
2015-05-27 10:39:56 -07:00