summaryrefslogtreecommitdiff
path: root/testing
AgeCommit message (Collapse)Author
2015-12-10Merge to XFA: Fix integer and bounds issues in sycc4{22,44}_to_rgb.Oliver Chang
Also clean up while we're here. BUG=557223 TBR=tsepez@chromium.org Original Review URL: https://codereview.chromium.org/1512833008 . (cherry picked from commit 08750d0400f1635ac33c3234cb11b192f31a1eeb) Review URL: https://codereview.chromium.org/1521473003 .
2015-12-09Merge to XFA: Prevent infinite looping in CPDF_Parser::LoadAllCrossRefV5().Lei Zhang
BUG=pdfium:298 TBR=weili@chromium.org Review URL: https://codereview.chromium.org/1496703005 . (cherry picked from commit 93181f9a20db7ac706bb9405750303db93762a5b) Review URL: https://codereview.chromium.org/1514783002 .
2015-12-06Merge to XFA: fix for stream object readingWei Li
Loosen a check for earlier version of PDF files. When the bytes with specified length are followed by 'endstream' keyword, even if there is no EOL marker before the keyword, it signals the end of stream. BUG=551258 TBR=jun_fang@foxitsoftware.com Review URL: https://codereview.chromium.org/1499433002 . (cherry picked from commit 0ff66089c87ab6e3adaaff0ec69728ce7a8d8299) Review URL: https://codereview.chromium.org/1504723002 .
2015-12-01Merge to XFA: Add basic checking for RebuildCrossRefWei Li
RebuildCrossRef function returns false when we can not find file trailer or any indirect object. This serves as a basic file format checking. BUG=pdfium:215 TBR=jun_fang@foxitsoftware.com Review URL: https://codereview.chromium.org/1476163002 . (cherry picked from commit f14da1d58e8e12633c7a47e6efd5ffe43bb37b4b) Review URL: https://codereview.chromium.org/1486383002 .
2015-11-30Allow building non-XFA (master) on the XFA branch.Tom Sepez
This first pass is GYP-only, will do GN in the next CL. R=ochang@chromium.org Review URL: https://codereview.chromium.org/1480403002 .
2015-11-23Merge to XFA: Enable Dr. Memory to run javascript, pixel, and corpus testsQin Zhao
- add DrMemoryWrapper in common.py to adjust Dr. Memory wrapper - add --wrapper option to run_*_tests.py for Dr. Mempry wrapper - update run_*_tests.py to handle Dr. Memory wrapper - add TestPDFiumTest in pdfium_tests.py to support run_*_tests.py - remove ValgrindTool in valgrind_tests.py R=thestig@chromium.org BUG=pdfium:238 Review URL: https://codereview.chromium.org/1464453003 . (cherry picked from commit 36476923ae5eb8e9283e605f3c85ee8811c86014) Review URL: https://codereview.chromium.org/1465333002 .
2015-11-20Merge to XFA: Initialize V8 before starting embedder testsTom Sepez
Pull Jochen's fix before it is forgotten. Original Review URL: https://codereview.chromium.org/1462313002 . (cherry picked from commit 3ccd36892fe826e8f2ed8dde0819756ae3546733) TBR=jochen@chromium.org TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1470443002 .
2015-11-20Merge to XFA: Change |CCodec_ScanlineDecoder::m_Pitch| to FX_DWORDOliver Chang
This matches the type of the corresponding |CFX_DIBSource::m_Pitch|, where integer overflow is checked for FX_DWORD. This change is propagated to many other places. Also, check for integer overflow in |CCodec_RLScanlineDecoder::Create| during the calculation of |m_Pitch| since it aligns to 4 bytes while overflow was was previously checked without this alignment. TBR=tsepez@chromium.org BUG=555784 Review URL: https://codereview.chromium.org/1460033002 . (cherry picked from commit e7950df70a2fd658f466751b29483436cb31e829) Review URL: https://codereview.chromium.org/1461363002 .
2015-11-12Merge to XFA: Clear decoders after the image decoder in the /Filter array.Oliver Chang
During decoding, when an image decoder is encountered, any subsequent decoders are ignored, but remain in the array. However, later on CPDF_DIBSource::ValidateDictParam expects the image decoder to be the last in the array, causing issues. A check is also added in CPDF_DIBSource::GetScanline to ensure that the calculated pitch value is <= the (4-aligned) pitch value in the cached bitmap to prevent future issues. Also cleans up some NULL usages. BUG=552046 TBR=tsepez@chromium.org Review URL: https://codereview.chromium.org/1406943005 . (cherry picked from commit 182d129bcee8f7731b9bbfde0064295ad3b37271) Review URL: https://codereview.chromium.org/1436153003 .
2015-11-11Merge to XFA: Fix extraction of colour components in ↵Oliver Chang
CPDF_DIBSource::DownSampleScanline32Bit Previously, if |m_bpc| was < 8 (e.g. 4), this function may still try to access the source components as if |m_bpc| == 8. Even when it fell into the codepath that tried to do the right thing in this case, it was wrong. BUG=554151 TBR=tsepez@chromium.org Committed: https://pdfium.googlesource.com/pdfium/+/9b99615806e358fdb396d1cb162ee2e69c2a20ec Review URL: https://codereview.chromium.org/1433423002 . (cherry picked from commit e21fe98d5b5da7da01503b985b07b90c8e811689) Review URL: https://codereview.chromium.org/1441563002 .
2015-11-10Merge to XFA: Support linearized loadingJun Fang
BUG=446715 R=thestig@chromium.org, tsepez@chromium.org Review URL: https://codereview.chromium.org/1353093003 . Conflicts: core/include/fpdfapi/fpdf_parser.h core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp core/src/fpdfapi/fpdf_parser/fpdf_parser_parser_embeddertest.cpp samples/pdfium_test.cc testing/embedder_test.cpp testing/embedder_test.h Review URL: https://codereview.chromium.org/1412083010 .
2015-11-09Merge to XFA: Fix all relative includes to core.Lei Zhang
Do some IWYU to fix build errors due to files that have no #includes but just happened to work previously because the #includes were in the right order. R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1407423004 . (cherry picked from commit 9e7cd8ffb81c564e1102f6c6459ec0942a0b11ea) Review URL: https://codereview.chromium.org/1425163004 .
2015-11-09Merge to XFA: Add path service to retrieve test data directory at run time ↵Wei Li
so tests can be run from any directory. Previously the tests which read test files assume the current directory is under pdfium. Running from any other directory will break the build. R=thestig@chromium.org Review URL: https://codereview.chromium.org/1408003014 . (cherry picked from commit c0e93a9a942fe7d99800502a61d2fbb58cf9276f) Conflicts: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser_embeddertest.cpp fpdfsdk/src/fpdfdoc_embeddertest.cpp testing/embedder_test.cpp testing/embedder_test.h Review URL: https://codereview.chromium.org/1411403012 .
2015-11-06Merge to XFA: Fix all relative includes to public.Lei Zhang
R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1415803007 . (cherry picked from commit 5899671184d01b74989d181363066379ef3e4051) Review URL: https://codereview.chromium.org/1431593007 .
2015-11-06Merge to XFA: Fix all relative includes to third_party.Lei Zhang
- In non-standalone builds, use the provided jpeg library. - Run gn format over all the GN files. - Also roll DEPS for buildtools to c2f2598. - And fix XFA's lack of #includes. BUG=541704 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1425153006 . (cherry picked from commit 34bb6c58fe60206a08dc0a1f37b7cfe83e8c762c) Review URL: https://codereview.chromium.org/1434543003 .
2015-11-06XFA: Suppress remaining failing corpus tests on Linux.Lei Zhang
R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1417703011 .
2015-11-05Merge to XFA: Add base test for RebuildCrossRef function.Wei Li
This tests whether RebuildCrossRef could handle well-formatted pdf file. R=thestig@chromium.org Review URL: https://codereview.chromium.org/1409013005 . (cherry picked from commit 4544797e8998a31e7bc3f5439a5982f7f66dff26) Review URL: https://codereview.chromium.org/1413343004 .
2015-11-04XFA: Set the right FPDF_FORMFILLINFO version for embedder tests.Lei Zhang
TBR=tsepez@chromium.org Review URL: https://codereview.chromium.org/1409993013 .
2015-11-04Merge to XFA: Make JS app.setTimeOut() work again.Lei Zhang
This regressed in commit 794c9b6. BUG=551248 TBR=tsepez@chromium.org Review URL: https://codereview.chromium.org/1424743006 . (cherry picked from commit 8cadf995e9a0fec8da19f69edac9d10fccca7eed) (cherry picked from commit 955930dce7e4b5c764cdd34b134baea4207de523) Review URL: https://codereview.chromium.org/1416663008 .
2015-11-04Merge to XFA: Make checkdeps --resolve-dotdot succeed.Lei Zhang
This is just a straight-forward, partial merge. It does not actually make checkdeps succeed. R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1419373005 . (cherry picked from commit 79f5a32175293620abe456554e10efb7c3f4e7c6) Review URL: https://codereview.chromium.org/1409153007 .
2015-11-04Merge to XFA: Enforce input and output dimensionalities for CPDF_StitchFunc.Oliver Chang
Also cleans up some places in the relevant functions since we're here. BUG=551460 TBR=tsepez@chromium.org Review URL: https://codereview.chromium.org/1421783004 . Clean merge. (cherry picked from commit 4f85605cbc652a17bc833f883186e0a68af6006d) Review URL: https://codereview.chromium.org/1405383009 .
2015-11-03Merge to XFA: Revert "One test runner to rule them all."Dan Sinclair
This reverts commit a1215ba51a235fb7abcb995f0e768ea0176d9275. Revert "Return result of the test runner." This reverts commit d1579c9b92b7f9c1d9e0fac1ecb8e3cb23875fca. Reverting the new test_runner code as there appears to be something string happening on the non-Linux boxes on XFA. It looks like it ran the font_size test twice, once with the .in and once with the .pdf. The .in was suppressed, the .pdf faild and wasn't suppressed. Rendering PDF file /Volumes/data/b/build/slave/mac_xfa/build/pdfium/out/Debug/gen/pdfium/testing/pixel/font_size.pdf. Rendered 1 pages. Skipped 0 bad pages. Checking /Volumes/data/b/build/slave/mac_xfa/build/pdfium/out/Debug/gen/pdfium/testing/pixel/font_size.pdf.0.png FAILURE: font_size.in; Command '['/Volumes/data/b/build/slave/mac_xfa/build/pdfium/out/Debug/pdfium_diff', '/Volumes/data/b/build/slave/mac_xfa/build/pdfium/testing/resources/pixel/font_size_expected.pdf.0.png', '/Volumes/data/b/build/slave/mac_xfa/build/pdfium/out/Debug/gen/pdfium/testing/pixel/font_size.pdf.0.png']' returned non-zero exit status 1 font_size.in is suppressed, found in SUPPRESSIONS_mac file Rendering PDF file /Volumes/data/b/build/slave/mac_xfa/build/pdfium/out/Debug/gen/pdfium/testing/pixel/font_size.pdf. Rendered 1 pages. Skipped 0 bad pages. Checking /Volumes/data/b/build/slave/mac_xfa/build/pdfium/out/Debug/gen/pdfium/testing/pixel/font_size.pdf.0.png FAILURE: font_size.pdf; Command '['/Volumes/data/b/build/slave/mac_xfa/build/pdfium/out/Debug/pdfium_diff', '/Volumes/data/b/build/slave/mac_xfa/build/pdfium/testing/resources/pixel/font_size_expected.pdf.0.png', '/Volumes/data/b/build/slave/mac_xfa/build/pdfium/out/Debug/gen/pdfium/testing/pixel/font_size.pdf.0.png']' returned non-zero exit status 1 TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1410743008 . (cherry picked from commit e067f7bab4317704de27917c1befa8f57a0e78d7) Review URL: https://codereview.chromium.org/1421133005 .
2015-11-03Merge to XFA: Return result of the test runner.Dan Sinclair
We need to actually return the result of the test runner.... TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1413863011 . (cherry picked from commit d1579c9b92b7f9c1d9e0fac1ecb8e3cb23875fca) Review URL: https://codereview.chromium.org/1419953009 .
2015-11-03Merge to XFA: One test runner to rule them all.Dan Sinclair
This CL takes the three test runners (corpus, javascript, pixel) and combines the code into a single test_runner file. Each of the individual runners still exists and calls the test runner with their data directory. With this change, the pixel and javascript test will now run in parallel if multiple processors are available. TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1430623006 . (cherry picked from commit a1215ba51a235fb7abcb995f0e768ea0176d9275) Review URL: https://codereview.chromium.org/1411553010 .
2015-10-28Merge to XFA: Allow running individual tests.Dan Sinclair
This CL adds the ability to run a given test from the corpus, javascript and pixel test runners. The filename to provide is relative to the testing directory in question. Because the directories for javascript and pixel are flat you just provide the filename (it will rewrite the .pdf to .in if .pdf is provided). For corpus tests you have to provide the path from the corpus directory. Development/pdfium/pdfium % ./testing/tools/run_javascript_tests.py apply.pdf Rendering PDF file /Development/pdfium/pdfium/out/Debug/gen/pdfium/testing/javascript/apply.pdf. Non-linearized path... Rendered 1 pages. Skipped 0 bad pages. Development/pdfium/pdfium % ./testing/tools/run_pixel_tests.py bug_524043_1.pdf Rendering PDF file /Development/pdfium/pdfium/out/Debug/gen/pdfium/testing/pixel/bug_524043_1.pdf. Linearized path... Rendered 1 pages. Skipped 0 bad pages. Checking /Development/pdfium/pdfium/out/Debug/gen/pdfium/testing/pixel/bug_524043_1.pdf.0.png diff: 0.00% passed Development/pdfium/pdfium % ./testing/tools/run_corpus_tests.py third_party/tcpdf/example_065.pdf Rendering PDF file /Development/pdfium/pdfium/out/Debug/gen/pdfium/testing/corpus/example_065.pdf. Non-linearized path... Rendered 1 pages. Skipped 0 bad pages. Checking /Development/pdfium/pdfium/out/Debug/gen/pdfium/testing/corpus/example_065.pdf.0.png diff: 0.14% failed FAILURE: example_065.pdf; Command '['/Development/pdfium/pdfium/out/Debug/pdfium_diff', '/Development/pdfium/pdfium/testing/corpus/third_party/tcpdf/example_065_expected.pdf.0.png', '/Development/pdfium/pdfium/out/Debug/gen/pdfium/testing/corpus/example_065.pdf.0.png']' returned non-zero exit status 1 Summary of Failures: /Development/pdfium/pdfium/testing/corpus/third_party/tcpdf/example_065.pdf TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1407913005 . (cherry picked from commit da6254ff78553773b7bb637ee1e3f5111c083c74) Review URL: https://codereview.chromium.org/1423523005 .
2015-10-28Merge to XFA: Revert "Add test case for parsing endobj keywords."Dan Sinclair
This reverts commit 5bd88ec07e79215400777f3095c6843e0627cade. (cherry picked from commit 97dd3fec106ac8a945e03ed1509af0a8b73da993) R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1430533003 .
2015-10-28XFA: Merge master SUPPRESSIONS filesTom Sepez
These have gotten out of sync with master. TBR=dsinclair@chromium.org Review URL: https://codereview.chromium.org/1414943004 .
2015-10-28XFA: Update document_methods javascript test.Tom Sepez
TBR=dsinclair@chromium.org Review URL: https://codereview.chromium.org/1430663003 .
2015-10-28Merge to XFA: Check if document was opened during testing.Dan Sinclair
When we call OpenDocument we fail to check if the document was actually opened. Currently we return true in all cases (assuming we read the file). This CL updates the code to check if the document was opened and return false if not. I've updated several tests to check for FALSE instead of TRUE. I verified the documents in fact don't open with my local (non-PDFium) PDF reader. BUG=pdfium:223 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1417893007 . (cherry picked from commit dd4cd523ef4546b43d68e8ca6ec0a97fbe8954e9) Review URL: https://codereview.chromium.org/1418563010 .
2015-10-28A crasher due to lacking 'template' node in XFA fileJun Fang
A template node is mandatory in XFA file. Pdfium should ignore processing it when no template node is found in XFA file. BUG=pdfium:216 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1423903002 .
2015-10-27Merge to XFA: Type check the m_pShadingObj before assuming it's a stream.Dan Sinclair
The m_pShadingObj can be a stream or a dictionary depending on how it's used. This CL adds some simple type checking to make sure that the type of the object matches what we expect. BUG=chromium:547706 TBR=tsepez@chromium.org Review URL: https://codereview.chromium.org/1421973004 . (cherry picked from commit 4ef782ab57979add3e3910d6bcfde6ef59f65724) Review URL: https://codereview.chromium.org/1422253002 .
2015-10-27Revert accidental commits to XFA.Tom Sepez
Revert "Add an embedded test case" This reverts commit ec44186fdbca423eddf432be8b5c38914674023a. Revert "Update the format" This reverts commit 1df068061b5bb5e768a623318186523ffd251aaa. Revert "Update .in file" This reverts commit c13090439e1fbfd8a18c358058f137f897a7477b. Revert "Address review comments" This reverts commit 24967515b8be77a79aa1599f8fbf5d3ecbcd1769. TBR=jun_fang@foxitsoftware.com TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1414033007 .
2015-10-27Update .in fileJun Fang
2015-10-27Update the formatJun Fang
2015-10-27Add an embedded test caseJun Fang
2015-10-22Merge to XFA: Set a recursion limit on CPDF_DataAvail::CheckPageNodeOliver Chang
This limit mirrors FX_MAX_PAGE_LEVEL in fpdf_parser_document.cpp Clean merge. TBR=thestig@chromium.org BUG=544880 Review URL: https://codereview.chromium.org/1421743003 . (cherry picked from commit 3bfb1dcf56f8470b693ad1126e24e65f9d17926c) Review URL: https://codereview.chromium.org/1418173003 .
2015-10-22Merge to XFA: Make parallelized run_corpus_tests.py handle ctrl-c.Lei Zhang
Thanks Stack Overflow! TBR=tsepez@chromium.org Review URL: https://codereview.chromium.org/1421623002 . (cherry picked from commit 61fe6edb3f789feefa4bd0c8475b9645fae0d09e) Review URL: https://codereview.chromium.org/1420543004 .
2015-10-19Merge to XFA: Consolidate test support code.Tom Sepez
Original Review URL: https://codereview.chromium.org/1416713002 . (cherry picked from commit 6d34d056a7188b7ae9800fe3ceb68645e0442879) Conflicts: BUILD.gn samples/BUILD.gn samples/pdfium_test.cc samples/samples.gyp R=thestig@chromium.org Review URL: https://codereview.chromium.org/1413593003 .
2015-10-16Merge to XFA: DEPS include_rules no longer allows core/ -> fpsdfsk/ inclusion.Tom Sepez
Original Review URL: https://codereview.chromium.org/1411493002 . (cherry picked from commit 8316a8a0274558f7a0f515e04bb13a7cca5762b2) BUG=pdfium:217 TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1405243004 .
2015-10-16Merge to XFA: Loosen checking on the bytes following 'stream'Jun Fang
PDF specs say that end of line markers shall follow the keyword "stream". But a white space before end of line markers follows this keyword in the test pdf files. BUG=543018 R=thestig@chromium.org, tsepez@chromium.org Review URL: https://codereview.chromium.org/1401923005 .
2015-10-14Merge to XFA: Add unit test for top-level bookmarks.Tom Sepez
Original Review URL: https://codereview.chromium.org/1404723002 . (cherry picked from commit 7d54a9f70f977ce9b72959ef55dc6300713ccafe) R=thestig@chromium.org TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1404193002 .
2015-10-13Merge to XFA: Allow compiling PDFium without V8.Tom Sepez
Original Review URL: https://codereview.chromium.org/1395733006 . (cherry picked from commit f1c713663192368d26031a4caed1f9705f4510af) Conflicts: BUILD.gn fpdfsdk/src/fpdfview.cpp fpdfsdk/src/javascript/JS_Runtime.cpp pdfium.gyp samples/BUILD.gn samples/samples.gyp BUG=pdfium:211 R=thestig@chromium.org Review URL: https://codereview.chromium.org/1393833006 .
2015-10-09Merge to XFA: Parallelize run_corpus_tests.py.Lei Zhang
- Use the number of cores as the default -j value - Fall back to old code for -j 1 TBR=nparker@chromium.org Review URL: https://codereview.chromium.org/1398793003 . (cherry picked from commit fd751f28cecce61ab36038799043639d570e0b26) Review URL: https://codereview.chromium.org/1395253002 .
2015-10-07Merge to XFA: Pass v8::Isolate to PDFium at init time.Tom Sepez
New code changes in JS_Runtime.cpp. (cherry picked from commit 3dedace9623fef6161a8666e53a4ab2b9be61e4c) Original Review URL: https://codereview.chromium.org/1367033002 . Also merge to XFA: Run FXJS_V8 embedder tests against a shared isolate, since the two go together. (cherry picked from commit 4ea721cb7954898a9722c389dae86c62957352d0) Original Review URL: https://codereview.chromium.org/1377293004 . R=thestig@chromium.org Review URL: https://codereview.chromium.org/1381633008 .
2015-10-02Merge to XFA: Add test case for parsing endobj keywords.Tom Sepez
(cherry picked from commit 5bd88ec07e79215400777f3095c6843e0627cade) Original Review URL: https://codereview.chromium.org/1232803005 . BUG=493126 R=thestig@chromium.org TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1237713004 .
2015-10-02Merge to XFA: Correct mistakes in test case for 507316Tom Sepez
(cherry picked from commit ccc8b21622a7d6a7723bc04e065e0ec3666dab64) Original Review URL: https://codereview.chromium.org/1377403003 . TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1384053002 .
2015-09-30Merge to XFA: Add signatures to FXJS_V8.Tom Sepez
(cherry picked from commit 158e335717efba9dce3aa6f6d1e31ed884e1f59e) Original Review URL: https://codereview.chromium.org/1353193004 . TBR=jochen@chromium.org, krasin@google.com Review URL: https://codereview.chromium.org/1376343002 .
2015-09-29Merge to XFA: Fix blank page issue caused by too strict correction on bpcJun Fang
For bit per component (bpc), PDF spec mentions that a RunLengthDecode or DCTDecode filter shall always deliver 8-bit samples. However, some PDF files don't follow this rule. We can find that filter is RunLengthDecode but bpc is 1 in the provided test file. In this case, pdfium will correct bpc to 8 but the actual bpc is 1. It causes a failure because the data is much more than the expected. To handle this case, pdfium doesn't correct bpc to 8 when the original bpc is 1. BUG=512557 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1328213002 .
2015-09-28Merge to XFA: Introduce kPerIsolateDataIndex and tidy JS_Define.hTom Sepez
(cherry picked from commit d6d9dc6b9a45368abdf43477592ee9f6cdb6102e) (cherry picked from commit cfff2f65aaec70247d020188bc68a0dc4fb34c3e) Original Review URL: https://codereview.chromium.org/1372963003 . Original Review URL: https://codereview.chromium.org/1367813003 . TBR=jochen@chromium.org Review URL: https://codereview.chromium.org/1370133007 .
2015-09-25Merge to XFA: Add Mac-specific pixel test expectations.Lei Zhang
The font is slightly different from Linux/Windows. BUG=524043 TBR=jun_fang@foxitsoftware.com Review URL: https://codereview.chromium.org/1366363002 . (cherry picked from commit 6c5afa68ed4e21f9d0bfd1ecc01e824d946c5485) Review URL: https://codereview.chromium.org/1361783004 .